日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言程序设计学习笔记:P4-循环

發布時間:2023/12/8 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言程序设计学习笔记:P4-循环 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本系列博客用于記錄學習浙江大學翁愷老師的C語言程序設計,系列筆記鏈接如下:
C語言程序設計學習筆記:P1-程序設計與C語言
C語言程序設計學習筆記:P2-計算
C語言程序設計學習筆記:P3-判斷
C語言程序設計學習筆記:P4-循環
C語言程序設計學習筆記:P5-循環控制
C語言程序設計學習筆記:P6-數據類型
C語言程序設計學習筆記:P7-函數
C語言程序設計學習筆記:P8-數組
C語言程序設計學習筆記:P9-指針
C語言程序設計學習筆記:P10-字符串
C語言程序設計學習筆記:P11-結構類型
C語言程序設計學習筆記:P12-程序結構
C語言程序設計學習筆記:P13-文件
C語言程序設計學習筆記:P14-鏈表

文章目錄

  • 一、循環
    • 1.1 循環
    • 1.2 while循環
    • 1.3 do-while 循環
    • 小測驗
  • 二、循環應用
    • 2.1 循環計算
    • 2.2 猜數游戲
    • 2.3 算平均數
    • 2.4 整數求逆
    • 小測驗


一、循環

1.1 循環

問題引出

現在我有一個題目:程序讀入一個4位以下(含4位)的正整數,然后輸出這個整數的位數。如輸入352,輸出3。
人的方式:眼睛一看就知道了,我們一眼就可以看出352是三位數。
計算機的方式:計算機最不擅長的就是一眼看出來結果,因此一個合適的方法便是判斷數的范圍來決定它的位數。由于352∈[100,999],因此352是三位數。因此,我們寫出代碼如下。通過級聯的if來依次判斷輸入的數字是否大于最大的三位數、最大的兩位數、最大的一位數,從而得到數字的位數。

代碼實現

#include <stdio.h> int main() {int x;int n=1;scanf("%d", &x);if (x > 999){n=4;}else if (x > 99){n = 3;}else if (x > 9){n = 2;}else{n = 1;}printf("%d\n", n);return 0; }

我們進行測試,可以看出結果正確。

代碼的局限性

如果輸入任意范圍的正整數怎么辦?如果是5位數、6位數、7位數…,那我們得一直增加if的個數,這如何才是個頭?我們知道,如果讓你看到352這個數,可以一眼就知道是三位數。但是如果人看到123812843267518273618273612675317這個數,能一眼看出是多少位嗎?答案是明顯不能的,那我們就會去數數,一路數過來。
關于數數,人是怎么做的:
人數數的過程是這樣的:從左往右數,一次劃掉一個數字,并將位數加1。舉個例子,輸入352,那么我們首先劃去第一位的3,保留后面的52并將位數加1。
計算機怎么做:
計算機該怎樣實現這個功能呢?要完成上面操作我們可以讓352%100=52,此時成功劃去3并保留52,接著重復上面操作。那么,對于剛才那個非常大的數,要劃去第一個數,需要123812843267518273618273612675317%100000000000000000000000000000000=23812843267518273618273612675317
問題便是怎么得到那個100000000000000000000000000000000?

思路:

可以看出從左往右劃不現實,無法得知應該去模哪一個數。如果換一下,從右邊開始劃,直到沒數可以劃,同時在這個過程中計數,這樣就能夠得到正確的結果。
123812843267518273618273612675317 / 10 =12381284326751827361827361267531
12381284326751827361827361267531 / 10 = 1238128432675182736182736126753
1238128432675182736182736126753 / 10 = 123812843267518273618273612675

代碼實現

int x; int n = 0;scanf("%d", &x);n++; x /= 10; if < x>0) {n++;x/=10;if (x > 0){n++;x/=10;if ...} }printf("%d\n", n);

解決方案

我們寫出代碼,可以看出需要一直判斷劃完后的數是否為0,如果不為0就需要繼續。可以看出這事還是沒完沒了。那么我們也許需要這個東西:while。當x大于0時,我們需要一直去做這個事。

代碼實現

#include <stdio.h> int main() {int x;int n=0;scanf("%d", &x);n++;x /= 10;while (x > 0){n++;x /= 10;}printf("%d\n", n);return 0; }

我們進行測試,可以看出結果正確。


1.2 while循環

單看語法的話,while和if非常相似,只用把判斷條件前面的if改為while即可。不同的是,括號里面的操作if只執行1次,而while要重復地執行。

//if: if (x > 0) {x /= 10;n++; }//while while (x > 0) {x /= 10;n++; }

while的流程圖可以如下圖所示:

括號里面反復執行的叫做循環體。循環體內一定要有改變條件的機會,不然會一直在循環里面出不來。如下面這個例子,由于x大于0且x的值不會改變,因此n會一直加下去。

int x = 10; int n = 0; while (x > 0) {n++; } printf("%d", n);

在上面一節我們寫過一段判斷整數位數的代碼。while前面的兩行代碼與循環體內的代碼一樣,那我們能夠把外面的代碼放進來嗎?

n++; x /= 10; while (x > 0) {n++;x /= 10; }

我們來試一試。

#include <stdio.h> int main() {int x;int n=0;scanf("%d", &x);while (x > 0){n++;x /= 10;}printf("%d\n", n);return 0; }

當我們輸入0時,結果為0,明顯錯誤。因為這個程序需要一些特殊的代碼來判斷輸入為0時的情況,即必須先執行一次循環體內的操作。


1.3 do-while 循環

問題引出

上面判斷整數位數的代碼(包括輸入為0)的算法流程應該是怎么樣的:
①用戶輸入x;
②初始化n為0;
③x = x / 10,去掉個位;
④n ++;
⑤如果x>0,回到3;
⑥否則n就是結果。
我們有沒有更好的結構使得先將事情做一輪然后再去判斷呢?這就是我們的do-while循環。在進入循環的時候不做檢查,而是在執行完一輪循環體的代碼之后,再來檢查循環的條件是否滿足。如果滿足則繼續下一輪循環,不滿足則結束循環。do-while的語法如下,注意不要忘了while后面的那個分號。
do
{
<循環體語句>
} while ( <循環條件> );

其流程圖如下圖所示:

do-while循環和while循環很像,區別是do-while在循環體執行結束的時候才來判斷條件。也就是說,無論如何循環都會執行至少一遍,然后再來判斷條件。與while循環相同的是,條件滿足時執行循環,條件不滿足時結束循環。因此,判斷整數位數的代碼可以寫成下面這樣。

do-while實現判斷整數位數代碼

#include <stdio.h> int main() {int x;int n=0;scanf("%d", &x);do{n++;x /= 10;}while (x > 0);printf("%d\n", n);return 0; }

小測驗

1、while循環的條件滿足的時候循環繼續,而do-while的條件滿足的時候循環就結束了。
答案:錯誤

2、以下代碼片段執行結束后,變量i的值是多少?

答案:0

3、以下代碼片段執行結束后,變量i的值是多少?

答案:21


二、循環應用

2.1 循環計算

題目1:求一個數是2的多少次冪。(設置輸入的這個數是2的整數次冪)

#include <stdio.h> int main() {int x=64;int ret = 0;int t = x; //使用一個變量保存x,因為后面需要打印原始的x,后面x的值會改變while (x > 1){ret++;x /= 2;}printf("log2 of %d is %d\n", t, ret);return 0; }

題目2:我們再看個例子,下面我有一段代碼。

#include <stdio.h>int main() {int count = 100;while ( count>= 0 ) {count--;printf("%d ", count);}printf("發射\n");return 0; }

看著這段代碼,我們有以下幾個小問題:

①這個循環需要執行多少次?
②循環停下來的時候,有沒有輸出最后的0?
③循環結束后,count的值是多少?
小套路: 如果要模擬運行一個很大次數的循環,可以模擬較少的循環次數,然后作出推斷。我們先將count設置為3來看看。可以看出循環執行了4次,輸出了最后的0,循環結束后count的值為-1。


2.2 猜數游戲

題目

現在我們想做一個猜數游戲。讓計算機來想一個數,然后讓用戶來猜,用戶每輸入一個數,就告訴它是大了還是小了,直到用戶猜中為止,最后還要告訴用戶它猜了多少次。

思路

看到這個問題我們可以知道因為需要不斷重復讓用戶猜,所以需要用到循環,核心重點是循環的條件,尤其是循環終止的條件。我們用文字描述出我們設計代碼的思路:
1、計算機隨機想一個數,記在變量number里;
2、一個負責計次數的變量count初始化為0;
3、讓用戶輸入一個數字a;
4、count遞增(加一);
5、判斷a和number的大小關系,如果a大,就輸出“大”;如果a小就輸出“小”;
6、如果a和number是不相等的(無論大還是小),程序轉回到第3步;
7、否則,程序輸出“猜中”和次數,然后結束。

代碼實現

#include <stdio.h> #include <stdlib.h> #include <time.h>int main() { /* 需要使用stdlib.h和time.h兩個庫。 每次召喚rand()就得到一個隨機的整數。 加上srand(time(0))是為了讓得到的隨機整數更加真實。 將 隨機數%n 會得到一個∈[0, n-1]的整數。根據這個來產生1-100之間的數。 */srand(time(0));int number = rand()%100+1;int count = 0;int a = 0;printf("我已經想好了一個1到100之間的數。");//用do-while比較好,因此一定會執行一次do {printf("請猜這個1到100之間數:");scanf("%d", &a);if ( a > number ) {printf("你猜的數大了。");} else if ( a < number ) {printf("你猜的數小了。");}count ++;} while (a != number);printf("太好了,你用了%d次就猜到了答案。\n", count);return 0; }

運行結果

我們來測試一下,可以看出結果正確。實際上,猜100內的整數最多用7次,具體原因我們后面分析。


2.3 算平均數

題目

讓用戶輸入一系列的正整數,最后輸入-1表示輸入結束,然后程序計算出這些數字的平均數,輸出輸入的數字的個數和平均數。

思路

①需要一個記錄讀到的整數的變量
②平均數要怎么算?只需要每讀到一個數,就把它加到一個累加的變量里,到全部數據讀完,再拿它去除讀到的數的個數就可以了。
③需要一個變量記錄累加的結果
④需要一個變量記錄讀到的數的個數
程序的算法流程如下圖所示:

代碼實現

#include <stdio.h>int main() {int sum = 0;int count = 0;int number;scanf("%d", &number);while ( number != -1 ) {sum += number;count ++;scanf("%d", &number);}printf("The average is %f.\n", 1.0 * sum / count);return 0; }

運行結果

我們進行測試,可以看出結果正確。


2.4 整數求逆

題目

輸入一個正整數,輸出逆序的數。如輸入48102,輸出20184。這個問題會存在兩種情況。①對于一些以0結束的正整數,如700,輸出7。②對于一些以0結束的正整數,如700,輸出007


第一種情況代碼實現

#include <stdio.h>int main() {int x;scanf("%d", &x);int digit;int ret = 0;while ( x> 0 ) {digit = x%10;ret = ret*10 + digit;printf("x=%d,digit=%d,ret=%d\n", x, digit, ret);x /= 10;}printf("%d", ret);return 0; }

進行測試,可以看出結果正確。


第二種情況代碼實現

#include <stdio.h>int main() {int x;scanf("%d", &x);int digit;int ret = 0;while ( x> 0 ) {digit = x%10;printf("%d", digit);ret = ret*10 + digit;x /= 10;}return 0; }

進行測試,可以看出結果正確。


小測驗

1、以下哪種運算能從變量x中取得十進制最低位的數字
A. x / 10
B. x % 10
C. x * 10
D. 10 / x
答案:B

2、當需要累加一些值的時候,用來記錄累加結果的變量應該被初始為:
答案:0

總結

以上是生活随笔為你收集整理的C语言程序设计学习笔记:P4-循环的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。