实验二

实验一:
#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() % N + 1;
        printf("20490042%04d\n", number);
    }

    return 0;
}

屏幕截图 2026-11-01 210355问题1:该程序的功能是模拟生成并输出5个随机的学号。它利用随机数生成函数产生5个1到100之间的随机整数,作为学号的后4位,并与固定的前缀(20490042)拼接后打印输出。

问题2: lin14 代码是 number = rand() % N + 1;rand() 函数会返回一个0到 RAND_MAX 之间的伪随机整数。% N(即 % 100)是对100取余 结果限制在 0 ~ 99 之间 + 1 使结果偏移,最终将生成的随机数范围限定在 1 ~ 100 之间,并赋值给变量 number。

问题3: %04d 的作用是格式化输出整数。它表示输出的整数宽度至少为4位,如果数字本身不足4位(例如数字为 5 或者 57),则在左侧自动补前导零(输出为 0005 或 0057)。这保证了生成的学号后四位长度固定,符合学号的标准格式。

问题4:srand(time(0)); 的作用是设置随机数生成器的种子。time(0) 获取当前系统的系统时间(秒数),将其作为种子传入 srand(),可以保证每次运行程序时,种子值不同,从而让 rand() 生成完全不同的随机数序列。

实验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 (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;
}

屏幕截图 2026-11-01 210940

问题1:total_price 变量在第5行被定义在 while 循环外部。如果去掉第47行的 total_price = 0;,会导致多次购买时的金额累加错误。

问题2:continue 语句的语义是结束本次循环,跳过循环体中 continue 语句之后尚未执行的代码,直接跳转回循环条件的判断处(对于 while(1) 就是直接回到循环开头)开始下一次循环。

实验三:

#include <stdio.h>

int main() {
    char light;
    int i;
    
    // 循环4次,覆盖所有可能输入测试
    for (i = 0; i < 4; i++) {
        // 注意:%c前面加一个空格,用于吸收上一次输入留下的回车符(换行符)
        scanf(" %c", &light); 
        
        // 使用 switch 语句判断交通信号灯颜色
        switch (light) {
            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-11-01 211336

实验四:

#include <stdio.h>

int main() {
    float expense;      // 每笔开销
    float total = 0;    // 累计消费总额
    float max = 0;      // 最高一笔开销
    float min = 0;      // 最低一笔开销
    int count = 0;      // 记录输入的有效笔数,用于判断第一笔数据

    // 提示信息(可选,为了程序更友好)
    printf("输入今日开销,直到输入-1终止:\n");

    while (1) {
        scanf("%f", &expense);
        
        // 遇到 -1 终止循环
        if (expense == -1) {
            break;
        }
        
        // 过滤无效数据(题干限定 0 < 每笔消费 <= 2万元)
        if (expense > 0) {
            total += expense; // 累加总消费
            
            if (count == 0) {
                // 如果是第一笔有效消费,最高和最低都初始化为该值
                max = expense;
                min = expense;
            } else {
                // 如果不是第一笔,则进行比较更新
                if (expense > max) {
                    max = expense;
                }
                if (expense < min) {
                    min = expense;
                }
            }
            count++; // 有效笔数加1
        }
    }

    // 如果有有效消费记录才输出
    if (count > 0) {
        printf("今日累计消费总额: %.1f\n", total);
        printf("今日最高一笔开销: %.1f\n", max);
        printf("今日最低一笔开销: %.1f\n", min);
    } else {
        printf("今日没有消费记录。\n");
    }

    return 0;
}

屏幕截图 2026-11-01 211452

实验五:

#include <stdio.h>

int main() {
    int a, b, c;
    int i;
    
    // 循环5次,要求测试5组
    for (i = 0; i < 5; i++) {
        scanf("%d %d %d", &a, &b, &c);
        
        // 1. 判断是否能构成三角形 (任意两边之和大于第三边)
        if (a + b > c && a + c > b && b + c > a) {
            // 2. 如果能构成三角形,判断具体类型
            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-11-01 211629

实验六:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    int lucky_day;
    int guess;
    int i;
    int is_guessed = 0; // 标记是否猜中,0表示未猜中,1表示猜中

    // 生成随机数种子,并生成 1~30 之间的随机数
    srand(time(0));
    lucky_day = rand() % 30 + 1;

    printf("猜猜2026年11月哪一天是你的lucky day\n");
    printf("开始喽,你有3次机会,猜吧(1~30): ");

    // 3次猜测机会
    for (i = 0; i < 3; i++) {
        scanf("%d", &guess);
        
        if (guess == lucky_day) {
            printf("哇,猜中了:)\n");
            is_guessed = 1; // 标记为已猜中
            break;          // 猜中了直接跳出循环
        } else if (guess < lucky_day) {
            printf("你猜的日期早了,你的lucky day还没到呢\n");
        } else {
            printf("你猜的日期晚了,你的lucky day在前面哦\n");
        }
        
        // 如果还没到最后一次,提示继续猜
        if (i < 2) { 
            printf("再猜(1~30): ");
        }
    }

    // 循环结束后,如果3次都没猜中
    if (is_guessed == 0) {
        printf("次数用光啦。11月你的lucky day是%d号\n", lucky_day);
    }

    return 0;
}

屏幕截图 2026-11-01 211750

 

posted @ 2026-11-01 21:18  魏子翔  阅读(6)  评论(0)    收藏  举报