網站首頁 編程語言 正文
一、單層for循環
引例:C語言實現求1到10的和(用for循環實現)
#include <stdio.h>
int main()
{
int i, sum = 0;
for (i = 1; i <= 10; i++)
sum = sum + i;
printf("sum = %d\n", sum);
return 0;
}
單層for循環執行的順序:
第一次循環先執行語句①,執行完語句①執行語句②,如果語句②成立則執行語句④,執行完語句④執行語句③,執行完語句③標志著第一次循環結束;第二次循環先執行語句②,如果語句②成立則執行語句④,執行完語句④執行語句③,執行完語句③標志著第二次循環執行結束,隨后循環中語句的執行順序與第二次循環一致。如果在循環過程中語句②不成立,則整個循環就結束了。直到整個循環結束后才會執行語句⑤,因為,for語句與if語句所能控制的范圍相同,只能控制其接下來的第一條語句,言下之意是,語句⑤并不在for循環的內部。需要注意的是,語句①僅在第一次循環中執行,在其它循環過程中不執行。換句話說,語句①只會在整個循環過程中執行一次。語句①的作用其實是給變量進行初始化,所以它僅參與了第一次循環。還有值得注意的是,初學時容易在for (①; ②; ③)后加分號,這個情況我已經在《C語言if語句中常見的問題》這篇文章中的空語句問題中詳細敘述了其中的道理,并且在for語句中依然適用,有興趣的話可以一看。
練習
C語言實現求1到10中奇數的和
#include <stdio.h>
int main()
{
int i, sum = 0;
for (i = 1; i <= 10; i = i +2)
sum = sum + i;
printf("sum = %d\n", sum);
return 0;
}
C語言實現求1+1/2+1/3+…+1/99+1/100
初學時的錯誤代碼:
#include <stdio.h>
int main()
{
int i;
float sum = 0; // 考慮到和是小數,所以定義sum為float類型
for (i = 1; i <= 100; i++)
sum = sum + 1/i;
printf("sum = %f\n", sum); // float類型的變量用%f輸出
return 0;
}
錯誤原因:沒有考慮到1/i的數據類型。在C語言中,整型除以整型得到的結果只有整數位。例如,16/3 = 5。上述程序中i是整型變量,所以1/i也是整型,故從i大于等于2時,1/i的值永遠為0。
因此需要將1/i的值想辦法變為浮點數才可以實現想要的功能。C語言規定,只要被除數與除數其中的一個為浮點數,則商為浮點數。故解決的辦法有兩種,第一種是將1/i寫為1.0/i,第二種是將整型變量i強制類型轉化為float類型,正確的代碼如下:
#include <stdio.h>
int main()
{
int i;
float sum = 0;
for (i = 1; i <= 100; i++)
sum = sum + 1.0/i;// 或 sum = sum + 1/(float)(i);
printf("sum = %f\n", sum);
return 0;
}
思考1:如果將上述代碼中的sum = sum + 1/(float)(i);改為sum = sum + (float)(1/i);后能否正確輸出sum的值?
思考2:能否將i直接定義為浮點型變量?
答案是不能,因為浮點型數據是以IEEE754標準來存儲的,但IEEE754標準無法確保精確存儲每一個浮點數,例如,6.234在存儲過程中很可能存的不是6.234而是6.23399999,這是IEEE754標準的缺陷。所以即便在該程序中將i定義為浮點型變量后輸出的結果是正確的,也不能確保在其他程序中依然正確,因為i不一定是準確的數字。需要注意的是,我們一般不會把循環中不斷發生更新的變量定義為浮點型變量,因為浮點型數據存儲過程屬于非精確存儲。
二、for循環與if選擇的嵌套
引例:C語言實現求1到100之間所有可以被3整除的數字之和
#include <stdio.h>
int main()
{
int i, sum = 0;
for (i = 1; i <= 100; i++)
{
if (i % 3 == 0)
sum = sum + i;
}
printf("sum = %d\n", sum);
return 0;
}
思考:下面的程序輸出結果是什么?
#include <stdio.h>
int main()
{
int i, sum = 0;
for (i = 1; i <= 12; i++)
{
if (i % 3 == 0)
sum = sum + i;
printf("sum = %d\n", sum);
}
return 0;
}
練習(以下題目均要求使用for循環和if選擇的嵌套來完成)
編寫C語言程序求1到100之間的奇數之和
#include <stdio.h>
int main()
{
int i;
int sum = 0;
for (i = 1; i <= 100; i++)
{
if (i % 2 == 1)
sum += i;
}
printf("奇數之和為%d\n", sum);
return 0;
}
編寫C語言程序求1到100之間的奇數的個數
#include <stdio.h>
int main()
{
int i;
int count = 0;
for (i = 1; i <= 100; i++)
{
if (i % 2 == 1)
count++;
}
printf("個數為%d\n", count);
return 0;
}
編寫C語言程序求1到100之間的奇數的平均值
#include <stdio.h>
int main()
{
int i;
int count = 0;
int sum = 0;
float average; // 考慮到平均值可能帶有小數位,所以將平均值定義為float類型
for (i = 1; i <= 100; i++)
{
if (i % 2 == 1)
{
count++;
sum += i;
}
}
average = 1.0 * sum / count; //也可以運用強制類型轉換寫成average = (float)(sum)/count;
printf("平均數為%f\n", average);
return 0;
}
編寫C語言程序求1到100之間的奇數之和與1到100之間的偶數之和
#include <stdio.h>
int main()
{
int i;
int sum1 = 0; // 奇數和
int sum2 = 0; // 偶數和
for (i = 1; i <= 100; i++)
{
if (i % 2 == 1)
sum1 += i;
else
sum2 += i;
}
printf("奇數之和為%d,偶數之和為%d\n", sum1, sum2);
return 0;
}
三、多層for循環的嵌套
多層for循環執行的順序:
第一次循環先執行語句①,執行完語句①執行語句②,如果語句②成立則跳入內部循環執行語句④,執行完語句④執行語句⑤,如果語句⑤成立則執行語句⑦,執行完語句⑦執行語句⑥,執行完語句⑥執行語句⑤,如果如果語句⑤不成立,則標志著內部循環執行完畢,接下來跳出內部循環執行語句③,執行完語句③標志著第一次整個循環結束;第二次循環先執行語句②,如果語句②成立,則再次跳入內部循環執行語句④,以此類推;如果語句②不成立,整個循環就結束了。由于⑧不屬于任何一個for循環內部的語句,所以要在整個循環執行完畢后才會執行語句⑧。
換個方式:
因為for語句與if語句所能控制的范圍相同,只能控制其接下來的第一條語句,所以語句⑦屬于內部for循環,而語句⑦與內部的for循環語句構成的語句整體是一個語句,也就是上圖中的綠色方框部分,這個整體語句又是外層for循環內部的第一個語句,所以,外層for循環所控制的語句就是綠色方框部分,而外層for循環完整的結構就是上圖中的橙色方框部分。所以按照for循環的大體執行順序,首先會執行語句①,執行完語句①執行語句②,如果語句②成立則會執行綠色方框部分,綠色方框部分是單層for循環,所以執行過程按照單層for循環的執行循序執行,當內部的綠色方框部分執行完畢后,則會執行語句③,語句③執行完標志著整體一次循環結束,下一次循環又從判斷語句②是否成立開始,如果成立,則執行綠色方框部分;如果不成立,則整個循環結束。整個循環結束后才會執行語句⑧,因為語句⑧并不屬于這兩層for循環中的任何一層。
思考1:下面的for循環的執行順序是什么樣的?
思考2:下面的for循環的執行順序是什么樣的?
思考3:下面的for循環的執行順序是什么樣的?
思考4:下面的程序輸出結果是什么?
#include <stdio.h>
int main()
{
int i, j;
for (i = 0; i <3; i++)
for (j = 2; j < 5; j++)
printf("AAAA\n");
printf("BBBB\n");
return 0;
}
思考5:下面的程序輸出結果是什么?
#include <stdio.h>
int main()
{
int i, j;
for (i = 0; i <3; i++)
printf("AAAA\n");
for (j = 2; j < 5; j++)
printf("BBBB\n");
printf("CCCC\n");
return 0;
}
思考6:下面的程序輸出結果是什么?
#include <stdio.h>
int main()
{
int i, j;
for (i = 0; i <3; i++)
{
printf("AAAA\n");
for (j = 2; j < 5; j++)
printf("BBBB\n");
printf("CCCC\n");
}
return 0;
}
四、while循環
引例:C語言實現求1到10的和(用while循環實現)
#include <stdio.h>
int main()
{
int i, sum = 0;
i = 1;
while (i <= 10)
{
sum += i;
i++;
}
printf("sum = %d\n", sum);
return 0;
}
對比:C語言實現求1到10的和(用for循環實現)
#include <stdio.h>
int main()
{
int i, sum = 0;
for (i = 1; i <= 10; i++)
sum = sum + i;
printf("sum = %d\n", sum);
return 0;
}
while循環與for循環的相互轉換:
從上述兩個程序可知,while循環和for循環可以進行互相轉換,言下之意是,所有能用for循環實現的功能,就可以用while循環實現,反之同理。但是,while循環和for循環在寫法上有一定的差別。
五、總結
循環結構在學習編程中起到至關重要的作用,幾乎每個有用的程序中都有循環結構的身影,循環結構是我們以后編程中的重中之重,掌握其執行順序是理解程序的不二法門.
原文鏈接:https://blog.csdn.net/weixin_65334260/article/details/125276062
相關推薦
- 2023-07-02 oracle數據庫排序后如何獲取第一條數據_oracle
- 2022-11-27 搭建?Selenium+Python開發環境詳細步驟_python
- 2023-02-10 rust引用和借用的使用小結_Rust語言
- 2022-04-18 python?ConfigParser庫的使用及遇到的坑_python
- 2022-09-15 C#?讀寫自定義的Config文件的實現方法_C#教程
- 2023-02-25 Golang嵌入資源文件實現步驟詳解_Golang
- 2022-06-21 Android實現登錄界面的注冊功能_Android
- 2023-07-25 使用Redis做Mybatis的二級緩存
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支