控制语句练习题

Tutorial: 教程一 Category: C语言 Published: 2026-04-07 13:58:26 Views: 21 Likes: 0 Comments: 0
14 . 控制语句练习题
1. 判断奇偶数

题目描述: 编写一个 C 程序,输入一个整数,判断该数是奇数还是偶数,并输出结果。

解题思路: 要判断一个整数是奇数还是偶数,可以利用取模运算符(%)。如果一个数对 2 取余为 0,则是偶数;否则是奇数。程序流程如下:

  1. 提示用户输入一个整数。
  2. 使用scanf函数读取用户输入的整数。
  3. 使用if-else语句判断该整数对 2 取余的结果。
  4. 根据判断结果输出相应的消息。

详细代码:

#include <stdio.h>

int main() {
    int num;

    // 提示用户输入一个整数
    printf("请输入一个整数: ");
    scanf("%d", &num);

    // 判断该整数是奇数还是偶数
    if (num % 2 == 0) {
        printf("%d 是偶数。\n", num);
    } else {
        printf("%d 是奇数。\n", num);
    }

    return 0;
}

代码注释:

  • #include <stdio.h>:包含标准输入输出库。
  • int main():主函数,程序入口点。
  • int num;:声明一个整数变量num用于存储用户输入。
  • printfscanf:用于提示和读取用户输入。
  • if (num % 2 == 0):判断num对 2 取余是否等于 0,若是,则为偶数。
  • printf:根据判断结果输出相应的信息。
  • return 0;:程序结束,返回 0 表示正常退出。
2. 计算 1 到 N 的和

题目描述: 编写一个 C 程序,输入一个正整数 N,使用for循环计算并输出从 1 到 N 的所有整数的和。

解题思路: 要计算从 1 到 N 的和,可以使用一个循环变量从 1 遍历到 N,每次将循环变量的值累加到总和中。程序流程如下:

  1. 提示用户输入一个正整数 N。
  2. 使用scanf函数读取 N 的值。
  3. 使用for循环从 1 遍历到 N,将每个数累加到sum变量中。
  4. 输出最终的和。

详细代码:

#include <stdio.h>

int main() {
    int N, sum = 0;

    // 提示用户输入一个正整数N
    printf("请输入一个正整数N: ");
    scanf("%d", &N);

    // 使用for循环计算从1到N的和
    for(int i = 1; i <= N; i++) {
        sum += i; // 将当前数累加到sum
    }

    // 输出结果
    printf("1到%d的和是 %d。\n", N, sum);

    return 0;
}

代码注释:

  • int N, sum = 0;:声明整数变量N用于存储用户输入,sum初始化为 0 用于累加。
  • for(int i = 1; i <= N; i++):循环变量i从 1 开始,直到i大于 N。
  • sum += i;:将当前循环变量i的值累加到sum中。
  • printf:输出从 1 到 N 的和。
3. 判断闰年

题目描述: 编写一个 C 程序,输入一个年份,判断该年份是否为闰年,并输出结果。闰年的判断规则如下:

  • 能被 4 整除且不能被 100 整除,或者能被 400 整除。

解题思路: 根据闰年的定义,可以使用条件判断语句来确定输入的年份是否满足闰年的条件。程序流程如下:

  1. 提示用户输入一个年份。
  2. 使用scanf函数读取年份。
  3. 使用if-else语句判断年份是否满足闰年的条件。
  4. 输出判断结果。

详细代码:

#include <stdio.h>

int main() {
    int year;

    // 提示用户输入年份
    printf("请输入年份: ");
    scanf("%d", &year);

    // 判断是否为闰年
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
        printf("%d 是闰年。\n", year);
    } else {
        printf("%d 不是闰年。\n", year);
    }

    return 0;
}

代码注释:

  • int year;:声明一个整数变量year用于存储用户输入的年份。
  • if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)):判断年份是否能被 4 整除且不能被 100 整除,或者能被 400 整除。
  • printf:根据判断结果输出是否为闰年的信息。
4. 找出最大数

题目描述: 编写一个 C 程序,输入三个整数,找出其中最大的数并输出。

解题思路: 要找出三个数中的最大值,可以通过连续比较的方法实现。程序流程如下:

  1. 提示用户输入三个整数。
  2. 使用scanf函数读取三个数。
  3. 假设第一个数为最大值。
  4. 依次将第二个和第三个数与当前最大值比较,并更新最大值。
  5. 输出最终的最大值。

详细代码:

#include <stdio.h>

int main() {
    int a, b, c, max;

    // 提示用户输入三个整数
    printf("请输入三个整数: ");
    scanf("%d %d %d", &a, &b, &c);

    // 假设a为最大值
    max = a;

    // 比较b和max
    if(b > max) {
        max = b;
    }

    // 比较c和max
    if(c > max) {
        max = c;
    }

    // 输出最大的数
    printf("最大的数是 %d。\n", max);

    return 0;
}

代码注释:

  • int a, b, c, max;:声明三个整数变量abc用于存储用户输入,max用于存储最大值。
  • max = a;:初始假设a为最大值。
  • if(b > max):如果b大于当前的max,则更新maxb
  • if(c > max):如果c大于当前的max,则更新maxc
  • printf:输出最终的最大值。
5. 计算阶乘

题目描述: 编写一个 C 程序,输入一个非负整数 N,使用while循环计算并输出 N 的阶乘。

解题思路: 阶乘的定义是从 1 到 N 所有正整数的乘积。使用while循环可以逐步计算阶乘。程序流程如下:

  1. 提示用户输入一个非负整数 N。
  2. 使用scanf函数读取 N 的值。
  3. 判断 N 是否为负数,若是,则输出错误信息。
  4. 初始化阶乘结果为 1。
  5. 使用while循环,从 1 遍历到 N,每次将循环变量乘到阶乘结果中。
  6. 输出最终的阶乘值。

详细代码:

#include <stdio.h>

int main() {
    int N;
    unsigned long long factorial = 1; // 使用unsigned long long存储大数

    // 提示用户输入一个非负整数N
    printf("请输入一个非负整数N: ");
    scanf("%d", &N);

    // 检查N是否为负数
    if(N < 0) {
        printf("阶乘不存在。\n");
        return 1; // 非正常退出
    }

    int i = 1;
    // 使用while循环计算阶乘
    while(i <= N) {
        factorial *= i; // 将当前数乘到阶乘结果中
        i++;
    }

    // 输出结果
    printf("%d 的阶乘是 %llu。\n", N, factorial);

    return 0;
}

代码注释:

  • unsigned long long factorial = 1;:使用unsigned long long类型来存储可能较大的阶乘结果,初始化为 1。
  • if(N < 0):判断输入的 N 是否为负数,若是则输出错误信息并退出程序。
  • int i = 1;:初始化循环变量i为 1。
  • while(i <= N):循环从 1 到 N,每次将i乘到factorial中。
  • printf:输出 N 的阶乘。
6. 生成九九乘法表

题目描述: 编写一个 C 程序,使用嵌套for循环生成并输出标准的九九乘法表。

解题思路: 九九乘法表是一个典型的嵌套循环应用。外层循环控制行数(1 到 9),内层循环控制每行的列数(1 到当前行数)。程序流程如下:

  1. 使用外层for循环从 1 遍历到 9,控制乘数的大小。
  2. 内层for循环从 1 遍历到当前的乘数,计算并输出乘积。
  3. 每完成一行的输出后,换行。

详细代码:

#include <stdio.h>

int main() {
    // 外层循环控制乘数i从1到9
    for(int i = 1; i <= 9; i++) {
        // 内层循环控制被乘数j从1到i
        for(int j = 1; j <= i; j++) {
            // 输出乘法表达式和结果,格式化对齐
            printf("%d×%d=%2d  ", j, i, i*j);
        }
        printf("\n"); // 换行
    }
    return 0;
}

代码注释:

  • for(int i = 1; i <= 9; i++):外层循环控制乘数i从 1 到 9。
  • for(int j = 1; j <= i; j++):内层循环控制被乘数j从 1 到i,确保每行的列数与行数一致。
  • printf("%d×%d=%2d ", j, i, i*j);:输出格式为j×i=结果%2d保证结果对齐。
  • printf("\n");:完成一行后换行。
7. 判断素数

题目描述: 编写一个 C 程序,输入一个整数,判断该数是否为素数,并输出结果。

解题思路: 素数是只能被 1 和它本身整除的自然数。判断一个数是否为素数,可以尝试用从 2 到该数的一半进行除法运算,如果能被整除,则不是素数。程序流程如下:

  1. 提示用户输入一个整数。
  2. 使用scanf函数读取该整数。
  3. 判断该数是否小于等于 1,若是,则不是素数。
  4. 使用for循环从 2 到该数的一半,检查是否存在能整除该数的数。
  5. 根据判断结果输出是否为素数。

详细代码:

#include <stdio.h>

int main() {
    int num, i, isPrime = 1; // isPrime假设为1表示是素数

    // 提示用户输入一个整数
    printf("请输入一个整数: ");
    scanf("%d", &num);

    // 判断num是否小于等于1
    if(num <= 1) {
        isPrime = 0; // 不是素数
    } else {
        // 从2到num/2检查是否能整除
        for(i = 2; i <= num/2; i++) {
            if(num % i == 0) {
                isPrime = 0; // 存在因数,不是素数
                break; // 提前退出循环
            }
        }
    }

    // 输出判断结果
    if(isPrime) {
        printf("%d 是素数。\n", num);
    } else {
        printf("%d 不是素数。\n", num);
    }

    return 0;
}

代码注释:

  • int num, i, isPrime = 1;:声明整数变量num用于存储用户输入,i作为循环变量,isPrime标志是否为素数,初始化为 1。
  • if(num <= 1):素数定义为大于 1 的整数,若num小于等于 1,则不是素数。
  • for(i = 2; i <= num/2; i++):从 2 遍历到num/2,检查是否有因数。
  • if(num % i == 0):如果num能被i整除,则不是素数,设置isPrime为 0,并使用break退出循环。
  • if(isPrime):根据isPrime的值输出是否为素数。
8. 使用switch进行菜单选择

题目描述: 编写一个 C 程序,提供一个简单的菜单让用户选择不同的操作(如加法、减法、乘法、除法),根据用户的选择进行相应的计算。

解题思路: 利用switch语句可以根据用户的选择执行不同的操作。程序流程如下:

  1. 显示菜单选项(加法、减法、乘法、除法)。
  2. 提示用户输入选择的操作编号。
  3. 提示用户输入两个操作数。
  4. 使用switch语句根据用户的选择执行相应的运算。
  5. 处理除数为零的特殊情况。
  6. 输出运算结果或错误信息。

详细代码:

#include <stdio.h>

int main() {
    int choice;
    double num1, num2;

    // 显示菜单选项
    printf("选择运算:\n");
    printf("1. 加法\n");
    printf("2. 减法\n");
    printf("3. 乘法\n");
    printf("4. 除法\n");
    printf("请输入选择(1-4): ");
    scanf("%d", &choice);

    // 提示用户输入两个数
    printf("请输入两个数: ");
    scanf("%lf %lf", &num1, &num2);

    // 根据选择执行相应的运算
    switch(choice) {
        case 1:
            printf("结果: %.2lf\n", num1 + num2);
            break;
        case 2:
            printf("结果: %.2lf\n", num1 - num2);
            break;
        case 3:
            printf("结果: %.2lf\n", num1 * num2);
            break;
        case 4:
            if(num2 != 0)
                printf("结果: %.2lf\n", num1 / num2);
            else
                printf("除数不能为零。\n");
            break;
        default:
            printf("无效的选择。\n");
    }

    return 0;
}

代码注释:

  • int choice;:声明整数变量choice用于存储用户的菜单选择。
  • double num1, num2;:声明双精度浮点数num1num2用于存储操作数。
  • switch(choice):根据choice的值执行不同的case
  • case 1case 4:分别对应加法、减法、乘法和除法操作。
  • if(num2 != 0):在除法操作中,检查除数是否为零,避免除零错误。
  • default:处理用户输入的无效选择。
9. 打印菱形图案

题目描述: 编写一个 C 程序,输入一个奇数 N,打印一个由星号组成的菱形图案。

解题思路: 菱形图案可以分为上半部分和下半部分。根据输入的奇数 N,计算菱形的中间行,并分别打印上半部分和下半部分。程序流程如下:

  1. 提示用户输入一个奇数 N。
  2. 使用scanf函数读取 N 的值。
  3. 检查 N 是否为奇数,若不是则输出错误信息。
  4. 计算菱形的中间行位置。
  5. 使用for循环打印上半部分。
  6. 使用for循环打印下半部分。

详细代码:

#include <stdio.h>

int main() {
    int N;

    // 提示用户输入一个奇数N
    printf("请输入一个奇数N: ");
    scanf("%d", &N);

    // 检查N是否为奇数
    if(N % 2 == 0) {
        printf("请输入一个奇数。\n");
        return 1; // 非正常退出
    }

    int mid = N / 2 + 1; // 中间行的位置

    // 打印上半部分
    for(int i = 1; i <= mid; i++) {
        int stars = i; // 当前行星号数
        // 打印空格
        for(int j = 1; j <= mid - stars; j++) {
            printf(" ");
        }
        // 打印星号
        for(int j = 1; j <= 2 * stars -1; j++) {
            printf("*");
        }
        printf("\n"); // 换行
    }

    // 打印下半部分
    for(int i = mid-1; i >=1; i--) {
        int stars = i; // 当前行星号数
        // 打印空格
        for(int j = 1; j <= mid - stars; j++) {
            printf(" ");
        }
        // 打印星号
        for(int j = 1; j <= 2 * stars -1; j++) {
            printf("*");
        }
        printf("\n"); // 换行
    }

    return 0;
}

代码注释:

  • int mid = N / 2 + 1;:计算菱形的中间行位置。

  • 第一组

    for
    

    循环(上半部分):

    • 外层循环控制行数从 1 到mid
    • 内层第一个for循环打印空格,数量为mid - stars
    • 内层第二个for循环打印星号,数量为2 * stars -1
  • 第二组

    for
    

    循环(下半部分):

    • 外层循环控制行数从mid-1递减到 1。
    • 内层两个for循环的作用同上半部分。
10. 求数组中最大和最小值

题目描述: 编写一个 C 程序,输入一组整数,存储在数组中,使用for循环遍历数组,找出其中的最大值和最小值并输出。

解题思路: 要找出数组中的最大值和最小值,可以先假设第一个元素为最大值和最小值,然后遍历数组,逐一比较并更新最大值和最小值。程序流程如下:

  1. 提示用户输入数组的大小。
  2. 使用scanf函数读取数组大小。
  3. 声明数组并提示用户输入各个元素。
  4. 初始化maxmin为数组的第一个元素。
  5. 使用for循环遍历数组,比较并更新maxmin
  6. 输出最大值和最小值。

详细代码:

#include <stdio.h>

int main() {
    int n;

    // 提示用户输入数组的大小
    printf("请输入数组的大小: ");
    scanf("%d", &n);

    int arr[n];

    // 提示用户输入数组元素
    printf("请输入 %d 个整数:\n", n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    // 初始化max和min为第一个元素
    int max = arr[0], min = arr[0];

    // 遍历数组寻找最大值和最小值
    for(int i = 1; i < n; i++) {
        if(arr[i] > max)
            max = arr[i];
        if(arr[i] < min)
            min = arr[i];
    }

    // 输出结果
    printf("最大值是 %d,最小值是 %d。\n", max, min);

    return 0;
}

代码注释:

  • int n;:声明整数变量n用于存储数组的大小。
  • int arr[n];:声明一个大小为n的整数数组。
  • for(int i = 0; i < n; i++):循环读取数组的各个元素。
  • int max = arr[0], min = arr[0];:初始化maxmin为数组的第一个元素。
  • if(arr[i] > max):如果当前元素大于max,则更新max
  • if(arr[i] < min):如果当前元素小于min,则更新min
  • printf:输出数组中的最大值和最小值。
11. 判断闰年并输出二月天数

题目描述: 编写一个 C 程序,输入一个年份,判断该年份是否为闰年,并输出二月的天数(闰年为 29 天,平年为 28 天)。

解题思路: 基于闰年的定义,判断年份是否为闰年后,输出二月的天数。程序流程如下:

  1. 提示用户输入一个年份。
  2. 使用scanf函数读取年份。
  3. 使用if-else语句判断是否为闰年。
  4. 根据判断结果输出二月的天数。

详细代码:

#include <stdio.h>

int main() {
    int year;

    // 提示用户输入年份
    printf("请输入年份: ");
    scanf("%d", &year);

    // 判断是否为闰年并输出二月天数
    if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
        printf("%d 是闰年,二月有29天。\n", year);
    } else {
        printf("%d 不是闰年,二月有28天。\n", year);
    }

    return 0;
}

代码注释:

  • int year;:声明一个整数变量year用于存储用户输入的年份。
  • if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)):判断是否为闰年。
  • printf:根据判断结果输出对应年份二月的天数。
12. 计算 BMI 指数

题目描述: 编写一个 C 程序,输入用户的身高(米)和体重(公斤),计算并输出 BMI 指数,并根据 BMI 值判断体重状态(偏瘦、正常、超重)。

解题思路: BMI(体质指数)的计算公式为:BMI = 体重(kg) / (身高(m) × 身高(m))。根据 BMI 值的范围,可以判断体重状态。程序流程如下:

  1. 提示用户输入身高和体重。
  2. 使用scanf函数读取身高和体重。
  3. 计算 BMI 值。
  4. 使用if-else语句根据 BMI 值判断体重状态。
  5. 输出 BMI 值和体重状态。

详细代码:

#include <stdio.h>

int main() {
    double height, weight, bmi;

    // 提示用户输入身高和体重
    printf("请输入身高(米)和体重(公斤): ");
    scanf("%lf %lf", &height, &weight);

    // 计算BMI指数
    bmi = weight / (height * height);
    printf("BMI指数是: %.2lf\n", bmi);

    // 判断体重状态
    if(bmi < 18.5) {
        printf("体重状态: 偏瘦。\n");
    } else if(bmi < 24.9) {
        printf("体重状态: 正常。\n");
    } else {
        printf("体重状态: 超重。\n");
    }

    return 0;
}

代码注释:

  • double height, weight, bmi;:声明双精度浮点数变量heightweightbmi

  • bmi = weight / (height * height);:计算 BMI 指数。

  • if-else
    

    语句:根据 BMI 值判断体重状态。

    • BMI < 18.5:偏瘦
    • 18.5 ≤ BMI < 24.9:正常
    • BMI ≥ 24.9:超重
  • printf:输出 BMI 指数和体重状态。

13. 简单猜数字游戏

题目描述: 编写一个 C 程序,实现一个简单的猜数字游戏。程序随机生成一个 1 到 100 之间的整数,用户输入猜测的数字,程序提示猜高了还是猜低了,直到猜中为止。

解题思路: 使用随机数生成目标数字,利用do-while循环让用户反复猜测,直到猜中为止。需要包含随机数库,并使用时间作为种子。程序流程如下:

  1. 包含必要的库(stdlib.htime.h)。
  2. 使用srand(time(0))设置随机数种子。
  3. 生成一个 1 到 100 之间的随机数作为目标数字。
  4. 使用do-while循环,提示用户猜测数字。
  5. 根据用户的猜测与目标数字比较,提示“猜高了”或“猜低了”。
  6. 当猜中时,输出恭喜信息并结束循环。

详细代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    int target, guess;

    // 初始化随机数生成器
    srand(time(0));
    target = rand() % 100 + 1; // 生成1到100之间的随机数

    printf("猜数字游戏开始!猜一个1到100之间的整数。\n");

    // 猜测循环
    do {
        printf("请输入你的猜测: ");
        scanf("%d", &guess);

        if(guess > target) {
            printf("猜高了。\n");
        } else if(guess < target) {
            printf("猜低了。\n");
        } else {
            printf("恭喜你,猜对了!\n");
        }
    } while(guess != target);

    return 0;
}

代码注释:

  • #include <stdlib.h>#include <time.h>:包含生成随机数和时间函数的库。
  • srand(time(0));:用当前时间作为随机数种子,确保每次运行程序生成不同的随机数。
  • target = rand() % 100 + 1;:生成 1 到 100 之间的随机数。
  • do-while循环:确保至少进行一次猜测,并在猜不中时继续循环。
  • if-else语句:根据猜测结果给出提示。
14. 计算数组元素的平均值

题目描述: 编写一个 C 程序,输入一组整数存储在数组中,使用for循环计算并输出这些元素的平均值。

解题思路: 计算数组元素的平均值需要先计算所有元素的总和,然后除以元素的数量。程序流程如下:

  1. 提示用户输入数组的大小。
  2. 使用scanf函数读取数组大小。
  3. 声明数组并提示用户输入各个元素。
  4. 使用for循环遍历数组,累加元素值。
  5. 计算平均值。
  6. 输出平均值。

详细代码:

#include <stdio.h>

int main() {
    int n;
    double sum = 0.0, average;

    // 提示用户输入数组的大小
    printf("请输入数组的大小: ");
    scanf("%d", &n);

    int arr[n];

    // 提示用户输入数组元素
    printf("请输入 %d 个整数:\n", n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
        sum += arr[i]; // 累加元素值
    }

    // 计算平均值
    average = sum / n;

    // 输出结果
    printf("数组元素的平均值是 %.2lf。\n", average);

    return 0;
}

代码注释:

  • double sum = 0.0, average;:声明双精度浮点数变量sum用于累加,average用于存储平均值。
  • for(int i = 0; i < n; i++):循环读取数组元素,并累加到sum中。
  • average = sum / n;:计算平均值。
  • printf:输出数组元素的平均值。
15. 输出斐波那契数列

题目描述: 编写一个 C 程序,输入一个整数 N,使用forwhile循环输出斐波那契数列的前 N 项。

解题思路: 斐波那契数列的定义是前两项为 0 和 1,后续每一项都是前两项之和。程序流程如下:

  1. 提示用户输入要输出的斐波那契数列的项数 N。
  2. 使用scanf函数读取 N 的值。
  3. 检查 N 是否为正整数,若不是则输出错误信息。
  4. 初始化前两项firstsecond
  5. 使用for循环或while循环,依次计算和输出每一项。
  6. 输出斐波那契数列。

详细代码:

#include <stdio.h>

int main() {
    int N;

    // 提示用户输入要输出的斐波那契数列的项数
    printf("请输入要输出的斐波那契数列的项数: ");
    scanf("%d", &N);

    // 检查N是否为正整数
    if(N <= 0) {
        printf("请输入一个正整数。\n");
        return 1; // 非正常退出
    }

    long long first = 0, second = 1, next;
    printf("斐波那契数列: ");

    // 使用for循环输出斐波那契数列
    for(int i = 1; i <= N; i++) {
        printf("%lld ", first); // 输出当前项
        next = first + second;   // 计算下一项
        first = second;          // 更新前两项
        second = next;
    }
    printf("\n");

    return 0;
}

代码注释:

  • long long first = 0, second = 1, next;:声明并初始化斐波那契数列的前两项。
  • for(int i = 1; i <= N; i++):循环控制输出 N 项。
  • printf("%lld ", first);:输出当前斐波那契数。
  • next = first + second;:计算下一项。
  • first = second;second = next;:更新前两项的值。
16. 判断闰年的 2 月天数并累计总天数

题目描述: 编写一个 C 程序,输入一个年份和月份,判断该月份的天数(考虑闰年 2 月的天数),并累计到该年份的总天数。

解题思路: 程序需要判断输入的月份对应的天数,特别是 2 月需要考虑是否为闰年。此外,还需要累计该月份之前所有月份的天数,最终计算出累计的总天数。程序流程如下:

  1. 提示用户输入年份和月份。
  2. 使用scanf函数读取年份和月份。
  3. 判断输入的月份是否有效(1-12)。
  4. 使用switch语句确定该月份的天数,2 月需要判断是否为闰年。
  5. 使用另一个for循环,从 1 到输入的月份之前,累加每个月的天数。
  6. 最后,加上输入月份的天数,得到累计总天数。
  7. 输出结果。

详细代码:

#include <stdio.h>

int main() {
    int year, month, days, totalDays = 0;

    // 提示用户输入年份和月份
    printf("请输入年份和月份: ");
    scanf("%d %d", &year, &month);

    // 判断月份天数
    switch(month) {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            days = 31;
            break;
        case 4: case 6: case 9: case 11:
            days = 30;
            break;
        case 2:
            // 判断是否为闰年
            if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
                days = 29;
            else
                days = 28;
            break;
        default:
            printf("无效的月份。\n");
            return 1; // 非正常退出
    }

    printf("%d年%d月有 %d 天。\n", year, month, days);

    // 累计总天数
    for(int m = 1; m < month; m++) {
        switch(m) {
            case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                totalDays += 31;
                break;
            case 4: case 6: case 9: case 11:
                totalDays += 30;
                break;
            case 2:
                if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
                    totalDays += 29;
                else
                    totalDays += 28;
                break;
        }
    }
    totalDays += days; // 加上当前月份的天数
    printf("%d年%d月的总天数累计到 %d 天。\n", year, month, totalDays);

    return 0;
}

代码注释:

  • int year, month, days, totalDays = 0;:声明变量用于存储年份、月份、当前月份天数和累计总天数。
  • 第一个switch(month):根据输入的月份确定该月份的天数,特别是 2 月需要根据是否为闰年调整天数。
  • 第二个for循环:从 1 遍历到month-1,累加每个月的天数。
  • 每个switch(m):与第一个switch类似,根据月份累加天数。
  • totalDays += days;:将当前月份的天数加到累计总天数中。
  • printf:输出当前月份的天数和累计的总天数。
17. 使用do-while实现菜单循环

题目描述: 编写一个 C 程序,实现一个菜单驱动的程序,用户可以反复选择不同的操作(如查看菜单、执行操作、退出),直到选择退出为止。使用do-while循环实现。

解题思路: 利用do-while循环可以实现菜单的重复显示和用户选择,直到用户选择退出。程序流程如下:

  1. 使用do-while循环,确保菜单至少显示一次。
  2. 在循环内,显示菜单选项并提示用户选择。
  3. 使用scanf函数读取用户的选择。
  4. 使用switch语句根据选择执行相应操作。
  5. 当用户选择退出时,结束循环。

详细代码:

#include <stdio.h>

int main() {
    int choice;

    // 菜单循环
    do {
        // 显示菜单
        printf("\n--- 菜单 ---\n");
        printf("1. 打印欢迎信息\n");
        printf("2. 显示当前年份\n");
        printf("3. 退出\n");
        printf("请选择(1-3): ");
        scanf("%d", &choice);

        // 根据选择执行操作
        switch(choice) {
            case 1:
                printf("欢迎使用程序!\n");
                break;
            case 2:
                printf("当前年份是2024年。\n");
                break;
            case 3:
                printf("退出程序。\n");
                break;
            default:
                printf("无效的选择,请重新选择。\n");
        }
    } while(choice != 3); // 当选择不是3时,继续循环

    return 0;
}

代码注释:

  • int choice;:声明整数变量choice用于存储用户的菜单选择。

  • do { ... } while(choice != 3);:循环体内显示菜单并处理选择,直到用户选择退出(选择 3)。

  • switch(choice)
    

    :根据用户的选择执行不同的操作。

    • case 1:打印欢迎信息。
    • case 2:显示当前年份。
    • case 3:打印退出信息并结束循环。
    • default:处理无效的选择,提示用户重新选择。
18. 实现简单的计算器

题目描述: 编写一个 C 程序,实现一个简单的计算器,可以进行加、减、乘、除四种运算。用户输入两个数和选择的运算符,程序输出结果。使用if-elseswitch控制语句。

解题思路: 通过用户输入运算符,使用switch语句选择对应的运算,并处理除数为零的情况。程序流程如下:

  1. 提示用户输入一个算术表达式,例如:3 + 4。
  2. 使用scanf函数读取两个数和运算符。
  3. 使用switch语句根据运算符执行相应的运算。
  4. 处理除数为零的特殊情况。
  5. 输出运算结果或错误信息。

详细代码:

#include <stdio.h>

int main() {
    double num1, num2, result;
    char operator;

    // 提示用户输入算术表达式
    printf("请输入一个算术表达式 (例如: 3 + 4): ");
    scanf("%lf %c %lf", &num1, &operator, &num2);

    // 根据运算符执行相应的运算
    switch(operator) {
        case '+':
            result = num1 + num2;
            printf("结果: %.2lf\n", result);
            break;
        case '-':
            result = num1 - num2;
            printf("结果: %.2lf\n", result);
            break;
        case '*':
            result = num1 * num2;
            printf("结果: %.2lf\n", result);
            break;
        case '/':
            if(num2 != 0) {
                result = num1 / num2;
                printf("结果: %.2lf\n", result);
            } else {
                printf("错误: 除数不能为零。\n");
            }
            break;
        default:
            printf("无效的运算符。\n");
    }

    return 0;
}

代码注释:

  • double num1, num2, result;:声明双精度浮点数变量用于存储操作数和结果。

  • char operator;:声明字符变量用于存储运算符。

  • scanf("%lf %c %lf", &num1, &operator, &num2);:读取用户输入的两个数和运算符。

  • switch(operator)
    

    :根据运算符执行相应的运算。

    • case '+'case '-'case '*':执行加、减、乘运算。
    • case '/':执行除法运算,并检查除数是否为零。
    • default:处理无效的运算符,提示用户输入错误。
19. 判断三角形类型

题目描述: 编写一个 C 程序,输入三角形的三边长度,判断并输出该三角形的类型(等边三角形、等腰三角形、普通三角形或无效三角形)。

解题思路: 根据三角形的三边长度,可以通过以下步骤判断其类型:

  1. 首先判断三边是否满足构成三角形的条件(任意两边之和大于第三边)。
  2. 如果是有效的三角形,再判断是否为等边三角形(三边相等)。
  3. 如果不是等边三角形,判断是否为等腰三角形(任意两边相等)。
  4. 否则,为普通三角形。

程序流程如下:

  1. 提示用户输入三角形的三边长度。
  2. 使用scanf函数读取三边长度。
  3. 判断三边是否满足三角形不等式。
  4. 根据相等关系判断三角形的类型。
  5. 输出判断结果。

详细代码:

#include <stdio.h>

int main() {
    double a, b, c;

    // 提示用户输入三角形的三边长度
    printf("请输入三角形的三边长度: ");
    scanf("%lf %lf %lf", &a, &b, &c);

    // 判断是否为有效三角形
    if(a + b > c && a + c > b && b + c > a) {
        if(a == b && b == c) {
            printf("这是一个等边三角形。\n");
        }
        else if(a == b || a == c || b == c) {
            printf("这是一个等腰三角形。\n");
        }
        else {
            printf("这是一个普通三角形。\n");
        }
    }
    else {
        printf("输入的边长无法构成一个三角形。\n");
    }

    return 0;
}

代码注释:

  • double a, b, c;:声明双精度浮点数变量用于存储三角形的三边长度。
  • if(a + b > c && a + c > b && b + c > a):判断三边是否满足三角形不等式。
  • if(a == b && b == c):判断是否为等边三角形。
  • else if(a == b || a == c || b == c):判断是否为等腰三角形。
  • else:如果以上条件都不满足,则为普通三角形。
  • printf:根据判断结果输出相应的三角形类型或错误信息。
20. 实现九九乘法表的倒序输出

题目描述: 编写一个 C 程序,使用嵌套for循环生成并输出九九乘法表,但以倒序的形式展示(从 9×9 到 1×1)。

解题思路: 与标准的九九乘法表类似,但循环顺序是从大到小。程序流程如下:

  1. 使用外层for循环从 9 递减到 1,控制乘数的大小。
  2. 内层for循环从 9 递减到 1,控制被乘数的大小。
  3. 为了保持格式一致,只输出j × i的结果,当j <= i时输出,否则跳过。
  4. 每完成一行的输出后,换行。

详细代码:

#include <stdio.h>

int main() {
    // 外层循环控制乘数i从9到1
    for(int i = 9; i >= 1; i--) {
        // 内层循环控制被乘数j从9到1
        for(int j = 9; j >= 1; j--) {
            if(i >= j) { // 只打印j <= i的情况,避免重复
                printf("%d×%d=%2d  ", j, i, i*j);
            }
        }
        printf("\n"); // 换行
    }
    return 0;
}

代码注释:

  • for(int i = 9; i >= 1; i--):外层循环控制乘数i从 9 递减到 1。
  • for(int j = 9; j >= 1; j--):内层循环控制被乘数j从 9 递减到 1。
  • if(i >= j):确保只打印j <= i的乘法结果,避免重复输出(如同时输出2×33×2)。
  • printf("%d×%d=%2d ", j, i, i*j);:格式化输出乘法表达式和结果,确保对齐。
  • printf("\n");:完成一行后换行。