@TOC
3.1.1做判断:if语句根据条件决定做还是不做
计算时差 输入两个时间,每个时间分别输入小时和分钟的值,然后输出两个时间之间的差,也以几小时几分钟表示 int hour1,minute1; int hour2,minute2; scanf("%d %d",&hour1,&minute1); scanf("%d %d",&hour2,&minute2); 如果直接分别减,会出现分钟借位的情况。 如果 就用分别减的方案,然后判断有没有出现借位行不行? 借位的表现是,分钟减的结果小于0 int im=minute2-minute1; if(im<0){ .... } 代码:
#include<stdio.h>
int main()
{
int hours1,min1;
int hours2,min2;
scanf_s("%d %d",&hours1,&min1);
scanf_s("%d %d",&hours2,&min2);
int hours = hours1 - hours2;
int min = min1 - min2;
if (min < 0)
{
min = min + 60;
hours--;
}
printf("相差%d时%d分",hours,min);
}
如果 if(条件成立){ ... }
3.1.2判断的条件:关系运算,做比较的运算符
条件 计算两个值之间的关系,所以叫做关系运算
| 运算符 | 意义 |
|---|---|
| == | 相等 |
| != | 不相等 |
| 大于 | |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
关系运算的结果 当两个值的关系符合关系运算符的预期时,关系运算的结果为整数1,否则为整数0 printf("%d\n",5==3); printf("%d\n",5>3); printf("%d\n",5<=3); 优先级 所有的关系运算符的优先级比算数运算的低,但是比赋值运算的高 7>=3+4; int r = a > 0; 优先级 判断是否相等的 ==和!=的优先级比其他的低,而连续的关系运算符是从左到右进行的 5>3 ==6>4 6>5>4 a ==b= =c a= =b>0
3.1.3找零计算器
找零计算器需要用户做两个操作:输入购买的金额,输入支付的面票,而找零计算器则根据用户的输入做出相应的动作:计算并打印找零,或告知用户余额不足以购买。 从计算机程序的角度看,这就是意味着程序需要读用户的两个输入,然后进行一些计算和判断,最后输出结果。 代码:
#include<stdio.h>
int main()
{
//初始化
int price;
int bill;
//读入金额和面票
printf("请输入金额:");
scanf_s("%d",&price);
printf("请输入面票:");
scanf_s("%d",&bill);
//计算找零
if (bill>=price)
{
printf("找您%d元",bill-price);
}
}
注释 以两个斜杠“//”开头的语句把程序分成了三个部分: 1.初始化 2.读入金额和票面 3.计算并打印找零 多行注释 延续数行的注释,要用多行注释的格式来写。多行注释由一对字符序列“/*”开始,而以" */"结束。也可以用于一行内的注释 int ak=47/*36 */,y=9;
3.1.4否则的话如果条件不成立呢?
else else=否则的话 代码:
#include<stdio.h>
int main()
{
//初始化
int price;
int bill;
//读入金额和面票
printf("请输入金额:");
scanf_s("%d",&price);
printf("请输入面票:");
scanf_s("%d",&bill);
//计算找零
if (bill>=price)
{
printf("找您%d元",bill-price);
}
else
printf("您还需要给我%d元",price-bill);
}
比较数的大小
#include <stdio.h>
int main()
{
printf("请输入两个整数:");
scanf("%d %d",&a,&b);
int max=0;
if(a>b)
{
max=a;
}else
{
max=b;
}
printf("大的那个数是%d\n",max);
}
3.1.5if语句再探:if和else后面也可以没有{}而是一句话
if语句 一个基本是if语句由一个关键字if开头,跟上在括号里的一个表示条件的逻辑表达式,然后是一对大括号"{}"之间的若干条语句。如果表示条件的逻辑表达式的结果不是零,那么就执行后面跟着的这对大括号中的语句,否则就跳过这些语句不执行,而继续下面的其他语句。 if(total>amount) total+=amount+10; if语句这一行结束的时候并没有表示语句结束的";",而后面的赋值语句写在if的下一行,并且缩颈了,在这一行结束的时候有一个表示语句结束的";"。这表明这条赋值语句是if语句的一部分,if语句拥有和控制这条赋值语句,决定它是否要被执行。 计算薪水 代码:
#include<stdio.h>
int main()
{
const RATE = 8.25;
const STANDARD = 40;
double pay = 0.0;
int hours;
printf("请输入工作时间:");
scanf_s("%d",&hours);
if (hours > STANDARD)
{
pay = STANDARD * RATE + (hours - STANDARD) * (RATE * 1.5);
}
else
pay = hours * RATE;
printf("应付工资:%lf",pay);
}
3.2分支
3.2.1嵌套的if-else:在if或else后面要执行的还是if语句,就成了嵌套
找三个数中最大的 代码:
#include<stdio.h>
int main()
{
int a, b, c, max;
scanf_s("%d %d %d",&a,&b,&c);
if (a > b)
{
if (a > c)
{
max = a;
}
else
{
max = c;
}
}
if (a < b)
{
if (b > c)
{
max = b;
}
else max = c;
}
printf("最大的数是:%d",max);
}
当if的条件满足或者不满足的时候要执行的语句也可以是一条if或if-else语句,这就是嵌套的if语句 if(code == READY) if(count<20) else printf("继续等待"); else的匹配 else总是和我最近的那个if匹配 if(code==READY){ if(counr<20) printf("一切正常"); }else printf("继续等待"); 缩进 if(code ==READY) if(count<20) printf("一切正常"); else printf("继续等待"); 上面的代码中else虽然个第一个if对齐,但是在计算机运行的过程中是和第二个if关联的,因此缩进和if的配对没有关系。 tips 在if或else后面总是用{} 即使只有一条语句的时候。
3.2.2级联的if-else if像分段函数这样的程序就可以写成这样的if
分段函数
if(x<0)
{
f=-1;
}else if(x == 0)
{
f=0;
}else
{
f=2*x;
}
级联的if-else if if(exp1) st1; else if(exp2) st2; else st2; 像这样的有的人会有下面一种写法:
if(x<0){
printf("%d",-1);
}else if(x == 0){
printf("%d",0);
}else{
printf("%d",2*x);
}
一般不推荐这样写,最好写为单一出口。
3.2.3if语句常见的错误:没有{},多了;,=和==这些都是常见的错误
if语句的常见的错误 忘了大括号 if后面的分号 错误使用==和= 使人困惑的else 忘了大括号 错误代码: if(age>60) salary=salary1.2; printf("%f",salary); 这个代码的本意是如果age大于60,就乘1.2再输出,但是因为忘记加大括号所以无论age是否大于60都会输出age, 修改代码: if(age>60){ salary=salary1.2; printf("%f",salary); } 永远在if和else后面加上大括号,即使当时后面只有一条语句 if后面的分号 如果if后面加分号,计算机就不会进行判断,会直接运行if下面的语句。 **错误使用 ==和= id只要求()里的值是非零或零 如果()里面只有一个等号,例如: if(A=B) { printf("A=B"); } 这样的话,计算机会自动帮你将B赋值给A然后判断A是不是为零,再执行大括号里的值。
代码风格 在if和else之后必须加上大括号形成语句块; 大括号内的语句缩进一个tab的位置
3.2.4多路分支
switch-case
switch(type)(
case 1:
printf("你好");
break;
case 2:
printf("早上好");
break;
case 3:
printf("晚上好");
break;
case 4:
printf("再见");
break;
default:
printf("?");
switch-case switch(控制表达式) { case 常量: 语句 。。。 case 常量: 语句 。。。 default: 语句 。。。 } 控制表达式只能是整数型的结果 常量可以是常数,也可以是常数计算的表达式 根据表达式的结果,寻找匹配的case,并执行case后面的语句,一直到break为止 如果所有的case都不匹配,那么就执行default后面的语句; 如果没有default,那么就什么都不做。 break switch语句可以看作是一种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case(分支语句)处。 分支标号只是说明switch内部位置的路标,在执行完分支的最后一条语句后,如果后面没有break,就会顺序执行到下面的case里去,直到遇到一个break,或者switch结束为止。 练习 题目:当成绩大于90为A 当成绩小于90且大于等于80为B 当成绩小于80且大于等于70为C 当成绩小于70且大于等于60为D 当成绩小于60为E 代码:
#include<stdio.h>
int main()
{
printf("请输入分数:");
int scour;
scanf_s("%d",&scour);
int scour1 = scour / 10;
switch (scour1)
{
case 10:
case 9:
printf("A");
break;
case 8:
printf("B");
break;
case 7:
printf("C");
break;
case 6:
printf("D");
break;
default:
printf("E");
break;
}
return 0;
}