黑馬程式設計師-C語言回顧-迴圈
一、迴圈結構介紹
1、概述
迴圈結構是程式中一種很重要的結構。其特點是:在給定條件成立時,反覆執行某程式段,知道條件不成立為止。給定的條件稱為村換條件,反覆執行的程式段稱為迴圈體。
迴圈結構簡單來說就是:迴圈是一次又一次的執行相同的程式碼塊。
C語言提供了多種迴圈語句,可以組成各種不同形式的迴圈結構:
用goto語句和if語句構成迴圈;
用while語句;
用do-while語句;
用for語句;
2、構成迴圈結構的幾個條件:
1)迴圈控制條件
迴圈退出的主要依據,來控制迴圈到底什麼時候退出
2)迴圈體
迴圈的過程中重複執行的程式碼段
3)能夠讓迴圈結束的語句(遞增、遞減、真、假等)
能夠讓迴圈條件為假的依據,否則退出迴圈
二、while迴圈介紹及基本格式
1、while迴圈的格式
while(條件)
{
語句1;
語句2;
····
}
2、while迴圈使用方法:
1)while迴圈的特點
如果while中的條件一開始i不成立,那麼迴圈體中的語句永遠不會執行
2)while語句的語義是:
如果條件成立,就會執行迴圈體中的語句(“迴圈體”就是while後面大括號中的內容)。然後再次判斷條件,重複上述過程,直到條件不成立就結束while迴圈。
思考&實現:
1、用while語句計算從1到100的值。
思路:
1)定義一個變數i,定義一個變數存放和計算和
2)迴圈條件
3)進行加法 i自增。
int i = 1,sum = 0;
while (i<=100) {
sum = sum + i;
i++;
}
printf("從1加到100的值是:%d",sum);
2、改進:輸入一個整數n計算從1到n的值。
int i = 1,sum = 0,a = 0; printf("請輸入一個數字:\n"); scanf("%d",&a); while (i<=a) { sum = sum + i; i++; } printf("從1加到%d的值是:%d",a,sum);
三、while迴圈使用陷阱
1、while迴圈的陷阱
死迴圈:就是一直都執行迴圈體中的程式碼,不會退出
while(條件)
思考&實現
統計從鍵盤輸入一行字元的個數
思路:
1)接受使用者輸入的字串
2)判斷使用者是不是敲了換行。
#include <stdio.h>
int main(int argc, const char * argv[]) {
int count = 0;
char ch;
printf("請輸入一行字元:\n");//字母字元都可以
scanf("%c",&ch);
while (ch!='\n') {
scanf("%c",&ch);
count++;
}
printf("你輸入的字元的個數是:%d",count);
return 0;
}
四、while迴圈的應用
1、遊戲方向控制
1)不知道要迴圈的次數的時候使用死迴圈
2)在某個範圍內查詢滿足條件的值
思考&實現
使用while迴圈實現控制w(上) s(下) a(左) d(右) 方向控制
#include <stdio.h>
int main(int argc, const char * argv[]) {
int flag = 1;
char ch;
printf("請控制小人移動:w,s,a,d\n");//如果在whil內列印,會列印兩次。
while (flag) {
scanf("%c",&ch);
switch (ch) {
case 'w':
case 'W':
printf("上\n");
break;
case 's':
case 'S':
printf("下\n");
break;
case 'a':
case 'A':
printf("左\n");
break;
case 'd':
case 'D':
printf("右\n");
break;
case 'q':
case 'Q':
printf("程式已經退出!\n");
flag=0;
}
}
return 0;
}
2、應用:《瘋狂猜數》
思考&實現
使用隨機數隨機產生一個1~1000之間的數,給使用者10詞競猜的機會。
遊戲分析
思路:
1)定義變數
2)儲存計算機產生的隨機數和輸入的數字
3)儲存隨機數產生的範圍
4)儲存總的次數
5)儲存已經競猜的次數
產生隨機數
1)匯入標頭檔案 stdlib.h
2)呼叫隨機數函式,產生隨機數。
arc4ranom_uniform(1000); 產生0~999之間的隨機數
產生m到n之間的隨機數
arc4random_uniform(n-m+1)+m
死迴圈判斷
判斷次數是否小於10
如果<10,可以猜
提示使用者輸入一個數,然後判斷是大了還是小了
>10,提示,退出程式。
程式碼實現:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
int randomNum = 0,inputNmu = 0;
int count = 1;
int flag = 1;
randomNum=arc4random_uniform(1000)+1;
while (flag) {
if (count<=10) {
printf("請輸入一個1~1000之間的數字\n");
scanf("%d",&inputNmu);
if (inputNmu<randomNum) {
printf("這是第%d次輸入,你還有%d次機會\n對不起,你猜小了\n",count,10-count);
} else if(inputNmu>randomNum){
printf("這是第%d次輸入,你還有%d次機會\n對不起,你猜大了\n",count,10-count);
}else{
printf("恭喜你,你在第%d次時猜對了\n",count);
flag=0;
}
count++;
} else {
printf("你的智商不適合這個遊戲!\n");
flag = 0;
}
}
return 0;
}
五、while迴圈使用注意
1、死迴圈:任何數值都有真假性。
while(-1){
}
2、當一個變數與一個常量進行==或!=的時候,通常把常量寫在前面
3 == num
3、while後如果只有一條語句它可以省略大括號
1)空語句它也是一條語句
2)while小括號後面不可以直接寫分號
4、作用域:內部程式碼塊中定義的變數不可以在外邊程式碼塊中訪問
5、作用域紊亂
while(1<3)
int num = 5;
6、最簡單死迴圈
while(1);
六、do···while迴圈的基本格式
1、基本格式
do{
語句1;
語句2;
···
}while(條件);
直到型迴圈:先執行迴圈體,然後判斷條件,直到條件為假就結束。
2、do while語句用法
1)do while語句的語義是:
當執行do-while迴圈是,首先會執行一遍迴圈體中的語句。接著判斷while中的條件,如果條件成立,就執行迴圈體中的語句。然後再次判斷條件,重複上述過程,直到條件不成立就結束while迴圈
2)do-while迴圈的特點:
不管while中的條件是否成立,迴圈體中的語句至少會被執行一遍。
七、do-while和while對比
1)當迴圈控制條件第一次判斷不為假的時候
while和do-while迴圈體執行的次數相同
2)當迴圈控制條件第一次判斷為假的時候
while迴圈的迴圈體執行0次
do-while執行1次。
八、for迴圈結構及執行過程
1、for迴圈的語法格式
C語言中的for語句使用最為靈活,不僅可以用於迴圈次數已經確定的情況,而且可以用於迴圈次數不確定而只給出迴圈結束條件的情況,它完全可以代替while語句。
一般形式:
for(表示式1;表示式2;表示式3){語句;}
2、for迴圈執行過程
1)先求解表示式1。
2)求解表示式2,若其值為真(值為非0),則執行for語句中制定的內嵌語句,然後執行下面第3)步。若為假(值為0),則結束迴圈,轉到第5)步。
3)求解表示式3
4)轉會上面第2)步繼續執行
5)迴圈結束,執行for語句下面的一個語句。
注意:
1)初始化語句只會被執行1次
2)當條件不滿足的時候,迴圈就結束
九、for迴圈的其他形式
1、表示式省略(三個表示式都可以省略)
如:for(;;)語句相當於while(1)語句,即不設初值,不判斷條件(認為表示式2為真),迴圈變數不增值。無終止地執行迴圈體。
2、迴圈控制無關的任意表達式
表示式1和表示式3可以是一個簡單的表示式,也可以是逗號表示式,即包含一個以上的簡單表示式,中間用逗號隔開。
在逗號表示式內按自左至右順序求解,整個逗號表示式的值為其最右邊的表示式的值。
如:
for(i = 1; i<=100;i++,i++)
相當於
for(i=1;i<=100; i = i+2)
十、for迴圈巢狀應用
1、列印圖形(一)
思考&實現1
列印圖形
*
- *
- * *
- * * *
- * * * *
for (int i = 0; i<5; i++) {
for (int j = 0; j<=i; j++) {
printf("* ");
}
printf("\n");
}
思考&實現2
使用者輸入一個整數N,輸出如下圖形,如:N=5
1
2 2
3 3 3
4 4 4 4
5 5 5 5 5
#include <stdio.h>
int main(int argc, const char * argv[]) {
int N=0;
printf("請輸入一個正整數:\n");
scanf("%d",&N);
for (int i =0; i<N; i++) {
for (int j =0; j<=i; j++) {
printf("%d",i+1);
}
printf("\n");
}
return 0;
}
2、列印圖形(二)
列印正三角形
#include <stdio.h>
int main(int argc, const char * argv[]) {
for (int i = 0; i<6; i++) {
//第一個內迴圈控制空格。
for (int j = 0 ; j<6-i; j++) {
printf(" ");
}
//第二個內迴圈控制*的個數。
//注意每行*的個數和行數的關係 2*i-1。
for (int k = 0; k<2*i-1; k++) {
printf("*");
}
printf("\n");
}
return 0;
}
3、列印9*9乘法表
#include <stdio.h>
int main(int argc, const char * argv[]) {
for (int i = 1; i<=9; i++) {
for (int j = 1; j<=i; j++) {
printf("%d*%d = %d ",j,i,j*i);
}
printf("\n");
}
return 0;
}
十一、break關鍵字及break語句
break和continue語句都可以用在迴圈中,用來跳出迴圈(結束迴圈)
break語句還可以在switch語句中,用來跳出switch語句。
1、break語句用法
當break語句用於do-while、for、while迴圈語句中時,可是程式終止迴圈而執行迴圈後面的語句,通常break語句總是與while語句聯在一起,及滿足條件時便跳出迴圈。
注意:
1)break語句對if-else的條件語句不起作用;
2)在多層迴圈中,一個break語句只向外跳一層。
#include <stdio.h>
int main(int argc, const char * argv[]) {
float area = 0.0f;
for (int r = 1; r<=10; r++) {
area = 3.14f*r*r;
if (area>100) {
printf("半徑是%d,圓面積是%.2f",r,area);
break;
}
}
return 0;
}
十二、continue關鍵字及continue語句
1、continue語句(結束本次迴圈,繼續下次迴圈)用法
continue語句的作用是跳過迴圈體中剩餘的語句而繼續下一次。continue語句只用在for、while、do-while等迴圈體中,常與if條件語句一起使用,用來加速迴圈。
/*
contin語句的使用:
作用,跳出本次迴圈,進行下次迴圈。加速迴圈。
思考題:
把100~200之間不能被3乘除的數輸出。
*/
#include <stdio.h>
int main(int argc, const char * argv[]) {
printf("100~200之間不能被3乘除的數是:\n");
for (int i = 100; i<=200; i++) {
if (i%3==0) {
continue;
}
printf("%d ",i);
}
return 0;
}