实验二
实验任务1:
Q1:解释lin13代码的功能
A1:设计出所需要取的随机数的区间,如题目中为区间100的随机数
Q2:解释line14使用格式符%04d起到什么作用
A2:确保number所占位数为4位,不够则用0来填充
Q3:这个程序的功能是什么
A3:取该专业学号伪随机数,可用于抽奖或抽人回答问题
源代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 5 #define N 5 6 7 int main() { 8 int number; 9 int i; 10 11 srand(time(0)); 12 for (i = 0; i < N; ++i) { 13 number = rand() % 100 + 1; 14 printf("20248328%03d\n", number); 15 16 17 18 } 19 20 21 return 0; 22 }
运行截图:

实验任务2:
Q1:line53代码的用途?如果去掉,会有什么影响?
A1:清零已选的商品,重置售货机;去掉会导致下次使用总额有个初值,会导致bug
Q2:line17-18, 使用了break语句;line20-23, line28-31, 使用了continue语句。在循环中使用break和 continue有什么区别?
A2:break是终止当前循环,跳出循环。continue是跳出当前一次的循环,开始下一次的循环。
Q3:line33-44,使用了switch语句实现多分支。通常情况下,在switch语句中使用default子句有利于代码 运行时错误排查,这个程序中,是否有必要增加default子句?你的答案和原因。
A3:没必要,在第20行中,已经将default所可能发生的情况给排除了。
源代码:
1 #include <stdio.h> 2 int main() 3 { 4 int choice, quantity; 5 float total_price = 0, amount_paid, change; 6 while (1) 7 { 8 printf("\n自动饮料售卖机菜单:\n"); 9 printf("1. 可乐 - 3 元/瓶\n"); 10 printf("2. 雪碧 - 3 元/瓶\n"); 11 printf("3. 橙汁 - 5 元/瓶\n"); 12 printf("4. 矿泉水 - 2 元/瓶\n"); 13 printf("0. 退出购买流程\n"); 14 printf("请输入饮料编号: "); 15 scanf_s("%d", &choice); 16 if (choice == 0) 17 break; 18 if (choice < 1 || choice > 4) 19 { 20 printf("无效的饮料编号,请重新输入。\n"); 21 continue; 22 } 23 printf("请输入购买的数量: "); 24 scanf_s("%d", &quantity); 25 if (quantity < 0) 26 { 27 printf("购买数量不能为负数,请重新输入。\n"); 28 continue; 29 } 30 switch (choice) { 31 case 1: 32 case 2: 33 total_price += 3 * quantity; 34 break; 35 case 3: 36 total_price += 5 * quantity; 37 break; 38 case 4: 39 total_price += 2 * quantity; 40 break; 41 42 } 43 printf("请投入金额: "); 44 scanf_s("%f", &amount_paid); 45 change = amount_paid - total_price; 46 printf("本次购买总价: %.2f 元\n", total_price); 47 printf("找零: %.2f 元\n", change); 48 total_price = 0; 49 } 50 printf("感谢您的购买,欢迎下次光临!\n"); 51 return 0; 52 }
运行截图:

实验任务3:
源代码:
1 #include<stdio.h> 2 #include<ctype.h> 3 int main() { 4 char color; 5 printf("请输入此时交通信号灯的颜色(红:r,黄:y,绿:g):\n"); 6 7 while ((color=getchar())!=EOF) 8 { 9 while ((getchar()) != '\n' && !feof(stdin)); 10 11 switch (color) 12 { 13 14 case('r'):printf("stop!\n"); break; 15 case('y'):printf("wait a minute!\n"); break; 16 case('g'):printf("go go go\n"); break; 17 default: 18 if (isalpha(color)) 19 printf("something must be wrong...\n\n\n"); 20 printf("请输入现在你所看到的颜色(红:r,黄:y,绿:g):\n"); 21 break; 22 } 23 24 } 25 return 0; 26 }
运行截图:

实验任务4:
源代码:
1 #include<stdio.h> 2 3 int main() 4 { 5 printf("输入今日的若干笔开销,输入-1时终止:\n"); 6 int count = 0; 7 double m=0, total=0, max=0, min=0; 8 while (1) 9 { 10 scanf_s("%lf", &m); 11 if (m != -1) 12 { 13 if (m > 20000 || m < 0) { 14 printf("请重新输入一个小于20000元和大于0元的有效值:"); 15 scanf_s("%lf", &m); 16 17 } 18 else{ 19 20 if (count == 0) 21 { 22 min = m; 23 max = m; 24 25 } 26 else 27 { 28 if (max < m) 29 max = m; 30 if (m < min) 31 min = m; 32 } 33 count += 1; 34 total += m; 35 } 36 } 37 else 38 break; 39 40 } 41 printf("今日累计消费总额为%.1lf\n", total); 42 printf("今日最高开销为%.1lf\n", max); 43 printf("今日最低开销为%.1lf\n", min); 44 return 0; 45 46 }
运行截图:

实验任务5:
源代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #define N 10 5 int main() 6 { 7 int i, day, x = 0; 8 printf("猜猜2025年哪天是你的lucky day\n"); 9 printf("你有十次机会,猜吧从1到365:"); 10 srand(time(0)); 11 day = rand() % 365 + 1; 12 for (i = 0; i < N; ++i) 13 { 14 scanf_s("%d", &x); 15 if (x == day) 16 { 17 printf("哇,猜中了\n"); 18 break; 19 } 20 else if (x < day) 21 printf("你猜的日期早了,你的lucky day还没到呢\n\n再猜(你还有%d次机会):", 9 - i); 22 else if (x > day) 23 printf("你猜的日期晚了,你的lucky day在前面呢\n\n再猜(你还有%d次机会):",9-i); 24 25 } 26 if (i == 10) 27 printf("你的次数用完了,偷偷告诉你你的lucky day是:%d", day); 28 return 0; 29 }
运行截图:

实验任务6:
源代码:
1 #include <stdio.h> 2 3 int main() { 4 int r, i, j; 5 6 7 printf("请输入倒三角的行数: "); 8 scanf_s("%d", &r); 9 10 11 for (i = r; i >= 1; --i) 12 { 13 14 for (j = 0; j < r - i; ++j) { 15 printf(" "); 16 } 17 18 for (j = 0; j < 2 * i - 1; ++j) { 19 printf(" 0 "); 20 printf(" "); 21 } 22 printf("\n"); 23 for (j = 0; j < r - i; ++j) { 24 printf(" "); 25 } 26 for (j = 0; j < 2 * i - 1; ++j) { 27 printf("<H>"); 28 printf(" "); 29 } 30 31 printf("\n"); 32 for (j = 0; j < r - i; ++j) { 33 printf(" "); 34 } 35 for (j = 0; j < 2 * i - 1; ++j) { 36 printf("/ \\"); 37 printf(" "); 38 39 } 40 printf("\n"); 41 for (j = 0; j < r - i; ++j) { 42 printf(" "); 43 } 44 printf("\n"); 45 } 46 47 return 0; 48 }
运行截图:

实验总结:这次的实验2难度上升了很多,但是熟练度已经不是第一次实验中的我所能比拟的,这次的实验更偏向于在现实生活中的应用,例如随机数,记账,售货机之类的,我在想,在生活中或许可以更好的利用自己在这门课上所培养的算法思维。这次实验中也出现了很多问题,例如在实验3中,回车作为一个字符,导致“something must be wrong”总是多打一行,在与舍友的交流中我们有了两个解决方法,一个是清空域,另一个就是多打一个getchar专门用来接收回车。总之,这次的实验有难度,但是也很有趣。
posted on 2025-03-17 23:54 A0809-lemon 阅读(49) 评论(0) 收藏 举报
浙公网安备 33010602011771号