




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
語言循環結構語言循環結構1(優選)語言循環結構(優選)語言循環結構C語言的重復語句用于設置循環。循環是重復執行其他語句的一種語句,循環中重復執行的語句就是循環體
C語句中,每個循環都有一個控制表達式。每次執行循環體時都要對控制表達式進行計算。如果表達式為真,也就是不為零,那么繼續執行循環。重復語句C語言的重復語句用于設置循環。重復語句C提供三種循環語句:while語句用于判定控制表達式在循環體執行之前的循環。do語句用于判定控制表達式在循環體執行之后的循環。for語句對于自增或自減計數變量的循環十分方便。重復語句C提供三種循環語句:重復語句使用while語句是最簡單、最基本的設置循環方法。While語句格式如下 while(表達式)語句表達式即為控制表達式;語句則是循環體。while語句使用while語句是最簡單、最基本的設置循環方法。whilwhile語句示例 while(i<n)/*控制表達式*/ i=i*2;/*循環體*/執行while語句時,首先計算控制表達式的值。如果值不為零(真),那么執行循環體,接著再次判定表達式。這個過程持續進行直到最終控制表達式的值變為零。while語句while語句示例while語句while語句示例計算大于或等于數n的最小的2次冪 i=1; while(i<n) i=i*2;設n為10時,下面跟蹤顯示了while語句執行情況 i=1; i現在值為1. i<n成立嗎? 是,繼續。 i=i*2; i現在為2. i<n成立嗎? 是,繼續。 i=i*2; i現在為4。 i<n成立嗎? 是,繼續。 i=i*2; i現在為8。 i<n成立嗎? 是,繼續。 i=i*2; i現在為16。 i<n成立嗎? 不成立,退出循環。while語句while語句示例計算大于或等于數n的最小的2次冪while雖然循環體必須是單獨的一條語句,但這只是個技術問題。如果需要多條語句,那么只要用一對大括號構造成單獨一條復合語句就可以了 while(i>0){ printf("Tminus%dandcounting\n",i); i; }即使沒有嚴格要求的時候,一些程序員始終使用大括號括住循環體 while(i<n){ i=i*2; }while語句雖然循環體必須是單獨的一條語句,但這只是個技術問題。whil下面的語句顯示一串“倒數計數”信息 i=10; while(i>0){ printf("Tminus%dandcounting\n",i); i; }整個過程持續到顯示信息為“Tminus1andcounting”。while語句下面的語句顯示一串“倒數計數”信息while語句關于while語句的一些討論在while循環終止時,控制表達式的值為假。因此,當通過表達式i>0控制循環終止時,i必須是小于或等于0的。可能根本不執行while循環體。因為控制表達式是在循環體執行之前進行判定。while語句常常可以有多重寫法。更加簡明的遞減計數循環如下 while(i>0) printf("Tminus%dandcounting\n",i);while語句關于while語句的一些討論while語句printf("%disprime\n",n);}while();}intmain(void)scanf("%f",&credit);從1向上加到n for(i=1;i<=n;i++)…loop_done:…/*emptyloopbody*/;printf("Tminus%dandcounting\n",i);for(d=2;d<n;d++)case4:break語句不會產生期望的效果它可以跳出switch語句,但是無法跳出循環。printf("Thisprogramprintsatableofsquares.“0”代表當前掃描器“位于空格串中”這一狀態。for(d=2;d<n&&n%d!=0;d++)for(;;){i<n成立嗎? 不成立,退出循環。如果控制表達式的值始終是非零值的話,while語句將無法終止。C語句程序員有時故意用非零常量作為控制表達式來構造無限循環 while(1)…除非循環體含有跳出循環控制的語句(break,goto,return)或調用了導致程序終止的函數,否則上述這種形式的while語句將永遠執行下去。無限循環printf("%disprime\n",n);如果控程序square.c用一個while語句顯示平方值表格。用戶指定平方值表格的行數 Thisprogramprintsatableofsquares. Enternumberofentriesintable:5 11 24 39 416 525程序顯示平方值的表格程序square.c用一個while語句顯示平方值表格。程序square.c
/*Printsatableofsquaresusingawhilestatement*/
#include<stdio.h>
intmain(void){inti,n;
printf("Thisprogramprintsatableofsquares.\n");printf("Enternumberofentriesintable:");scanf("%d",&n);
i=1;while(i<=n){printf("%10d%10d\n",i,i*i);i++;}
return0;}square.c程序sum.c對用戶輸入的整數數列求和 Thisprogramsumsaseriesofintegers. Enterintegers(0toterminate):8237150 Thesumis:107程序需要使用循環,循環采用scanf函數讀取用戶輸入數,然后再把這個數加到運算的總和中。程序數列求和程序sum.c對用戶輸入的整數數列求和程序數列求和sum.c
/*Sumsaseriesofnumbers*/
#include<stdio.h>
intmain(void){intn,sum=0;
printf("Thisprogramsumsaseriesofintegers.\n");printf("Enterintegers(0toterminate):");
scanf("%d",&n);while(n!=0){sum+=n;scanf("%d",&n);}printf("Thesumis:%d\n",sum);
return0;}sum.c例6.3求1到100的和
學生練習運行結果:5050例6.3求1到100的和
學生練習運行結果:5050第二,計算表達式2并將計算結果作為整個逗號表達式的結果。如果需要多條語句,那么只要用一對大括號構造成單獨一條復合語句就可以了除非循環體含有跳出循環控制的語句(break,goto,return)或調用了導致程序終止的函數,否則上述這種形式的while語句將永遠執行下去。表達式1、表達式2和表達式3全都是表達式。“向下減使用>或〉=運算符。return0;scanf("%d",&n);printf("%10d%10d\n",i,square);通常循環的退出點是在while或for循環體之前,或do循環體之后。Enterintegers(0toterminate):8237150while(i>0){說明:當n能被3整除時,執行continue語句,結束本次循環(即跳過printf函數語句),只有n不能被3整除時才執行printf函數。在for語句中省略表達式case2:printf("***ACMEcheckbookbalancingprogram***\n");如果值不為零(真),那么執行循環體,接著再次判定表達式。scanf("%d",&n);如果把條件n%d==0移到循環控制表達式中,那么循環體將會為空使用break語句可以在循環體中間設置退出點,甚至設置多個退出點。例6.2求1到100的和
#include<stdio.h>
voidmain()
{inti,sum=0;
i=1;
while(i<=100)
{sum=sum+i;
i++;
}
printf(″%d\\n″,sum);
}說明:(1)循環體如果包含一個以上的語句,應該用花括弧括起來,以復合語句形式出現.(2)在循環體中應有使循環趨向于結束的語句。
運行結果:5050第二,計算表達式2并將計算結果作為整個逗號表達式的結果。例6do語句的一般格式如下 do語句while(表達式);執行do語句時,先執行循環體,再計算控制表達式的值。如果表達式的值非零,那么再次執行循環體,然后再次計算表達式的值。do語句do語句的一般格式如下do語句使用do語句重寫前面的“倒數計數”程序 i=10; do{ printf("Tminus%dandcounting\n",i); i; }while(i>0);do語句和while語句沒有本質的區別。唯一的不同在于do語句的循環體至少會被執行一次。do語句使用do語句重寫前面的“倒數計數”程序do語句最好對所有的do語句都使用大括號包括循環體,因為沒有大括號的do語句很容易被誤認為是while語句 do printf("Tminus%dandcounting\n",i); while(i>0);粗心的讀者可能會把單詞while誤認為是while語句的開始。do語句while(i<=100)最好對所有的do語句都使用大括號包括循環體,因為沒有大括號的例6.3求1到100的和
運行結果:5050例6.3求1到100的和
運行結果:5050例6.3求1到100的和
#include<stdio.h>
voidmain()
{inti,sum=0;
i=1;
do
{sum=sum+i;
i++;
}
while(i<=100);
printf("%d\\n″,sum);
}運行結果:5050例6.3求1到100的和
#include<stdio程序numdigits.c計算用戶輸入的整數的位數 Enteranonnegativeinteger:60 Thenumberhas2digit(s).方法是將將用戶輸入的整數反復除以10,直到結果變為0,除的次數就是用戶輸入整數的位數。do語句比while語句更適合,因為每個整數,即便是0都至少有一位數字。程序計算整數的位數程序numdigits.c計算用戶輸入的整數的位數程序計算numdigits.c
/*Calculatesthenumberofdigitsinaninteger*/
#include<stdio.h>
intmain(void){intdigits=0,n;
printf("Enteranonnegativeinteger:");scanf("%d",&n);
do{n/=10;digits++;}while(n>0);
printf("Thenumberhas%ddigit(s).\n",digits);
return0;}numdigits.cfor語句對于“向上加”(變量自增)或“向下減”(變量自減)的循環來說是最好的選擇。for語句和while語句關系緊密。同樣,循環體只執行一次,并顯示相同的信息。return0;break;while(n<10){case3:while(i>0){for(k=1;k<=i;k++)“0”代表當前掃描器“位于空格串中”這一狀態。程序numdigits.i=i*2; i現在為8。表達式2控制用于控制循環的終止(循環持續執行,只要表達式2的值非零)。scanf("%d",&i);Entercommand:4在控制表達式中使用==代替<,<=,>,或>=。sum+=i;for(i=10;i>0;i);/***WRONG***/用數學不等式來描述打印星號區域:說明:當n能被3整除時,執行continue語句,結束本次循環(即跳過printf函數語句),只有n不能被3整除時才執行printf函數。goto語句能跳轉到函數中任何有標號的語句處。for語句適合應用在使用“計數”變量的循環中,然而它也靈活用于許多其他類型的循環中。for語句的一般格式如下 for(表達式1;表達式2;表達式3)語句 表達式1、表達式2和表達式3全都是表達式。示例 for(i=10;i>0;i) printf("Tminus%dandcounting\n",i);for語句for語句對于“向上加”(變量自增)或“向下減”(變量自減)for語句的執行流程for(表達式1;表達式2;表達式3)
語句;for語句for語句的執行流程for語句for語句和while語句關系緊密。除了極少數情況,for循環總可以等價替換為while循環 表達式1; while(表達式2){ 語句 表達式3; }表達式1是在循環開始執行前,只執行一次的初始化步驟。for語句for語句和while語句關系緊密。for語句表達式2控制用于控制循環的終止(循環持續執行,只要表達式2的值非零)。表達式3是在每次循環的最后被執行的一個操作。按照這種模式,上面的for循環可以改寫為如下的while循環 i=10; while(i>0){ printf("Tminus%dandcounting\n",i); i; }for語句表達式2控制用于控制循環的終止(循環持續執行,只要表達式2的研究等價的while語句有助于更好地理解for語句。例如,假設把先前for循環示例中的i替換為i for(i=10;i>0;i) printf("Tminus%dandcounting\n",i);等價的while循環顯示上述的替換對循環沒有任何影響 i=10; while(i>0){ printf("Tminus%dandcounting\n",i); i; }for語句研究等價的while語句有助于更好地理解for語句。for語由于for語句中的第一和第三表達式都是以語句的方式執行的,所以它們的值互不相關——它們有用僅僅是因為有副作用。
所以,這兩個表達式常常是賦值表達式或自增/自減表達式。for語句由于for語句中的第一和第三表達式都是以語句的方式執行的,所for語句對于“向上加”(變量自增)或“向下減”(變量自減)的循環來說是最好的選擇。對于向上加或向下減共有n次的情況,for語句經常會采用下列形式中的一種。從0向上加到n–1 for(i=0;i<n;i++)…從1向上加到n for(i=1;i<=n;i++)…從n1向下減到0 for(i=n1;i>=0;i)…從n向下減到1 for(i=n;i>0;i)…for語句慣用法for語句對于“向上加”(變量自增)或“向下減”(變量自減)常見語句錯誤在控制表達式中用<(大于)代替>(反之亦然)。“向上加”使用<或<=運算符;“向下減使用>或〉=運算符。在控制表達式中使用==代替<,<=,>,或>=。編寫的控制表達式用i<=n代替i<n,會產生“循環次數差一次”錯誤。for語句慣用法常見語句錯誤for語句慣用法C語言允許省略任意或全部的表達式。如果省略第一個表達式,那么在執行循環前沒有初始化的操作 i=10; for(;i>0;i) printf("Tminus%dandcounting\n",i);如果省略第三個表達式,那么循環體需確保第二個表達式的值最終會變為假 for(i=10;i>0;) printf("Tminus%dandcounting\n",i);在for語句中省略表達式C語言允許省略任意或全部的表達式。在for語句中省略表達式當第一和第三表達式都省略時,for循環與while循環沒有任何區別 for(;i>0;) printf("Tminus%dandcounting\n",i); 等價于 while(i>0) printf("Tminus%dandcounting\n",i);while語句的形式更清楚,因此更可取。在for語句中省略表達式當第一和第三表達式都省略時,for循環與while循環沒有任如果省略第二個表達式,那么它默認為真,因此for語句不會終止(除非以某種其他形式停止)。例如某些程序員用下列的for語句建立無限循環 for(;;)…在for語句中省略表達式如果省略第二個表達式,那么它默認為真,因此for語句不會終止C99中,for語句的第一個表達式能被替換為一個聲明(定義)。這個特性允許程序員在for循環中定義變量 for(inti=0;i<n;i++) …這樣,變量i不需要在for循環前定義。C99中的for語句C99中,for語句的第一個表達式能被替換為一個聲明(定義)在for語句中定義的變量不能在循環體外訪問,即在循環外不可見) for(inti=0;i<n;i++){ … printf("%d",i);/*legal;iisvisibleinsideloop*/ … } printf("%d",i);/***WRONG***/C99中的for語句在for語句中定義的變量不能在循環體外訪問,即在循環外不可見讓for語句定義自己的循環控制變量通常是個好的做法,方便且讓程序易于理解。當然,如果程序需要在循環結束后訪問這樣的變量,那么就需要采用for語句常規的方式。for語句可以定義多個相同類型的變量 for(inti=0,j=0;i<n;i++) …C99中的for語句讓for語句定義自己的循環控制變量通常是個好的做法,方便且讓有時,for語句可能需要多個初始表達式,或在每次循環時一次對幾個變量進行自增(減)操作。可以在for語句的第一和第三表達式中使用逗號表達式實現這些想法。逗號表達式具有如下形式 表達式1,表達式2 這里表達式1和表達式2可以是任意兩個表達式。逗號運算符有時,for語句可能需要多個初始表達式,或在每次循環時一次對逗號表達式的計算分兩步實現第一,計算表達式1并丟棄計算結果。第二,計算表達式2并將計算結果作為整個逗號表達式的結果。計算表達式1始終是有意義的。當計算逗號表達式++i,i+j,i先自增,然后計算i+j假設,變量i和j的值分別為1和5,那么上面逗號表達式的值為7,而i的值將自增為2。逗號運算符逗號表達式的計算分兩步實現逗號運算符逗號運算符是左結合性的,所以編譯器把下列表達式 i=1,j=2,k=i+j 解釋為 ((i=1),(j=2)),(k=(i+j))即左邊的操作先于右邊的執行,這樣表達式i=1,j=2,和k=i+j將從左到右執行。逗號運算符逗號運算符是左結合性的,所以編譯器把下列表達式逗號運算符逗號運算符允許將兩個或多個表達式黏貼成一個表達式。在后面章節中我們會看到某些定義將從逗號運算符中受益。for語句是唯一除上述之外還可以發現逗號運算符的地方。例如 for(sum=0,i=1;i<=N;i++) sum+=i;利用附加的逗號運算符,for語句可以初始化兩個及以上的變量。逗號運算符逗號運算符允許將兩個或多個表達式黏貼成一個表達式。逗號運算符程序square.c(Section6.1)可以通過將while循環轉化為for循環的方式進行改進程序顯示平方值表格(改進版)程序square.c(Section6.1)可以通過將whsquare2.c
/*Printsatableofsquaresusingaforstatement*/
#include<stdio.h>
intmain(void){inti,n;
printf("Thisprogramprintsatableofsquares.\n");printf("Enternumberofentriesintable:");scanf("%d",&n);
for(i=1;i<=n;i++)printf("%10d%10d\n",i,i*i);
return0;}square2.cbreak語句從switch語句中轉移出程序控制,但沒有從while循環中轉移出來。printf("Tminus%dandcounting\n",i);for(表達式1;表達式2;表達式3)語句for(i=10;i>0;i);/***WRONG***/c(Section6.Thisprogramprintsatableofsquares.printf("Thesumis:%d\n",sum);i<n成立嗎? 是,繼續。for(i=10;i>0;i);/***WRONG***/break語句把程序控制轉出循環體。printf("Thenumberhas%ddigit(s).goto語句能跳轉到函數中任何有標號的語句處。}while();}/*emptyloopbody*/;while(…){intmain(void)printf("Error:Divisionbyzero\n");Enterintegers(0toterminate):8237150sum+=i;下面幾種都是合法的形式:C語言對控制循環行為的三個表達式沒有加任何限制。
雖然這些表達式通常對同一個變量進行初始化、判定和更新,但是不要求它們之間以任何方式進行相互關聯。程序square3.c
等價于square2.c,但是包含一個for語句,它初始化一個變量(square),判定另一個變量(i),并對第三個變量(odd)進行自增操作。
for語句這種極大的靈活性有時是十分有用的,但是原始的程序無疑更加清晰。程序顯示平方值表格(改進版)break語句從switch語句中轉移出程序控制,但沒有從wsquare3.c
/*Printsatableofsquaresusinganoddmethod*/
#include<stdio.h>
intmain(void){inti,n,odd,square;
printf("Thisprogramprintsatableofsquares.\n");printf("Enternumberofentriesintable:");scanf("%d",&n);
i=1;odd=3;for(square=1;i<=n;odd+=2){printf("%10d%10d\n",i,square);++i;square+=odd;}
return0;}square3.c通常循環的退出點是在while或for循環體之前,或do循環體之后。使用break語句可以在循環體中間設置退出點,甚至設置多個退出點。退出循環通常循環的退出點是在while或for循環體之前,或do循環break語句能夠把程序控制從switch語句中轉移出來,而且還可以用于跳出while、do或for循環。可以編寫一個循環用于測試一個數是否是素數,只要發現一個約數就用break語句終止循環 for(d=2;d<n;d++) if(n%d==0) break;break語句break語句能夠把程序控制從switch語句中轉移出來,而在循環終止后,可以用if語句來確定是提前終止(即n不是素數)還是正常終止(n是素數) if(d<n) printf("%disdivisibleby%d\n",n,d); else printf("%disprime\n",n);break語句在循環終止后,可以用if語句來確定是提前終止(即n不是素數)break語句特別適合退出點在循環體中間,而不是循環體之前或之后的循環。例如,用于讀入用戶輸入并且在遇到特殊輸入值時終止的循環 for(;;){ printf("Enteranumber(enter0tostop):"); scanf("%d",&n); if(n==0) break; printf("%dcubedis%d\n",n,n*n*n); }break語句break語句特別適合退出點在循環體中間,而不是循環體之前或break語句把程序控制從最內層封閉的while、do、for或switch語句中轉移出來。當這些語句出現嵌套時,break語句只能跳出一層嵌套 while(…){ switch(…){ … break; … } }break語句從switch語句中轉移出程序控制,但沒有從while循環中轉移出來。break語句break語句把程序控制從最內層封閉的while、do、focontinue語句與break語句類似break語句把程序控制轉出循環體。continue語句把程序控制轉移到循環體結束之前的一點。break語句使程序控制跳出循環,continue語句把程序控制留在循環體內。break語句和continue語句的另一個區別break語句可以在用于switch語句和循環中,而continue語句則只能用在循環中。continue語句continue語句與break語句類似continue語句使用continue語句的循環示例 n=0; sum=0; while(n<10){ scanf("%d",&i); if(i==0) continue; sum+=i; n++; /*continuejumpstohere*/ }continue語句使用continue語句的循環示例continue語句不用continue語句的相同循環示例 n=0; sum=0; while(n<10){ scanf("%d",&i); if(i!=0){ sum+=i; n++; } }continue語句不用continue語句的相同循環示例continue語句例6.5學生讀程
#include<stdio.h>
voidmain()
{intn;
for(n=100;n<=200;n++)
{if(n%3==0)
continue;
printf("%d″,n);
}
}說明:當n能被3整除時,執行continue語句,結束本次循環(即跳過printf函數語句),只有n不能被3整除時才執行printf函數。例6.5學生讀程
#include<stdio.h>
vo例6.5把100~200之間的不能被3整除的數輸出。
#include<stdio.h>
voidmain()
{intn;
for(n=100;n<=200;n++)
{if(n%3==0)
continue;
printf("%d″,n);
}
}說明:當n能被3整除時,執行continue語句,結束本次循環(即跳過printf函數語句),只有n不能被3整除時才執行printf函數。例6.5把100~200之間的不能被3整除的數輸出。
#goto語句能跳轉到函數中任何有標號的語句處。標號是放置在語句開始處的標識符 標識符語句一條語句可以有多個標號。goto語句格式如下 goto標識符;執行語句gotoL,把程序控制轉移到標號L后的語句上,轉移目標語句必須與goto語句在同一個函數中。goto語句goto語句能跳轉到函數中任何有標號的語句處。goto語句Entercommand:1例如,用于讀入用戶輸入并且在遇到特殊輸入值時終止的循環C99中,for語句的第一個表達式能被替換為一個聲明(定義)。loop_done:…gotoloop_done;/*breakwon'tworkhere*/scanf("%d",&n);“0”代表當前掃描器“位于空格串中”這一狀態。程序顯示平方值表格(改進版)printf("%disdivisibleby%d\n",n,d);當這些語句出現嵌套時,break語句只能跳出一層嵌套printf("Thesumis:%d\n",sum);printf("***ACMEcheckbookbalancingprogram***\n");do語句和while語句沒有本質的區別。case3:如果表達式為真,也就是不為零,那么繼續執行循環。break語句從switch語句中轉移出程序控制,但沒有從while循環中轉移出來。scanf("%d",&n);printf("*");循環嵌套中,每層循環的進行都有相應的控制機制(比如循環變量)。在控制表達式中使用==代替<,<=,>,或>=。從n1向下減到0 for(i=n1;i>=0;i)…如果C語言沒有break語句,goto語句可以用于退出循環 for(d=2;d<n;d++) if(n%d==0) gotodone; done: if(d<n) printf("%disdivisibleby%d\n",n,d); else printf("%disprime\n",n);goto語句Entercommand:1如果C語言沒有break語句goto語句在日常的C語言編程中很少用到。break、continue和return
等語句本質上都是受限制的goto語句,它們和exit函數一起足夠應付其他編程語言中大多數goto語句的情況。盡管如此,goto語句偶爾還是很有用的。goto語句goto語句在日常的C語言編程中很少用到。goto語句考慮從包含switch語句的循環中退出的問題。break語句不會產生期望的效果它可以跳出switch語句,但是無法跳出循環。goto語句可以解決這個問題 while(…){ switch(…){ … gotoloop_done;/*breakwon'tworkhere*/ … } } loop_done:…goto語句在需要從嵌套的多層循環中轉出時還是很有用。goto語句考慮從包含switch語句的循環中退出的問題。goto語句例6.1用if語句和goto語句構成循環
voidmain()
{inti,sum=0;
i=1;
loop:if(i<=100)
{sum=sum+i;
i++;
gotoloop;
}
printf("%d\\n″,sum);
}說明:這里用的是“當型”循環結構,當滿足“i<=100”時執行花括弧內的循環體。運行結果:5050例6.1用if語句和goto語句構成循環
voidma許多簡單的交互式程序都是基于菜單的,它們向用戶顯示可供選擇的命令列表。一旦用戶選擇了某條命令,程序就執行相應的操作,然后提示用戶輸入下一條命令。這個過程一直會持續到用戶選擇“退出”或“停止”命令。這類程序的核心顯然是循環。 for(;;){
提示用戶輸入命令;
讀入命令;
執行命令; }程序賬本結算許多簡單的交互式程序都是基于菜單的,它們向用戶顯示可供選擇的執行這個命令將需要switch語句(或級聯式if語句) for(;;){
提示用戶輸入命令;
讀入命令; switch(command){ case命令1:執行操作1;break; case命令2:
執行操作2;break; . . . case命令n:
執行操作n;break; default:顯示錯誤信息;break; } }程序賬本結算執行這個命令將需要switch語句(或級聯式if語句)程序賬程序checking.c用這種循環來維護賬本的余額程序將為用戶提供選擇菜單刷新帳戶余額,往帳戶上存錢,從帳戶上取錢,顯示當前余額,退出程序。程序賬本結算程序checking.c用這種循環來維護賬本的余額程序賬本結***ACMEcheckbookbalancingprogram***Commands:0=clear,1=credit,2=debit,3=balance,4=exit
Entercommand:1Enteramountofcredit:1042.56Entercommand:2Enteramountofdebit:133.79Entercommand:1Enteramountofcredit:1754.32Entercommand:2Enteramountofdebit:1400Entercommand:2Enteramountofdebit:68Entercommand:2Enteramountofdebit:50Entercommand:3Currentbalance:$1145.09Entercommand:4程序賬本結算***ACMEcheckbookbalancingprchecking.c
/*Balancesacheckbook*/
#include<stdio.h>
intmain(void){intcmd;floatbalance=0.0f,credit,debit;
printf("***ACMEcheckbookbalancingprogram***\n");printf("Commands:0=clear,1=credit,2=debit,");printf("3=balance,4=exit\n\n");for(;;){printf("Entercommand:");scanf("%d",&cmd);switch(cmd){case0:balance=0.0f;break;checking.ccase1:printf("Enteramountofcredit:");scanf("%f",&credit);balance+=credit;break;case2:printf("Enteramountofdebit:");scanf("%f",&debit);balance=debit;break;case3:printf("Currentbalance:$%.2f\n",balance);break;case4:return0;default:printf("Commands:0=clear,1=credit,2=debit,");printf("3=balance,4=exit\n\n");break;}}}case1:語句可以為空,即除了末尾的分號外什么符號也沒有。下面一行代碼包含三條語句 i=0;;j=1;空語句主要有一個好處編寫空循環體的循環。空語句語句可以為空,即除了末尾的分號外什么符號也沒有。空語句“1”代表當前掃描頭“位于字母串中”這一狀態;continue語句把程序控制轉移到循環體結束之前的一點。雖然循環體必須是單獨的一條語句,但這只是個技術問題。這個過程持續進行直到最終控制表達式的值變為零。Enterintegers(0toterminate):8237150return0;#include<stdio.1用if語句和goto語句構成循環
voidmain()
{inti,sum=0;
i=1;
loop:if(i<=100)
{sum=sum+i;
i++;
gotoloop;
}
printf("%d\\n″,sum);
}i=1,j=2,k=i+j因為控制表達式是在循環體執行之前進行判定。執行語句gotoL,把程序控制轉移到標號L后的語句上,轉移目標語句必須與goto語句在同一個函數中。/*Printsatableofsquaresusingawhilestatement*/gotoloop_done;/*breakwon'tworkhere*/Enterintegers(0toterminate):8237150使用do語句重寫前面的“倒數計數”程序do語句比while語句更適合,因為每個整數,即便是0都至少有一位數字。scanf("%d",&n);{…}…}但是在某一層x中,可能會使用甚至改變另一層y的控制機制(比如在x層中引用甚至修改y層的循環變量的值),這是造成多層循環難以理解的重要原因。考慮下面尋找素數的循環 for(d=2;d<n;d++) if(n%d==0) break;如果把條件n%d==0移到循環控制表達式中,那么循環體將會為空 for(d=2;d<n&&n%d!=0;d++) /*emptyloopbody*/;為了避免混淆,C程序員習慣性地把空語句單獨放置一行。空語句“1”代表當前掃描頭“位于字母串中”這一狀態;考慮下面尋找素不小心在if、while或for語句放置了分號形成空語句會造成上述語句的提前結束。例1: if(d==0);/***WRONG***/ printf("Error:Divisionbyzero\n"); 函數調用printf不在if語句中,所以無論d的值是否等于0都會執行該函數。例2: i=10; while(i>0);/***WRONG***/ { printf("Tminus%dandcounting\n",i); i; } while圓括號后多余的分號(空語句)造成無限循環。
空語句不小心在if、while或for語句放置了分號形成空語句會造例3: i=11; while(i>0);/***WRONG***/ printf("Tminus%dandcounting\n",i); 循環體在循環終止后只執行一次;顯示信息如下 Tminus0andcounting例4: for(i=10;i>0;i);/***WRONG***/ printf("Tminus%dandcounting\n",i); 同樣,循環體只執行一次,并顯示相同的信息。空語句例3:空語句循環的嵌套一個循環體內又包含另一個完整的循環結構稱為循環的嵌套。內嵌的循環中還可以嵌套循環,這就是多層循環。三種循環(while循環、do-while循環和for循環)可以互相嵌套。循環的嵌套循環的嵌套下面幾種都是合法的形式:(1)
while()(2)do(3)for(;;){…{…{while()dofor(;;){…}{…}{…}}while();}}while();
循環的嵌套循環的嵌套(4)
while()(5)for(;;)(6)do{…{…{…do{…}while()for(;;){}while(){}…{…}…}}}while()
循環的嵌套循環嵌套的難點循環嵌套中,每層循環的進行都有相應的控制機制(比如循環變量)。但是在某一層x中,可能會使用甚至改變另一層y的控制機制(比如在x層中引用甚至修改y層的循環變量的值),這是造成多層循環難以理解的重要原因。循環嵌套的難點循環嵌套中,每層循環的進行都有相應的控制機循環嵌套的難點例:intmain(){inti,k,s=0;for(i=1;i<=10;i++) for(k=1;k<=i;k++) s+=k;printf("%d",s);}此程序的作用是什么?打印的結果是?循環嵌套的難點例:循環嵌套的難點例:intmain(){inti,k,s=0;for(i=1;i<=10;i++) for(k=1;k<=i;k++) { if(k%2==0) i++; s+=k;}printf("%d",s);}}此程序的作用是什么?打印的結果是?循環嵌套的難點例:程序設計算法vs數學建模例:使用循環,在屏幕上打印如下圖案:*************************效果:程序設計算法vs數學建模例:使用循環,在屏幕上打印如下圖程序設計算法vs數學建模分析:1.將圖形放入笛卡爾坐標系(即建模)
**************************************************坐標平移程序設計算法vs數學建模分析:1.將圖形放入笛卡爾坐標程序設計算法vs數學建模2.得到數學模型:
0123456-1-2-3-4-5-6打印空格打印空格打印空格打印空格打印星號程序設計算法vs數學建模2.得到數學模型:012345程序設計算法vs數學建模3.用數學不等式來描述打印星號區域:(1)寫出四條邊線的方程(也可先不平移坐標,寫出原方程后再平移):(x-3)+(y+3)=3,-(x-3)+(y+3)=3,-(x-3)-(y+3)=3,(x-3)-(y+3)=3(2)統一描述為:|x-3|+|y+3|=3(3)故可描述打印星號區域為:
|x-3|+|y+3|≤30123456-1-2-3-4-5-6打印星號yx程序設計算法vs數學建模3.用數學不等式來描述打印星號程序設計算法vs數學建模由此得到本程序核心算法的描述:if(當前光標處于|x-3|+|y+3|≤3的區域中)
打印*;else打印空格;程序設計算法vs數學建模由此得到本程序核心算法的描述:程序設計算法vs數學建模完整程序如下#include<math.h>/*程序中要使用求絕對值函數fabs(),需包含此頭文件*/intmain(){intx,y;for(y=0;y>=-6;y--)/*此循環用于處理行*/{for(x=0;x<=6;x++)/*此循環用于處理某行中的各列*/if(fabs(x-3)+fabs(y+3)<=3)/*在y行x列中,坐標滿足本條件則打印星號,否則打空格*/printf("*");elseprintf(“”);/*可嘗試將此處換成打印減號,結果更直觀*/printf("\n");/*每處理完一行,需換行*/}}程序設計算法vs數學建模完整程序如下程序設計算法思想描述*例:輸入一個英文句子,以句號.結束,計算其中包含多少單詞(假設除句號外輸入的字符均為英文字母或者空格)。分析:把句子看成是由字母序列和空格序列(單詞間可能有多個空格)交替組成的一個字符串。程序處理的方式,是對句子中的所有字符進行逐一掃描(可以想象成有一個掃描頭,不斷地掃描句子中的每個字符),然后在這個過程中判定單詞的出現,如出現則把計數變量加1。
在編制程序前,先思考如何描述這個掃描的過程??方法:使用狀態轉移圖(或稱狀態機):程序設計算法思想描述*例:輸入一個英文句子,以句號.結束,“1”代表當前掃描頭“位于字母串中”這一狀態;“0”代表當前掃描器“位于空格串中”這一狀態。當“掃描到字母”事件或者“掃描到空格”事件發生時,掃描頭的狀態會被改變,如圖箭頭所示。程序設計算法思想描述*01掃描到空格掃描到字母掃描到空格掃描到字母“1”代表當前掃描頭“位于字母串中”這一狀態;程序設計算法思我們關心的是當處于狀態0時,“掃描到字母”事件發生的情況。這個時候意味著什么?——之前掃描到的是空格,現在是個字母,即意味著掃描到了一個單詞的開頭!所以此時,計數變量加1。程序設計算法思想描述*01掃描到空格掃描到字母掃描到空格掃描到字母我們關心的是當處于狀態0時,“掃描到字母”事件發生的情況。這語言循環結構語言循環結構87(優選)語言循環結構(優選)語言循環結構C語言的重復語句用于設置循環。循環是重復執行其他語句的一種語句,循環中重復執行的語句就是循環體
C語句中,每個循環都有一個控制表達式。每次執行循環體時都要對控制表達式進行計算。如果表達式為真,也就是不為零,那么繼續執行循環。重復語句C語言的重復語句用于設置循環。重復語句C提供三種循環語句:while語句用于判定控制表達式在循環體執行之前的循環。do語句用于判定控制表達式在循環體執行之后的循環。for語句對于自增或自減計數變量的循環十分方便。重復語句C提供三種循環語句:重復語句使用while語句是最簡單、最基本的設置循環方法。While語句格式如下 while(表達式)語句表達式即為控制表達式;語句則是循環體。while語句使用while語句是最簡單、最基本的設置循環方法。whilwhile語句示例 while(i<n)/*控制表達式*/ i=i*2;/*循環體*/執行while語句時,首先計算控制表達式的值。如果值不為零(真),那么執行循環體,接著再次判定表達式。這個過程持續進行直到最終控制表達式的值變為零。while語句while語句示例while語句while語句示例計算大于或等于數n的最小的2次冪 i=1; while(i<n) i=i*2;設n為10時,下面跟蹤顯示了while語句執行情況 i=1; i現在值為1. i<n成立嗎? 是,繼續。 i=i*2; i現在為2. i<n成立嗎? 是,繼續。 i=i*2; i現在為4。 i<n成立嗎? 是,繼續。 i=i*2; i現在為8。 i<n成立嗎? 是,繼續。 i=i*2; i現在為16。 i<n成立嗎? 不成立,退出循環。while語句while語句示例計算大于或等于數n的最小的2次冪while雖然循環體必須是單獨的一條語句,但這只是個技術問題。如果需要多條語句,那么只要用一對大括號構造成單獨一條復合語句就可以了 while(i>0){ printf("Tminus%dandcounting\n",i); i; }即使沒有嚴格要求的時候,一些程序員始終使用大括號括住循環體 while(i<n){ i=i*2; }while語句雖然循環體必須是單獨的一條語句,但這只是個技術問題。whil下面的語句顯示一串“倒數計數”信息 i=10; while(i>0){ printf("Tminus%dandcounting\n",i); i; }整個過程持續到顯示信息為“Tminus1andcounting”。while語句下面的語句顯示一串“倒數計數”信息while語句關于while語句的一些討論在while循環終止時,控制表達式的值為假。因此,當通過表達式i>0控制循環終止時,i必須是小于或等于0的。可能根本不執行while循環體。因為控制表達式是在循環體執行之前進行判定。while語句常常可以有多重寫法。更加簡明的遞減計數循環如下 while(i>0) printf("Tminus%dandcounting\n",i);while語句關于while語句的一些討論while語句printf("%disprime\n",n);}while();}intmain(void)scanf("%f",&credit);從1向上加到n for(i=1;i<=n;i++)…loop_done:…/*emptyloopbody*/;printf("Tminus%dandcounting\n",i);for(d=2;d<n;d++)case4:break語句不會產生期望的效果它可以跳出switch語句,但是無法跳出循環。printf("Thisprogramprintsatableofsquares.“0”代表當前掃描器“位于空格串中”這一狀態。for(d=2;d<n&&n%d!=0;d++)for(;;){i<n成立嗎? 不成立,退出循環。如果控制表達式的值始終是非零值的話,while語句將無法終止。C語句程序員有時故意用非零常量作為控制表達式來構造無限循環 while(1)…除非循環體含有跳出循環控制的語句(break,goto,return)或調用了導致程序終止的函數,否則上述這種形式的while語句將永遠執行下去。無限循環printf("%disprime\n",n);如果控程序square.c用一個while語句顯示平方值表格。用戶指定平方值表格的行數 Thisprogramprintsatableofsquares. Enternumberofentriesintable:5 11 24 39 416 525程序顯示平方值的表格程序square.c用一個while語句顯示平方值表格。程序square.c
/*Printsatableofsquaresusingawhilestatement*/
#include<stdio.h>
intmain(void){inti,n;
printf("Thisprogramprintsatableofsquares.\n");printf("Enternumberofentriesintable:");scanf("%d",&n);
i=1;while(i<=n){printf("%10d%10d\n",i,i*i);i++;}
return0;}square.c程序sum.c對用戶輸入的整數數列求和 Thisprogramsumsaseriesofintegers. Enterintegers(0toterminate):8237150 Thesumis:107程序需要使用循環,循環采用scanf函數讀取用戶輸入數,然后再把這個數加到運算的總和中。程序數列求和程序sum.c對用戶輸入的整數數列求和程序數列求和sum.c
/*Sumsaseriesofnumbers*/
#include<stdio.h>
intmain(void){intn,sum=0;
printf("Thisprogramsumsaseriesofintegers.\n");printf("Enterintegers(0toterminate):");
scanf("%d",&n);while(n!=0){sum+=n;scanf("%d",&n);}printf("Thesumis:%d\n",sum);
return0;}sum.c例6.3求1到100的和
學生練習運行結果:5050例6.3求1到100的和
學生練習運行結果:5050第二,計算表達式2并將計算結果作為整個逗號表達式的結果。如果需要多條語句,那么只要用一對大括號構造成單獨一條復合語句就可以了除非循環體含有跳出循環控制的語句(break,goto,return)或調用了導致程序終止的函數,否則上述這種形式的while語句將永遠執行下去。表達式1、表達式2和表達式3全都是表達式。“向下減使用>或〉=運算符。return0;scanf("%d",&n);printf("%10d%10d\n",i,square);通常循環的退出點是在while或for循環體之前,或do循環體之后。Enterintegers(0toterminate):8237150while(i>0){說明:當n能被3整除時,執行continue語句,結束本次循環(即跳過printf函數語句),只有n不能被3整除時才執行printf函數。在for語句中省略表達式case2:printf("***ACMEcheckbookbalancingprogram***\n");如果值不為零(真),那么執行循環體,接著再次判定表達式。scanf("%d",&n);如果把條件n%d==0移到循環控制表達式中,那么循環體將會為空使用break語句可以在循環體中間設置退出點,甚至設置多個退出點。例6.2求1到100的和
#include<stdio.h>
voidmain()
{inti,sum=0;
i=1;
while(i<=100)
{sum=sum+i;
i++;
}
printf(″%d\\n″,sum);
}說明:(1)循環體如果包含一個以上的語句,應該用花括弧括起來,以復合語句形式出現.(2)在循環體中應有使循環趨向于結束的語句。
運行結果:5050第二,計算表達式2并將計算結果作為整個逗號表達式的結果。例6do語句的一般格式如下 do語句while(表達式);執行do語句時,先執行循環體,再計算控制表達式的值。如果表達式的值非零,那么再次執行循環體,然后再次計算表達式的值。do語句do語句的一般格式如下do語句使用do語句重寫前面的“倒數計數”程序 i=10; do{ printf("Tminus%dandcounting\n",i); i; }while(i>0);do語句和while語句沒有本質的區別。唯一的不同在于do語句的循環體至少會被執行一次。do語句使用do語句重寫前面的“倒數計數”程序do語句最好對所有的do語句都使用大括號包括循環體,因為沒有大括號的do語句很容易被誤認為是while語句 do printf("Tminus%dandcounting\n",i); while(i>0);粗心的讀者可能會把單詞while誤認為是while語句的開始。do語句while(i<=100)最好對所有的do語句都使用大括號包括循環體,因為沒有大括號的例6.3求1到100的和
運行結果:5050例6.3求1到100的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 采茶機企業制定與實施新質生產力戰略研究報告
- 驅動微電機行業跨境出海戰略研究報告
- 農耕設備租賃合同標準文本
- 2025吉林建筑安全員知識題庫及答案
- 公司分錢合同樣本
- 出渣合同樣本
- 住宅屋轉讓合同樣本
- 個人花盆出售合同標準文本
- 農村木房建造合同標準文本
- 基于平衡計分卡的XY汽車公司銷售人員績效考核體系優化研究
- 項目二 物流基本功能活動管理
- 融資借款合同協議書范本(2024版)
- 2024年湖南省高中學業水平合格性考試英語試卷真題(含答案詳解)
- 鋁型材質檢規程
- 智能云服務交付工程師認證考試題庫(網大版)-中(多選題)
- 旅游景區運營委托經營協議書
- 景區人員管理制度
- 采礦學課程設計-潘三煤礦1
- 第9課第一框課件《相伴相助融洽相處》-【中職專用】中職思想政治《心理健康與職業生涯》(高教版2023·基礎模塊)
- 2024年4月自考04184線性代數(經管類)答案及評分參考
- MOOC 空中機器人-浙江大學 中國大學慕課答案
評論
0/150
提交評論