判斷
問題描述:給定兩個時間,計算其時間差,輸出形式爲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。