---
title: C/C++ 迴圈控制
tags: C++程式設計實習
---
# for 迴圈
:::success
語法:
for(<font color='red'>**初值設定**</font>;<font color='blue'>**條件運算式**</font>;<font color='red'>**控制運算式**</font>){
條件運算式為true要做的事情(敘述);
}
<font color='red'>-當已經知道執行次數時,使用for迴圈</font>
:::
1.<font color='red'>**初值設定**</font>:只會執行一次,第一次迴圈的時候。設定迴圈開始執行的初始值
2.<font color='blue'>**條件運算式**</font>:每次要執行回圈內的敘述時,都會判斷此條件是否成立(true),當此條件成立時,才會執行回圈內的敘述,否則結束迴圈</font>
3.<font color='red'>**控制運算式**</font>:每次執行迴圈內的敘述後,會執行此部分,通常用來更新條件的運算變數值
:::success
範例:for(int i=1; i<6; i++)
:::
```cpp=1
#include <iostream>
using namespace std;
int main()
{
//計算1+2+3+.....100總和
//sun為儲存總和的變數,i為for迴圈的初數值
unsigned int sum=0,i;
for(i=1;i<=100;i++){ //i由1開始每次加1直到101為止
cout<<"i="<<i;
sum = sum + i; //sun每次加上i的值
cout<<"\tsum="<<sum<<"\n";
}
cout<<"1+2+3+.....100="<<sum<<"\n";//輸出結果
//計算51+53+55....+99
sum=0;
for(i=51;i<=99;i+=2){
cout<<"i="<<i;
sum = sum + i;
cout<<"\tsum="<<sum<<"\n";
}
//計算100~1000中17的倍數
sum=0;
for(i=100;i<=1000;i++)
if(i%17==0){
cout<<"i="<<i;
sum += i;
cout<<"\tsum="<<sum<<"\n";
}
return 0;
}
```
# while 迴圈
:::success
-語法:
初值設定:
while(條件判斷){
執行敘述;
條件更新敘述;
}
<font color='red'>**-當不知道執行次數時,使用while迴圈**</font>
<font color='blue'>**-while迴圈次數有可能為0次**</font>
:::
1.<font color='red'>**初值設定**</font>:只會執行一次,第一次迴圈的時候。設定迴圈開始執行的初始值
2.<font color='blue'>**條件運算式**</font>:每次要執行回圈內的敘述時,都會判斷此條件是否成立(true),當此條件成立時,才會執行回圈內的敘述,否則結束迴圈</font>
3.<font color='red'>**控制運算式**</font>:用來更新條件的運算變數值
:::info
計算100~1000中17的倍數總和
:::
```hpp=1
include <iostream>
using namespace std;
int main()
{
//計算 100~1000中17的倍數和
unsigned int sum=0 //初值為0
unsigned int i=100; //100~1000第一個值作為初數
while(i<=1000){ //i<=1000條件成立值行while內容
if (i%7==0){ //i可以被7整除
cout<<"i="<<i; //輸出i值
sum +=i; //sum=sum+1
cout<<"sum="<<sun<<"\n"; //顯示目前累加的種和
}
i++; //i=i+1
}
cout<<"100~1000中17的倍數和="<<"\n";
return 0;
}
```
:::info
計算BMI
:::
```hpp=
#include <iostream>
using namespace std;
int main()
{
//w儲存使用者體重(kg)
//h儲存使用者身高(cm)
float w,h ;
//當go為y或Y的時候繼續讓使用者輸入BMI資料
char go='y';
while(go=='y' || go=='Y'){
//讓使用者輸入身高和體重(空白隔開)
cin>>w>>h;
h/=100; //身高轉體重為多少公尺
float bmi=w/(h*h); //bmi=w/(h*h)
cout<<"bmi="<<bmi<<"\n";
cout<<"繼續嗎?(Y or y):";
cin>>go;
}
return 0;
}
```
:::info
使用輾轉相除法求最大公因數
https://zh.wikipedia.org/zh-tw/%E8%BC%BE%E8%BD%89%E7%9B%B8%E9%99%A4%E6%B3%95
:::
![](https://i.imgur.com/gZqZFP7.png)
```cpp=1
#include <iostream>
using namespace std;
int main()
{
//計算a,b兩數的最大公因數
//r為a除b的餘數
unsigned int a,b,r;
//讓使用者輸入a,b兩數(空白隔開兩數)
cin>>a>>b;
//輾轉相除法
while(b!=0){
r=a%b;
a=b;
b=r;
}
cout<<"GCD(a,b)"<<a<<"\n";
return 0;
}
```
```cpp=1
#include <iostream>
using namespace std;
int main()
{
//計算a,b兩數的最大公因數
//r為a除b的餘數
unsigned int a, b, r;
//讓使用者輸入a,b兩數(空白隔開兩數)
cin>>a>>b;
//將a,b的值暫存
unsigned int tmpl=a, tmp2=b;
//輾轉相除法
while(b!=0)f 當除數不是0
r=a%b;//取a除b的餘數
a = b; //b變為被除數
b = r; //r變為餘數
}
cout<<"GCD(" <<tmp1<<", "
<<tmp2<<" )="
<<aくく"In" ;
return 0;
```
# do while 迴圈
:::success
-語法:
初值設定:
do{
執行敘述;
條件更新敘述;
}while(條件運算式)
<font color='red'>**-當不知道執行次數時,使用do while迴圈**</font>
<font color='blue'>**-do while迴圈最少執行一次1次**</font>
:::
```cpp=1
#include <iostream>
using namespace std;
int main()
{
int pwd; //儲存密碼的變數
do{
cout<<"請輸入密碼:";
cin>>pwd;
}while(pwd!=1234);
cout<<"密碼正確\n";
return 0;
}
```
# 巢狀迴圈
:::success
- 巢狀迴圈(nested loops)敘述是指迴圈敘述中還有迴圈敘述。
- 第一層迴圈內還有最少一層迴圈
:::
![](https://i.imgur.com/tcwWT8r.png)
:::info
顯示9x9的乘法表
:::
```cpp=1
#include <iostream>
using namespace std;
int main()
{
for(int i=1; i<10; ++i){
for(int j=1; j<10;j++){
//cout<<i*j<<" "; //不會對齊
printf("%3d",i*j); //可對齊
}
cout<<"\n";
}
return 0;
}
```
# 無窮迴圈
::: success
迴圈永遠不會停
:::
1. 使用for
```cpp=1
for(;;){
要做的事
}
```
2. 使用while
```cpp=1
while(1){
要做的事
}
while(-1){
要做的事
}
```
# break 跳出迴圈
:::success
遇到break就執行最近的}下-
:::
```cpp=1
#include <iostream>
using namespace std;
int main()
{
int sum=0;
for(int i=1;i<=100; i++){
if(i>50) break; //跑到第13行繼續執行程式
sum += i;
}
//cout<<sun<<"\n";
printf("%d\n",sum);
return 0;
}
```
# continue 繼續迴圈
:::success
遇到continue就執行最竟近的迴圈開都
:::
```cpp=1
#include <iostream>
using namespace std;
int main()
{
int sum=0;
for(int i=1; i<=100; i++){
if(i%2) continue; //遇到continue執行第8行for迴圈
sum +=i;
}
printf("1~100的偶數和=%d\n", sum);
return 0;
}
```
## 練習題
1. 判斷使用者輸入的整數,是否能被2及5整除
```cpp=1
/****************************************************
** 判斷使用者輸入的整數,是否能被2及5整除
*****************************************************/
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
if(n%2==0 && n%5==0){
cout<<n<<"能被2及5整除\n";
} else {
cout<<n<<"不能被2及5整除\n";
}
return 0;
}
```
2. 判斷座標(x, y)在第幾象限
```cpp=1
/****************************************************
** 判斷座標(x, y)在第幾象限
*****************************************************/
#include <iostream>
using namespace std;
int main()
{
int x, y;
cin>>x>>y;
if(x>0){
if(y>0){
printf("(%d, %d)在第一象限\n",x,y);
}else{
printf("(%d, %d)在第四象限\n",x,y);
}
}else{
if(y>0){
printf("(%d, %d)在第二象限\n",x,y);
}else{
printf("(%d, %d)在第三象限\n",x,y);
}
}
return 0;
}
```
3. 判斷是否可為三角形三邊長
```cpp=1
/****************************************************
** 判斷是否可為三角形三邊長
*****************************************************/
#include <iostream>
using namespace std;
int main()
{
int x , y, z;
while(cin>>x>>y>>z){
if(x+y>z and x+z>y and z+y>x){
cout<<"可以為三角形三邊長\n"<<endl;
}else{
cout<<"不可為三角形三邊長\n"<<endl;
}
}
return 0;
}
```
4. 電影分級制度
```cpp=1
/****************************************************
** 電影分級制度
*****************************************************/
#include <iostream>
case 0 ... 5:
cout<<"可觀賞普遍級\n";
break;
case 6 ... 11:
cout<<"可觀賞普遍級跟保護級\n";
break;
case 12 ... 17:
cout<<"可觀賞普遍級,保護級,輔導級";
break;
case 18 ... 150:
cout<<"可觀賞普遍級,保護級,輔導級,限制級\n";
break;
case 151 ... 999:
cout<<"請輸入合理年齡\n";
break;
}
return 0;
}
```
5. 用for迴圈計算1 + 3 + 5 + 7 + 9
```cpp=1
/****************************************************
** 用for迴圈計算1 + 3 + 5 + 7 + 9
*****************************************************/
#include <iostream>
using namespace std;
int main()
{
int sum=0;
for(int i=1; i<=9; i+=2){
sum+=i;
}
pruntf("1+3+5+7+9=%d\n",sum);
return 0;
}
```
6. 利用for迴圈顯示等差數列10 8 6 4 2
```cpp=1
/****************************************************
** 利用for迴圈顯示等差數列10 8 6 4 2
*****************************************************/
using namespace std;
int main()
{
for(int i=10; i>=2; i-=2){
printf("%d", i);
}
return 0;
}
```
7. 猜數字遊戲: 遊戲會發出提示訊息要使用者輸入所要猜的數字(1~10),若猜錯,遊戲會繼續進行,直到猜對為止。
:::info
1.加入time.h stdlib.h這2個標頭檔
2.產生亂數種子 srand(time(NULL))
3.產生亂數: 產生(min,max)範圍的亂數,公式為<font color='red'>**亂數x=rand()%(max-min+1)+min**</font>
:::
```cpp=1
/****************************************************
** 利猜數字遊戲:
**遊戲會發出提示訊息要使用者輸入所要猜的數字(1~10),
**若猜錯,遊戲會繼續進行,直到猜對為止。
*****************************************************/
#include <iostream>
#include <time.h> //取得從1970/1/1午夜12點到現在所經過的秒數
#include <stdlib.h> //使用內建的srand(),rand()等亂數函數
using namespace std;
int main()
{
//使用時間秒數建立亂數種子
srand(time(NULL));
//產生一個(1,10)的整數亂數
int x = rand()%(10-1+1)+1;
//printf("%d",x);
//儲存使用者猜的數字
int guess=1;
int total=0; //紀錄猜的次數
while(guess!=x){
cout<<"請輸入要猜的數字:";
cin>>guess; //讀取使用者猜的數字
total+=1; //猜的數字+1
}
printf("數字為%d,總共猜了%d次\n",guess,total);
return 0;
}
```
8. 計算2的n次方
```cpp=1
/****************************************************
** 計算2的n次方
*****************************************************/
#include <iostream>
using namespace std;
int main()
{
unsigned int k=1;
unsigned int n=3;
cout<<"請輸入n:";
cin>>n;
for(int i=1; i<=n; i++){
k = k*2;
//printf("i=%d, k=%d\n",i,k);
}
printf("2的%d次方=%d",n,k);
printf("使用左移(1<<n)即為計算2的n次方:\n\
2的%d次方=%d",n,(1<<n));
return 0;
}
```
9. 以do…while迴圈進行成績加總,直到使用者輸入-1,才顯示總分。
```cpp=1
/****************************************************
** 以do…while迴圈進行成績加總,直到使用者輸入-1,才顯示總分。
*****************************************************/
#include <iostream>
using namespace std;
int main()
{
int sum=0; //儲存總分的變數
int x=0l; //輸入的成績
int n=0; //紀錄輸入的人數.
do{
sum+=x; //x加入總分
n++; //人數加1
cin>>x; //讀取輸入成績
}while(x!=-1); //當x不是-1繼續執行
printf("總分為%d,人數為%d,平均為%.21f\n",
sum, n-1, (double)sum/(n-1));
return 0;
}
```
10. 用*組成三角形
```cpp=1
/****************************************************
** 用*組成三角形
*****************************************************/
#include <iostream>
using namespace std;
int main()
{
for(int i=1; i<=5; i++){ //層數:1, 2, 3, 4, 5
for(int j=1; j<=i; j++){ //每層中的*數有i個
printf("*");
}
printf("\n");
}
return 0;
}
```
![](https://i.imgur.com/oB8jniw.png)
![](https://i.imgur.com/vXjDpmd.png)
```cpp=1
/****************************************************
** 用*組成三角形
*****************************************************/
#include <iostream>
using namespace std;
int main()
{
for(int i=1; i<=5; i++){ //層數:1, 2, 3, 4, 5
for(int j=1; j<=i; j++){ //每層中的*數有i個
printf("*");
}
printf("\n");
}
for(int i=1; i<=5; i++){ //層數:1, 2, 3, 4, 5
for(int j=1; j<=i; j++){ //輸入*左邊的(n-1)個空白
printf(" ");
}
for(int j=1; j<=i; j++){ //每層中的*數有i個
printf("*");
}
printf("\n");
}
for(int i=1; i<=5; i++){ //層數:1, 2, 3, 4, 5
for(int j=1; j<=i; j++){ //輸入*左邊的(n-1)個空白
printf(" ");
}
for(int j=1; j<=(2*-1);j++){ //每層中的*數有2*i-1個
printf("*");
}
printf("\n");
}
return 0;
}
```
11. 顯示1∼50的質數
https://zh.m.wikipedia.org/zh-hant/%E8%B4%A8%E6%95%B0
```cpp=1
/****************************************************
** 顯示1∼50的質數
*****************************************************/
#include <iostream>
using namespace std;
int main()
{
for(int val=2; val<=50; val++){
//大於2的偶數,不用判斷,繼續執行下一個迴圈的值
if(val>2 && val%2==0) continue;
//2是唯一的偶數質數
if(val==2) printf("%d",val);
else{
//3以上的奇數
int flag=1; //假設val是質數
for(int j=3; j<val; j++){ //j:從3~val=1來測試val是否為質數
if(val%j==0){ //被j整除
flag=0; //val不是質數
break; //跳離測試的迴圈
}
}
//如果val是質數,顯示
if(flag) printf("%d ",val);
}
}
return 0;
}
```
12. 計算使用者輸入數字的階乘值
```cpp=1
/****************************************************
**計算使用者輸入數字的階乘值
*****************************************************/
#include <iostream>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
unsigned int fact=1; //1!=1,只能存到16!的值,17!以上就無法計算
for(int i=2; i<=n; i++){
fact *= i;
}
printf("%d!=%d\n", n, fact);
return 0;
}
```
![](https://i.imgur.com/IF6Ie2c.png)
![](https://i.imgur.com/eVHdBvK.png)
![](https://i.imgur.com/H0PXKHh.jpg)
![](https://i.imgur.com/U2J8KcW.png)
![](https://i.imgur.com/fTotd5w.png)
![](https://i.imgur.com/zqRNZvW.png)
![](https://i.imgur.com/h7rmkLj.png)
![](https://i.imgur.com/EXdeVG8.png)
![](https://i.imgur.com/ju2rttl.png)
![](https://i.imgur.com/fjXvD7K.png)