3.1 判断
3.1.1 做判断:if语句
对于上次提出的计算时间差的问题,如果采用分别减的方法,然后判断是否出现借位,则以这样的思路可以的出这样的代码
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;
ih--;
}
printf("时间差是%d小时%d分。\n", ih, im);
输出
10 30
11 20
时间差是0小时50分。
结果显然是正确的。当im>0时,即没有出现借位,im等于分钟数直接相减,当im<0即出现借位时,运行if后面{}内的内容,将相减后的im加上60,ih减一。
这是if语句的格式
if(条件成立){
...
}
3.1.2 判断的条件
注意"==“是关系运算,”="是赋值
- 关系运算的结果只有1或0;
- 关系运算优先级比算术运算低,比赋值运算高;
- 其中==和!=的优先级比其他的低,连续的关系运算是从左至右的;
3.1.3 找零计算器
找零计算器需要用户做两个操作,即给出金额和票面,计算器会据此打印找零或告知余额不足。从计算机程序角度看,需要两个输入,然后进行计算和判断输出结果。
代码如下
//初始化
int price=0;
int bill=0;
//读入金额和票面
printf("请输入金额:");
scanf("%d", &price);
printf("请输入票面:");
scanf("%d", &bill);
//计算找零
if(bill>price){
printf("应该找您:%d", bill-price);
}
其中,//是注释,是对人类读者提供解释信息,只能用于单行。/**/是多行注释,也可用于单行。有了注释之后代码看起来更清晰。
//单行注释
/*多行注释用于单行*/
/*多行注释用于
多行*/
这段代码可以用流程图来表示
黄圈表示if语句的部分。
老师又举了个年龄的例子,与找零计算器类似。
如果输入的年龄小于35,就会先输出一句话“年轻是美好的,”。
3.1.4 否则的话
上面的找零计算器如果钱不够程序会直接结束,但是如果想让程序在if判断结果为否时运行其它内容,就需要用到else。
代码改动如下
//初始化
int price=0;
int bill=0;
//读入金额和票面
printf("请输入金额:");
scanf("%d", &price);
printf("请输入票面:");
scanf("%d", &bill);
//计算找零
if(bill>price){
printf("应该找您:%d", bill-price);
} else{
printf("你的钱不够\n");
}
输出
请输入金额:100
请输入票面:80
你的钱不够
另一个例子,比较两数的大小
方案一
int max=0;
if(a>b){
max=a;
}
if(b>a){
max=b;
}
两个问题,一是当a=b时程序会出错,二是判断两数大小只需比较一次。
方案二
int max=0;
if(a>b){
max=a;
}else{
max=b;
}
方案三
int max=b;
if(a>b){
max=a;
}
方案二更为清晰易懂,方案三更为聪明,孰优孰劣个人有个人的判断。
3.1.5 if语句再谈
- if(total>amount)
total+=amount+10;
if语句()后面没有“;”表示语句没有结束,要在下一行的赋值语句后加“;”以表示语句结束。
使用if和else语句时要注意{}内的内容。
3.2 循环
3.2.1 有些事就得用循环来解决
给一个整数,如何输出整数的位数呢?
如果题目明确四位数及以下正整数
if(x>999){
n=4;
}else if(x>99){
n=3;
}else if(x>9){
n=2;
}
但是如果问题是任意范围的正整数,这种方法就不太可行了。
这里就要引出循环。
给出下面的代码
n++;
x/=10;
while(x>0){
n++;
x/=10;
}
这样就可以解决更大范围正整数的位数问题。
3.2.2 while循环
while和if语法结构相类似
if(x>0){
x/=10;
n++
}
和
while(x>0){
x/=10;
n++;
}
其中,while后面{}里面的内容叫做循环体,while语句的流程图如下
注意,循环体内要有改变条件的机会
在验证程序时,常使用边界数据,如有效范围两端的数据、特殊的倍数等,以及个位数、10、0、负数等。
在调试程序时,在程序适当位置插入printf,这样也许会省去debug。
3.2.3 do-while循环
do-while循环与while循环相比,区别在于do-while循环要先执行一边循环体,除此之外二者完全相同,尤其是()内的条件相同。
do-while的语法结构和流程图如下
3.3.4 for循环
for循环像计数循环,设定一个计数器并初始化,在计数器到达某值钱重复执行循环体,同时计数器值以一定步进行调整,比如加1或减1。如
- for(count=10;count>0;count–)
- 读成:“对于一开始的count=10,当count>0时,重复执行循环体,每一轮循环在做完循环体内语句后使count–。”
3.3.5 循环的选择
对于for(i=0;i<n;i++),循环次数为n,循环结束之后i=n,而对于for(i=1;i<=n;i++),循环次数 为n,循环结束之后i=n+1。
for循环和while循环有时是等价的。
如
for(int i=1;i++){
fact*=i;
}
和
int i=1;
while(i<=n){
fact*=i;
i++
}
for循环的语法结构为
for(初始动作;条件;每轮的动作){
}
for循环中每一个表达式都可省略(分号必须有)。
for(;条件;)==while(条件)
tips for loops
- 如果有固定次数用for;
- 如果必须执行一次用do-while;
- 其他情况用while。