十三.做判断
devc++调整代码大小:工具-编译器选项-显示
1.算时间差
第二章计算时间差考虑到借位的情况,转化成分钟后再取余,如果就用分别减的方法,然后判断有没有出现错位的情况
int hour1,minute1;
int hour2,minute2;
scanf("%d %d",&hour1,&minute1);
scanf("%d %d",&hour2,&minute2);
int ih=hour2-hour1;
int im=minute2-minute1;
if(im<0){
im=60+im;
ih--;
}
printf("时间差是%d小时%d分钟",ih,im);
2.调试

在if(im<0){设置断点,im此时是-40<0,则执行命令,否则直接跳过if
3.if如果
if(条件成立){
…
}
条件成立则执行…否则直接跳过if
十四.判断的条件
1.条件
()里面的是计算两个值之间的关系,叫做关系运算
|
运算符 |
意义 |
|
== |
相等 |
|
!= |
不相等 |
|
> |
大于 |
|
>= |
大于或等于 |
|
< |
小于 |
|
<= |
小于或等于 |
2.关系运算符的结果
两个值的关系符合关系运算符,关系运算符的结果为整数1,否则为整数0
printf("%d\n",5==3);
printf("%d\n",5>3);
printf("%d\n",5<=3);
![]()
3.优先级
所有关系运算符的优先级<算数运算符的优先级;但是>赋值运算符的优先级
7>=3+4---7>=7---1
printf("%d\n",7>=3+4);
![]()
int r=a>0; 先a>0,再赋值
4.关系运算符之间的优先级
==和!=优先级<其他,连续关系运算是从左到右
5>3==6>4---1==1---1
6>5>4---1>4---0
a==b==6---1(或0)==6
a==b>0---1(或)>0rr
十五.找零计算器
1.找零计算器原理
找零计算器需要用户做两个操作:输入购买的金额,输入支付的票面,找零计算器做两个动作:计算并打印找零,或告知用户余额不足以购买
计算机程序角度看:程序需要读用户的两个输入,然后计算判断给出结果
//初始化
int price=0;
int bill=0;
//读入金额和票面
printf("请输入金额:");
scanf("%d",&price);
printf("请输入票面:");
scanf("%d",&bill);
//计算找零
printf("应该找您%d元",bill-price);
2.注释
//单行注释,/**/多行注释
//是c99的注释,ansic不支持
3.判断票面够不够
//初始化
int price=0;
int bill=0;
//读入金额和票面
printf("请输入金额:");
scanf("%d",&price);
printf("请输入票面:");
scanf("%d",&bill);
//计算找零
if(price<=bill){
printf("应该找您%d元",bill-price);
}
4.流程图
流程图设计软件draw.io

5.人机交互案例
const int MINOR=35;
int age=0;
//printf人机交互
printf("请输入你的年龄:");
scanf("%d",&age);
if(age<MINOR){
printf("人生才刚刚开始,");
}
printf("珍惜时光");
流程图就不画了,太麻烦了
十六.否则的话
1.else否则的话
在你的if后面写
else{
…
}
//初始化
int price=0;
int bill=0;
//读入金额和票面
printf("请输入金额:");
scanf("%d",&price);
printf("请输入票面:");
scanf("%d",&bill);
//计算找零
if(price<=bill){
printf("应该找您%d元",bill-price);
}
else{
printf("钱不够");
}
2.比较数的大小
int a,b;
printf("请输入两个整数:");
scanf("%d %d",&a,&b);
int max=0;
if(a>b){
max=a;
}
printf("大的那个是%d\n",max);
这个代码的问题是a<=b的情况没有考虑
方案1
int a,b;
printf("请输入两个整数:");
scanf("%d %d",&a,&b);
int max=0;
if(a>b){
max=a;
}
if(b>a){
max=b;
}
printf("大的那个是%d\n",max);
问题:a=b的时候终端是0,我们不需要考虑a=b的情况,else包括a<=b的情况
方案2
int a,b;
printf("请输入两个整数:");
scanf("%d %d",&a,&b);
int max=0;
if(a>b){
max=a;
}
else{
max=b;
}
printf("大的那个是%d\n",max);
方案3
int a,b;
printf("请输入两个整数:");
scanf("%d %d",&a,&b);
int max=b;
if(a>b){
max=a;
}
printf("大的那个是%d\n",max);
十七.if语句再探
1.if和else不加{}的情况
if和else()后可以不加{},而是下一句成为执行的语句
if(total>amount)
//记得;
total+=amount+10;
2.计算薪水
const double RATE=8.25;
const int STANDARD=40;
double pay=0.0;
int hours;
printf("请输入工作小时数:");
scanf("%d",&hours);
printf("\n");
if (hours>STANDARD)
pay=STANDARD*RATE+(hours-STANDARD)*(RATE*1.5);
else
pay=hours*RATE;
printf("实付工资%f",pay);
3.判断成绩
const pass=60;
int score;
printf("请输入成绩:");
scanf("%d",&score);
printf("你输入的成绩是%d",score);
if(score>pass)
printf("成绩合格");
else
printf("成绩不合格");
//这个printf就和ifelse没关系了
printf("再见");
十八.嵌套的if-else
1.三个整数,输出最大的
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
int max=0;
if(a>b){
if(a>c){
max=a;
}
}else{
if(b>c){
max=b;
}else{
max=c;
}
}
printf("最大的数是%d",max);
if-else不使用{}的写法
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
int max=0;
if(a>b)
if(a>c)
max=a;
else
max=c;
else
if(b>c)
max=b;
else
max=c;
printf("最大的整数是%d",max);
这种写法好像只有我自己看得懂,不推荐用这个方法写嵌套
2.嵌套的判断
if的条件满足或者不满足的时候要执行的语句也可以是一条if或if-else语句,这是嵌套的if语句
if(code==READY)
if(count<20)
printf("一切正常\n");
else
printf("继续等待\n");
const int READY=24;
int code=0;
int count=0;
scanf("%d %d",&code,&count);
if(code==READY)
if(count<20)
printf("一切正常\n");
else
printf("继续等待\n");
3.else的匹配
在if-else不使用{}的情况下,else总与最近的if匹配,如果是if if else else,里面两个匹配,外边两个匹配
加了{}就和最近的{}的if匹配
const int READY=24;
int code=0;
int count=0;
scanf("%d %d",&code,&count);
if(code==READY){
if(count<20)
printf("一切正常\n");
}else
printf("继续等待\n");
4.缩进
缩进格式不能暗示if-else的匹配
5.好习惯
if-else后面习惯用{}
十九.级联的if-else
1.分段函数
f(x)=-1,x<0|0,x=0|2x,x>0
int x;
scanf("%d",&x);
int y=0;
if(x<0)
y=-1;
else if(x==0)
y=0;
else
y=2*x;
printf("%d\n",y);

2.级联if-else
下面的应该是无{}用法
if(exp1)
st1;
else if(exp2)
st2;
else
st3;
我们用有{}的用法
if(exp1){
st1;
}else if{(exp2)
st2;
}else
st3;
二十.多路分支:switch-case语句
1.根据每个值执行
int type=0;
scanf("%d",&type);
if(type==1)
printf("你好");
else if(type==2)
printf("早上好");
else if(type==3)
printf("晚上好");
else if(type==4)
printf("再见");
else
printf("什么啊");
依次执行
2.switch-case
int type=0;
scanf("%d",&type);
switch(type){
case 1:
printf("你好");
break;
case 2:
printf("早上好");
break;
case 3:
printf("晚上好");
break;
case 4:
printf("再见");
break;
default:
printf("什么啊");
}
直接找到对应的case,到break后直接结束
3.switch-case格式
switch(控制表达式){
case 常量:
语句
…
case 常量:
语句
…
default:
语句
…
}
控制表达式只能是整数型的结果
常量可以是常数,也可以是常数计算的表达式
注意:用const的一个变量做case后面的常量是c99才能用的
4.switch-case运行规则
简之,从常量和控制表达式符合的case,再往下走,直到遇到第一个break跳过整个switch-case
5.利用switch-case的特性
成绩转换
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
沈睿(浙江大学)
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
输入格式:
输入在一行中给出1个整数的百分制成绩。
输出格式:
在一行中输出对应的五分制成绩。
输入样例:
90
输出样例:
A
思路:第一想法是级联
int score;
printf("请输入成绩:\n");
scanf("%d",&score);
if(score>=90){
printf("A");
}else if(80<=score<90){
printf("B");
}else if(70<=score<80){
printf("C");
}else if(60<=score<70){
printf("D");
}else if(score<60){
printf("E");
}
这种写法不正确,eg:else if(80<=score<90)中,因为<=的优先级大于<,80<=score为真=1.1<90为真=1,在BCD中,无论输入什么score,都会输出B
解决方案:
int score;
printf("请输入成绩:\n");
scanf("%d", &score);
if(score >= 90){
printf("A");
}else if(score >= 80){ // 因为前面已经排除了 >=90,所以这里等价于 80<=score<90
printf("B");
}else if(score >= 70){
printf("C");
}else if(score >= 60){
printf("D");
}else{
printf("E");
}
第二想法是得到分数的十位数再用switch-case
int grade;
scanf("%d",&grade);
grade/=10;
switch(grade){
case 10:
case 9:
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("C\n");
break;
case 6:
printf("D\n");
break;
default:
printf("F\n");
break;
}
这段代码不符合单一出口,因为还没有学习字符或字符串数据的处理
也可以根据月份得出单词,以后可以用数组来做
6.分段函数有没有可能用switch-case来做
f(x)=-1,x<0|0,x=0|2x,x>0
我的思路是:要想使用switch-case,就要把这三段范围转换成三个点
int x,y;
scanf("%d",&x);
if(x>0)
x=1;
else if(x==0)
x=2;
else
x=3;
switch(x){
case 1:
printf("y=%d\n",2*x);
break;
case 2:
printf("y=%d\n",0);
break;
case 3:
printf("y=%d\n",-1);
break;
}
可以运行x<0和x=0,但是这种方法有一个bug,前面if-else把x的值覆盖了,以至于y=2*x的值一直是2
ai修改方案,用新变量保存分段标记
int x, y, flag;
scanf("%d", &x);
if(x > 0)
flag = 1;
else if(x == 0)
flag = 2;
else
flag = 3;
switch(flag) {
case 1:
y = 2 * x; // 用原始 x 计算
break;
case 2:
y = 0;
break;
case 3:
y = -1;
break;
}
printf("y=%d\n", y);
2万+



被折叠的 条评论
为什么被折叠?



