实验2_C语言分支与循环基础应用编程
Task1 生成随机数
源代码:
点击查看代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 5
int main() {
int number;
int i;
srand(time(0)); //以当前系统时间作为随机种子
for (i = 0;i < N;++i) {
number = rand() % 100 + 1;
printf("20240042%04d\n", number);
}
return 0;
}
运行结果:

问题回答:
问题1:解释lin13代码的功能。
答:生成一个随机的整数,范围在1到100之间(包括1和100)。
问题2:解释line14使用格式符%04d起到什么作用。
答:格式符 %04d 的作用是控制输出的整数格式。具体来说:%d 表示输出一个整数;0 表示在数字前面填充零;4 表示输出的总宽度为 4 个字符。
因此,%04d 的意思是,如果输出的整数少于 4 位数,则在前面用零填充,直到总宽度达到 4 位。例如,如果 number 的值是 5,则输出为 0005;如果 number 的值是 42,则输出为 0042;如果 number 的值是 100,则输出为 0100。
问题3:这个程序的功能是什么?
答:专业课随机选人系统。生成 5 个随机的整数,每个整数的范围是 1 到 100,并将这些整数格式化为特定的字符串格式(每行的格式为 20240042XXXX),然后打印出来。
Task2 自动饮料售卖机程序
源代码:
点击查看代码
#include <stdio.h>
int main() {
int choice, quantity;
float total_price = 0, amount_paid, change;
while (1) {
printf("\n自动饮料售卖机菜单:\n");
printf("1. 可乐 - 3 元/瓶\n");
printf("2. 雪碧 - 3 元/瓶\n");
printf("3. 橙汁 - 5 元/瓶\n");
printf("4. 矿泉水 - 2 元/瓶\n");
printf("0. 退出购买流程\n");
printf("请输入饮料编号: ");
scanf("%d", &choice);
if (choice == 0)
break;
if (choice < 1 || choice > 4) {
printf("无效的饮料编号,请重新输入。\n");
continue;
}
printf("请输入购买的数量: ");
scanf("%d", &quantity);
if (quantity < 0) {
printf("购买数量不能为负数,请重新输入。\n");
continue;
}
switch (choice) {
case 1:
case 2:
total_price += 3 * quantity;
break;
case 3:
total_price += 5 * quantity;
break;
case 4:
total_price += 2 * quantity;
break;
}
printf("请投入金额: ");
scanf("%f", &amount_paid);
change = amount_paid - total_price;
printf("本次购买总价: %.2f 元\n", total_price);
printf("找零: %.2f 元\n", change);
total_price = 0;
}
printf("感谢您的购买,欢迎下次光临!\n");
return 0;
}
运行结果:

问题回答:
问题1:line53代码的用途?如果去掉,会有什么影响?
答:(1)这一行代码的作用是将在每次交易结束后将总价格清零。这在循环中是必要的,因为程序可能会进行多次饮料购买,清零总价可以确保下一次销售的开始金额是初始的,避免将上次交易的残余总价加到新的交易中去。(2)如果去掉这一行代码,total_price将在每次交易后累加之前的交易价格,会影响程序功能。如果用户多次购买,后续的购买价格将基于之前的总价计算,这将导致支付和找零的计算结果错误。在第二次或后续的购买中,用户的支付总会加上之前的交易总价,导致机器认为的应付金额错误。
问题2:line17-18, 使用了break语句;line20-23, line28-31, 使用了continue语句。在循环中使用break和continue有什么区别?
答:(1)break语句用于立即终止当前的循环,它会跳出整个循环结构,控制权将转移到循环之后的代码。如果用户输入选择为0,break会停止当前的while循环,从而结束程序。(2)continue语句用于跳过本次循环的剩余代码,直接进入下一次循环的条件判断。continue的使用,比如在选择无效饮料编号或输入负的购买数量的情况下,将不会执行后续的代码并重新开始循环。
问题3:line33-44,使用了switch语句实现多分支。通常情况下,在switch语句中使用default子句有利于代码运行时错误排查,这个程序中,是否有必要增加default子句?你的答案和原因。
答:(1)没有必要(2)原因是在进入 switch 语句之前,程序已经通过 if 条件语句对输入进行了有效性检查:
if (choice < 1 || choice > 4)
{
printf("无效的饮料编号,请重新输入。\n");
continue;
}
增加 default 子句会引起代码的冗余性。
Task3 模拟红绿灯信息程序
源代码:
点击查看代码
#include <stdio.h>
int main() {
char input;
printf("请输入交通灯颜色 (r: red, g: green, y: yellow)。按CTRL+Z结束:\n");
while (1) {
input = getchar(); // 读取单个字符
while (getchar() != '\n');// 清除输入缓存中的换行符
switch (input) {
case 'r':
printf("stop!\n");
break;
case 'g':
printf("go go go\n");
break;
case 'y':
printf("wait a minute\n");
break;
default:
printf("something must be wrong...\n");
break;
}
}
return 0;
}
运行结果:

Task4 模拟记账程序
源代码:
点击查看代码
int main() {
double expense;
double total = 0.0; // 总开销
double maxExpense = 0.0; // 最高开销
double minExpense = 0.0; // 最低开销
int firstInput = 1; // 用于标记是否为第一次输入
printf("输入今日开销,直到输入-1终止:\n");
while (1) {
scanf_s("%lf", &expense); // 读取用户输入的开销
if (expense == -1) { // 判断是否结束输入
break;
}
// 更新总开销
total += expense;
// 更新最高和最低开销
if (firstInput) { // 如果是第一次输入
maxExpense = expense;
minExpense = expense;
firstInput = 0; // 标记第一次输入已处理
}
else {
if (expense > maxExpense) {
maxExpense = expense;
}
if (expense < minExpense) {
minExpense = expense;
}
}
}
// 输出结果
if (!firstInput) { // 确保至少有一笔有效输入
printf("今日累计消费总额: %.1f\n", total);
printf("今日最高一笔开销: %.1f\n", maxExpense);
printf("今日最低一笔开销: %.1f\n", minExpense);
}
else {
printf("没有有效的开销输入。\n");
}
return 0;
}
运行结果:

Task5 猜日期程序
源代码:
点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int luckyDay; // 幸运日
int guess; // 用户猜测的日期
int attempts = 3; // 最大猜测次数
// 初始化随机数种子
srand(time(NULL));
// 生成[1, 30]之间的随机整数
luckyDay = rand() % 30 + 1;
printf("欢迎来到猜日期游戏!\n");
printf("请猜2025年4月哪一天是你的lucky day\n");
printf("开始喽,你有三次机会,猜吧(1到30之间)\n");
// 允许用户猜3次
for (int i = 0; i < attempts; i++) {
printf("第 %d 次猜测:", i + 1);
scanf_s("%d", &guess);
// 检查用户猜测的日期是否合法
if (guess < 1 || guess > 30) {
printf("请输入有效的日期,范围在1到30之间。\n");
i--; // 不算这一猜测
continue;
}
if (guess == luckyDay) {
printf("恭喜你,猜中了!\n");
return 0; // 猜对了,程序结束
}
else if (guess < luckyDay) {
printf("你猜的日期早了,你的lucky day还没到呢!\n");
}
else {
printf("你猜的日期晚了,你的lucky day在前面噢!\n");
}
}
// 用户用光了所有机会
printf("次数用完啦。偷偷告诉你,4月你的lucky day是:4月%d日\n", luckyDay);
return 0;
}
运行结果:


Task6 打印字符小人阵列程序
源代码:
点击查看代码
#include <stdio.h>
int main() {
int n;
printf("Input n: ");
scanf_s("%d", &n);
for (int i = n; i > 0; i--) {
// 计算并打印前面的空白
for (int j = 0; j < n - i; j++) {
printf("\t");
}
// 打印头部
for (int j = 0; j < 2*i-1; j++) {
printf(" 0\t");
}
printf("\n");
for (int j = 0; j < n - i; j++) {
printf("\t");
}
// 打印身体
for (int j = 0; j < 2 * i - 1; j++) {
printf("<H>\t");
}
printf("\n");
for (int j = 0; j < n - i; j++) {
printf("\t");
}
// 打印腿部
for (int j = 0; j < 2 * i - 1; j++) {
printf("I I\t");
}
printf("\n\n"); // 分隔行
}
return 0;
}
运行结果:


浙公网安备 33010602011771号