2 2 循壞結構及其應用文字輸入

2021-10-03 10:38:57 字數 3961 閱讀 3651

設計迴圈時的幾條指導原則:1)指定迴圈終止條件 2)在首次測試前初始化條件 3)在條件被再次測試之前更新條件

c++允許在for迴圈初始化部分中宣告和初始化變數,c不允許,這種變數離開迴圈後就會消失。

#include string word;

cin>>word;

for(int i = word.size()-1;i>=0;i--) // 反向列印字串

couttypedef clock_t clo; // 1)2)

float secs;

cin >> secs;

clo delay = secs * clocks_per_sec; // 3)

cout << "start!" << endl;

clo start = clock(); // 4)

while(clock() - start < delay); // 時間差,目的等待secs秒

cout << "done!" << endl;

4)處:函式名clock()返回從開始程式到呼叫clock()函式之間的系統時間,問題是單位不一定是秒,其次他的型別可能是long、unsigned int或其他型別。

1)處:為型別建立別名有兩種方式:一種是使用預處理器,格式#definealiasname typename,缺點有時不適用,如

#define float_point float *

float_point pa,pb;

此時預處理器會將該宣告轉換為float * pa,pb;,pa是float*型別,而pb是float型別。另一種是關鍵字typedef來建立別名,格式typedeftypename aliasname;,它能夠處理更加複雜的型別別名

2)處:cctime將clock_t作為clock()返回型別的別名,編譯器會將它轉換為long、unsigned int或適合系統的其他型別

3)處:clocks_per_sec為符號常量,等於每秒包含的系統時間單位數,秒數*clocks_per_sec,可以得到以系統時間單位為單位的時間。

int number[5] = ;

for(int x : number) // 版本1對陣列中的元素執行相同的操作

cout << x << endl;

for(int &x : number) // 版本2:x是引用變數,能夠修改陣列中的內容,版本1不可以

x = 2 * x;

cout << x <<" ";

cout << endl;

方案一:使用原始的cin進行輸入(有問題)

char ch;

int count = 0; // 計數

cin >> ch;

while (ch != '#')

cout << endl << count << endl;

// 測試示例

ewr fwe#wer

ewrfwe

6

1)問題:cin會忽略空格、製表符和換行符,因此輸入中的空格沒有被回顯,也沒有被包括在計數內。

方案二:使用cin.get(char)修改,缺點是#也有可能是合法輸入,此時的程式就出錯了。

char ch;

int count = 0; // 計數

cin.get(ch);

while (ch != '#')

cout << endl << count << endl;

// 測試示例

wew we# // 這裡輸入時有tab鍵

wew we

6

方案三:檢測檔案尾條件(eof,被定義為-1,它不表示字元,而是指出沒有字元) windows將ctrl+z視為模擬的eof,使用者還要按回車鍵結束。

檢測到eof後,cin將兩位(eofbit和failbit)都設定為1,可以通過成員函式eof()檢視eofbit是否被設定,如果檢測到eof,則cin.eof()將返回bool值true,否則返回false。同樣,如果eofbit或failbit被設定為1,則fail()成員函式返回true,否則返回false。eof()和fail()方法報告最近讀取結果,應將cin.eof()或cin.fail()測試放在讀取之後。

char ch;

int count = 0;

cin.get(ch);

while(cin.fail() == false) // while(!cin.fail())

cout << endl << count << endl;

// 測試示例

qwe ert

qwe ert

^z8 // 在qwe ert後有回車鍵

最終通用版: cin.get(ch)版本

char ch;

int count = 0;

while(cin.get(ch)) // 1)

cout << endl << count << endl;

// 測試示例

wer zxc

wer zxc

^z8

1)處:方法cin.get(ch)的返回值是乙個cin物件,然而istream類提供乙個將istream物件轉換為bool值的函式,所以當cin出現在需要bool值的地方時,該轉換函式將被呼叫。在判斷迴圈測試條件時,程式必須首先呼叫cin.get(ch),如果成功,則將值放入ch中。然後,程式獲得函式呼叫的返回值,即cin。接下來,程式對cin進行bool轉換,如果輸入成功,則結果為true,否則為false。這時的三條指導原則全部放在while的迴圈測試條件中。

ch = cin.get()版本

int ch;                          // 1)

int count = 0;

while((ch = cin.get()) != eof) // 1)

cout << endl << count << endl;

// 測試示例

we are chinese.

we are chinese.

^z16

1)處: char型別可能是沒有符號的,因此char變數不可能是-1,測試條件永遠不會成立。當使用cin.get()並測試eof,則必須將返回值賦給int變數,而不是char變數。

const char * varieties[num] =   // 1)2)

;double price[num][val] = , ,

};for(int varity = 0; varity < num; ++varity)

// 測試結果

fruit: 10 11 12 13 15

snacks: 21 22 23 24 25

drink: 7 8 9 10 11

1)字串字面值是常量,所以在宣告中使用const關鍵字,意味著可以用varieties訪問字串,但不可修改它

2)這是字串指標陣列,也可以用char陣列的陣列和string物件陣列,如下

char varieties[num][10] =   // char陣列的陣列

;const string varieties[num] = // string物件陣列。可省略const,便可修改字串

;

循壞柵欄CyclicBarrier

一種多執行緒併發控制實用工具,和countdownlatch類似,它也可以實現執行緒間的計數等待,功能比countdownlatch複雜且強大 柵欄可想象為私人宅邸的柵欄,阻止閒雜人等入內。這裡當然是用來阻止繼續執行,要求執行緒在柵欄處等待 cyclic意為迴圈,也就是說這個計數器可以反覆使用 另外...

幾種循壞的使用

而且我們都知道幾種迴圈語句可以相互轉化。對於do while 條件 它 是先執行然後再進行判斷 對於while 條件 先進行判斷然後再執行循壞體內的語句 for循壞 for 表示式1 表示式2 表示式3 這裡我們需要知道for中的執行順序 表示式1 表達2 語句 表示式三 其中這裡開始循壞知道條件為...

lua for循壞和迭代器

普通for迴圈 for var exp1,exp2,exp3 do 執行體 endvar 從 exp1 變化到 exp2,每次變化以 exp3 為步長遞增 var,並執行一次 執行體 exp3 是可選的,如果不指定,預設為1。函式for迴圈 function f x print function r...