第七章
注:以下所有代码需要添加头文件<stdio.h>、<math.h>、<string.h>
- 写两个函数分别求两个整数的最大公约数和最小公倍数
代码如下
int find_GCD(int a, int b);
void find_LCM(int a, int b, int gcd);
int main()
{
int gcd = find_GCD(24, 8);
find_LCM(24, 8, gcd);
return 0;
}
int find_GCD(int a, int b)
{
int temp, remainder;
if(a < b)
{
temp = a;
a = b;
b = temp;
}
while((remainder = a % b) != 0)
{
a = b;
b = remainder;
}
printf("GCD = %d\n", b);
return b;
}
void find_LCM(int a, int b, int gcd)
{
printf("LCM = %d\n", a * b / gcd);
}
- 写函数求一元二次方程的根,根据delta的正负分三种情况
代码如下
void delta_greater_than_zero(int a, int b, double delta);
void delta_is_zero(int a, int b, double delta);
void delta_less_than_zero(int a, int b, double delta);
int main()
{
int a, b, c;
printf("a = ");
scanf("%d", &a);
printf("b = ");
scanf("%d", &b);
printf("c = ");
scanf("%d", &c);
double delta = pow(b, 2) - 4 * a * c;
if(delta > 0) delta_greater_than_zero(a, b, delta);
else if(delta == 0) delta_is_zero(a, b, delta);
else delta_less_than_zero(a, b, delta);
return 0;
}
void delta_greater_than_zero(int a, int b, double delta)
{
double x1 = (-b + sqrt(delta)) / (2 * a);
double x2 = (-b - sqrt(delta)) / (2 * a);
printf("x1 = %f, x2 = %f\n", x1, x2);
}
void delta_is_zero(int a, int b, double delta)
{
double x = -b / (2 * a);
printf("x = %f\n", x);
}
void delta_less_than_zero(int a, int b, double delta)
{
double real = -b / (2 * a);
double imaginary = sqrt(-delta) / (2 * a);
printf("x1 = %f + %fi\nx2 = %f - %fi\n", real, imaginary, real, imaginary);
}
- 写一个判断素数的函数
代码如下
void is_prime(int num);
int main()
{
is_prime(27);
return 0;
}
void is_prime(int num)
{
for(int i = 2; i <= (int)sqrt(num); i++)
{
if(num % i == 0)
{
printf("%d is not a prime number\n", num);
break;
}
else if(i == (int)sqrt(num))
{
printf("%d is a prime number\n", num);
break;
}
}
}
- 写一个3X3数组转置函数
代码如下
void transpose_3x3(int array[3][3]);
int main()
{
int array[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
transpose_3x3(array);
return 0;
}
void transpose_3x3(int array[3][3])
{
int temp;
for(int i = 0; i < 3; i++)
{
for(int j = i; j < 3; j++)
{
temp = array[i][j];
array[i][j] = array[j][i];
array[j][i] = temp;
}
}
printf("after transpose:\n");
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
printf("%d ", array[i][j]);
}
printf("\n");
}
}
- 写一个使字符串逆序存放的函数
代码如下
void reverse_string(char str[]);
int main()
{
char string[] = "hello";
reverse_string(string);
return 0;
}
void reverse_string(char str[])
{
char temp;
for(int i = 0; i < strlen(str) / 2; i++)
{
temp = str[i];
str[i] = str[strlen(str) - i - 1];
str[strlen(str) - i - 1] = temp;
}
printf("%s\n", str);
}
- 写一个函数连接连个字符串,不用strcat()函数
代码如下
void concat(char s1[], char s2[]);
int main()
{
char s1[80] = "hello";
char s2[20] = "world";
concat(s1, s2);
return 0;
}
void concat(char s1[], char s2[])
{
int i = 0, j = 0;
while(s1[i] != '\0') i++;
while(s2[j] != '\0') s1[i++] = s2[j++];
s1[i] = '\0';
printf("%s\n", s1);
}
- 写一个函数找出一个字符串中的元音字母
代码如下
void find_vowel(char str1[], char str2[]);
int main()
{
char str1[] = "abcdefghijklmn";
char str2[20];
find_vowel(str1, str2);
return 0;
}
void find_vowel(char str1[], char str2[])
{
int i = 0, j = 0;
while(str1[i] != '\0')
{
if(str1[i] == 'a' || str1[i] == 'e' || str1[i] == 'i' || str1[i] == 'o' || str1[i] == 'u' || str1[i] == 'A' || str1[i] == 'E' || str1[i] == 'I' || str1[i] == 'O' || str1[i] == 'U')
{
str2[j++] = str1[i];
}
i++;
}
str2[j] = '\0';
printf("the vowels in %s are: %s\n", str1, str2);
}
- 写一个函数,输入一个4位数字,将数字转化为字符输出,间隔为一个空格
代码如下
void num_to_char(char num[]);
int main()
{
char num[] = "1234";
num_to_char(num);
return 0;
}
void num_to_char(char num[])
{
char temp[10];
for(int i = 0; i < 7; i++)
{
temp[2 * i] = num[i];
temp[2 * i + 1] = ' ';
}
temp[7] = '\0';
printf("%s\n", temp);
}
- 写一个函数,统计一个字符串中字母、数字、空格和其他字符的个数
代码如下
void count_str(char str[]);
int main()
{
char str[80] = "hello world, 123";
count_str(str);
return 0;
}
void count_str(char str[])
{
int letter = 0, digit = 0, space = 0, other = 0;
for(int i = 0; str[i] != '\0'; i++)
{
if((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z')) letter++;
else if(str[i] >= '0' && str[i] <= '9') digit++;
else if(str[i] == ' ') space++;
else other++;
}
printf("letter = %d, digit = %d, space = %d, other = %d\n", letter, digit, space, other);
}
- 写一个函数,找出一个字符串中最长的单词
代码如下
void find_longest_word(char str[]);
int main()
{
char string[80] = "I am a student";
find_longest_word(string);
return 0;
}
void find_longest_word(char str[])
{
int maxLen = 0, curLen = 0;
int start = 0, end = 0;
for(int i = 0; str[i] != '\0'; i++)
{
if(str[i] == ' ') curLen = 0;
else curLen++; // 当前字符不为0使,长度+1
if(curLen > maxLen)
{
maxLen = curLen;
start = i - curLen + 1;
end = i;
}
}
printf("the longest word is %s\n", str + start);
}
- 写一个函数,使用冒泡法对含有10个字符的字符串进行排序
代码如下
void sort_str(char str[]);
int main()
{
char str[] = "reputation";
sort_str(str);
return 0;
}
void sort_str(char str[])
{
char temp;
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9 - i; j++)
{
if(str[j] > str[j + 1])
{
temp = str[j];
str[j] = str[j + 1];
str[j + 1] = temp;
}
}
}
printf("%s\n", str);
}
- 写一个函数,使用牛顿迭代法求方程x3+2*x2+3*x+4=0的根
代码如下
void root_of_quadratic_equation();
int main()
{
root_of_quadratic_equation();
return 0;
}
void root_of_quadratic_equation()
{
int a = 1, b = 2, c = 3, d = 4;
double x0 = 1, x_cur, f, f1;
do
{
x_cur = x0;
f = ((a * x_cur + b) * x_cur + c) * x_cur + d;
f1 = (3 * a * x_cur + 2 * b) * x_cur + c;
x0 = x_cur - f / f1;
} while (fabs(x_cur - x0) >= 1e-6);
printf("x = %10.7f\n", x0);
}
- 写一个函数,使用递归方法求n阶勒让德多项式的值
代码如下
float legendre_polynomial(int n, int x);
int main()
{
printf("p(3, 4) = %f\n", legendre_polynomial(3, 4));
return 0;
}
float legendre_polynomial(int n, int x)
{
if(n == 0) return 1;
else if(n == 1) return x;
else return ((2 * n - 1) * x - legendre_polynomial(n - 1, x) - (n - 1) * legendre_polynomial(n - 2, x)) / n;
}
- 写一个函数,计算10个学生5门课的成绩,计算每门课的平均分、计算每个学生的平均分和方差
代码如下
float stu_average[10], course_average[5];
void input_data(float data[10][5]);
void score_average(float data[10][5]);
void cour_average(float data[10][5]);
void score_variance(float data[10][5]);
int main()
{
float score[10][5];
input_data(score);
score_average(score);
cour_average(score);
score_variance(score);
return 0;
}
void input_data(float data[10][5])
{
for(int i = 0; i < 10; i++)
{
printf("student %d\n", i + 1);
for(int j = 0; j < 5; j++)
{
scanf("%f", &data[i][j]);
}
}
}
void score_average(float data[10][5])
{
float sum;
for(int i = 0; i < 10; i++)
{
sum = 0;
for(int j = 0; j < 5; j++)
{
sum += data[i][j];
}
stu_average[i] = sum / 5.0;
}
}
void cour_average(float data[10][5])
{
float sum;
for(int i = 0; i < 5; i++)
{
sum = 0;
for(int j = 0; j < 10; j++)
{
sum += data[j][i];
}
course_average[i] = sum / 10.0;
}
}
void score_variance(float data[10][5])
{
float sum_x, sum_square;
for(int i = 0; i < 10; i++)
{
sum_x += stu_average[i];
sum_square += pow(stu_average[i], 2);
}
printf("score variance is %8.2f\n", sum_square / 10.0 - pow(sum_x / 10.0, 2));
}
- 写函数记录10名职工的姓名和职工号,然后根据工号排序,可进行职工号查询姓名
代码如下
void data_input(char name[10][20], int id[10]);
void data_output(char name[10][20], int id[10]);
void data_sort(char name[10][20], int id[10]);
void data_search(char name[10][20], int id[10], int target_id);
int main()
{
char name[10][20];
int id[10];
data_input(name, id);
data_sort(name, id);
printf("after sort:\n");
data_output(name, id);
int target_id;
printf("input target id: ");
scanf("%d", &target_id);
data_search(name, id, target_id);
return 0;
}
void data_input(char name[10][20], int id[10])
{
for(int i = 0; i < 10; i++)
{
printf("name: ");
scanf("%s", name[i]);
printf("id: ");
scanf("%d", &id[i]);
}
}
void data_output(char name[10][20], int id[10])
{
for(int i = 0; i < 10; i++)
{
printf("name: %s, id: %d\n", name[i], id[i]);
}
}
void data_sort(char name[10][20], int id[10])
{
int min, temp1;
char temp2[20];
for(int i = 0; i < 9; i++)
{
min = i;
for(int j = i + 1; j < 10; j++)
{
if(id[j] < id[min]) min = j;
}
temp1 = id[i];
id[i] = id[min];
id[min] = temp1; // 选择法排序id
strcpy(temp2, name[i]);// 根据id顺序将name排序
strcpy(name[i], name[min]);
strcpy(name[min], temp2);
}
}
void data_search(char name[10][20], int id[10], int target_id)
{
int left = 0, right = 9;
while(left <= right)
{
int mid = left + ((right - left) >> 1); // 中间位置
if(id[mid] == target_id)
{
printf("the name is %s\n", name[mid]);
break;
}
else if(id[mid] < target_id) left = mid + 1;
else right = mid - 1;
}
printf("%d is not in the array\n", target_id);
}
- 写一个函数,将十六进制数转换为十进制数
代码如下
void hex_to_dec(char hex[]);
int main()
{
char hex[] = "a11";
hex_to_dec(hex);
return 0;
}
void hex_to_dec(char hex[])
{
int n = 0;
for(int i = 0; hex[i] != '\0'; i++)
{
// n * 16是为了每次将十六进制数转换为十进制数
if(hex[i] >= '0' && hex[i] <= '9') n = n * 16 + hex[i] - '0';
else if(hex[i] >= 'A' && hex[i] <= 'F') n = n * 16 + hex[i] - 'A' + 10;
else if(hex[i] >= 'a' && hex[i] <= 'f') n = n * 16 + hex[i] - 'a' + 10;
}
printf("%d\n", n);
}
- 写一个函数,使用递归法将一个整数转换为字符串
代码如下
void int_to_str(int num);
int main()
{
int num;
printf("num = ");
scanf("%d", &num);
int_to_str(num);
return 0;
}
void int_to_str(int num)
{
int division = num / 10;
if(division != 0) int_to_str(division);
printf("%c", num % 10 + '0');
putchar('-');
}
- 写一个函数,计算该日是该年的第几天
代码如下
int day_of_year(int month, int day);
int is_leap_year(int year);
int main()
{
int year, month, day;
printf("year = ");
scanf("%d", &year);
printf("month = ");
scanf("%d", &month);
printf("day = ");
scanf("%d", &day);
int days = day_of_year(month, day);
if(is_leap_year(year)) days++;
printf("days = %d\n", days);
return 0;
}
int day_of_year(int month, int day)
{
int day_tab[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
for(int i = 1; i < month; i++) day += day_tab[i];
return day;
}
int is_leap_year(int year)
{
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}