实验二
Task 1
点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5
int main(){
int number;
int i;
srand(time(0));
for (i = 0; i<N; ++i) {
number = rand()%100 +1;
printf("20490042%04d\n",number);
}
return 0;
}
q1:这个程序的功能:在这个专业的100个学生里随机抽取5个人
q2:line13的作用是调用rand函数随机生成1-100的数字
q3:作用是输出20490042后面加上4位的数字,也就是对应的number的值,不足四位的在前面补0
q4:作用是让程序每次运行都可以产生不同的随机数字
Task 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(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;
}
q1:去掉后total_price的那金额和累计到下一次中
q2:line22的是如果输入无效编号,那么就跳过下面的循环重新开始
line30也是同理
Task 3
点击查看代码
#include <stdio.h>
int main() {
int c; // 必须用 int 才能存储 EOF
while (1) {
c = getchar();
// 输入CTRL+Z的时候结束循环
if (c == EOF) {
printf("\n程序已退出。\n");
break;
}
// 作用是容纳回车键
if (c == '\n') {
continue;
}
switch (c) {
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;
}

Task 4
点击查看代码
#include <stdio.h>
int main(){
double n,sum=0,max=0,min = 0;
int f1 = 1;
printf("输入今日开销,直到输入-1终止:");
while(1){
scanf("%lf",&n);
if (n==-1){
break;
}
if(n<=0||n>20000){
printf("无效");
continue;
}
sum +=n;
if(f1){
max = n;
min = n;
f1 = 0;
}
else {
if(n>max)
max = n;
if(n<min)
min = n;
}
}
printf("今日累计消费总额:%.1lf\n",sum);
printf("今日最高一笔开销:%.1lf\n",max);
printf("今日最低一笔开销:%.1lf\n",min);
return 0;
}

Task 5
点击查看代码
#include <stdio.h>
int main() {
int a, b, c;
while (scanf("%d%d%d", &a, &b, &c) == 3) {
if (a + b > c && a + c > b && b + c > a)
{
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;
}

Task 6
点击查看代码
#include <stdio.h>
#include <stdlib.h> //引入标准库中的通用工具函数
#include <time.h> //引入与日期和时间相关的函数和类型
int main(){
int ld,n,m=3;
srand((unsigned int)time(NULL));
ld = rand()%30 +1;
printf("猜猜2026年4月的哪一天是你的lucky day\n\n");
printf("开始喽,你有3次机会,猜吧(1~30)");
while(m>0){
scanf("%d", &n);
if (n == ld)
{
printf("哇,猜中了:\n");
break;
}
else
if (n < ld)
{
printf("你猜的日期早了,你的lucky day在还没到哦\n");
printf("再猜1~30:");
}
else
{
printf("你猜的日期晚了,你的lucky day在前面哦\n");
}
m-=1;
}
printf("次数用光啦。4月的lucky day是 %d 号。\n", ld);
return 0;
}

总结
1.这次实验加深了我对函数库调用的理解,明白了#include <stdlib.h> //引入标准库中的通用工具函数
include <time.h> //引入与日期和时间相关的函数和类型
2.同时对while循环中输入ctrl z终止循环有了新的理解,首先要把while内的条件变量变成数值类型,因为
在 Windows 控制台中,当你在输入状态下按下 CTRL+Z(再按回车),系统会向程序发送一个 文件结束符 (EOF) 信号。
scanf 函数在读取到 EOF 时会返回 EOF(通常定义为 -1),而不是成功读取的变量个数。
因此,通过判断 scanf 的返回值是否等于期望读取的个数,就可以实现循环终止
距离可以见红绿灯和记账的例子
3.对随机函数有了新的理解:
srand 函数的参数类型是 unsigned int,而 time(NULL) 返回的是 time_t 类型(通常是一个有符号整数,比如 long 或 long long)。直接写成 srand(time(NULL)) 可能会触发编译器的类型不匹配警告(例如 "conversion from 'time_t' to 'unsigned int' may lose value")。加上 (unsigned int) 显式类型转换是为了:
消除警告:告诉编译器“我明确知道要转换为无符号整型”。
匹配函数签名:确保传入的参数类型与 srand 要求的 unsigned int 完全一致。
time(NULL):获取当前系统时间(从1970年1月1日至今的秒数),作为随机数种子传递给 srand(),从而确保每次运行程序时生成的随机数序列不同。
4.每次执行循环输入回车键避免多输出一个结果,以红绿灯为例:// 作用是容纳回车键
if (c == '\n') {
continue;
}
浙公网安备 33010602011771号