while循環能做什么???
- 先來個概念格式,while循環的一般形式為:
while(表達式){
語句塊
}
意思是,先計算“表達式”的值,當值為真(非0)時, 執行“語句塊”;執行完“語句塊”,再次計算表達式的值,如果為真,繼續執行“語句塊”……這個過程會一直重復,直到表達式的值為假(0),就退出循環,執行 while 后面的代碼。
看這段話你可能會有很多疑問,不過不重要,只要記住那個格式就行,因為上面那段話是官方闡述。通常將“表達式”稱為循環條件,把“語句塊”稱為循環體,整個循環的過程就是不停判斷循環條件、並執行循環體代碼的過程。其實就是符合條件就進行大括號里的內容,不符合條件,無視它就好。
- 看個例子,用 while 循環計算1加到100的值:
#include <stdio.h>
int main(){
int i=1, sum=0;
while(i<=100){
sum+=i;
i++;
}
printf("%d\n",sum);
return 0;
}
運行結果:
5050
代碼分析:
-
程序運行到 while 時,因為 i=1,i<=100 成立,所以會執行循環體;執行結束后 i 的值變為 2,sum 的值變為 1。
-
接下來會繼續判斷 i<=100是否成立,因為此時 i=2,i<=100 成立,所以繼續執行循環體;執行結束后 i 的值變為 3,sum 的值變為3。
-
重復執行步驟 2)。
-
當循環進行到第100次,i 的值變為 101,sum 的值變為5050;因為此時 i<=100 不再成立,所以就退出循環,不再執行循環體,轉而執行while循環后面的代碼。
while 循環的整體思路是這樣的:設置一個帶有變量的循環條件,也即一個帶有變量的表達式;在循環體中額外添加一條語句,讓它能夠改變循環條件中變量的值。這樣,隨着循環的不斷執行,循環條件中變量的值也會不斷變化,終有一個時刻,循環條件不再成立,整個循環就結束了。
如果循環條件中不包含變量,會發生什么情況呢?
- 循環條件成立時的話,while 循環會一直執行下去,永不結束,成為“死循環”。例如:
#include <stdio.h>
int main(){
while(1){
printf("1");
}
return 0;
}
- 運行程序,會不停地輸出“1”,直到用戶強制關閉。
- 循環條件不成立的話,while 循環就一次也不會執行。例如:
#include <stdio.h>
int main(){
while(0){
printf("1");
}
return 0;
}
- 運行程序,什么也不會輸出。
下面來練習一下!!!
- 如果要打印1~100該咋辦?這個問題可能很簡單。
#include <stdio.h>
#include <stdlib.h>
int main()
{
system("color 0a");//輸出的背景為黑底綠字,可刪
int i=1;
while(i<=100){
printf("%d\n",i);
i=i+1;
}
return 0;
}
- 如果要到着輸出100到1呢?
#include <stdio.h>
#include <stdlib.h>
int main()
{
system("color 0a");
int i=100;
while(i>0){
printf("%d\n",i);
i=i-1;
}
return 0;
}
- 如果要輸出1~100的偶數呢?
#include <stdio.h>
#include <stdlib.h>
int main()
{
system("color 0a");
int i=2;
while(i<=100){
printf("%d\n",i);
i=i+2;
}
return 0;
}
- 再來個難的,輸出1~100后再從100輸到1。
#include <stdio.h>
#include <stdlib.h>
int main()
{
system("color 0a");
int i=1;
while(i<100){
printf("%d\n",i);
i=i+1;
}
while(i>0){
printf("%d\n",i);
i=i-1;
}
return 0;
}
所以,循環(Loop),就是重復地執行同一段代碼,例如要計算 1+2+3+……+99+100 的值,就要重復進行99次加法運算。
通過上述對while有個基本了解,但如何用計算機輸出1~100中所有不能被3整除的數,例如1,2,4,5……,97,98,100。
通過上述,其實可以讓a從開始每次增加1就可以。如果想每次遇到3的倍數就不打印,只需每次對a進行判斷就好,即當a為3或3的倍數就不輸出,否則就輸出。
那具體該如何做?
我們只需要通過if語句來判斷變量a的值除以3的余數是否為0就可以了。如果余數不為0,說明變量a中的值不是3的倍數,就將變量a中的值打印出來;否則就說明變量a中的值是3的倍數,不能打印。
那么,怎么判斷變量a中的值除以3的余數是否為0呢,需要使用“%”這個運算符。在第3章中我們介紹過,“%”讀作mod,也可以稱之為“取模”,作用就是獲取余數。另外說一下“%”這個運算符的左右兩邊必須為整數。而“/”這個符號表示除號,作用是獲取商,“/”這個運算符的左右兩邊既可以是整數也可以是小數。
代碼如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=1;
while(a<=100){
if(a%3!=0){
printf("%d\n",a);
}
a++;
}
return 0;
}
- 如果要輸出1~100中能被3整除但是不能被5整除的所有數,又該怎么辦?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=1;
while(a<=100){
if(a%3==0 && a%5!=0){
printf("%d\n",a);
}
a++;
}
return 0;
}
- 更復雜的來了!現在我想知道1~100中有多少這樣的數,請你寫這樣一個程序,輸出1~100中所有7的倍數和末尾含7的數。
- 很簡單,我們先參照以往的程序,利用while循環,讓變量a從1遞增到100,不過我們每次在輸出變量a的值之前需要對變量a進行判斷。根據題目的要求,如果變量a的值是7的倍數或者末尾含有7就打印出來。判斷一個變量是否為7的倍數我們已經很熟悉了,只需要判斷變量a除以7的余數是否為0就可以,即如果
a%7==0
這個關系表達式成立就輸出。那怎么判斷變量a的值末尾是否含7呢?我們仔細想一想就會發現末尾含7的數其實就是這個數的個位為7,也就是這個數除以10的余數為7。發現這個規律就好辦了,即在a%10==7
這個關系表達式成立時輸出就可以啦。 - 好了,現在有兩個關系表達式
a%7==0
和a%10==7
,分別表示這個數是否為7的倍數以及末尾是否含7。這兩個式子是“或者”的關系,只要有一個成立,就將這個數輸出。這里的邏輯關系“或者”在C語言中的表示方法用“||”表示, - 所以,代碼如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=1;
while(a<=100){
if(a%7==0 || a%10==7){
printf("%d\n",a);
}
a++;
}
return 0;
}
那如何求和呢?
- 可能你會說,一直加就好,比如在求1~100的和之前,我們先來解決如何求1+2+3的值。
沒錯,你可以這樣寫:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
a = 1+2+3;
printf("%d", a);
system("pause");
return 0;
}
- 但如果是1~100的話,這樣不會很麻煩嗎?可以換一種方式,比如:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
a = 0; //想一想為什么a的初始值要為0呢?
a = a+1;
a = a+2;
a = a+3;
printf("%d", a);
return 0;
}
你可能會說這樣寫豈不是更麻煩……但是我們發現在上面的這段代碼中,a=a+1; a=a+2;a=a+3;這三句話,基本思想是相同的,第一次加1,第二次加2,第三次加3。我們可以把這三個語句用a=a+i;來表示。然后讓變量i從1到3循環就可以了。
- 代碼如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a, i;
a = 0;
i = 1;
while(i< = 3)
{
a = a+i;
i = i+1;
}
printf("%d", a);
return 0;
}
- 如果需要計算1~100的和,我們只需將上面代碼中i<=3修改為i<=100就可以了,代碼如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a, i;
a = 0;
i = 1;
while(i< = 100)
{
a = a+i;
i = i+1;
}
printf("%d", a);
return 0;
}
- 如果求1~100中所有7的倍數或者末尾含7的數的總和,又該怎么辦呢?其實是一樣的:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a, i;
a = 0;
i = 1;
while(i<= 100)
{
if(i%7 == 0 || i%10 == 7) {
a = a+i;
}
i = i+1;
}
printf("%d", a);
return 0;
}
- 求1~100所有偶數的和
#include <stdio.h>
#include <stdlib.h>
int main(){
system("color 0a");
int i=0,a=0;
while(i<100){
a=a+i;
i=i+2;
}
printf("%d",a);
return 0;
}
- 輸入一個整數n,求n的階乘
#include <stdio.h>
#include <stdlib.h>
int main()
{
system("color 0a");
int i=1,a=1;
int n;
scanf("%d",&n);
while(i<=n){
a=a*i;
i=i+1;
}
printf("%d",a);
return 0;
}
- 請嘗試編寫一個兩分鍾的倒計時。形如:2:00 1:59 1:58 …… 1:00 0:59 0:58 …… 0:02 0:01 0:00
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
int i,j=0;
scanf("%d",&i);
while(i>=j){
system("cls");
printf("%2d:%2d\n",i/60,i-i/60*60);
Sleep(1000);
i--;
}
return 0;
}
- 打印三行,每行5個
“*”
。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=1;
while(a<=15){
printf("*");
if(a%5==0){
printf("\n");
}
a++;
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=1,b;
while(a<=3){
b=1;
while(b<=5){
printf("*");
b++;
}
printf("\n");
a++;
}
return 0;
}
- 想一想,如果想要完成這樣的圖形該怎么辦?
*
**
***
****
*****
- 具體代碼:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=1,b;
while(a<=5){
b=1;
while(b<=a){
printf("*");
b++;
}
printf("\n");
a++;
}
return 0;
}
- 請嘗試用while循環打印下面的圖形:
1
2 2
3 3 3
4 4 4 4
5 5 5 5 5
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=1,b;
while(a<=5){
b=1;
while(b<=a){
printf("%d",a);
b++;
}
printf("\n");
a++;
}
return 0;
}
- 請嘗試用while循環打印下面的圖形:
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=0,b,c;
while(a<=5){
b=0;
while(b<=a){
c++;
b++;
printf("%d ",c);//這里有空格
}
printf("\n");
a++;
}
return 0;
}