The C Programming Language

Download Report

Transcript The C Programming Language

Introduction to the C Programming
Language
重覆敘述(for,while,break,continue)
適合重複性的計算或判斷
CSIM, PU
C Language
選擇性結構(if-else statements)
 if-else 敘述的語法格式如下:
if (expr)
{
Statement1;
}
else
{
Statement2;
}
Statement3;
 if-else 敘述的流程圖:
根據判斷條件的結
果為真或假來執行
Statement 1或2,最
後都會再回到
Statement3繼續執
行.
false
expr
true
Statement2
Statement1
Statement1
Statement3
CSIM, PU
C Language
2
重複性結構
 根據判斷條件的成立與否
,決定程式段落的執行次
數,這個程式段落就稱為
迴圈的主體,如右圖的虛
線範圍。
 重覆敘述(iteration
statement ), 包括 while 、
for 及do while(下學期會教)
敘述。
重複性敘述的流程圖:
true
expr
Statement1
false
Statement2
CSIM, PU
C Language
3
 重覆敘述--for迴圈(for loop)
 for 迴圈的語法格式如下:
for ( expr1 ; expr2 ; expr3 )
{
statements;
}
此處不可加分號
next-statements;
•運算式 1(expr1 ) 為迴圈控制變數的初值。
•運算式 2 (expr 2) 為迴圈是否重覆執行的條件
。
•運算式 3 (expr 3) 為迴圈控制變數的增減值。
•以上3種運算式若有兩個以上的參數請以逗號隔開。
CSIM, PU
C Language
4
重覆敘述--for迴圈(for loop)---範例2
範例2 流程圖:
開始
輸入一個正整數N,計算1累加至
N的總和,並輸出其總和
輸入
正整數 N
Sum = 0
I=1
流程圖符號說明
起始符號/結束符號
處理符號
I=I+1
false
I <= N?
true
Sum = Sum +I
印出累加值
輸入/輸出方塊
流向符號
結束
判斷符號
CSIM, PU
C Language
5
重覆敘述--for迴圈(for loop)---範例2
範例2 程式碼:














#include<stdio.h>
int main()
{
int i ,N , sum=0;
printf("Please input an integer: ");
/*由鍵盤輸入數值N*/
scanf("%d", &N );
for (i=1; i<=N; i++)
{
sum= sum+i;
/*計算1+2+…+N*/
}
printf("1+2+…+%d = %d \n",N, sum);
/*印出sum的值*/
system("pause");
return 0;
}
Ch3_1_2.c
CSIM, PU
C Language
6
九九乘法表—巢狀for迴圈(nested for loop)---範例3
 #include<stdio.h>
 int main()
 {

int i, j;

for (i=1; i<=9; i++) /*外層迴圈*/

{

for (j=1; j<=9; j++) /*內層迴圈*/

{

printf("%d*%d=%2d ", i, j, i*j);

}
 }
 system(“pause”);
 return 0; }
開始
i為外層迴圈的控制變數
j為內層迴圈的控制變數
i=1
i=i+1
false
j<=9
true
印出i*j
j=j+1
i<=9
true
j=1
false
結束
CSIM, PU
C Language
7
重覆敘述--for迴圈(for loop)---範例3
範例5 執行結果:
1*1= 1 1*2= 2 1*3= 3 1*4= 4 1*5= 5 1*6= 6 1*7= 7 1*8= 8 1*9= 9 2*1= 2 2*2= 4 2*3
= 6 2*4= 8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*1= 3 3*2= 6 3*3= 9 3*4=12 3*5=15
3*6=18 3*7=21 3*8=24 3*9=27 4*1= 4 4*2= 8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*
8=32 4*9=36 5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 6*1=
6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54 7*1= 7 7*2=14 7*3=21 7
*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63 8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=
48 8*7=56 8*8=64 8*9=72 9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72
9*9=81
若要將表格排列如下,應如何修改?
CSIM, PU
C Language
8
重覆敘述—巢狀for迴圈(nested for loop)---範例4















CSIM, PU
#include<stdio.h>
int main()
{
int i,k;
for(i=1;i<=5;i++)
{
for(k=1;k<=i;k++)
{
printf(“%d”,k);
}
printf("\n");
}
system("pause");
return 0;
}
 執行結果:
 練習:如果想改成倒三角形的話,程
式要怎麼改呢?
C Language
9
 重覆敘述--while loop
 適用於事先不確定迴圈需要執行多少次.
while loop的語法格式如下:
設定迴圈初值;
while ( expr )
{
statements;
}
next-statements;
條件運算式
迴圈主體;
設定增減量;
依靠一個條件運算式來判斷是否停止迴圈.
迴圈內的statement必須能改變條件運算式的結果才能離開迴圈,否
則也會變成無窮迴圈.
CSIM, PU
C Language
10
 重覆敘述(while loop)

while loop 的流程圖
expr
false
true
Statements
(迴圈主體,
設定值的增減)
CSIM, PU
next-statements
C Language
11
重覆敘述--while迴圈(while loop)範例1
範例1 流程圖:
求兩數的最大公因數
開始
輸入M
和N
X=M
Y=N
X!=Y?
false
輸出X即為
最大公因數
結束
true
X>Y?
true
X=X-Y
false
X<Y?
true
Y=Y-X
false
CSIM, PU
C Language
12
重覆敘述--while迴圈(while loop)---範例1
 #include <stdio.h>
 int main(void)
 {
int M, N, X, Y;

printf("輸入兩個正數值M,N \n");

scanf("%d %d",&M, &N);

/*由鍵盤輸入數值*/

X=M; Y=N;

while(X != Y)

{

if(X > Y)

X=X-Y;

if(X < Y)

Y=Y-X;

}
 printf("M和N的最大公因數=%d
",X);

printf("\n");

system("pause");

return 0; }
Ch3_2_1.c
CSIM, PU
C Language
13
重覆敘述--while迴圈(while loop)範例2
 /* Copy the input to screen















CSIM, PU
*/
#include<stdio.h>
#include<stdlib.h>
int main()
{
char ch;
while ( ( ch = getche() ) != '\r' )
{
/*判斷輸入的字元是不是換行符號*/
putchar(ch);
/*印出使用者輸入值*/
printf("\n");
}
system("pause");
return 0;
}
執行結果:
輸入g與x,再按下enter鍵
C Language
14
 重覆敘述(do-while loop)
do-while 則是先執行敘述(statements)
後, 再判斷運算式(expr)之值是否為真,
再決定是否重覆執行敘述。
do
{
statements;
} while ( expr );
do-while 至少會執行一
次;while 可能一次都沒
有執行。
statements
true
expr
false
CSIM, PU
C Language
15
重覆敘述-- 重覆敘述(do-while loop)範例1










#include<stdio.h>
/*sum*/
main()
{
int a, sump=0;
do
{
printf("請輸入一個整數a : ");
scanf("%d", &a);
if (a>0)
/*若a為正整數則累績到sump*/
sump=sump+a;
 } while (a!=0);
/*會重覆輸入,直到a輸入為0才結束*/
 printf("總和= %d\n", sump);
 system("pause");
 }
CSIM, PU
C Language
16
重覆敘述-- 重覆敘述(do-while loop)範例1執行結果
執行結果:
請輸入一個整數a : 1
請輸入一個整數a : 2
請輸入一個整數a : 3
請輸入一個整數a : 4
請輸入一個整數a : 5
請輸入一個整數a : 0
總和= 15
CSIM, PU
C Language
17
重覆敘述-- 重覆敘述(do-while loop)範例2
 從鍵盤輸入一個整數a,若a為正整數則累績到sumP,再重覆輸入,若a為負整數則累績
到sumN,再重覆輸入直到a輸入為0才結束, 然後, 輸出印出sumP 以及sumN 的值(總
和)
 因為此題目是要先輸入一整數,再來作累加的動作,所以非常適合使用do- while
 #include<stdlib.h>
 main()
 { int a, sumP=0, sumN=0;
 do

{ printf("請輸入一個整數a : ");

scanf("%d", &a);

if (a>0)

sumP=sumP+a;

else

sumN=sumN+a;

} while (a!=0);

printf("正數總和= %d\n", sumP);

printf("負數總和= %d\n", sumN);
 system("pause");
 }
CSIM, PU
C Language
18
重覆敘述—for, while與do while的比較
for (i=1;i<=5;i++,j++)
{ sum=sum+i*j;
}
i=1;
while(i<=5)
{ i++; j++ ;
sum=sum+i*j;
}
i=1;
do { i++; j++ ;
sum=sum+i*j;
} while (i<=5);
CSIM, PU
C Language
19
無窮迴圈
如果迴圈的條件永遠為真,則會形成無窮迴圈,程式將無法停止,若要強制中
斷可按下Ctrl + C鍵強迫中止.
for( i=1; ; i++)
{
 statement;
}
CSIM, PU
while(1)
{
 statement;
}
do
{
 statement;
}while(1);
C Language
20
重覆敘述--for迴圈(無窮迴圈) ----範例1
範例6:無窮for迴路
(for loop with forever loop)
 #include<stdio.h>
 int main()
 {

int i;

int count = 1;
無窮迴圈,此種寫法要小心

for ( ; ; )
確認終止條件一定會成立,

{
否則程式會一直執行

printf("\1: guess number here: ");

scanf("%d",&i);

if ( i == 5 )
/*表示當i之值全等於5時,就會離開此迴圈*/

break;

count++;
/*若i之值不等於5,則繼續將count變數加1*/

}

printf("\2: You take %d times to get it.\n",count);

system(“pause”);

return 0; }
CSIM, PU
C Language
21
重覆敘述--for迴圈(for loop) ---範例1
範例6 執行結果:
☺: guess number here: 1
☺: guess number here: 2
☺: guess number here: 3
☺: guess number here: 19
☺: guess number here: 5
☻: You take 5 times to get it.
CSIM, PU
C Language
22
重覆敘述--while迴圈(while loop)範例2


















CSIM, PU
範例2:while(1)與switch的應用
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i;
while(1)
{ /*無論如何一定要執行此迴圈*/
printf("Enter 1-4 for exit==>");
scanf("%d",&i);
switch(i)
{
case 1:
printf(" Excellent!\n");
break;
case 2:
printf(" Good!\n");
break;















case 3:
printf(" Fair!\n");
break;
case 4:
printf(" Bye!\n");
break;
default: /*若輸入之值不在1~4*/
printf(" Illegal number try
again!\n");
}
if(i==4) /*當i之值全等於4時,才離
開此迴圈*/
break;
}
system("pause");
return 0;
}
C Language
23
重覆敘述--while迴圈(while loop)範例2 執行結果
執行結果:
Enter 1-4 for exit==>1
Excellent!
Enter 1-4 for exit==>2
Good!
Enter 1-4 for exit==>3
Fair!
Enter 1-4 for exit==>4
Bye!
CSIM, PU
C Language
24
重覆敘述(Break and Continue比較)
Break
不同點
終止do, for, switch, while,等敘 忽略接在continue後面的
述在break 那一層次的執行工作 敘述,直接返回到該層迴圈
若在巢狀迴圈(nested loop)中, 的條件運算式,並判斷是否
break只中止該層次的執行, 而
繼績執行下一迴圈
若要中止整個巢狀迴圈可使
用return
相同點
CSIM, PU
Continue
繼續執行迴圈.
可用在for、while、do-
可用在for、while、do-
while
while
C Language
25
Break與Continue---範例1



















#include<stdio.h>
#include<stdlib.h>
int main()
{
char ch;
int ans,keyin,num1,num2;
while(1) /*外層的while迴圈*/
{
printf("\n請輸入兩個整數:\n");
scanf("%d %d",&num1,&num2);
ans=num1*num2;
while(1) /*內層的while迴圈*/
{
printf("%d * %d =",num1,num2);
scanf("%d",&keyin);
if(keyin==ans)
{
printf("答對了\n");
break; /*若答對就離開內層的迴圈,跳至
接在內層迴圈後的程式碼*/

}
CSIM, PU
 else

{

printf("答錯了\n");

continue;
/*若答錯就回到內層的迴圈判斷條件*/

}

}

printf("\n是否繼續執行:");

ch=getche();

if(ch==‘n’)
/*若輸入n表示要離開外層迴圈,跳至接在外
層迴圈後的程式碼*/

break;
 }

printf("\n");

system("pause");

return 0;
 }
C Language
26
Break與Continue---範例1
 執行結果:
使用者輸入之值
CSIM, PU
C Language
27
重覆敘述--(continue跳躍敘述)範例2















CSIM, PU
#include<stdlib.h>
main()
{
int f=1,n;
printf("請輸入一個正整數n : ");
scanf("%d",&n);
請自行練習將此範例改以do
while (n>0)
while或for迴圈來撰寫
{
if ((n%2)==0)
{n--; continue;}
/*n為偶數則忽略 f=f*n; */
f=f*n;
/*f是奇數連乘積 1*3*5*...*/
n--; }
printf("f=%d\n",f);
/*印出f值*/
system("pause");
}
C Language
28