实验2_C语言分支与循环基础应用编程

Task1 生成随机数

源代码:
点击查看代码
#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("20240042%04d\n", number);
	}

	return 0;
}
运行结果:

image

问题回答:

问题1:解释lin13代码的功能。
答:生成一个随机的整数,范围在1到100之间(包括1和100)。
问题2:解释line14使用格式符%04d起到什么作用。
答:格式符 %04d 的作用是控制输出的整数格式。具体来说:%d 表示输出一个整数;0 表示在数字前面填充零;4 表示输出的总宽度为 4 个字符。
因此,%04d 的意思是,如果输出的整数少于 4 位数,则在前面用零填充,直到总宽度达到 4 位。例如,如果 number 的值是 5,则输出为 0005;如果 number 的值是 42,则输出为 0042;如果 number 的值是 100,则输出为 0100。
问题3:这个程序的功能是什么?
答:专业课随机选人系统。生成 5 个随机的整数,每个整数的范围是 1 到 100,并将这些整数格式化为特定的字符串格式(每行的格式为 20240042XXXX),然后打印出来。

Task2 自动饮料售卖机程序

源代码:
点击查看代码
#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;
        }

        switch (choice) {
        case 1:
        case 2:
            total_price += 3 * quantity;
            break;
        case 3:
            total_price += 5 * quantity;
            break;
        case 4:
            total_price += 2 * quantity;
            break;
        }

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

运行结果:

image

问题回答:

问题1:line53代码的用途?如果去掉,会有什么影响?
答:(1)这一行代码的作用是将在每次交易结束后将总价格清零。这在循环中是必要的,因为程序可能会进行多次饮料购买,清零总价可以确保下一次销售的开始金额是初始的,避免将上次交易的残余总价加到新的交易中去。(2)如果去掉这一行代码,total_price将在每次交易后累加之前的交易价格,会影响程序功能。如果用户多次购买,后续的购买价格将基于之前的总价计算,这将导致支付和找零的计算结果错误。在第二次或后续的购买中,用户的支付总会加上之前的交易总价,导致机器认为的应付金额错误。
问题2:line17-18, 使用了break语句;line20-23, line28-31, 使用了continue语句。在循环中使用break和continue有什么区别?
答:(1)break语句用于立即终止当前的循环,它会跳出整个循环结构,控制权将转移到循环之后的代码。如果用户输入选择为0,break会停止当前的while循环,从而结束程序。(2)continue语句用于跳过本次循环的剩余代码,直接进入下一次循环的条件判断。continue的使用,比如在选择无效饮料编号或输入负的购买数量的情况下,将不会执行后续的代码并重新开始循环。
问题3:line33-44,使用了switch语句实现多分支。通常情况下,在switch语句中使用default子句有利于代码运行时错误排查,这个程序中,是否有必要增加default子句?你的答案和原因。
答:(1)没有必要(2)原因是在进入 switch 语句之前,程序已经通过 if 条件语句对输入进行了有效性检查:
if (choice < 1 || choice > 4)
{
printf("无效的饮料编号,请重新输入。\n");
continue;
}
增加 default 子句会引起代码的冗余性。

Task3 模拟红绿灯信息程序

源代码:
点击查看代码
#include <stdio.h>  

int main() {
    char input;

    printf("请输入交通灯颜色 (r: red, g: green, y: yellow)。按CTRL+Z结束:\n");

    while (1) {
        input = getchar(); // 读取单个字符
		
        while (getchar() != '\n');// 清除输入缓存中的换行符

        switch (input) {
        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;
}
运行结果:

image

Task4 模拟记账程序

源代码:
点击查看代码
int main() {
    double expense;
    double total = 0.0;         // 总开销  
    double maxExpense = 0.0;    // 最高开销  
    double minExpense = 0.0;    // 最低开销  
    int firstInput = 1;         // 用于标记是否为第一次输入  
 
    printf("输入今日开销,直到输入-1终止:\n");

    while (1) {
        scanf_s("%lf", &expense); // 读取用户输入的开销  

        if (expense == -1) { // 判断是否结束输入  
            break;
        }

        // 更新总开销  
        total += expense;

        // 更新最高和最低开销  
        if (firstInput) { // 如果是第一次输入  
            maxExpense = expense;
            minExpense = expense;
            firstInput = 0; // 标记第一次输入已处理  
        }
        else {
            if (expense > maxExpense) {
                maxExpense = expense;
            }
            if (expense < minExpense) {
                minExpense = expense;
            }
        }
    }

    // 输出结果  
    if (!firstInput) { // 确保至少有一笔有效输入  
        printf("今日累计消费总额: %.1f\n", total);
        printf("今日最高一笔开销: %.1f\n", maxExpense);
        printf("今日最低一笔开销: %.1f\n", minExpense);
    }
    else {
        printf("没有有效的开销输入。\n");
    }

    return 0;
}
运行结果:

image

Task5 猜日期程序

源代码:
点击查看代码
#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  

int main() {
    int luckyDay;     // 幸运日  
    int guess;       // 用户猜测的日期  
    int attempts = 3; // 最大猜测次数  

    // 初始化随机数种子  
    srand(time(NULL));

    // 生成[1, 30]之间的随机整数  
    luckyDay = rand() % 30 + 1;

    printf("欢迎来到猜日期游戏!\n");
    printf("请猜2025年4月哪一天是你的lucky day\n");
    printf("开始喽,你有三次机会,猜吧(1到30之间)\n");

    // 允许用户猜3次  
    for (int i = 0; i < attempts; i++) {
        printf("第 %d 次猜测:", i + 1);
        scanf_s("%d", &guess);

        // 检查用户猜测的日期是否合法  
        if (guess < 1 || guess > 30) {
            printf("请输入有效的日期,范围在1到30之间。\n");
            i--; // 不算这一猜测  
            continue;
        }

        if (guess == luckyDay) {
            printf("恭喜你,猜中了!\n");
            return 0; // 猜对了,程序结束  
        }
        else if (guess < luckyDay) {
            printf("你猜的日期早了,你的lucky day还没到呢!\n");
        }
        else {
            printf("你猜的日期晚了,你的lucky day在前面噢!\n");
        }
    }

    // 用户用光了所有机会  
    printf("次数用完啦。偷偷告诉你,4月你的lucky day是:4月%d日\n", luckyDay);

    return 0;
}

运行结果:

image
image

Task6 打印字符小人阵列程序

源代码:
点击查看代码
#include <stdio.h>  

int main() {
    int n;
    printf("Input n: ");
    scanf_s("%d", &n);

    for (int i = n; i > 0; i--) {
        // 计算并打印前面的空白  
        for (int j = 0; j < n - i; j++) {
            printf("\t");
        }
        // 打印头部  
        for (int j = 0; j < 2*i-1; j++) {
            printf(" 0\t");
        }
        printf("\n");
        
        for (int j = 0; j < n - i; j++) {
            printf("\t");
        }
        // 打印身体  
        for (int j = 0; j < 2 * i - 1; j++) {
            printf("<H>\t");
        }
        printf("\n");

        for (int j = 0; j < n - i; j++) {
            printf("\t");
        }
        // 打印腿部  
        for (int j = 0; j < 2 * i - 1; j++) {
            printf("I I\t");
        }
        
        printf("\n\n"); // 分隔行  
    }

    return 0;
}
运行结果:

image
image

posted @ 2025-03-23 21:14  Meredith_GISer  阅读(38)  评论(0)    收藏  举报