实验2
实验结论
任务1
- task1.c源代码
点击查看代码
#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()%100+1;
printf("20490042%04d\n",number);
}
return 0;
}
- 运行结果截图

- 回答问题
问题1.随机抽取 5 位学员编号。基础前缀固定为 20490042,再拼接一个在 1~100 之间随机生成的数字,最终输出完整学员编号。
问题2.利用 rand() 获取随机整数;对 N(值为 100)取余,得到范围 0~99;再加 1,就得到 1~100 的随机整数,用来作为学员编号的后两位。
问题3.%04d:以至少占 4 位的宽度输出整数;如果数字不足 4 位,在左侧自动补前导 0,保证编号对齐。
问题4.这一句用来设置随机种子,使用当前系统时间作为种子。
如果删掉这一行:每次启动程序都会使用同一个默认种子,随机序列就固定不变,每次运行抽出来的编号都是一样的,失去随机效果。加上之后,因为时间一直在变化,每次运行都会得到不同的随机编号。
任务2
- task2.c源代码
点击查看代码
#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.这行的作用是把本次订单的总价清零。如果去掉,下一轮购买会在上一次的总价基础上继续累加,导致价格越算越大,总价、找零全部出错。
运行结果如图:

问题2.continue:直接跳过本轮循环中位于它后面的所有代码,回到循环条件判断,继续进入下一轮循环。
在这个自动售卖机里:
如果编号无效,执行 continue,就会跳过“输入数量、计算价格”等后续步骤,直接回到菜单;
如果购买数量是负数,同样使用 continue,放弃本次输入,重新开始选择商品。
任务3
- task3.c源代码
点击查看代码
#include <stdio.h>
int main(){
char ch;
int i;
for(i=0;i<4;++i)
{
scanf("%c",&ch);
//getchar();
switch(ch)
{
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");
}
}
return 0;
}
- 运行结果截图

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

任务5
- task5.c源代码
点击查看代码
#include <stdio.h>
int main()
{
int a,b,c;
int i;
for(i=0;i<5;++i)
{
scanf("%d%d%d",&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a)
{if(a==b&&b==c&&a==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;
}
- 运行结果截图

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

实验总结
- 任务3 要加getchar()吃掉回车,若没有getchar()运行结果如下图

- 任务6
(1)"猜中了"后面不加break,加return 0
break:
只跳出这一层 for,循环结束之后,会继续执行后面这一行:
于是就会变成:猜中了,但还额外打印一句“次数用光了”,不符合题目效果。
return 0:
直接结束整个 main,程序立刻终止,后面所有代码都不再执行,正好满足需求。
(2)如果写:
rand()%31
得到的是:
0~30
会出现 0,但日期没有第 0 号。
所以要写rand()%30+1
浙公网安备 33010602011771号