1. 程式人生 > >C++菜鳥學習筆記系列(15)——迭代語句

C++菜鳥學習筆記系列(15)——迭代語句

C++菜鳥學習筆記系列(15)

本期主題:迭代語句(包括while語句、傳統for語句、範圍for語句、do…while語句)

迭代語句就是我們常說的迴圈,它重複執行一些操作直到滿足某個條件才停下來。不同的是while語句和for語句都是在執行迴圈體之前先進行條件的檢查,而do…while語句則是在執行了迴圈體之後才會進行條件檢查(也就是說,無論初始條件是否滿足,do…while語句肯定會執行一次迴圈體操作,而while語句和for語句則一次都不執行)。

下面我們就來分別討論一下這最常見的幾種迭代語句:

(1)while語句

while語句的基本形式為:

	while (條件)
	{
		迴圈體;
	}

while的條件部分可以是一個表示式或者是一個帶初始化的變數宣告。一般來說我們通過迴圈體來改變表示式的值,當然有些時候我們也可以通過條件本身來改變表達的值,但是表示式的值一定要可以通過改變最終滿足條件,否則會導致迴圈不能終止。

當我們不知道具體要迭代多少次時,使用while迴圈是一個不錯的選擇,比如讀取輸入的內容就是這樣,我們在寫程式時,並不知道使用者要輸入多少個字元對吧。除此之外,還有一種情況也常用while語句,就是我們想要在迴圈結束後訪問控制迴圈的變數。

下面我們來看一個小例子:

/*
author: wxc_1998
date: 2018/10/22 
*/

#include <iostream>
#include <vector>

using namespace std;

void main()
{
	int i;
	vector <int> vec ;
	cout << "please input a integer:" << endl;
	while(cin >> i)
		vec.push_back( i );
	
	auto b = vec.begin(), e = vec.end();
	
	while(b != e && *b >= 0 )
		++ b;
	if(b == e )
		cout << "all of they are positive integers! " << endl;
	else
		cout << *b << " is the first number that isn't a positive integer!" << endl;

	cout << endl << "press any key to continue!";
  	cin.clear();
  	cin.sync();
  	cin.get();
}

可以看到,在上述程式碼中我們使用了兩個while語句,這兩個語句中分別代表了我們開始時所說的兩種情況,第一種我們一直在輸入整數,但是我們並不知道要輸入多少個整數,所以我們使用了一個vector容器去儲存,使用了while語句去迴圈;第二種,我們在後面還要使用變數b判斷是否到達了vector變數vec的尾部,所以使用while語句(關於迭代器的有關知識請點選“迭代器”)。

(2)傳統for語句

我們在其他的一系列語言中都可以發現for語句的基本形式為:

	for ( 初始化變數; 控制條件; 變數變化 )
	{
		迴圈體;
	}

對於傳統for語句頭中的三個部分原則上都可以省略不寫,這三個部分在省略時有以下幾個注意點:

(1)省略初始化變數:初始化變數這個部分可以是宣告語句(最常見)、表示式(在前面已經宣告變數)、空語句(後面控制條件及迴圈體中所用到的變數已經在前面宣告)這三個情況,對於最後一中情況我們只要在前面有相應變數的宣告和初始化就可以用一個空語句代替這一部分了。
(2)省略控制條件:可能很多同學會認為省略初始化變數也就算了,控制條件怎麼可以省略呢?這樣不是就進入了一個死迴圈了嗎?對,如果我們省略了控制條件之後不做其他補充那麼肯定就是一個邏輯上錯誤的死迴圈,但是我們如果在迴圈體中加入一個控制條件不就可以解決這個問題了嗎?

例如:

		if ( 變數滿足條件 )
			break;

(3)省略變數變化:這一部分和第二部分類似的,如果我們去除之後不做其他改變會導致變成一個死迴圈,但是我們在去除它之後,只要在迴圈體中改變變數的值就可以實現同樣的效果。

對於傳統for語句我就不做過多介紹了,還有一個必須要記住的是在for語句頭及其迴圈體中定義的變數都不可以在外部使用。

(3)範圍for語句

C++11新標準為我們提供了一種更加簡單的for語句(至少是從形式上更加簡略),這種for語句可以遍歷容器或者其他序列中的所有元素。其基本形式為:

	for(定義變數(容器或序列中的元素型別):容器或序列)
	{
		迴圈體;
	}

在第一部分我們定義變數時,如果不知道容器或序列內部元素的型別,那麼使用auto關鍵字可能是一個比較好的解決方式。容器或序列是指我們在之前所介紹的string型別、vector型別、陣列型別等。

範圍for語句的工作方式是在每一次迭代都會重新定義迴圈控制變數,並將其初始化為容器或序列中的下一個值,然後執行迴圈體,直到容器或序列中的所有元素都處理完畢後為止,這樣也就實現了對容器或序列的遍歷操作。

我們來看一個關於範圍for語句使用的小例子:

/*
author: wxc_1998
date: 2018/10/22 
*/

#include <iostream>
#include <string>

using namespace std;

void main()
{
	string s = "hello world!";
	for(auto c : s)
	{
		cout << c << " ";
	}
	
	cout << endl << "press any key to continue!";
  	cin.clear();
  	cin.sync();
  	cin.get();
}

對於上述程式碼我們實現了把hello world!各字元之間加入了一個“ ”。

上述程式碼中的範圍for語句其實還可以用以下所示的傳統for語句所代替:

	for (auto b = s.begin() , e = s.end(); b != e ; ++ b)
	{
		cout << *b << " ";
	}

從形式上看範圍for語句確實簡單不少,對於遍歷容器或序列中的元素十分方便!

(4)do while語句

do while語句和我們在前面所介紹的while語句十分相似,唯一的區別就是do while語句會先執行迴圈體然後再進行判斷條件,其基本形式為:

do
{
	迴圈體;
}
while(控制條件);

注意:這裡的while後面還有一個分號“;”,我們在使用時不要忘記加了。

下面我們來看一個小例子:

/*
author: wxc_1998
date: 2018/10/22 
*/

#include <iostream>

using namespace std;

void main()
{
	char c;

	do
	{
		cout << "please inpute two numbers:" << endl;
		double i = 0, j = 0;
		cin >> i >> j;
		cout << i << " + " << j << " = " << i+j << endl;
		cout << "calculate more?(Enter y or n)" << endl;
		cin >> c;	
	}
	while (c == 'y');

	cout << endl << "press any key to continue!";
  	cin.clear();
  	cin.sync();
  	cin.get();
}

上述程式碼至少會進行一次運算,且可以根據使用者的後續輸入字元來決定是否繼續執行迴圈,從而實現多次運算或停止。

好了,關於迭代語句我們就介紹到這裡了。

注:雖然這篇部落格的內容十分簡單,但是大家若有轉載還請標明出處!