1. 程式人生 > >c++學習筆記---03---從一個小程序說起2

c++學習筆記---03---從一個小程序說起2

name 操作系統 簡單 sin clu sed close tchar 重載

從一個小程序說起2

要求:編寫一個程序,要求用戶輸入一串整數和任意數目的空格,這些整數必須位於同一行中,但允許出現在該行中的任何位置。當用戶按下鍵盤上的“Enter”鍵時,數據輸入結束。程序自動對所有的整數進行求和並打印出結果。

C語言版本:

技術分享
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 void main()
 5 {
 6       int i;
 7       int sum = 0;
 8       char ch;
 9 
10       printf("請輸入一串整數和任意數目的空格: 
"); 11 12 while( scanf("%d", &i) == 1 ) 13 { 14 sum += i; 15 16 while( (ch=getchar()) == ) // 屏蔽空格 17 ; 18 19 if( ch == \n ) 20 { 21 break; 22 } 23 24 ungetc( ch, stdin ); //
將變量ch 中存放的字符退回給stdin輸入流。 25 } 26 27 printf("結果是: %d", sum); 28 printf("\n"); 29 system("pause"); 30 }
View Code

C++語言版本:

技術分享
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7       int sum = 0;
 8       int i;
 9 
10       cout << "請輸入一串整數和任意數目的空格:
"; 11 12 13 while( cin >> i ) 14 { 15 sum += i; 16 while( cin.peek() == ) 17 { 18 cin.get(); 19 } 20 if( cin.peek() == \n ) 21 { 22 break; 23 } 24 } 25 26 cout << "?á1?ê?: " << sum << endl; 27 28 return 0; 29 }
View Code

C++版本分析

這個程序使用了流對象 cin。這個對象的類型是istream,它知道如何從用戶終端讀取數據。

cin >> i;

cin 輸入操作符又稱為提取操作符,它一次從輸入流對象cin 提取一個整數。

當用戶進行鍵盤輸入時,對應的字符將輸入到操作系統的鍵盤緩沖區中。

這樣,當用戶點擊鍵盤上的“Enter”鍵時,操作系統把鍵盤緩沖區的內容傳輸到cin 流的內部緩沖區,“>>”操作符隨後從這個緩沖區提取需要的信息。

我們還發覺,如果用戶不進行鍵盤的輸入,程序將會阻塞。這是阻塞性(blocking)IO的例子。

“>>”最初定義為右移操作符,它在C++ 中進行了重載,當它按照這裏所示的方式使用時,它就用於從輸入流對象提取信息。

另外,這個操作符對所有內建的數據類型都進行了重載,所以它可以從輸入流對象提取出int, float, double 型數據,也可以提取字符串等數據。

在while( cin >> i ) 中,表達式 cin >> i 返回輸入流對象本身,也就是cin。但是,如果到達了文件尾或者提取操作符遇到一個非法值,這個返回值將是 false。

我們小舉一個例子:如果我們試圖把一個浮點數讀取到一個 int 型變量中,當提取操作符遇到小數點時,它將使輸入流對象置於一個錯誤的狀態中,導致 cin 的值為 false。

註意,在while( cin >> i ) 中,當用戶在鍵盤上點擊“enter”鍵的時候,在這一句並不會結束。

另外,觀察兩個程序,我們發現:C 和 C++事實上在聲明變量的事實上有點不同,C++允許我們在程序的任意位置聲明變量。

這大大的提高了大型C++ 程序的可讀性,因為這樣子我們就可以在實際需要使用變量的時候才來聲明他們。

cin、cout對象的多個方法

前邊我們講過,cin 是 istream類的對象,那麽cin 同樣具有一些方法,這些方法可以增強對於輸入操作的控制,下邊我們將通過簡單的例子介紹 cin 的一些方法!

例子一:cin.ignore()和cin.getline()

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7       char buf[20];
 8 
 9       cin.ignore(7);
10       cin.getline( buf, 10 );
11 
12       cout << buf << endl;
13 
14       return 0;
15 }

例子二:cin.get()和cin.peek()

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7       char p;
 8       cout << "請輸入一段文本: \n";
 9 
10       while( cin.peek() != \n )
11       {
12             p = cin.get();
13             cout << p;
14       }
15       cout << endl;
16 
17       return 0;
18 }

例子三:cin.gcount()和cin.read()

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7       const int SIZE = 50;
 8       char buf[SIZE];
 9       
10       cout << "請輸入一段文本: ";
11       cin.read( buf, 20 );
12 
13       cout << "字符串收集到的字符數為: " 
14            << cin.gcount() << endl;
15 
16       cout << "輸入的文本信息是: ";
17       cout.write( buf, 20 );
18       cout << endl;
19 
20       return 0;
21 }

前邊我們已經介紹了幾種常用的 cin 對象的方法,下邊再介紹幾種關於 cout 對象的方法。同樣我們通過實例在讓大家快速認識!

實例一:cout.precision()

 1 #include <iostream>
 2 #include <math.h>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8       double result = sqrt(3.0);
 9 
10       cout << "對 3 開方保留小數點後0 ~ 9 位,結果如下: \n" << endl;
11 
12       for( int i=0; i <= 9; i++ )
13       {
14             cout.precision(i);
15             cout << result << endl;
16       }
17 
18       cout << "當前的輸出精度為: " << cout.precision() << endl;
19 
20       return 0;
21 }

實例二:cout.width()

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7       int width = 4;
 8       char str[20];
 9 
10       cout << "請輸入一段文本: \n";
11       cin.width(5);
12 
13       while( cin >> str )
14       {
15             cout.width(width++);
16             cout << str << endl;
17             cin.width(5);
18       }
19 
20       return 0;
21 }

c++學習筆記---03---從一個小程序說起2