C語言基礎第七課循環結構程序設計——第三節循環嵌套、打印九九乘法表(仔細分解全教程附加源代碼)、break語句的使用方式、continue語句的使用方式、while(1)循環的使用方式

一、循環嵌套

循環的嵌套,就是在一個循環的循環體中,又包含了另外的循環結構,也稱爲多重循環。
在多重循環中,最常用的是雙重循環。
例1.雙重循環示例。

#include <stdio.h>
int main()
{
int i,j;
for(i=0;i<2;i++)
//外循環
//在下面的括號裏面的就是外循環的內容
{
for(j=0;j<3;j++)
printf("%d,%d\n",i,j);
printf("*****\n");
/*這條五個星號的在內內循環外面
在外循環裏面
因爲循環後面跟的是單條語句
所以有人就會在每個循環後面都加{}來表示區分
即便只有一條語句*/
}
return 0;
}

首先將外循環的循環體看作一個整體,然後將外循環展開(就是寫寫它能夠運行幾次跟跳出條件啊啥的)。
然後,依次執行內循環。

二、打印九九乘法表

直接打印自然很難啊
所以想辦法拆分
拆着拆着就簡單了
編程思路:
首先,只考慮1個等式(比如“19=9”)的打印。
最簡單的方法,就是將這個等式,直接作爲字符串常量打印。
printf("1
9=9\n");
這種方式相當於一種半人工方式,不能體現程序控制的優勢。
爲了體現程序控制的思想,定義兩個整型變量,代表等式所處的行號、列號。用行號列號控制程序運行。
打印一個等式“1*9=9”的程序:

#include <stdio.h>
int main()
{
int i,j;
i=9; 	//行號
j=1; 	//列號
printf("%d*%d=%d\n",j,i,i*j);
return 0;
}

要打印整個第9行的9個等式,只需要讓行號i=9保持不變,然後讓列號j從1遞增到9,並循環執行打印一個等式的printf語句即可。

打印乘法表一行的源程序:
#include <stdio.h>
int main()
{
int j,i=9;
for(j=1;j<=9;j++)
printf("%d*%d=%d\t",j,i,i*j);
//\t就是轉義字符
//代表水平製表符、
//簡單點就是tab鍵
//就爲了等式之間能夠有間隔
//看起來條理一些
printf("\n");
//換行
return 0;
}

在上面的程序中,變量i的值固定爲9,因此只能打印第9行。
要打印所有的9行等式,只需讓行號i從1遞增到9,並循環執行打印一行的程序段即可。

#include <stdio.h>
int main()
{
int i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
printf( "%d*%d=%d\t",j,i,i*j);
printf("\n");
}
return 0;
}

//語句printf("\n");
必須位於外循環體之內
內循環體之外。

效果圖
在這裏插入圖片描述等式的行數,是由外循環的循環次數控制的。
每行中等式的個數,是由內循環的循環次數控制的。
內循環就是j那個循環
可以看到j就是9次
不管有幾行(那是外循環的事情)
每行都有9個等式(這室內循環規定的)
這是改成五以後的效果圖
在這裏插入圖片描述要讓各行的等式個數隨行號而變化,只需讓內循環的循環次數,跟隨外循環變量的值而變化即可。
決定一個循環的循環次數的因素,是它的初值、終值和步長。
通常的實現方法,是將內循環變量的終值(或初值),設置爲包含外循環變量的表達式。

只需要將內循環變量j的終值
設置爲與外循環變量i的值相等即可。
for(i=1;i<=9;i++ )
{
for(j=1;j<=i;j++)
printf("%d*%d=%d\t",i,j,i*j);
printf("\n");
這樣,內循環的循環次數將變成i次,從而使得第i行輸出i個等式。

修正之後的源程序:
#include <stdio.h>
int main()
{
int i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
printf("%d*%d=%d\t",j,i,i*j);
printf("\n");
}
return 0;
}

在這裏插入圖片描述99乘法表的源代碼其實並不長
總結:如果要編寫雙重循環結構的程序,可以先構造出內循環部分。以整個內循環部分作爲循環體,加上外層循環語句,形成嵌套結構即可。

三、break語句的使用

break語句只能用於switch語句內部,或者循環體內部。
用於循環體內部時,其功能是從本層的循環體中跳出來,從而提前結束循環。

#include <stdio.h>
int main()
{
int i;
for(i=1;i<=5;i++)
{
if(i>=3)
break;
//這裏就是i=3的時候跳出循環
printf( "%d,",i);
return 0;
}

break一般結合if語句執行,就是由if語句提供一個判斷條件,決定是否執行break語句。

四、continue語句的使用

continue;
只能用於循環體內部,其功能是跳過continue之後的部分循環體,而繼續進行下一次循環。

#include <stdio.h>
int main()
{
int i;
for(i=1;i<=5;i++)
{
if(i<=2)
continue;
//就是如果if表達式的值爲真
//那麼後面的printf("%d,",i);就不執行了
//就跳過了
//等到if語句爲假的時候
//就可以跳過continue;了
printf("%d,",i);
}
return 0;
}

對於for循環,執行continue將轉向表達式3(一般就是i++這一類)執行,然後轉向循環條件的判斷(表達式2,就是i<=5這種)
而對於while循環和do-while循環,執行continue將直接轉向循環條件的判斷。(因爲他的i++通常在循環體裏面如果排序的時候continue在i++之前,i++就會被跳過)

while(i<10{
printf("%d",i)
continue;
i++
}

五、while(1)循環

while(1)循環的循環條件永遠爲真
對循環條件進行判斷的時機,是至關重要的。
一方面,要保證先給循環變量賦值、後判斷循環條件;
另一方面,要保證先判斷循環條件、後進行相應處理。

例:從鍵盤輸入若干名學生某一門課程的成績,然後求出他們的平均成績。要求以任意負數作爲輸入結束標記。
編程思路:
要想求平均成績,必須先求出這些成績的總和。由於沒有明確給出學生的人數,因此可以採用輸入結束標記控制循環。

算法設計:
輸入一個學生的成績。如果是結束標記,那麼就結束循環;否則,累加到總成績中,並統計當前學生的人數,然後轉向第1步。最後求出平均成績並輸出。

#include<stdio.h>
int main()
{
float g,sum=0,ave;
//sum=0注意
int n=0;
printf("請輸入若干個成績,以任意負數退出:\n");
while(g>=0)
{
scanf("%f",&g);
sum=sum+g;
n++;
}
ave=sum/n;
printf("平均成績=%.2f\n",ave);
return 0;
}
這樣是不對的
while(g>=0)
{
scanf("%f",&g);
sum=sum+g;
n++;
}
很明顯while所判斷的g一開始並沒有被賦值
而且如果輸入負數也是先執行循環體
也就是先加到sum中
在進行判斷
不合適
所以用do-while

#include <stdio.h>
int main()
{
float g,sum=0, ave;
int n=0;
printf("請輸入若干個成績,以任意負數退出:\n");
{
scanf("%f",&g);
sum=sum+g ;
n++ ;
}
while(g>=0);
ave=sum/n;
printf("平均成績=%.2f\n" ,ave);
return 0;
}
but
結束標記也是可以被加進去
因爲在循環體裏面

綜上
用while(1)
直接用1作爲循環的條件,即循環條件永遠爲真,從而成爲無限循環。
可以通過有條件的break語句,選擇適當的時機跳出循環。

#include<stdio.h>
int main()
{
float g,sum=0ave;
int n=0;
printf("請輸入若干個成績,以任意負數退出:\n");
while(1)
{
scanf("%f",&g);
if(g<0)
break;
sum=sum+g;
n++;
}

//這裏break的位置美挺有意思的

ave=sum/n;
printf("平均成績=%f\n" ,ave);
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章