1. 程式人生 > >程式設計菜鳥到大佬之路:C語言程式(七)

程式設計菜鳥到大佬之路:C語言程式(七)

第七天學習精要

for迴圈

for迴圈語句

  • for迴圈一般用於將某段程式碼(語句組)重複執行若干次。
    • 第一步:計算“表示式1”。
    • 第二步:計算“表示式2”,若其值為true,則執行“{ }”中的語句組,然後轉到第三步;若為false,則不再執行“{}”中的語句組,for語句結束,轉到第五步。
    • 第三步:計算“表示式3”。
    • 第四步:轉到第二步。
    • 第五步:從for語句後面繼續往下執行程式。
      for( 表示式1 ;表示式2;表示式3) {
          語句組
      }
      
# include <iostream>
using namespace std;
int main()
{
	int i;	// i是迴圈控制變數
	for (i = 0; i < 26; ++i)
	{
		cout << char('a' + i);	// 'a'+i強制轉換成char型別
	}
	return 0;	
} 

# 第二種寫法
# include <iostream>
using namespace std;
int main()
{
	for (int i = 0; i < 26; ++i)
	// 語句組裡只有一條一句就可以不用寫”{ }”
		cout << char('a' + i);	
	return 0;
}
  • 迴圈控制變數定義在"表示式1"中,則其只在for語句內部起作用,可以不用擔心迴圈控制變數重名

  • 迴圈控制變數並非每次只能加1,for迴圈可以巢狀,形成多重for迴圈。

  • for迴圈結構裡的“表示式1”和“表示式3”都可以是用逗號連線的若干個表示式。

for( int i= 15, j = 0; i > j; i-=2, j+= 3)
    cout << i << "," << j << endl;
  • 例題: 寫一個程式,輸入一個正整數n,從小到大輸出它的所有因子。
# include <iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i)
	{
		if (n % i == 0)
			cout << i << endl;
	}
	return 0;
}
  • 例題: 給定正整數n和m,在1至n這n個數中,取出兩個不同的數,使得其和是m的因子,問有多少種不同的取法。
# include <iostream>
using namespace std;
int main()
{
	int n, m, total = 0;	// total表示取法總數 
	cin >> n >> m;
	for (int i = 1; i < n; ++i)		// 取第一個數,共n-1種取法 
	{
		// 第二個數要比第一個數大,以免取法重複
		for (int j = i + 1; j <= n; ++j)	
		{
			if (m % (i + j) == 0)
				total += 1;
		}		
	}
	cout << total;	
	return 0;
}
  • for 語句括號裡面的“表示式1”,“表示式2”,“表示式3”任何一個都可以不寫,甚至可以全都不寫,但是“;”必須保留

  • 可以用 break 語句從 for( ; ;)死迴圈中跳出

while迴圈和do…while迴圈

while迴圈

  • 並非到達指定次數,而是滿足某條件時即停止迴圈,則適合用while語句來實現迴圈
    • 第一步:判斷“表示式”是否為真,如果不為真,則轉第四步。

    • 第二步:執行“語句組”。

    • 第三步:轉第一步。

    • 第四步:while語句結束,繼續執行while語句後面的語句。

      while(表示式) {
          語句組
      }
      
  • 例題:輸入若干個(至少1個)不超過100的正整數,輸出其中的最大值、最小值以及所有數的和。輸入的最後一個數是0,標誌著輸入結束
# include <iostream>
using namespace std;
int main()
{
	int min = 150, max = 0, n, sum = 0;
	cin >> n;
	while (n <= 100 && n > 0)
	{
		if (n > max)
			max = n;
		if (n < min)
			min = n;
		sum = sum + n;
		cin >> n;
	}
	cout << max << "," << min << "," << sum;
	return 0;
}
  • 例題:用牛頓迭代法求輸入的數的平方根
    • 欲求a的平方根,首先猜測一個x1x_1=a/2a/2(也可以是隨便什麼其他值)作為其平方根
    • 根據迭代公式: xn+1=(xn+a/xn)/2x_{n+1} = (x_n + a / x_n) / 2算出x2x_2
    • 再將x2x_2代入公式右邊算出x3x_3……
    • 直到連續兩次算出的xnx_nxn+1x_{n+1}的差的絕對值小於某個值ε,即認為找到了足夠精確的平方根。
    • 這個ε值取得越小,計算出來的平方根就越精確。
# include <iostream>
using namespace std;
double EPS = 0.001; //用以控制計算精度
int main()
{
	double a;	// 輸入a,要求a的平方根
	cin >> a;
	if (a >= 0)
	{
		double x = a / 2;
		double lastX = x + 1 + EPS;		// 確保能夠進行至少一次迭代
		//只要精度未達要求,就繼續迭代
		while (x - lastX > EPS || lastX - x > EPS)
		{
			lastX = x;
			x = (x + a/x)/2;
		}
		cout << x;
	}
	else
	{
		cout << "It can't be nagitive.";

	}
	return 0;
}

do…while迴圈

  • 如果希望迴圈至少要執行一次,就可以使用do…while語句。

  • 每執行一次迴圈後,都要判斷“表示式”的值是否為真,如果真就繼續迴圈,如果為假,就停止迴圈。

do {
    語句組
} while(表示式);
  • 輸出1到10000以內所有2的整數次冪:
int n = 1;
do {
    cout << n << endl;
    n *= 2;
} while( n < 10000);