experiment2
一、实验目的
- 能正确使用if语句实现分支结构
- 能正确使用while语句、do...while语句实现循环结构
- 能在具体问题场景中正确区分、使用continue和break
- 能灵活、组合使用c语句编程解决简单应用问题
二、实验准备
实验前,请复习第3章以下内容:
- 分支语句 if 和循环语句 while 、 do...while 的用法:语法规则及注意事项
- 在循环语句中 continue 和 break 语句的功能和用法
- 使用 while 语句实现多组输入的方法
- 常见问题的算法
三、实验内容
实验任务1————验证性实验
task1.c
//在c开发环境下,输入如下程序。结合程序运行结果,理解代码、回答问题
SHOW CODE
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5
#define N1 80
#define N2 35
int main() {
int cnt;
int random_major,random_no;
srand(time(NULL)); // 以当前系统时间作为随机种子
cnt = 0;
while(cnt < N) {
random_major = rand() % 2;
if(random_major) {
random_no = rand() % N1 + 1;
printf("20256343%04d\n", random_no);}
else {
random_no = rand() % N2 + 1;
printf("20256136%04d\n", random_no);
}
cnt++;
}
return 0;
}
实验结论
//有代码 srand(time(NULL))预期效果如下图所示
问题一
没有有代码 srand(time(NULL))预期效果与上图没有区别,但多次运行后发现每次生成的随机序列完全相同
问题二
srand(time(NULL))这个程序功能是以系统时间作为种子,由于时间不断变化,每次运行的种子不同,从而生成的随机序列不同
Tip:
与伪随机数生成相关的两个标准库函数: rand(), srand()
int rand(void)
返回一个0~RAND_MAX之间的伪随机数。
头文件<stdlib.h>(也有的在<math.h>)
rand()函数原型及使用示例参考: https://en.cppreference.com/w/cpp/numeric/random/rand
void srand(unsigned int seed)
为rand()设置随机种子。通常以时间作为随机种子,即srand(time(NULL))
头文件<stdlib.h>(也有的在<math.h>), <time.h>
srand()函数运行及使用示例参考: https://en.cppreference.com/w/cpp/numeric/random/srand
实验任务2————验证性实验:自动饮料售卖机程序。
//在c开发环境下,输入如下程序。结合程序运行结果,理解代码、回答问题。
task.2c
SHOW CODE
#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;
}
实验结论
//预期效果如图所示
未注释total_price=0
已注释total_price=0
问题一:
注释后发现每次总价不重置,导致与上一次的费用累加
问题二:
continue语句一:判断饮料编号choice小于1或者大于4,如果是上述情况,则提示“无效饮料编号,请重新输入”,并通过continue跳过本次循环,即重新输入编号
comtinue语句二:判断“购买数量quantity小于0”(即负数)。若满足该条件,提示“购买数量不能为负数,请重新输入”,并通过continue跳出本次循环,即重新输入数量。
实验任务3
编写一个模拟红绿灯信息的程序task3.c。具体要求如下:
使用多分支if语句实现
要求用户从键盘输入字符,用来表示交通信号灯颜色。输入r表示red,输入g表示green, 输入y表示yellow
判断交通型号灯颜色,打印输出不同的提示信息:
如果输入的是r,打印输出字符串stop!
如果输入的是g,打印输出字符串go go go
如果输入的是y,打印输出字符串wait a minute
如果输入的是其它字符,打印输出字符串something must be wrong...
要求支持多组输入,直到用户按下CTRL+Z,回车,终止程序
task.3c
SHOW CODE
#include<stdio.h>
#include<string.h>
int main()
{
char input[20]={0};
printf("交通信号灯颜色。输入r表示red,输入g表示green, 输入y表示yellow\n");
//当输入CtrlZ回车
while (scanf("%s",input)!=EOF)
{
if(strcmp(input,"r")==0)
{printf("stop\n"); }
else if(strcmp(input,"g")==0)
{printf("gogogo");}
else if(strcmp(input,"y")==0)
{printf("wait a minute\n");}
else
{printf("something must be wrong...\n");}
}
return 0;
}
实验结论
//预期效果如图
实验任务4
编写一个模拟记账程序task4.c统计一天的开销。具体要求如下:
从键盘重复输入一天内的若干笔开销,输入-1时终止程序。
在屏幕上打印输出一天内最高一笔开销、最低一笔开销,及一天总开销。输出时保留到小数点后1位。
运行程序时,输入的测试数据限定:0元 < 每笔消费 <= 2万元
task 4.c
SHOW CODE
#include<stdio.h>
int main()
{
double expense = 0.0;
double total = 0.0;
double max=0.0,min=20000;
int count = 0;
printf("请输入每笔开销(输入-1结束):\n");
for( ; ; )
{
scanf("%lf",&expense);
if (expense == -1)
{break; }
if(expense>0&&expense<=20000)
{
count++;
total += expense;
if (expense>max)
{max=expense;}
if (expense<min)
{min = expense;}
}
else{printf("输入超出范围(0 < 消费 <= 2万),请重新输入!\n");}
}
if (count > 0) {
printf("最高开销:%.1f 元\n", max);
printf("最低开销:%.1f 元\n", min);
printf("总开销:%.1f 元\n", total);
} else {
printf("无有效消费记录!\n");
}
return 0;
}
实验结论
//预览效果如图
实验任务5
编写程序task5.c,根据输入的三角形三边边长,判断三角形类型。具体要求如下:
从键盘输入三角形三边边长a, b, c。边长为整数。
输出要求:
如果a, b, c不能构成三角形,打印输出"不能构成三角形"
如果能构成三角形,根据边长编写条件式,判断三角形属于哪一类别:普通三角形、直角三角形、等边
三角形、等腰三角形
要求支持多组输入,直到用户按下CTRL+Z,敲回车,终止程序。
task 5.c
SHOW CODE
#include<stdio.h>
int main()
{
int a, b, c;
a=0,b=0,c=0;
printf("输入a b c三个值判断是否为三角形\n") ;
while(scanf("%d""%d""%d",&a,&b,&c)!=EOF)
{
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;
}
实验结论
//预期结果如图
实验任务6
编写一个简单的猜日期程序task6.c。具体要求如下:
使用随机函数,生成[1, 30]之间一个随机整数作为11月的lucky day
用户有3次猜的机会。根据用户输入的日期,提示用户猜的日期是猜中了,或是,早或晚
如果用户已经猜中了,则无需打印输出lucky day
如果用户用光三次机会也没有猜中,则打印输出用户在11月的lucky day
task6.c
SHOW CODE
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand((unsigned int)time(NULL));
printf("猜猜2025年11月哪一天是你的lucky day\n 开始喽,你有三次机会\n 猜吧(1~30)");
int luckyday = rand()%30+1;
int guess,count = 0;
while(count<3)
{
scanf("%d",&guess);
count++;
if(guess==luckyday)
{
printf("哇,猜中了\n");
return 0;
}
else if (guess>luckyday) printf("日期猜晚了,你的luckyday在前面哦\n");
else printf("日期猜早了,你的luckyday还没到呢\n");
if(count<3) printf("再猜(1~30)");
}
printf("次数用光了。偷偷告诉你,11月你的luckyday是%d",luckyday);
}
实验结论
//预期结果如图
实验总结
srand((unsigned int)time(NULL)) srand是unsigned int类型,所以这里time进行了强制类型转换
while(scanf("%d""%d""%d",&a,&b,&c)!=EOF) CTRL+Z结束进程
strcmp 用于比较两个字符串的标准函数库
if(strcmp(input,"r")==0) 返回0,相等;正数,大于;负数,小于;