实验二
实验一:
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 100 #define CNT 5 int main() { int number; int i; srand(time(0)); // 以当前系统时间作为随机种子 for(i = 0; i < CNT; ++i) { number = rand() % N + 1; printf("20490042%04d\n", number); } return 0; }
问题1:该程序的功能是模拟生成并输出5个随机的学号。它利用随机数生成函数产生5个1到100之间的随机整数,作为学号的后4位,并与固定的前缀(20490042)拼接后打印输出。
问题2: lin14 代码是 number = rand() % N + 1;rand() 函数会返回一个0到 RAND_MAX 之间的伪随机整数。% N(即 % 100)是对100取余 结果限制在 0 ~ 99 之间 + 1 使结果偏移,最终将生成的随机数范围限定在 1 ~ 100 之间,并赋值给变量 number。
问题3: %04d 的作用是格式化输出整数。它表示输出的整数宽度至少为4位,如果数字本身不足4位(例如数字为 5 或者 57),则在左侧自动补前导零(输出为 0005 或 0057)。这保证了生成的学号后四位长度固定,符合学号的标准格式。
问题4:srand(time(0)); 的作用是设置随机数生成器的种子。time(0) 获取当前系统的系统时间(秒数),将其作为种子传入 srand(),可以保证每次运行程序时,种子值不同,从而让 rand() 生成完全不同的随机数序列。
实验2:
#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; } if(choice == 1 || choice == 2) total_price += 3 * quantity; else if(choice == 3) total_price += 5 * quantity; else total_price += 2 * quantity; 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:total_price 变量在第5行被定义在 while 循环外部。如果去掉第47行的 total_price = 0;,会导致多次购买时的金额累加错误。
问题2:continue 语句的语义是结束本次循环,跳过循环体中 continue 语句之后尚未执行的代码,直接跳转回循环条件的判断处(对于 while(1) 就是直接回到循环开头)开始下一次循环。
实验三:
#include <stdio.h> int main() { char light; int i; // 循环4次,覆盖所有可能输入测试 for (i = 0; i < 4; i++) { // 注意:%c前面加一个空格,用于吸收上一次输入留下的回车符(换行符) scanf(" %c", &light); // 使用 switch 语句判断交通信号灯颜色 switch (light) { 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; }

实验四:
#include <stdio.h> int main() { float expense; // 每笔开销 float total = 0; // 累计消费总额 float max = 0; // 最高一笔开销 float min = 0; // 最低一笔开销 int count = 0; // 记录输入的有效笔数,用于判断第一笔数据 // 提示信息(可选,为了程序更友好) printf("输入今日开销,直到输入-1终止:\n"); while (1) { scanf("%f", &expense); // 遇到 -1 终止循环 if (expense == -1) { break; } // 过滤无效数据(题干限定 0 < 每笔消费 <= 2万元) if (expense > 0) { total += expense; // 累加总消费 if (count == 0) { // 如果是第一笔有效消费,最高和最低都初始化为该值 max = expense; min = expense; } else { // 如果不是第一笔,则进行比较更新 if (expense > max) { max = expense; } if (expense < min) { min = expense; } } count++; // 有效笔数加1 } } // 如果有有效消费记录才输出 if (count > 0) { printf("今日累计消费总额: %.1f\n", total); printf("今日最高一笔开销: %.1f\n", max); printf("今日最低一笔开销: %.1f\n", min); } else { printf("今日没有消费记录。\n"); } return 0; }

实验五:
#include <stdio.h> int main() { int a, b, c; int i; // 循环5次,要求测试5组 for (i = 0; i < 5; i++) { scanf("%d %d %d", &a, &b, &c); // 1. 判断是否能构成三角形 (任意两边之和大于第三边) if (a + b > c && a + c > b && b + c > a) { // 2. 如果能构成三角形,判断具体类型 if (a == b && b == c) { printf("等边三角形\n"); } else if (a == b || a == c || b == c) { printf("等腰三角形\n"); } else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) { printf("直角三角形\n"); } else { printf("普通三角形\n"); } } else { // 不能构成三角形 printf("不能构成三角形\n"); } } return 0; }

实验六:
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int lucky_day; int guess; int i; int is_guessed = 0; // 标记是否猜中,0表示未猜中,1表示猜中 // 生成随机数种子,并生成 1~30 之间的随机数 srand(time(0)); lucky_day = rand() % 30 + 1; printf("猜猜2026年11月哪一天是你的lucky day\n"); printf("开始喽,你有3次机会,猜吧(1~30): "); // 3次猜测机会 for (i = 0; i < 3; i++) { scanf("%d", &guess); if (guess == lucky_day) { printf("哇,猜中了:)\n"); is_guessed = 1; // 标记为已猜中 break; // 猜中了直接跳出循环 } else if (guess < lucky_day) { printf("你猜的日期早了,你的lucky day还没到呢\n"); } else { printf("你猜的日期晚了,你的lucky day在前面哦\n"); } // 如果还没到最后一次,提示继续猜 if (i < 2) { printf("再猜(1~30): "); } } // 循环结束后,如果3次都没猜中 if (is_guessed == 0) { printf("次数用光啦。11月你的lucky day是%d号\n", lucky_day); } return 0; }

浙公网安备 33010602011771号