A-0809-lemon

导航

实验二

实验任务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 }
实验任务1

运行截图:

 

 

实验任务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      }
实验任务2

运行截图:

 

 

实验任务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 }
实验任务3

运行截图:

 

 

实验任务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 }
实验任务4

运行截图:

 

 

实验任务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 }
实验任务5

运行截图:

 

 

实验任务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 }
实验任务6

运行截图:

 

 

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

posted on 2025-03-17 23:54  A0809-lemon  阅读(49)  评论(0)    收藏  举报