Exercise/C/ExpStmt

From YuntechWiki

Jump to: navigation, search



在C語言中,選擇性的敘述包括了if、if...else、switch。

1. if是根據判斷的結果而執行想執行的敘述(如果....就...),語法的結構如下:

if (判斷的條件) {
判斷條件成立時,執行的敘述
}
 
例如:如果我考不及格,就必須重修
 
if (成績<60) {
重修
}

此程式是判斷輸入整數如果大於等於10就輸出"輸入的整數大於等於10"

#include <stdio.h>
#include <stdlib.h>
int main(void){
int num;
printf("請輸入整數:");
scanf("%d", &num);
if (num>=10) {
printf("輸入的整數大於等於10\n");
}
system("pause");
return 0;
}
Output:
請輸入整數:12
輸入的整數大於等於10

if...else 則是遇到判斷不成立時,也想執行某些敘述時所使用的(如果...就...不然...),可以減少重複判斷的時間。

例如:如果我考試不及格,就必須重修,不然就不用重修了

if (判斷的條件) {
判斷條件成立時,執行的敘述(考試不及格)
} else {
判斷條件不成立,執行的敘述(考試及格)
}
 
例如:如果我考不及格,就必須重修
 
if (成績<60) {
重修
} else {
不必重修(成績>=60)
}

此程式是判斷輸入整數大於等於或是小於10,如果大於等於10則輸出"輸入的整數大於等於10",不然就輸出"輸入的整數小於10"

#include <stdio.h>
#include <stdlib.h>
int main(void) {
int num;
printf("請輸入整數:");
scanf("%d", &num);
if (num>=10) {
printf("輸入的整數大於等於10\n");
} else {
printf("輸入的整數小於10\n");
}
system("pause");
return 0;
}
Output:
請輸入整數:1
輸入的整數小於10

1-1

  • 請寫一程式,判斷使用者輸入的整數是否為4的倍數,如果是4的倍數,則輸出"n可以4被整除,所以n是4的倍數。"若不是4的倍數,則輸出"n不能被4整除,所以%d不是4的倍數。"(註:其中n為使用者所輸入的整數)
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int num;
printf("請輸入整數:");
scanf("%d", &num);
if (num % 4 == 0) {
printf("%d可以被4整除,所以%d是4的倍數。\n", num, num);
} else {
printf("%d不能被4整除,所以%d不是4的倍數。\n", num, num);
}
system("pause");
return 0;
}
Output:
請輸入整數:2
2不能被4整除,所以2不是4的倍數。
請輸入整數:8
8可以被4整除,所以84的倍數。

1-2

  • 請寫一程式,計算國、英、數分數的總平均,判斷是否及格,輸出"及格"或"不及格"和平均分數(U9323013@yuntech.edu.tw)
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int score;
int math;
int eng;
int cha;
float avg;
 
printf("請輸入國文分數:");
scanf("%d", &cha);
printf("請輸入英文分數:");
scanf("%d", &eng);
printf("請輸入數學分數:");
scanf("%d",&math);
avg = float( cha + eng + math ) / 3;
if ( avg >= 60 ) {
printf("及格。\n");
printf("平均分數:%f", avg);
} else {
printf("不及格。\n");
printf("平均分數:%f", avg);
}
 
system("pause");
return 0;
}
Output:
請輸入國文分數:1
請輸入英文分數:2
請輸入數學分數:1
不及格。
平均分數:1.333333

1-3

  • 家中每月基本電話費為99元,每秒以0.06元計算,長途電話每秒以0.36元計算,通話時間以分鐘計算,若在結算時,上個月電話費未付時,則增加1%的電話費,累計到當月的帳單中。
#include <stdio.h>
#include <stdlib.h>
#define BASIC_M 99
#define LONG_TIME_M 0.36
#define TIME_M 0.06
#define LAST_M 0.01
 
void instruct_data(void);
double cal_last_bill(double last_b);
double cal_bill(int l_talk_time, int talk_time);
void display_bill(double tal_dollars, double last_b, double last_dol);
 
int main (void) {
double last_bill ;//上個月的電話費
int talk_time ;//這個月的通話時間
int long_talk_time;//這個月的長途通話時間
double total_dollars;//總金額
 
instruct_data();
 
printf("請輸入上個月尚未繳款金額:");
scanf("%lf", &last_bill);
printf("請輸入本月通話時間:\n");
printf("長途通話時間為幾分鐘:");
scanf("%d", &long_talk_time);
printf("一般通話時間為幾分鐘:");
scanf("%d", &talk_time);
 
total_dollars = cal_bill( long_talk_time, talk_time) + cal_last_bill(last_bill) + last_bill;
display_bill(total_dollars, last_bill, cal_last_bill(last_bill));
 
system("pause");
return 0;
}
 
void instruct_data (void) {
printf("計算電話費之程式 \n");
printf("====================\n");
printf("基本電話費: %d 元 \n", BASIC_M);
printf("一般費率每秒鐘 %lf元\n", TIME_M);
printf("長途費率每秒鐘 %lf元\n", LONG_TIME_M);
printf("增收費率 %lf%% \n", LAST_M * 100);
}
 
double cal_last_bill (double last_b) {
double last_dol ;
if (last_b>0) {
last_dol = last_b * LAST_M;
} else {
last_dol = 0.0;
}
return(last_dol);
}
 
double cal_bill (int l_talk_time,int talk_time) {
double long_m, m ; //長途費用,一般費用
double total_dollars;//總金額
long_m = l_talk_time * 60 * LONG_TIME_M;
m = talk_time * 60 * TIME_M;
return(BASIC_M + long_m + m);
}
 
void display_bill (double tal_dollars,double last_b,double last_dol) {
if (last_b > 0) {
printf("因為上個月的電話費未繳,罰金為:%lf 元\n", last_dol);
}
printf("本月電話總額:%lf", tal_dollars);
}
 
Output:
 
計算電話費之程式
====================
基本電話費: 99
一般費率每秒鐘 0.060000
長途費率每秒鐘 0.360000
增收費率 1.000000%
請輸入上個月尚未繳款金額:100
請輸入本月通話時間:
長途通話時間為幾分鐘:1
一般通話時間為幾分鐘:1
因為上個月的電話費未繳,罰金為:1.000000
本月電話總額:225.200000

2.如果需要在判斷中加判斷,也就是在if內加if (nested if, 巢狀if) 例如:依上範例所述,修改成判斷是否大於10或小於10或等於10。

#include <stdio.h>
#include <stdlib.h>
int main(void) {
int num;
printf("請輸入整數:");
scanf("%d",&num);
if (num>10) {
printf("輸入的整數大於等於10\n"); //輸入的數大於10則執行此行敘述
} else {
if (num<10) { //此時輸入的值已經不大於10了,在做一次判斷是否小於10
printf("輸入的整數小於10\n"); //輸入的數小於10則執行此行敘述
} else {
printf("輸入的整數等於10\n"); //此行則是輸入的數,不大於10,同時也不小於10,則一定等於10。
}
}
system("pause");
return 0;
}
Output:
請輸入整數:10
輸入的整數等於10

2-1

  • 請寫一程式,判斷使用者輸入的整數值為2或3或為6的倍數。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int num;
printf("請輸入整數:");
scanf("%d",&num);
if (num%2==0) {
if (num%3==0) {
printf("%d是2、3、6的倍數\n", num);
} else {
printf("%d是2的倍數\n", num);
}
} else {
if (num%3==0) {
printf("%d是3的倍數\n", num);
} else {
printf("%d不是2、3、6的倍數\n", num);
}
 
}
system("pause");
return 0;
}
Output:
請輸入整數:5
5不是236的倍數
 
請輸入整數:2
22的倍數
 
請輸入整數:12
12236的倍數


2-2

  • 請先輸入國文、英文、數學三科分數,分別存入變數之中,再判斷全部輸入的分數是否介於0到100之間,如果是,則輸出"您輸入的資料格式正確";有一科不是,則輸出"您輸入的資料格式有錯"。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int score;
int math;
int eng;
int cha;
printf("請輸入國文分數:");
scanf("%d", &cha);
printf("請輸入英文分數:");
scanf("%d", &eng);
printf("請輸入數學分數:");
scanf("%d", &math);
if (cha>0) && (cha<100) {
if (eng>0) && (eng<100) {
if (math>0)&&(math<100) {
printf("您輸入的資料格式正確");
} else {
printf("您輸入的資料格式有錯");
}
} else {
printf("您輸入的資料格式有錯");
}
} else {
printf("您輸入的資料格式有錯");
}
 
system("pause");
return 0;
}
Output:
請輸入國文分數:1
請輸入英文分數:2
請輸入數學分數:3
您輸入的資料格式正確
 
請輸入國文分數:1
請輸入英文分數:101
請輸入數學分數:3
您輸入的資料格式有錯

2-3

  • 修改上題,如果輸入格式錯誤,請輸出錯誤的科目分數
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int score;
int math;
int eng;
int cha;
printf("請輸入國文分數:");
scanf("%d", &cha);
printf("請輸入英文分數:");
scanf("%d", &eng);
printf("請輸入數學分數:");
scanf("%d", &math);
if ((cha>=0)&&(cha <=100)) {
if ((eng>=0)&&(eng<=100)) {
if ((math>=0)&&(math <=101)){
printf("您輸入的資料格式正確\n");
} else {
printf("您輸入的資料格式有錯\n");
printf("數學:%d\n", math);
}
} else {
printf("您輸入的資料格式有錯\n");
if ((math<0)||(math>100)) {
printf("數學:%d\n", math);
}
printf("英文:%d\n", eng);
}
} else {
printf("您輸入的資料格式有錯\n");
if ((eng<=100)&&(eng>=0)) {
if ((math>100)||(math<0)) {
printf("數學:%d\n", math);
}
} else {
if ((math>100)||(math<0)) {
printf("數學:%d\n", math);
}
printf("英文:%d\n", eng);
}
printf("國文:%d\n", cha);
}
 
system("pause");
return 0;
}
Output:
請輸入國文分數:101
請輸入英文分數:100
請輸入數學分數:101
您輸入的資料格式有錯
數學:101
國文:101

3.如果同時要做多個判斷時,則可以使用if ... else if ...else

其語法結構如下:

if (判斷條件1) {
...
} else if (判斷條件2) {
...
} else if (判斷條件3) {
...
} else {
...
}

如果條件1成立,則執行完條件1成立的敘述後,就跳出if的判斷敘述,只有當條件1不成立,才會往下執行,判斷條件2…依此類推,如果條件都不成立,才會執行else中的敘述。

此程式是判斷輸入的成績大於60、大於50小於等於60、大於40小於等於50、或是小於等於40。

#include <stdio.h>
#include <stdlib.h>
int main(void){
int score;
printf("請輸入成績:");
scanf("%d",&score);
if (score>60) {
printf("此整數>60\n");
} else if (score>50) {
printf("此整數>50 And <= 60\n");
} else if (score>40) {
printf("此整數>40 And <= 50\n");
} else {
printf("此整數 <= 40\n");
}
system("pause");
return 0;
}
Output:
請輸入成績:61
此整數>60

3-1

  • 請寫一程式,可以做兩正整數的加、減、乘、除運算。

例如3+6=9,當使用者輸入3 + 6 時,就輸出3+6=9;

#include <stdio.h>
#include <stdlib.h>
int main(void) {
 
int a, b;
double ans = 0;
char oper;
bool yn = false;
printf("請輸入第一個正整數:");
scanf("%d", &a);
printf("請輸入運算元符號:");
scanf(" %c", &oper);
printf("請輸入第二個正整數:");
scanf("%d", &b);
 
if (oper=='+') {
ans = a + b;
} else if (oper == '-') {
ans = a - b;
} else if (oper == '*') {
ans = a * b;
} else if (oper == '/') {
ans = (double) a /(double) b;
} else {
printf("你輸入的運算元符號有錯");
yn = true;
}
if (!yn) {
printf("%d %c %d = %lf", a, oper, b, ans);
}
 
system("pause");
return 0;
}
 
Output:
請輸入第一個正整數:3
請輸入運算元符號:+
請輸入第二個正整數:6
3 + 6 = 9.000000
 
請輸入第一個正整數:1
請輸入運算元符號:a
請輸入第二個正整數:2
你輸入的運算元符號有錯

3-2

  • 假設某公司計算員工薪水的方式如下:
底薪:20000
加班10小時為200
加班11-20小時,以1.5倍計算。
加班21小時以上,以2倍計算。
 
例如 某員工加班16個小時,則此員工薪水為 20000 + 10* 200+ 6 * 1.5*200 = 23800

請利用if...else if撰寫一程式,讓使用者輸入員工加班時數,計算員工薪水,並輸出結果。

#include <stdio.h>
#include <stdlib.h>
int main(void) {
double salary = 0;
int overtime = 0;
bool yn = false;
printf("請輸入員工加班時間:");
scanf("%d", &overtime);
 
if (overtime<=10) {
salary = 20000+ overtime *200;
} else if (overtime<=20) {
salary = 20000 + 10*200 +(overtime -10)*200*1.5;
} else {
salary = 20000 + 10*200+ 10*200*1.5 +(overtime -20)*200*1.5 ;
}
 
printf("此員工加班時數:%d \n", overtime);
printf("薪水 : %lf", salary);
 
system("pause");
return 0;
}
Output:
請輸入員工加班時間:25
此員工加班時數:25
薪水 : 26500.000000

4

  • 下列為一簡寫的if-else途述,請觀察下列程式碼與執行結果
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n1, n2, large;
printf("請輸入二整數:");
scanf("%d %d", &n1, &n2);
n1>n2 ? (large=n1) : (large=n2); // 此行為簡單的if...else 敘述
printf("%d較大\n", large);
system("pause");
return 0;
}
Output:
請輸入二整數:11
2
11較大

4-1

  • 請利用簡單式的if...else方法撰寫一程式,讓使用者輸入一整數,判斷此數是否為正整數。
#include <stdio.h>
#include <stdlib.h>
int main(void){
int n;
int num1 = -1;
int num2 = -1;
printf("請輸入一整數:");
scanf("%d", &n);
n > 0 ? (num1 = 0) : (num1 = 1); // 此行為簡單的if...else 敘述
n < 0 ? (num2 = 0) : (num2 = 1); // 此行為簡單的if...else 敘述
printf("你輸入的值為:%d\n", n);
printf("num1 = %d \n", num1);
printf("num2 = %d \n", num2);
system("pause");
return 0;
}
Output:
請輸入一整數:13
你輸入的值為:13
num1 = 0
num2 = 1

5.switch為多重判斷之敘述,判斷某一個變數的值為何時,就執行適當的敘述。 switch的語法架構如下:

switch (要判斷的值) {
case '值1'://如果要判斷的值,等於"值1"的話,就執行此行":"後面的敘述
...
break;
case '值2'://如果要判斷的值,等於"值2"的話,就執行此行":"後面的敘述
...
break;
case '值3'://如果要判斷的值,等於"值3"的話,就執行此行":"後面的敘述
...
break;
case '值4'://如果要判斷的值,等於"值4"的話,就執行此行":"後面的敘述
...
break;
default: //如果要判斷的值都不等於以上的值,則執行下面敘述
printf("輸入格式錯誤!!\n");
}

@其中在要判斷的值,只能為int 或 char的型態,不可以為double及字串的型態值,例如用"MonDay"

default不一定需要,您可以省去這個部份。

特別要注意的是case 後面所加的是冒號,而不是分號,如果要比對的值為字元,就必須加上單引號


下列為使用switch的方法所撰寫的程式,此程式為輸入運算元與一個數,並對此數做+-*/

#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n1;
char op;
printf("請輸入運算元與一個數(+2):");
scanf("%c %d", &op, &n1);
switch (op) { //op為要判斷的值,存放的是運算元符號
case '+': //如果op等於加號,就執行此行>>>>"printf("%d+%d=%d\n",n1,n1,n1+n1);"
printf("%d+%d=%d\n", n1, n1, n1+n1);
break;
case '-':
printf("%d-%d=%d\n", n1, n1, n1-n1);
break;
case '*':
printf("%d*%d=%d\n", n1, n1, n1*n1);
break;
case '/':
printf("%d/%d=%.3f\n", n1, n1, (float)n1/n1);
break;
default:
printf("輸入格式錯誤!!\n");
}
system("pause");
return 0;
}
Output:
請輸入運算元與一個數(+2):*4
4*4=16

5-1

  • 請利用switch方法撰寫一程式,可以做兩正整數的加、減、乘、除運算。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
 
int a, b;
double ans = 0;
char oper;
bool yn = false;
printf("請輸入第一個正整數:");
scanf("%d", &a);
printf("請輸入運算元符號:");
scanf(" %c", &oper);
printf("請輸入第二個正整數:");
scanf("%d", &b);
 
switch (oper) {
case '+':
ans = a + b;
break;
case '-':
ans = a - b;
break;
case '*':
ans = a * b;
break;
case '/':
ans = (double) a /(double) b;
break;
default:
yn = true;
}
if (!yn) {
printf("%d %c %d = %lf", a, oper, b, ans);
}
 
system("pause");
return 0;
}
 
Output:
請輸入第一個正整數:3
請輸入運算元符號:+
請輸入第二個正整數:6
3 + 6 = 9.000000
 
請輸入第一個正整數:1
請輸入運算元符號:a
請輸入第二個正整數:2
你輸入的運算元符號有錯

6.下列為goto的用法,觀察下列程式碼與執行結果 (註:撰寫程式時,通常不建議使用goto的寫法,因為利用goto會使得程式本身的架構混亂,同時也增加程式的複雜度。)

#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i=0, sum=0;
begin:
i = i + 1;
sum = sum + i;
printf("%d", i);
if (i<5) {
printf("+");
goto begin;
}
printf("\nsum=%d", sum);
system("pause");
return 0;
}
Output:
1+2+3+4+5
sum=15
Personal tools