羅左欣 BE STRONG TO BE USEFUL

20160405 [學習筆記] 由片語學習C程式設計(4) -- 判斷


整理自 由片語學習C程式設計 - Ch04 : 判斷

[ 筆記內容 ]

(一)if 判斷
  1.  if then
    [ 範例 4-1 ] 只顯示正數
    [ 範例 4-2 ] 檢查 i 及 j 的乘積是否為正數
  
  2.  if then else
    [ 範例 4-3 ] 顯示絕對值
    [ 範例 4-4 ] 決定三個數中的最大值
    [ 範例 4-5 ] 讀入兩個整數並由小到大印出
  
  3.  if then else if
    [ 範例 4-6 ] 使用 else if 判定閏年
    [ 範例 4-7 ] 使用多層 if 判定閏年

  4.  判斷式值
    [ 範例 4-8 ] 顯示絕對值(利用判斷式值精簡化)
    [ 範例 4-9 ] 決定三個數中的最大值(利用判斷式值精簡化)
    [ 範例 4-10 ] 判斷平閏年(利用判斷式值精簡化)


(二)switch 判斷
    [ 範例 4-11 ] 使用 switch 依據 power 值做不同的事
    [ 範例 4-12 ] 使用 switch 依據 power 值做不同的事(少寫一個 break)
    [ 範例 4-13 ] 決定一個月的天數


(三)作業
    [ 作業 4-14 ]
    [ 作業 4-15 ]
    [ 作業 4-16 ]
    [ 作業 4-17 ]
    [ 作業 4-18 ]
    [ 作業 4-19 ]
    [ 作業 4-20 ]
    [ 作業 4-21 ]

[ 範例程式碼 ] GitHub


(一)if 判斷

1. if then

  • 根據條件(condition)決定是否執行敘述(statement)。如果條件為真(非零),則會執行敘述;如果條件為偽(零),則不會執行敘述。
// if then 判斷
if (condition)
    statement;
[ 範例 4-1 ] 只顯示正數
// "4-1.c"
#include <stdio.h>
main()
{
    int i;
    scanf("%d", &i);
    
    if (i > 0)
        printf("%d\n", i);
}

< 執行結果 >

  • 複合敘述:將一組敘述合在一起當成一個敘述使用。兩個以上的敘述要用”大括號{}”包起來,而且句尾都有分號。
// if 複合敘述
if (condition) {
    staement1;
    staement2;
    staement3;
}
[ 範例 4-2 ] 檢查 i 及 j 的乘積是否為正數
// "4-2.c"
#include <stdio.h>
main()
{
    int i;
    int j;
        
    scanf("%d", &i);
    scanf("%d", &j);

    if(i * j > 0) {
        printf("%d\n", i);
        printf("%d\n", j);
    }
}

< 執行結果 >

2. if then else

  • 如果條件為真(非零),則會執行敘述1;如果條件為偽(零),則會執行敘述2。
// if then else 判斷
if (condition)
    statement1;
else
    statement2;
[ 範例 4-3 ] 顯示絕對值
// "4-3.c"
#include <stdio.h>
main()
{
    int i;
    int k;
    scanf("%d", &i);
    
    if(i > 0)
        k = i;
    else
        k = -i;

    printf("%d\n", k);
}

< 執行結果 >

  • 將較大值設為 max
// 將 i 及 j 的較大值設為 max
if (i > j)
    max = i;
    else
    max = j;    
// 將 i 及 max 的較大值設為 max
if (i > max)
    max = i;
[ 範例 4-4 ] 決定三個數中的最大值
// "4-4.c"
#include <stdio.h>
main()
{
	int i, j;
	scanf("%d", &i);
	scanf("%d", &j);

	if(i > j) {
		printf("%d\n", j);
		printf("%d\n", i);
	} else {
		printf("%d\n", i);
		printf("%d\n", j);
	}
}

< 執行結果 >

  • 在 then 和 else 的部份使用複合敘述
// 在 then 和 else 的部份使用複合敘述
if (condition) {
    statement1;   
    statement2;
    statement3;
} 
else {
    statement4;
    statement5;
    statement6;
}
[ 範例 4-5 ] 讀入兩個整數並由小到大印出
// "4-5.c"
#include <stdio.h>
main()
{
	int i, j;
	scanf("%d", &i);
	scanf("%d", &j);

	if(i > j) {
		printf("%d\n", j);
		printf("%d\n", i);
	} else {
		printf("%d\n", i);
		printf("%d\n", j);
	}
}

< 執行結果 >

3. if then else if

  • “多層次的 if-then-else” 結構也稱為 “巢狀 if-then-else”
// else if
if (condition1)
    statement1;
else if (condition2)
    statement2;
else
    statement3;   
[ 用法說明 ]
  • 如果條件 1 為真,則只執行敘述 1 並結束。
  • 如果條件 1 為偽,進入下列判斷:
    • 如果條件 2 為真,只執行敘述 2 並結束。
    • 如果條件 3 為偽,只執行敘述 3 並結束。
[ 範例 4-6 ] 使用 else if 判定閏年
  • 使用 else if 判定閏年,把判定的結果存在 k 中。如果 k 為 1,則 year 為閏年;如果 k 為 0,則 year 為平年。
// "4-6.c"
#include <stdio.h>
main()
{
	int year, k;
	scanf("%d", &year);
	
	if (year % 400 == 0)
		k = 1;
	else if ((year % 4 == 0) && (year % 100 != 0))
		k = 1;
	else
		k = 0;

	printf("%d\n", k);	
}

< 執行結果 >

[ 範例 4-7 ] 使用多層 if 判定閏年
  • 一個 else 會對應到往上最近的一個尚未對應的 if。
// "4-7.c"
#include <stdio.h>
main()
{
	int year, k;
	scanf("%d", &year);
	
	if (year % 400 != 0)
		if ((year % 4 == 0) && (year % 100 != 0))
			k = 1;
		else
			k = 0;
	else
		k = 1;
	
	printf("%d\n", k);
}

< 執行結果 >

4. 判斷式值

  • 如果”條件(condition)”為真,則”變數(variable)”的值設為”算式1(expression1),否則設為”算式2(expression2)。
// 判斷式值
(condition)?expression1:expression2
[ 範例 4-8 ] 顯示絕對值(利用判斷式值精簡化)
// "4-8.c"
#include <stdio.h>
main()
{
	int i, k;
	scanf("%d", &i);
	
	k = (i > 0)? i : -i;
	printf("%d\n", k);
}

< 執行結果 >

[ 範例 4-9 ] 決定三個數中的最大值(利用判斷式值精簡化)
// "4-9.c"
#include <stdio.h>
main()
{
	int i, j, k, max;
	scanf("%d", &i);
	scanf("%d", &j);
	scanf("%d", &k);

	max = (i > j)? i : j;
	if (k > max)
		max = k;
	printf("%d\n", max);
}

< 執行結果 >

[ 範例 4-10 ] 判斷平閏年(利用判斷式值精簡化)
// "4-10.c"
#include <stdio.h>
main()
{
	int year, k;
	scanf("%d", &year);
	k = (year % 400 == 0) ? 1 : (((year % 4 == 0) && (year % 100 != 0)) ? 1 : 0);
	printf("%d\n", k);
	
	scanf("%d", &year);
	k = (year % 400 == 0) || (((year % 4 == 0) && (year % 100 != 0)) ? 1 : 0);
	printf("%d\n", k);
}

< 執行結果 >


(二)switch 判斷

  • switch 判斷會根據一個旗標變數的”值”,在許多個可能中選擇一個來執行。
// 使用 switch 判斷
switch (flag) {
    case 1 :
        statement1;
        break;
        
    case 2 :
        statement2;
        break;
    ...
    
    case n :
        statementn;
        break;

    default :
        default_statement;
    }

[ 用法說明 ]

  1. flag 必須只能是一個變數,而非一個算式。(所以不能使用 i + j)
  2. 接在 case 之後的必須是常數。
  3. 接在敘述之後的 break 不可省略。break 在這裡的意思是跳出整個 switch 判斷,執行下一個敘述。
  4. 如果旗標變數 flag 的值不在這些列舉的 case 中,則會執行預設敘述(default statement)。雖然 switch 可以不寫 default ,但為了程式的正確性,必須加上 default 用以處理例外的狀況。
[ 範例 4-11 ] 使用 switch 依據 power 值做不同的事
// "4-11.c"
#include <stdio.h>
main()
{
	int i, j, power;
	scanf("%d", &power);
	scanf("%d", &i);
	
	switch (power) {
		case 1 :
			j = i;
			break;
		case 2 :
			j = i * i;
			break;
		case 3 :
			j = i * i * i;
			break;
		default :
			j = 0;
	}
	printf("%d\n", j);
}

< 執行結果 >

[ 範例 4-12 ] 使用 switch 依據 power 值做不同的事(少寫一個 break)
// "4-12.c"
#include <stdio.h>
main()
{
	int i, j, power;
	scanf("%d", &power);
	scanf("%d", &i);
	
	switch (power) {
		case 1 :
			j = i;
			break;
		case 2 :
			j = i * i;
		case 3 :
			j = i * i * i;
			break;
		default :
			j = 0;
	}
	printf("%d\n", j);
}

< 執行結果 >

[ 範例 4-13 ] 決定一個月的天數
// "4-13.c"
#include <stdio.h>
main()
{
	int year, month, days;
	scanf("%d", &year);
	scanf("%d", &month);

	switch (month) {
		case 1 : case 3 : case 5 : case 7 : case 8 :
		case 10 : case 12 :
			days = 31;
			break;

		case 4 : case 6 : case 9 : case 11 :
			days = 30;
			break;

		case 2 :
			if ((year % 4 == 0 && (year % 100 != 0)))
				days = 29;
			else
				days = 28;
			break;
		default :
			days = 0;
	}
	printf("%d\n", days);
}

< 執行結果 >


(三)作業

  • 本章所有作業中的數字均為整數,且可用 int 代表,計算中也不會有溢位的問題。輸入均為一行一整數,行末有換行字元。輸出也均為一行一整數,行末有換行字元。
[ 作業 4-14 ]
  • 寫一個程式讀入三個正整數 a、b、c。計算並印出其中的最小值。
#include <stdio.h>
main()
{
	int i, j, k;
	int min = 0;
	scanf("%d%d%d", &i, &j, &k);

	if (i < j && i <k)
		min = i;
	else if (j < i && j < k)
		min = j;
	else if (k < i && k < j)
		min = k;
	
	printf("min = %d\n", min);
}

< 執行結果 >

[ 作業 4-15 ]
  • 寫一個程式讀入三個平面上的點座標,然後印出其中距離原點最遠的點。如果兩個或多個點有相同的距離,輸出最先出現的點座標。
#include <stdio.h>
main()
{
	int a1, a2, la;	// 點 a(a1, a2)、與原點距離 la
	int b1, b2, lb;	// 點 b(b1, b2)、與原點距離 lb
	int c1, c2, lc;	// 點 c(c1, c2)、與原點距離 lc

	printf("輸入a點的座標 : ");	scanf("%d%d", &a1, &a2);
	printf("輸入b點的座標 : ");	scanf("%d%d", &b1, &b2);
	printf("輸入c點的座標 : ");	scanf("%d%d", &c1, &c2);

	la = (a1 * a1 + a2 * a2);		// 判斷 a 的距離
	lb = (b1 * b1 + b2 * b2);	// 判斷 b 的距離
	lc = (c1 * c1 + c2 * c2);		// 判斷 c 的距離

	if (la <= lb && la <= lc)
	{
		printf("min = a(%d, %d)\n", a1, a2);
	}
	else if (lb <= la && lb <= lc)
	{
		printf("min = b(%d, %d)\n", b1, b2);
	}
	else if (lc <= la && lc <= lb)
	{
		printf("min = c(%d, %d)\n", c1, c2);
	}		
}

< 執行結果 >

[ 作業 4-16 ]
  • 寫一個程式讀入四個整數a、b、c、d。計算以 (a,b) 及 (c,d) 為兩對角頂點的長方形面積。注意 (a,b) 及 (c,d) 若是水平或是垂直共線則面積為 0 。
// "4-16.c"
#include <stdio.h>
main()
{
	int a = 0, b = 0;		// 點 (a, b) 
	int c = 0, d = 0;		// 點 (c, d)
	int area = 0;	// 由 (a, b) 和 (c, d) 兩對角所組成的長方形面積

	printf("請輸入 '點 (a, b)' 的資料:");
	scanf("%d%d", &a, &b);
	printf("請輸入 '點 (c, d)' 的資料:");
	scanf("%d%d", &c, &d);

	if ((a == c) || (b == d))	// 判斷是否為"垂直共線"(x軸) 或 "水平共線"(y軸)
		area = 0;
	else if ( (c - a) * (d - b) < 0)	// 判斷面積是否為負
		area = - (c - a) * (d - b);
	else
		area = (c - a) * (d - b);

	printf("面積為:%d\n", area);
}

< 執行結果 >

[ 作業 4-17 ]
  • 寫一個程式讀入四個整數a、b、c、d。本題保證 (a,b) 及 (c,d) 不會水平或是垂直共線。請計算以 (a,b) 及 (c,d) 為兩對角頂點的長方形周長。
// "4-17.c"
#include <stdio.h>
main()
{
	int a = 0, b = 0;		// 點 (a, b) 
	int c = 0, d = 0;		// 點 (c, d)
	int length = 0;	// 由 (a, b) 和 (c, d) 兩對角所組成的長方形周長

	printf("請輸入 '點 (a, b)' 的資料:");
	scanf("%d%d", &a, &b);
	printf("請輸入 '點 (c, d)' 的資料:");
	scanf("%d%d", &c, &d);

	if ((a == c) || (b == d))	// 判斷是否為"垂直共線"(x軸) 或 "水平共線"(y軸)
	{
		length = 0;
		printf("點 (a, b) 和 點 (c, d) 互為'垂直'或'水平'共線");
	}

	else if ((c - a) < 0 || (d - b) < 0)	// 判斷兩邊邊長是否為負
	{
		if ((c - a) < 0 && (d - b) > 0)	// 如果 x 座標相減為負
			length = 2 * ((-1) * (c - a) + (d - b));

		else if ((c - a) > 0 && (d - b) < 0)	// 如果 y 座標相減為負
			length = 2 * ((c - a) + (-1) * (d - b));

		else if ((c - a) * (d - b) > 0)	// 如果 x、y 座標相減皆為負
			length = - 2 * ((c - a) + (d - b));

		printf("周長為:%d\n", length);
	}
		
	else	// 如果 x、y 座標相減皆為正
	{
		length = (c - a) * (d - b);		
		printf("周長為:%d\n", length);
	}
}

< 執行結果 >

[ 作業 4-18 ]
  • 寫一個程式讀入三個非零整數 a、b、c。如果 f(x) = ax^2 + bx + c = 0 有重根則輸出 0 ,有兩相異實根輸出 1 ,有兩相異虛根則輸出 -1。
// "4-18.c"
#include <stdio.h>
main()
{
	int a, b, c;	// 三個非零的整數
	scanf("%d%d%d", &a, &b, &c);

	   /* 利用判別式: "b * b - 4 * a * c"  */
	if (b * b - 4 * a * c < 0)	// 判斷是否為兩相異虛根
		printf("-1");

	else if (b * b - 4 * a * c = 0)	// 判斷是否為重根
		printf("0");

	else if (b * b - 4 * a * c > 0)	// 判斷是否為兩相異實根
		printf("1");
}

< 執行結果 >

[ 作業 4-19 ]
  • 寫一個程式讀入三個正整數 a、b、c。如果邊長為 a、b、c 的三角形不存在則輸出 0,否則輸出 1。
// "4-19.c"
#include <stdio.h>
main()
{
	int a, b, c;	// 三個非零的整數
	scanf("%d%d%d", &a, &b, &c);

	   /* 利用三角形特性:任兩邊邊長相加必定大於另一邊 之長度 */
	if ((a + b > c) && (b + c > a) && (a + c > b))	
		printf("1\n");

	else
		printf("0\n");
}

< 執行結果 >

[ 作業 4-20 ]
  • 寫一個程式讀入兩個整數 a、b 並計算由 a 加到 b 的和。
// "4-20.c"
#include <stdio.h>
main()
{
	int a, b, sum = 0;
	scanf("%d%d", &a, &b);

	if ( a > b)
		for ( ; b <= a; b++)
			sum += b;

	else if ( b > a)
		for ( ; a <= b; a++)
			sum += a;

	printf("%d\n", sum);
}

< 執行結果 >

[ 作業 4-21 ]
  • 寫一個程式讀入三個正整數 a、b、c 並判定由 a、b、c 為邊長的三角形為銳角、鈍角或是直角三角形。如為銳角三角形則輸出 1,鈍角三角形則輸出 2,直角三角形則輸出 3。題目保證 a、b、c 可形成一個三角形。
// "4-21.c"
#include <stdio.h>
main()
{
	int a, b, c;	// 三個非零的整數 (3個三角形的邊長)
	int i, tmp = 0;
	scanf("%d%d%d", &a, &b, &c);

	   // 利用三角形勾股定理特性來判別三角形的種類 (三角形最長邊,預設為 "c > b" 同時 "c > a")
	
	if (b > c) {
		tmp = b;  b = c;  	c = tmp;
		if (a > c) {
			tmp = a;  a = c;  c = tmp;
		}
	}

	if (a > c) {
		tmp = a;  a = c;  c = tmp;
		if (b > c) {
			tmp = b;  b = c;  	c = tmp;
		}
	}
	
	if (a * a + b * b > c * c)	// 判定是否為銳角三角形
		printf("此為銳角三角形:1\n");

	else if (a * a + b * b < c * c)	// 判定是否為鈍角三角形
		printf("此為鈍角三角形:2\n");

	else if (a * a + b * b == c * c)	// 判定是否為直角三角形
		printf("此為直角三角形:3\n");
}

< 執行結果 >


Similar Posts

Comments