谭浩强c程序设计例题+习题 第七章 用函数实现模块化程序设计习题

第七章习题

1.求两个整数的最大公约数与最大公倍数

主函数调用两个函数来输出结果

#include <stdio.h>

// 计算最大公约数
int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

// 计算最大公倍数
int lcm(int a, int b) {
    return (a * b) / gcd(a, b);
}

int main() {
    int num1, num2;
    printf("请输入两个整数:");
    scanf("%d %d", &num1, &num2);

    printf("最大公约数: %d\n", gcd(num1, num2));
    printf("最大公倍数: %d\n", lcm(num1, num2));

    return 0;
}

2.求方程ax²+bx+c=0的根

用三个函数分别求当△>0、=0、<0的根并输出结果

#include <stdio.h>
#include <math.h>

// 当△ > 0时求根
void roots_positive(double a, double b, double c) {
    double delta = b * b - 4 * a * c;
    double x1 = (-b + sqrt(delta)) / (2 * a);
    double x2 = (-b - sqrt(delta)) / (2 * a);
    printf("方程有两个不同的实根: x1 = %.2lf, x2 = %.2lf\n", x1, x2);
}

// 当△ = 0时求根
void roots_zero(double a, double b) {
    double x = -b / (2 * a);
    printf("方程有两个相等的实根: x = %.2lf\n", x);
}

// 当△ < 0时求根
void roots_negative(double a, double b, double c) {
    double delta = b * b - 4 * a * c;
    double realPart = -b / (2 * a);
    double imaginaryPart = sqrt(-delta) / (2 * a);
    printf("方程有两个虚根: x1 = %.2lf + %.2lfi, x2 = %.2lf - %.2lfi\n",
           realPart, imaginaryPart, realPart, imaginaryPart);
}

int main() {
    double a, b, c, delta;
    printf("请输入方程的系数a, b, c:");
    scanf("%lf %lf %lf", &a, &b, &c);

    delta = b * b - 4 * a * c;

    if (delta > 0) {
        roots_positive(a, b, c);
    } else if (delta == 0) {
        roots_zero(a, b);
    } else {
        roots_negative(a, b, c);
    }

    return 0;
}

3.判断是否为素数

主函数输入一个整数,调用函数判断,输出是否为素数

#include <stdio.h>
#include <stdbool.h>

// 判断是否为素数
bool is_prime(int n) {
    if (n <= 1) return false;
    for (int i = 2; i <= n / 2; i++) {
        if (n % i == 0) return false;
    }
    return true;
}

int main() {
    int num;
    printf("请输入一个整数:");
    scanf("%d", &num);

    if (is_prime(num)) {
        printf("%d 是素数。\n", num);
    } else {
        printf("%d 不是素数。\n", num);
    }

    return 0;
}

4.写一个函数,把3*3矩阵行列互换
#include <stdio.h>

// 矩阵转置
void transpose(int matrix[3][3], int transposed[3][3]) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            transposed[i][j] = matrix[j][i];
        }
    }
}

int main() {
    int matrix[3][3], transposed[3][3];

    printf("请输入3x3矩阵的元素:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }

    transpose(matrix, transposed);

    printf("转置后的矩阵为:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", transposed[i][j]);
        }
        printf("\n");
    }

    return 0;
}

5.写一个函数,使输入的一个字符串按反序存放,在主函数中输入输出字符串
#include <stdio.h>
#include <string.h>

// 反转字符串函数
void reverse_string(char str[]) {
    int length = strlen(str);
    for (int i = 0; i < length / 2; i++) {
        char temp = str[i];
        str[i] = str[length - i - 1];
        str[length - i - 1] = temp;
    }
}

int main() {
    char str[100];

    printf("请输入一个字符串:");
    scanf("%s", str);

    reverse_string(str);

    printf("反序后的字符串为:%s\n", str);

    return 0;
}

6.写一个函数将两字符连接
#include <stdio.h>
#include <string.h>

// 字符串连接函数
void concatenate(char str1[], char str2[], char result[]) {
    strcpy(result, str1);
    strcat(result, str2);
}

int main() {
    char str1[100], str2[100], result[200];

    printf("请输入第一个字符串:");
    scanf("%s", str1);
    printf("请输入第二个字符串:");
    scanf("%s", str2);

    concatenate(str1, str2, result);

    printf("连接后的字符串为:%s\n", result);

    return 0;
}

7.写一个函数,将一个字符串中的元音字母复制到另一字符串中,然后输出
#include <stdio.h>
#include <string.h>

// 判断字符是否为元音
int is_vowel(char ch) {
    return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' ||
           ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U';
}

// 将元音字母复制到新字符串中
void copy_vowels(char str[], char vowels[]) {
    int j = 0;
    for (int i = 0; i < strlen(str); i++) {
        if (is_vowel(str[i])) {
            vowels[j++] = str[i];
        }
    }
    vowels[j] = '\0';  // 添加字符串结束符
}

int main() {
    char str[100], vowels[100];

    printf("请输入一个字符串:");
    scanf("%s", str);

    copy_vowels(str, vowels);

    printf("字符串中的元音字母为:%s\n", vowels);

    return 0;
}

8.写一个函数,输入一个四位数字,要求输出这四个字符,但是每两个数字间要空一格空格

例如:输入1990 应输出"1 9 9 0"

#include <stdio.h>

// 输出四位数字,数字之间添加空格
void format_output(int num) {
    printf("%d %d %d %d\n", num / 1000, (num / 100) % 10, (num / 10) % 10, num % 10);
}

int main() {
    int num;

    printf("请输入一个四位数字:");
    scanf("%d", &num);

    format_output(num);

    return 0;
}

9.编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格以及其他字符个数,并在主函数中输入字符串和输出结果
#include <stdio.h>
#include <ctype.h>

// 统计字符类型
void count_characters(char str[], int *letters, int *digits, int *spaces, int *others) {
    *letters = *digits = *spaces = *others = 0;

    for (int i = 0; str[i] != '\0'; i++) {
        if (isalpha(str[i])) {
            (*letters)++;
        } else if (isdigit(str[i])) {
            (*digits)++;
        } else if (isspace(str[i])) {
            (*spaces)++;
        } else {
            (*others)++;
        }
    }
}

int main() {
    char str[100];
    int letters, digits, spaces, others;

    printf("请输入一个字符串:");
    fgets(str, 100, stdin);

    count_characters(str, &letters, &digits, &spaces, &others);

    printf("字母个数: %d\n", letters);
    printf("数字个数: %d\n", digits);
    printf("空格个数: %d\n", spaces);
    printf("其他字符个数: %d\n", others);

    return 0;
}

10.写一个函数,输入一行字符,将此字符串中最长的单词输出
#include <stdio.h>
#include <string.h>

// 找出最长的单词
void find_longest_word(char str[], char longest[]) {
    int maxLength = 0;
    int length = 0;
    int start = 0;
    int i = 0;

    while (str[i] != '\0') {
        if (str[i] != ' ' && str[i] != '\n') {
            length++;
        } else {
            if (length > maxLength) {
                maxLength = length;
                strncpy(longest, str + start, length);
                longest[length] = '\0';
            }
            length = 0;
            start = i + 1;
        }
        i++;
    }
    if (length > maxLength) {
        strncpy(longest, str + start, length);
        longest[length] = '\0';
    }
}

int main() {
    char str[100];
    char longest[100];

    printf("请输入一行字符:");
    fgets(str, 100, stdin);

    find_longest_word(str, longest);

    printf("最长的单词是:%s\n", longest);

    return 0;
}

11.写一个函数,用起泡法对输入的10个字符由小到大排序
#include <stdio.h>

// 起泡排序
void bubble_sort(char arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                char temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    char arr[10];

    printf("请输入10个字符:\n");
    for (int i = 0; i < 10; i++) {
        scanf(" %c", &arr[i]);
    }

    bubble_sort(arr, 10);

    printf("排序后的字符:\n");
    for (int i = 0; i < 10; i++) {
        printf("%c ", arr[i]);
    }
    printf("\n");

    return 0;
}

12.用牛顿迭代法求根。方程为a³+b²+cx+d=0,系数abcd的值依次为1、2、3、4,由主函数输入。求x在1附近的一个实根,求出根后主函数输出。
#include <stdio.h>
#include <math.h>

// 计算函数值
double f(double x, double a, double b, double c, double d) {
    return a * x * x * x + b * x * x + c * x + d;
}

// 计算函数的导数
double f_prime(double x, double a, double b, double c) {
    return 3 * a * x * x + 2 * b * x + c;
}

// 牛顿迭代法求解
double newton_method(double x0, double a, double b, double c, double d) {
    double x1;
    do {
        x1 = x0 - f(x0, a, b, c, d) / f_prime(x0, a, b, c);
        if (fabs(x1 - x0) < 1e-7)  // 判断是否收敛
            break;
        x0 = x1;
    } while (1);
    return x1;
}

int main() {
    double a = 1, b = 2, c = 3, d = 4;
    double x0 = 1.0;  // 初始猜测值

    double root = newton_method(x0, a, b, c, d);

    printf("方程的一个实根为:%.7lf\n", root);

    return 0;
}

13.用递归法求n阶勒让德多项式的值,递归公式为

在这里插入图片描述

#include <stdio.h>

// 勒让德多项式递归公式
double legendre(int n, double x) {
    if (n == 0) {
        return 1.0;
    } else if (n == 1) {
        return x;
    } else {
        return ((2 * n - 1) * x * legendre(n - 1, x) - (n - 1) * legendre(n - 2, x)) / n;
    }
}

int main() {
    int n;
    double x;

    printf("请输入n的值:");
    scanf("%d", &n);
    printf("请输入x的值:");
    scanf("%lf", &x);

    printf("勒让德多项式P_%d(%.2lf) = %.6lf\n", n, x, legendre(n, x));

    return 0;
}

14.输入10个同学5门课的成绩,分别用函数实现下列功能

1.计算每个学生平均分

2.计算每门课平均分

3.找出所有50个分数中最高分数所对应的学生和课程

4.计算平均分方差
在这里插入图片描述

其中xi为某一学生的平均分。

#include <stdio.h>

#define STUDENTS 10
#define COURSES 5

// 计算每个学生的平均分
void student_average(double scores[STUDENTS][COURSES], double averages[STUDENTS]) {
    for (int i = 0; i < STUDENTS; i++) {
        double sum = 0;
        for (int j = 0; j < COURSES; j++) {
            sum += scores[i][j];
        }
        averages[i] = sum / COURSES;
    }
}

// 计算每门课的平均分
void course_average(double scores[STUDENTS][COURSES], double averages[COURSES]) {
    for (int j = 0; j < COURSES; j++) {
        double sum = 0;
        for (int i = 0; i < STUDENTS; i++) {
            sum += scores[i][j];
        }
        averages[j] = sum / STUDENTS;
    }
}

// 找出最高分及其对应的学生和课程
void find_highest_score(double scores[STUDENTS][COURSES], int *student, int *course) {
    double max_score = scores[0][0];
    *student = 0;
    *course = 0;

    for (int i = 1; i < STUDENTS; i++) {
        for (int j = 0; j < COURSES; j++) {
            if (scores[i][j] > max_score) {
                max_score = scores[i][j];
                *student = i;
                *course = j;
            }
        }
    }
}

// 计算平均分的方差
double variance(double averages[STUDENTS]) {
    double mean = 0, var = 0;
    for (int i = 0; i < STUDENTS; i++) {
        mean += averages[i];
    }
    mean /= STUDENTS;
    for (int i = 0; i < STUDENTS; i++) {
        var += (averages[i] - mean) * (averages[i] - mean);
    }
    return var / STUDENTS;
}

int main() {
    double scores[STUDENTS][COURSES];
    double studentAverages[STUDENTS];
    double courseAverages[COURSES];
    int highestStudent, highestCourse;

    // 输入成绩
    printf("请输入10个学生的5门课成绩:\n");
    for (int i = 0; i < STUDENTS; i++) {
        for (int j = 0; j < COURSES; j++) {
            scanf("%lf", &scores[i][j]);
        }
    }

    // 计算学生平均分
    student_average(scores, studentAverages);
    printf("\n每个学生的平均分:\n");
    for (int i = 0; i < STUDENTS; i++) {
        printf("学生 %d: %.2lf\n", i + 1, studentAverages[i]);
    }

    // 计算课程平均分
    course_average(scores, courseAverages);
    printf("\n每门课的平均分:\n");
    for (int j = 0; j < COURSES; j++) {
        printf("课程 %d: %.2lf\n", j + 1, courseAverages[j]);
    }

    // 找出最高分及对应的学生和课程
    find_highest_score(scores, &highestStudent, &highestCourse);
    printf("\n最高分数为学生 %d 在课程 %d 中的分数:%.2lf\n",
           highestStudent + 1, highestCourse + 1, scores[highestStudent][highestCourse]);

    // 计算方差
    double var = variance(studentAverages);
    printf("\n平均分方差:%.6lf\n", var);

    return 0;
}

15.写几个函数

1.输入10个职工的姓名和职工号

2.按照职工号从小到大顺序排序,姓名顺序也随之调整

3.要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名

#include <stdio.h>
#include <string.h>

#define EMPLOYEES 10

typedef struct {
    char name[50];
    int id;
} Employee;

// 冒泡排序按职工号排序
void sort_employees(Employee employees[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            if (employees[j].id > employees[j + 1].id) {
                Employee temp = employees[j];
                employees[j] = employees[j + 1];
                employees[j + 1] = temp;
            }
        }
    }
}

// 折半查找职工号
int binary_search(Employee employees[], int n, int id) {
    int low = 0, high = n - 1;
    while (low <= high) {
        int mid = (low + high) / 2;
        if (employees[mid].id == id) {
            return mid;
        } else if (employees[mid].id < id) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    return -1;  // 没有找到
}

int main() {
    Employee employees[EMPLOYEES];
    int searchId, index;

    // 输入职工信息
    printf("请输入10个职工的姓名和职工号:\n");
    for (int i = 0; i < EMPLOYEES; i++) {
        printf("职工 %d 姓名:", i + 1);
        scanf("%s", employees[i].name);
        printf("职工 %d 号:", i + 1);
        scanf("%d", &employees[i].id);
    }

    // 排序
    sort_employees(employees, EMPLOYEES);

    // 输出排序后的结果
    printf("\n按职工号排序后的信息:\n");
    for (int i = 0; i < EMPLOYEES; i++) {
        printf("职工号: %d, 姓名: %s\n", employees[i].id, employees[i].name);
    }

    // 输入要查找的职工号
    printf("\n请输入要查找的职工号:");
    scanf("%d", &searchId);

    // 折半查找
    index = binary_search(employees, EMPLOYEES, searchId);
    if (index != -1) {
        printf("职工号 %d 的职工姓名为 %s\n", searchId, employees[index].name);
    } else {
        printf("未找到职工号 %d\n", searchId);
    }

    return 0;
}

16.写一个函数,输入一个16进制数,输出对应的十进制数
#include <stdio.h>
#include <math.h>

// 将16进制数转换为10进制数
int hex_to_decimal(char hex[]) {
    int len = strlen(hex);
    int base = 1;
    int dec_val = 0;

    for (int i = len - 1; i >= 0; i--) {
        if (hex[i] >= '0' && hex[i] <= '9') {
            dec_val += (hex[i] - '0') * base;
            base = base * 16;
        } else if (hex[i] >= 'A' && hex[i] <= 'F') {
            dec_val += (hex[i] - 'A' + 10) * base;
            base = base * 16;
        } else if (hex[i] >= 'a' && hex[i] <= 'f') {
            dec_val += (hex[i] - 'a' + 10) * base;
            base = base * 16;
        }
    }
    return dec_val;
}

int main() {
    char hex[20];

    printf("请输入一个16进制数:");
    scanf("%s", hex);

    printf("对应的10进制数为:%d\n", hex_to_decimal(hex));

    return 0;
}

17.用递归法将一个整数n转换成字符串。

例如输入483应输出字符串"483"。n的位数不确定,可以是任意位数的正数

#include <stdio.h>

// 递归将整数转换为字符串
void int_to_string(int n, char str[], int *index) {
    if (n == 0) {
        if (*index == 0) {  // 如果n为0,需要处理边界情况
            str[(*index)++] = '0';
        }
        str[*index] = '\0';
        return;
    }

    int digit = n % 10;  // 取得最后一位数字
    int_to_string(n / 10, str, index);  // 递归调用处理剩余部分
    str[(*index)++] = digit + '0';  // 将数字转换为字符并存入字符串
}

int main() {
    int n;
    char str[20];  // 假设整数不会超过20位
    int index = 0;

    printf("请输入一个正整数:");
    scanf("%d", &n);

    int_to_string(n, str, &index);

    printf("转换后的字符串为:%s\n", str);

    return 0;
}

18.给出年月日,计算该日是第几天,自定义函数
#include <stdio.h>

// 判断是否为闰年
int is_leap_year(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

// 计算该日是第几天
int day_of_year(int year, int month, int day) {
    int days_in_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

    if (is_leap_year(year)) {
        days_in_month[1] = 29;  // 闰年2月有29天
    }

    int day_of_year = 0;
    for (int i = 0; i < month - 1; i++) {
        day_of_year += days_in_month[i];
    }
    day_of_year += day;

    return day_of_year;
}

int main() {
    int year, month, day;

    printf("请输入年月日(格式:YYYY MM DD):");
    scanf("%d %d %d", &year, &month, &day);

    int result = day_of_year(year, month, day);

    printf("%d年%d月%d日是该年的第%d天\n", year, month, day, result);

    return 0;
}

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值