实验二

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;
}

屏幕截图 2026-04-02 230226

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;
}

屏幕截图 2026-04-02 225344

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;
}

屏幕截图 2026-04-02 232541

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;
}

屏幕截图 2026-04-02 234932

总结
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;
}

posted @ 2026-04-03 00:06  江苏燕双鹰  阅读(15)  评论(0)    收藏  举报