实验二
实验二
任务一
回答问题
问题1:程序的功能是什么?
随机打印5个学号。
问题2:解释line14代码的功能。
确保生成的随机数在1~ 100之间。rand生成的随机数大小为0~ rand_max,要通过line14的运算限定它的范围在1~ 100之间。
问题3:解释line15使用格式符%04d起到什么作用
在输出结果时,末尾四位在输出时自动用0补齐,保证每一个学号输出时长度都相同。
问题4:代码srand(time(0));起到什么作用
srand()以时间函数time(0)抓取的当前系统时间作为rand()的随机数种子,srand(time(0))不断变化,rand()生成的随机数也不断变化。srand(time(0))本身只设置种子,不生成随机数,随机数由rand()生成。去掉srand(time(0))之后,每次运行后输出的值都是固定的,出现“伪随机”的情况。
任务二
回答问题
问题1:line47代码total_price=0;如果去掉,对程序有什么影响?
去掉之后,在下一次输入购买的物品时,几次购买的金额会累计,导致购买总价出错。
问题2:while循环中,有两处使用continue语句。解释在循环中使用continue语句,语义是什么?
在循环中,continue语句的语义是跳过本次循环,继续执行下一个循环。
任务三
task3.c源代码
点击查看代码
#include<stdio.h>
char a;
int i=1;
int main()
{
for(i=1;i<=4;i++)
{
scanf("%c",&a);
getchar();
switch(a)
{
case 'g':
printf("go go go\n");
break;
case 'r':
printf("stop!\n");
break;
case 'y':
printf("wait a minute\n");
break;
default :
printf("something must be wrong…\n");
break;
}
}
return 0;
}
运行测试截图

任务四
task4.c源代码
点击查看代码
#include<stdio.h>
double a,max=-1,min=30000,s=0;
int main()
{
printf("输入今日开销,直到输入-1终止:");
while(1)
{
scanf("%lf",&a);
if(a==-1)
break;
if(a>max)
max=a;
if(a<min)
min=a;
s=s+a;
}
printf("今日累计消费总额:%.1lf\n今日最高一笔开销:%.1lf\n今日最低一笔开销:%.1lf\n",s,max,min);
return 0;
}
运行测试截图

任务五
task5.c源代码
点击查看代码
#include<stdio.h>
int a,b,c,i=1;
int judge()
{
scanf("%d%d%d",&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a) //判断是不是三角形
{
if(a==b&&b==c) //判断是不是等边三角形
printf("等边三角形\n");
else
{
if(a==b||b==c||a==c) //判断是不是等腰三角形
printf("等腰三角形\n");
else
{
if(a*a+b*b==c*c||a*a+c*c==b*b||a*a==b*b+c*c) //判断是不是直角三角形
printf("直角三角形\n");
else
printf("普通三角形\n"); //上面的情况都不满足,一般三角形
}
}
}
else
{
printf("不能构成三角形\n");
}
return 0;
}
int main()
{
for(i=1;i<=5;i++)
judge();
return 0;
}
运行测试截图

任务六
task6.c源代码
点击查看代码
#include<stdio.h>
#include<time.h>
int n,a,i;
int main()
{
n=srand(time(0))%30+1;
printf("猜猜2026年11月哪一天是你的lucky day\n开始喽,你有3次机会,猜吧(1~30):\n");
for(i=1;i<=3;i++)
{
scanf("%d",&a);
if(a==n)
{
printf("哇,猜中了:)");
break;
}
if(a>n)
{
printf("你猜的日期晚了,你的lucky day在前面哦\n");
}
if(a<n)
{
printf("你猜的日期早了,你的lucky day还没到呢\n") ;
}
if(i==3)
printf("次数用光啦。11月你的lucky day是%d号\n",n) ;
else
printf("再猜(1~30):");
}
return 0;
}
运行测试截图


实验总结
关于switch
在使用switch多分支结构时,如果每一种情况执行结束之后,要在语句后添加break语句,否则会无视后续case的条件,直接继续执行下一个case中的语句,直到遇到break或switch结束。
switch基本语法格式
点击查看代码
switch (表达式)
{
case 常量1: //只能是常量,不能是变量或表达式。常量类型可以是整型或字符型,不能是浮点型或字符串,且每个case后的常量值不能重复
// 当表达式等于常量1时执行的代码
break; // 执行完后跳出整个 switch 结构
case 常量2:
// 当表达式等于常量2时执行的代码
break;
case 常量3:
case 常量4:
// 当表达式等于常量3或常量4时,都会执行这里的代码
break;
default:
// 当所有 case 都不匹配时执行的默认代码(类似 else)
break;
}
关于break语句和continue语句
| 语句 | 作用 | 循环是否继续 |
|---|---|---|
| break | 终止整个循环,跳出循环体 | 循环终止 |
| continue | 跳过本次循环,继续执行下一次循环 | 循环继续 |
注:二者在内层循环执行时,均不影响外层循环的进程。
关于srand()和rand()
| 函数 | 作用 |
|---|---|
| srand(seed) | 设置随机数种子,决定随机序列的起点 |
| rand | 根据种子生成下一个随机数 |
srand()常用time(0)作为seed是因为时间一直在变,种子不同,序列就不同。如果使用定值或不使用srand()设置种子,会导致每次运行生成的随机数一样,出现伪随机的情况(例如任务一问题4中提及的)。

浙公网安备 33010602011771号