判断
问题描述:给定两个时间,计算其时间差,输出形式为x小时y分。
代码:
#include <stdio.h>
int main()
{
int hour1, minute1;
int hour2, minute2;
//输入两个时间
scanf("%d %d", &hour1, &minute1);
scanf("%d %d", &hour2, &minute2);
//计算时间差
int t1 = hour1 * 60 + minute1;
int t2 = hour2 * 60 + minute2;
int t = t2 - t1;
printf("时间差是%d小时%d分。\n", t/60, t%60);
return 0;
}
这里考虑到会有从小时位借位的情况,因此:
- hour1*60+minute1–>转换为分钟为单位;
- t/60–>小时部分;t%60–>分钟部分。
我们可以在这里用if语句判断是否需要借位,改动后的代码为:
#include <stdio.h>
int main()
{
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);
return 0;
}
Tips:
- else总是与最近的那个if匹配;
- 在if或else后面总是用{};
- 即使只有一条语句的时候;
循环
问题描述:给定一个任意位数的整数,数出它的位数。
代码:
#include <stdio.h>
int main()
{
//输入一个正整数
int x;
int n = 0;
scanf("%d", &x);
//数位数
n ++;
x /= 10;
while(x > 0){
n ++;
x /= 10;
}
printf("%d\n", n);
return 0;
}
while和do_while
我们发现n ++;x /= 10;这一段代码在循环前后重复出现,而循环有while、do_while和for三种。其中while和do_while的区别为:
- while先做判断再做循环体内的内容,循环次数可以为0;
- do_while先做循环再做判断,循环次数至少为1。
这个例子里无论循环条件成立与否都要先执行一次,因此应该用do_while循环。
改动后的代码为:
#include <stdio.h>
int main()
{
//输入一个正整数
int x;
int n = 0;
scanf("%d", &x);
//数位数
do{
n ++;
x /= 10;
}while(x > 0);
printf("%d\n", n);
return 0;
}
for语句
for语句一般在循环次数已知的情况下使用,形式为for(count=10;count>0;count --),可以读为“对于一开始的count=10,当count>0时,重复做循环体,每一轮循环在做完循环体内语句后,使得count --。”
下面举例说明:
问题描述:给定一个整数n,计算得到该数的阶乘n!。
while语句的代码:
#include <stdio.h>
int main()
{
//输入一个正整数
int n;
scanf("%d", &n);
int fact = 1;
//计算阶乘
int i = 1;
while(i <= n){
fact *= i;
i++;
}
printf("%d!=%d\n", n,fact);
return 0;
}
for语句的代码:
#include <stdio.h>
int main()
{
//输入一个正整数
int n;
scanf("%d", &n);
int fact = 1;
//计算阶乘
int i = 1;
for(i=1;i <= n;i++){
fact *= i;
}
printf("%d!=%d\n", n,fact);
return 0;
}
从上面的例子可以看出,while语句和for语句是可以相互替换的,一般在循环次数已知的情况下用for语句,循环次数未知的情况下用while语句。在本例子里,循环次数已知,为n次,因此使用for语句要好一些。
Tips for loops:
- 如果有固定次数,用for;
- 如果必须执行一次,用do_while;
- 其他情况用while。