C语言程序设计(第5版)习题解答-第7章

第七章

注:以下所有代码需要添加头文件<stdio.h>、<math.h>、<string.h>

  1. 写两个函数分别求两个整数的最大公约数和最小公倍数
    代码如下
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);
}
  1. 写函数求一元二次方程的根,根据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);
}
  1. 写一个判断素数的函数
    代码如下
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;
        }
    }
}
  1. 写一个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");
    }
}
  1. 写一个使字符串逆序存放的函数
    代码如下
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);
}
  1. 写一个函数连接连个字符串,不用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);
}
  1. 写一个函数找出一个字符串中的元音字母
    代码如下
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);
}
  1. 写一个函数,输入一个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);
}
  1. 写一个函数,统计一个字符串中字母、数字、空格和其他字符的个数
    代码如下
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);
}
  1. 写一个函数,找出一个字符串中最长的单词
    代码如下
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);
}
  1. 写一个函数,使用冒泡法对含有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);
}
  1. 写一个函数,使用牛顿迭代法求方程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);
}
  1. 写一个函数,使用递归方法求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;
}
  1. 写一个函数,计算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));
}
  1. 写函数记录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);
}
  1. 写一个函数,将十六进制数转换为十进制数
    代码如下
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);
}
  1. 写一个函数,使用递归法将一个整数转换为字符串
    代码如下
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('-');
}
  1. 写一个函数,计算该日是该年的第几天
    代码如下
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值