控制语句练习题
14 . 控制语句练习题
1. 判断奇偶数
题目描述: 编写一个 C 程序,输入一个整数,判断该数是奇数还是偶数,并输出结果。
解题思路:
要判断一个整数是奇数还是偶数,可以利用取模运算符(%)。如果一个数对 2 取余为 0,则是偶数;否则是奇数。程序流程如下:
- 提示用户输入一个整数。
- 使用
scanf函数读取用户输入的整数。 - 使用
if-else语句判断该整数对 2 取余的结果。 - 根据判断结果输出相应的消息。
详细代码:
#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用于存储用户输入。printf和scanf:用于提示和读取用户输入。if (num % 2 == 0):判断num对 2 取余是否等于 0,若是,则为偶数。printf:根据判断结果输出相应的信息。return 0;:程序结束,返回 0 表示正常退出。
2. 计算 1 到 N 的和
题目描述:
编写一个 C 程序,输入一个正整数 N,使用for循环计算并输出从 1 到 N 的所有整数的和。
解题思路: 要计算从 1 到 N 的和,可以使用一个循环变量从 1 遍历到 N,每次将循环变量的值累加到总和中。程序流程如下:
- 提示用户输入一个正整数 N。
- 使用
scanf函数读取 N 的值。 - 使用
for循环从 1 遍历到 N,将每个数累加到sum变量中。 - 输出最终的和。
详细代码:
#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 整除。
解题思路: 根据闰年的定义,可以使用条件判断语句来确定输入的年份是否满足闰年的条件。程序流程如下:
- 提示用户输入一个年份。
- 使用
scanf函数读取年份。 - 使用
if-else语句判断年份是否满足闰年的条件。 - 输出判断结果。
详细代码:
#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 程序,输入三个整数,找出其中最大的数并输出。
解题思路: 要找出三个数中的最大值,可以通过连续比较的方法实现。程序流程如下:
- 提示用户输入三个整数。
- 使用
scanf函数读取三个数。 - 假设第一个数为最大值。
- 依次将第二个和第三个数与当前最大值比较,并更新最大值。
- 输出最终的最大值。
详细代码:
#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;:声明三个整数变量a、b、c用于存储用户输入,max用于存储最大值。max = a;:初始假设a为最大值。if(b > max):如果b大于当前的max,则更新max为b。if(c > max):如果c大于当前的max,则更新max为c。printf:输出最终的最大值。
5. 计算阶乘
题目描述:
编写一个 C 程序,输入一个非负整数 N,使用while循环计算并输出 N 的阶乘。
解题思路:
阶乘的定义是从 1 到 N 所有正整数的乘积。使用while循环可以逐步计算阶乘。程序流程如下:
- 提示用户输入一个非负整数 N。
- 使用
scanf函数读取 N 的值。 - 判断 N 是否为负数,若是,则输出错误信息。
- 初始化阶乘结果为 1。
- 使用
while循环,从 1 遍历到 N,每次将循环变量乘到阶乘结果中。 - 输出最终的阶乘值。
详细代码:
#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 到当前行数)。程序流程如下:
- 使用外层
for循环从 1 遍历到 9,控制乘数的大小。 - 内层
for循环从 1 遍历到当前的乘数,计算并输出乘积。 - 每完成一行的输出后,换行。
详细代码:
#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 到该数的一半进行除法运算,如果能被整除,则不是素数。程序流程如下:
- 提示用户输入一个整数。
- 使用
scanf函数读取该整数。 - 判断该数是否小于等于 1,若是,则不是素数。
- 使用
for循环从 2 到该数的一半,检查是否存在能整除该数的数。 - 根据判断结果输出是否为素数。
详细代码:
#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语句可以根据用户的选择执行不同的操作。程序流程如下:
- 显示菜单选项(加法、减法、乘法、除法)。
- 提示用户输入选择的操作编号。
- 提示用户输入两个操作数。
- 使用
switch语句根据用户的选择执行相应的运算。 - 处理除数为零的特殊情况。
- 输出运算结果或错误信息。
详细代码:
#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;:声明双精度浮点数num1和num2用于存储操作数。switch(choice):根据choice的值执行不同的case。case 1到case 4:分别对应加法、减法、乘法和除法操作。if(num2 != 0):在除法操作中,检查除数是否为零,避免除零错误。default:处理用户输入的无效选择。
9. 打印菱形图案
题目描述: 编写一个 C 程序,输入一个奇数 N,打印一个由星号组成的菱形图案。
解题思路: 菱形图案可以分为上半部分和下半部分。根据输入的奇数 N,计算菱形的中间行,并分别打印上半部分和下半部分。程序流程如下:
- 提示用户输入一个奇数 N。
- 使用
scanf函数读取 N 的值。 - 检查 N 是否为奇数,若不是则输出错误信息。
- 计算菱形的中间行位置。
- 使用
for循环打印上半部分。 - 使用
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。
- 外层循环控制行数从 1 到
-
第二组
for循环(下半部分):
- 外层循环控制行数从
mid-1递减到 1。 - 内层两个
for循环的作用同上半部分。
- 外层循环控制行数从
10. 求数组中最大和最小值
题目描述:
编写一个 C 程序,输入一组整数,存储在数组中,使用for循环遍历数组,找出其中的最大值和最小值并输出。
解题思路: 要找出数组中的最大值和最小值,可以先假设第一个元素为最大值和最小值,然后遍历数组,逐一比较并更新最大值和最小值。程序流程如下:
- 提示用户输入数组的大小。
- 使用
scanf函数读取数组大小。 - 声明数组并提示用户输入各个元素。
- 初始化
max和min为数组的第一个元素。 - 使用
for循环遍历数组,比较并更新max和min。 - 输出最大值和最小值。
详细代码:
#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];:初始化max和min为数组的第一个元素。if(arr[i] > max):如果当前元素大于max,则更新max。if(arr[i] < min):如果当前元素小于min,则更新min。printf:输出数组中的最大值和最小值。
11. 判断闰年并输出二月天数
题目描述: 编写一个 C 程序,输入一个年份,判断该年份是否为闰年,并输出二月的天数(闰年为 29 天,平年为 28 天)。
解题思路: 基于闰年的定义,判断年份是否为闰年后,输出二月的天数。程序流程如下:
- 提示用户输入一个年份。
- 使用
scanf函数读取年份。 - 使用
if-else语句判断是否为闰年。 - 根据判断结果输出二月的天数。
详细代码:
#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 值的范围,可以判断体重状态。程序流程如下:
- 提示用户输入身高和体重。
- 使用
scanf函数读取身高和体重。 - 计算 BMI 值。
- 使用
if-else语句根据 BMI 值判断体重状态。 - 输出 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;:声明双精度浮点数变量height、weight和bmi。 -
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循环让用户反复猜测,直到猜中为止。需要包含随机数库,并使用时间作为种子。程序流程如下:
- 包含必要的库(
stdlib.h和time.h)。 - 使用
srand(time(0))设置随机数种子。 - 生成一个 1 到 100 之间的随机数作为目标数字。
- 使用
do-while循环,提示用户猜测数字。 - 根据用户的猜测与目标数字比较,提示“猜高了”或“猜低了”。
- 当猜中时,输出恭喜信息并结束循环。
详细代码:
#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循环计算并输出这些元素的平均值。
解题思路: 计算数组元素的平均值需要先计算所有元素的总和,然后除以元素的数量。程序流程如下:
- 提示用户输入数组的大小。
- 使用
scanf函数读取数组大小。 - 声明数组并提示用户输入各个元素。
- 使用
for循环遍历数组,累加元素值。 - 计算平均值。
- 输出平均值。
详细代码:
#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,使用for或while循环输出斐波那契数列的前 N 项。
解题思路: 斐波那契数列的定义是前两项为 0 和 1,后续每一项都是前两项之和。程序流程如下:
- 提示用户输入要输出的斐波那契数列的项数 N。
- 使用
scanf函数读取 N 的值。 - 检查 N 是否为正整数,若不是则输出错误信息。
- 初始化前两项
first和second。 - 使用
for循环或while循环,依次计算和输出每一项。 - 输出斐波那契数列。
详细代码:
#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 月需要考虑是否为闰年。此外,还需要累计该月份之前所有月份的天数,最终计算出累计的总天数。程序流程如下:
- 提示用户输入年份和月份。
- 使用
scanf函数读取年份和月份。 - 判断输入的月份是否有效(1-12)。
- 使用
switch语句确定该月份的天数,2 月需要判断是否为闰年。 - 使用另一个
for循环,从 1 到输入的月份之前,累加每个月的天数。 - 最后,加上输入月份的天数,得到累计总天数。
- 输出结果。
详细代码:
#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循环可以实现菜单的重复显示和用户选择,直到用户选择退出。程序流程如下:
- 使用
do-while循环,确保菜单至少显示一次。 - 在循环内,显示菜单选项并提示用户选择。
- 使用
scanf函数读取用户的选择。 - 使用
switch语句根据选择执行相应操作。 - 当用户选择退出时,结束循环。
详细代码:
#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-else或switch控制语句。
解题思路:
通过用户输入运算符,使用switch语句选择对应的运算,并处理除数为零的情况。程序流程如下:
- 提示用户输入一个算术表达式,例如:3 + 4。
- 使用
scanf函数读取两个数和运算符。 - 使用
switch语句根据运算符执行相应的运算。 - 处理除数为零的特殊情况。
- 输出运算结果或错误信息。
详细代码:
#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 程序,输入三角形的三边长度,判断并输出该三角形的类型(等边三角形、等腰三角形、普通三角形或无效三角形)。
解题思路: 根据三角形的三边长度,可以通过以下步骤判断其类型:
- 首先判断三边是否满足构成三角形的条件(任意两边之和大于第三边)。
- 如果是有效的三角形,再判断是否为等边三角形(三边相等)。
- 如果不是等边三角形,判断是否为等腰三角形(任意两边相等)。
- 否则,为普通三角形。
程序流程如下:
- 提示用户输入三角形的三边长度。
- 使用
scanf函数读取三边长度。 - 判断三边是否满足三角形不等式。
- 根据相等关系判断三角形的类型。
- 输出判断结果。
详细代码:
#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)。
解题思路: 与标准的九九乘法表类似,但循环顺序是从大到小。程序流程如下:
- 使用外层
for循环从 9 递减到 1,控制乘数的大小。 - 内层
for循环从 9 递减到 1,控制被乘数的大小。 - 为了保持格式一致,只输出
j × i的结果,当j <= i时输出,否则跳过。 - 每完成一行的输出后,换行。
详细代码:
#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×3和3×2)。printf("%d×%d=%2d ", j, i, i*j);:格式化输出乘法表达式和结果,确保对齐。printf("\n");:完成一行后换行。