1. 程式人生 > >【C++學習筆記】四、C++中的程式結構、輸入輸出以及語句(選擇、迴圈結構)

【C++學習筆記】四、C++中的程式結構、輸入輸出以及語句(選擇、迴圈結構)

1.C++程式結構

c++的每個程式單元由三部分組成:

(1)預處理指令:#include 和#define

(2)全域性宣告:在函式外部對資料型別、函式以及變數的宣告。它的有效範圍是從宣告開始到本程式單位結束。

(3)函式:包含函式首部和函式體,函式體中包含宣告語句和執行語句。

2. C++中的語句

(1)宣告語句,如:int a,b

(2)執行語句:

a.控制語句:if()...else... ; for(); while(); do...while() ; continue; break ; switch; goto; return;

b. 函式和流物件呼叫語句:函式呼叫+分號,如:sort(x,y,x); cout<<x<<endl;(流呼叫語句)

c. 表示式語句:表示式+分號;如:i= i+1;

(3)空語句:

單分號:;也是個語句,表示什麼都不做

(4)複合語句

{}括起來的若干個語句

3. C++ 關鍵字

下表列出了 C++ 中的保留字。這些保留字不能作為常量名、變數名或其他識別符號名稱。

asm else new this
auto enum operator throw
bool explicit private true
break export protected try
case extern public typedef
catch false register typeid
char float reinterpret_cast typename
class for return union
const friend short unsigned
const_cast goto signed using
continue if sizeof virtual
default inline static void
delete int static_cast volatile
do long struct wchar_t
double mutable switch while
dynamic_cast namespace template  

 

4. C++ 基本的輸入輸出

參考自:http://www.runoob.com/cplusplus/cpp-basic-input-output.html

C++ 標準庫提供了一組豐富的輸入/輸出功能,我們將在後續的章節進行介紹。本章將討論 C++ 程式設計中最基本和最常見的 I/O 操作。

C++ 的 I/O 發生在流中,流是位元組序列。如果位元組流是從裝置(如鍵盤、磁碟驅動器、網路連線等)流向記憶體,這叫做輸入操作。如果位元組流是從記憶體流向裝置(如顯示屏、印表機、磁碟驅動器、網路連線等),這叫做輸出操作

I/O 庫標頭檔案

下列的標頭檔案在 C++ 程式設計中很重要。

標頭檔案 函式和描述
<iostream> 該檔案定義了 cin、cout、cerr 和 clog 物件,分別對應於標準輸入流、標準輸出流、非緩衝標準錯誤流和緩衝標準錯誤流。
<iomanip> 該檔案通過所謂的引數化的流操縱器(比如 setw 和 setprecision),來宣告對執行標準化 I/O 有用的服務。
<fstream> 該檔案為使用者控制的檔案處理宣告服務。我們將在檔案和流的相關章節討論它的細節。

標準輸出流(cout)

預定義的物件 cout 是 iostream 類的一個例項。cout 物件"連線"到標準輸出裝置,通常是顯示屏。cout 是與流插入運算子 << 結合使用的

C++ 編譯器根據要輸出變數的資料型別,選擇合適的流插入運算子來顯示值。<< 運算子被過載來輸出內建型別(整型、浮點型、double 型、字串和指標)的資料項。

流插入運算子 << 在一個語句中可以多次使用,如上面例項中所示,endl 用於在行末新增一個換行符。

標準輸入流(cin)

預定義的物件 cin 是 iostream 類的一個例項。cin 物件附屬到標準輸入裝置,通常是鍵盤。cin 是與流提取運算子 >> 結合使用的。

C++ 編譯器根據要輸入值的資料型別,選擇合適的流提取運算子來提取值,並把它儲存在給定的變數中。

流提取運算子 >> 在一個語句中可以多次使用,如果要求輸入多個數據,可以使用如下語句:

cin >> name >> age;

這相當於下面兩個語句:

cin >> name;
cin >> age;

標準錯誤流(cerr)

預定義的物件 cerr 是 iostream 類的一個例項。cerr 物件附屬到標準錯誤裝置,通常也是顯示屏,但是 cerr 物件是非緩衝的,且每個流插入到 cerr 都會立即輸出。

標準日誌流(clog)

預定義的物件 clog 是 iostream 類的一個例項。clog 物件附屬到標準錯誤裝置,通常也是顯示屏,但是 clog 物件是緩衝的。這意味著每個流插入到 clog 都會先儲存在緩衝在,直到緩衝填滿或者緩衝區重新整理時才會輸出。

關於getchar()和putchar:

參考自:https://blog.csdn.net/qcq8208/article/details/54914149

putchar函式(字元輸出函式)
putchar函式的作用是向終端輸出一個字元。例如:
putchar(c);
它輸出字元變數c的值。

【例3.2】輸出單個字元。

複製純文字新視窗

#include <iostream> //或者包含標頭檔案stdio.h:#include <stdio.h>
using namespace std;
int main( )
{
char a,b,c;
a=’B';b=’O';c=’Y';
putchar(a);putchar(b);putchar(c);putchar(‘\n’);
putchar(66);putchar(79);putchar(89);putchar(10);
return 0;
}
#include <iostream>  //或者包含標頭檔案stdio.h:#include <stdio.h>
using namespace std;
int main( )
{
  char a,b,c;
  a='B';b='O';c='Y';
  putchar(a);putchar(b);putchar(c);putchar('\n');
  putchar(66);putchar(79);putchar(89);putchar(10);
  return 0;
}


執行結果為
BOY
BOY

可以看到:用putchar可以輸出轉義字元,putchar(‘\n’)的作用是輸出一個換行符,使輸出的當前位置移到下一行的開頭。putchar(66)的作用是將66作為ASCII碼轉換為字元輸出,66是字母’B’的ASCII碼,因此putchar(66)輸出字母’B’。其餘類似。putchar(10)中的10是換行符的ASCII碼,putchar(10)輸出一個換行符,作用與putchar(‘\n’) 相同。

也可以輸出其他轉義字元,如
putchar(‘\101′);  (輸出字元’A’,八進位制的101是’A’的ASCII碼)
putchar(‘\”);  (輸出單引號字元’)
putchar(‘\015′);  (輸出回車,不換行,使輸出的當前位置移到本行開頭)

getchar函式(字元輸入函式)
此函式的作用是從終端(或系統隱含指定的輸入裝置)輸入一個字元。getchar函式沒有引數,其一般形式為getchar( )函式的值就是從輸入裝置得到的字元。

【例3.3】輸入單個字元。

複製純文字新視窗

#include <iostream>
using namespace std;
int main( )
{
char c;
c=getchar( ); putchar(c+32); putchar(‘\n’);
return 0;
}
#include <iostream>
using namespace std;
int main( )
{
  char c;
  c=getchar( ); putchar(c+32); putchar('\n');
  return 0;
}


在執行時,如果從鍵盤輸入大寫字母’A’並按回車鍵,就會在螢幕上輸出小寫字母’a’。

請注意,getchar( )只能接收一個字元。getchar函式得到的字元可以賦給一個字元變數或整型變數,也可以不賦給任何變數,作為表示式的一部分。例如,例3.3第5行可以用下面一行代替:
putchar(getchar()+32);putchar(‘\n’);
因為getchar( )讀入的值為’A’,’A’+32是小寫字母’a’的ASCII碼,因此putchar函式輸出’a’。此時不必定義變數c。

也可用cout輸出getchar函式得到字元的ASCII的值:
cout<<getchar( );
這時輸出的是整數97,因為用getchar( )讀入的實際上是字元的ASCII碼,現在並未把它賦給一個字元變數,cout就按整數形式輸出。如果改成
cout<<(c=getchar( ));  //設c已定義為字元變數
則輸出為字母’a’,因為要求輸出字元變數c的值。

可以看到用putchar和getchar函式輸出和輸入字元十分靈活方便,由於它們是函式所以可以出現在表示式中,例如
cout<<(c=getchar( )+32);
 

關於printf()和scanf()

參考自https://blog.csdn.net/lx520aa/article/details/76642332

在C語言中是用printf函式進行輸出,用scanf函式進行輸入的。C++保留了C語言的這一用法,在此只作很簡單的介紹。

scanf函式一般格式是:

scanf(格式控制, 輸出表列)

printf函式的一般格式是
printf(格式控制,輸出表列)

【例3.4】用scanf和printf函式進行輸入和輸出。 

 
#include <iostream>
using namespace std;
int main( )
{
  int a; float b; char c;
  scanf("%d %c %f",&a,&c,&b);  //注意在變數名前要加地址運算子&
  printf("a=%d,b=%f,c=%c\n",a,b,c);
  return 0;
}

執行情況如下:
12 A 67.98↙(本行為輸入,輸入的3個數據間以空格相間)
a=12,b=67.980003,c=A(本行為輸出)

輸入的整數12送給整型變數a,字元’A’送給字元變數c,67.98送給單精度變數b。

5. C++ 變數作用域

作用域是程式的一個區域,一般來說有三個地方可以定義變數:

  • 在函式或一個程式碼塊內部宣告的變數,稱為區域性變數。

  • 在函式引數的定義中宣告的變數,稱為形式引數。

  • 在所有函式外部宣告的變數,稱為全域性變數。

我們將在後續的章節中學習什麼是函式和引數。本章我們先來講解什麼是區域性變數和全域性變數。

區域性變數

在函式或一個程式碼塊內部宣告的變數,稱為區域性變數。它們只能被函式內部或者程式碼塊內部的語句使用。下面的例項使用了局部變數:

#include <iostream>
using namespace std;
 
int main ()
{
  // 區域性變數宣告
  int a, b;
  int c;
 
  // 實際初始化
  a = 10;
  b = 20;
  c = a + b;
 
  cout << c;
 
  return 0;
}

全域性變數

在所有函式外部定義的變數(通常是在程式的頭部),稱為全域性變數。全域性變數的值在程式的整個生命週期內都是有效的。

全域性變數可以被任何函式訪問。也就是說,全域性變數一旦宣告,在整個程式中都是可用的。下面的例項使用了全域性變數和區域性變數:

#include <iostream>
using namespace std;
 
// 全域性變數宣告
int g;
 
int main ()
{
  // 區域性變數宣告
  int a, b;
 
  // 實際初始化
  a = 10;
  b = 20;
  g = a + b;
 
  cout << g;
 
  return 0;
}

6. 選擇與判斷(if、switch)

參考自:http://www.runoob.com/cplusplus/cpp-decision.html

(1)if語句

一個 if 語句 由一個布林表示式後跟一個或多個語句組成。

C++ 中 if 語句的語法:

if(boolean_expression)
{
   // 如果布林表示式為真將執行的語句
}

如果布林表示式為 true,則 if 語句內的程式碼塊將被執行。如果布林表示式為 false,則 if 語句結束後的第一組程式碼(閉括號後)將被執行。

C 語言把任何非零非空的值假定為 true,把或 null 假定為 false

(2)if...else語句

C++ 中 if...else 語句的語法:

if(boolean_expression)
{
   // 如果布林表示式為真將執行的語句
}
else
{
   // 如果布林表示式為假將執行的語句
}

如果布林表示式為 true,則執行 if 塊內的程式碼。如果布林表示式為 false,則執行 else 塊內的程式碼。

(3)if...else if...else語句

一個 if 語句後可跟一個可選的 else if...else 語句,這可用於測試多種條件。

當使用 if...else if...else 語句時,以下幾點需要注意:

  • 一個 if 後可跟零個或一個 else,else 必須在所有 else if 之後。
  • 一個 if 後可跟零個或多個 else if,else if 必須在 else 之前。
  • 一旦某個 else if 匹配成功,其他的 else if 或 else 將不會被測試。

C++ 中的 if...else if...else 語句的語法:

if(boolean_expression 1)
{
   // 當布林表示式 1 為真時執行
}
else if( boolean_expression 2)
{
   // 當布林表示式 2 為真時執行
}
else if( boolean_expression 3)
{
   // 當布林表示式 3 為真時執行
}
else 
{
   // 當上麵條件都不為真時執行
}

(4)if巢狀

在 C++ 中,巢狀 if-else 語句是合法的,這意味著您可以在一個 if 或 else if 語句內使用另一個 if 或 else if 語句。

C++ 中 巢狀 if 語句的語法:

if( boolean_expression 1)
{
   // 當布林表示式 1 為真時執行
   if(boolean_expression 2)
   {
      // 當布林表示式 2 為真時執行
   }
}

(5)switch()語句

一個 switch 語句允許測試一個變數等於多個值時的情況。每個值稱為一個 case,且被測試的變數會對每個 switch case 進行檢查。

C++ 中 switch 語句的語法:

switch(expression){
    case constant-expression  :
       statement(s);
       break; // 可選的
    case constant-expression  :
       statement(s);
       break; // 可選的
  
    // 您可以有任意數量的 case 語句
    default : // 可選的
       statement(s);
}

switch 語句必須遵循下面的規則:

  • switch 語句中的 expression 必須是一個整型或列舉型別,或者是一個 class 型別,其中 class 有一個單一的轉換函式將其轉換為整型或列舉型別。
  • 在一個 switch 中可以有任意數量的 case 語句。每個 case 後跟一個要比較的值和一個冒號。
  • case 的 constant-expression 必須與 switch 中的變數具有相同的資料型別,且必須是一個常量或字面量。
  • 當被測試的變數等於 case 中的常量時,case 後跟的語句將被執行,直到遇到 break 語句為止。
  • 當遇到 break 語句時,switch 終止,控制流將跳轉到 switch 語句後的下一行。
  • 不是每一個 case 都需要包含 break。如果 case 語句不包含 break,控制流將會 繼續 後續的 case,直到遇到 break 為止。
  • 一個 switch 語句可以有一個可選的 default case,出現在 switch 的結尾。default case 可用於在上面所有 case 都不為真時執行一個任務。default case 中的 break 語句不是必需的。

(7)條件運算子

? : 運算子可以用來替代 if...else 語句。它的一般形式如下:

Exp1 ? Exp2 : Exp3;

其中,Exp1、Exp2 和 Exp3 是表示式。請注意,冒號的使用和位置。

? 表示式的值是由 Exp1 決定的。如果 Exp1 為真,則計算 Exp2 的值,結果即為整個 ? 表示式的值。如果 Exp1 為假,則計算 Exp3 的值,結果即為整個 ? 表示式的值。

7.迴圈結構

參考自:http://www.runoob.com/cplusplus/cpp-loops.html

有的時候,可能需要多次執行同一塊程式碼。一般情況下,語句是順序執行的:函式中的第一個語句先執行,接著是第二個語句,依此類推。

程式語言提供了允許更為複雜的執行路徑的多種控制結構。

迴圈語句允許我們多次執行一個語句或語句組,下面是大多數程式語言中迴圈語句的一般形式:

迴圈結構

(1)while迴圈

只要給定的條件為真,while 迴圈語句會重複執行一個目標語句。

C++ 中 while 迴圈的語法:

while(condition)
{
   statement(s);
}

在這裡,statement(s) 可以是一個單獨的語句,也可以是幾個語句組成的程式碼塊。condition 可以是任意的表示式,當為任意非零值時都為真。當條件為真時執行迴圈。

當條件為假時,程式流將繼續執行緊接著迴圈的下一條語句。

(2)do-while迴圈

不像 for 和 while 迴圈,它們是在迴圈頭部測試迴圈條件。do...while 迴圈是在迴圈的尾部檢查它的條件。

do...while 迴圈與 while 迴圈類似,但是 do...while 迴圈會確保至少執行一次迴圈。

C++ 中 do...while 迴圈的語法:

do
{
   statement(s);

}while( condition );

請注意,條件表示式出現在迴圈的尾部,所以迴圈中的 statement(s) 會在條件被測試之前至少執行一次。

如果條件為真,控制流會跳轉回上面的 do,然後重新執行迴圈中的 statement(s)。這個過程會不斷重複,直到給定條件變為假為止。

(3)for迴圈

for 迴圈允許您編寫一個執行特定次數的迴圈的重複控制結構。

C++ 中 for 迴圈的語法:

for ( init; condition; increment )
{
   statement(s);
}

下面是 for 迴圈的控制流:

  1. init 會首先被執行,且只會執行一次。這一步允許您宣告並初始化任何迴圈控制變數。您也可以不在這裡寫任何語句,只要有一個分號出現即可。
  2. 接下來,會判斷 condition。如果為真,則執行迴圈主體。如果為假,則不執行迴圈主體,且控制流會跳轉到緊接著 for 迴圈的下一條語句。
  3. 在執行完 for 迴圈主體後,控制流會跳回上面的 increment 語句。該語句允許您更新迴圈控制變數。該語句可以留空,只要在條件後有一個分號出現即可。
  4. 條件再次被判斷。如果為真,則執行迴圈,這個過程會不斷重複(迴圈主體,然後增加步值,再然後重新判斷條件)。在條件變為假時,for 迴圈終止。

(4)迴圈的巢狀

一個迴圈內可以巢狀另一個迴圈。C++ 允許至少 256 個巢狀層次。

C++ 中 巢狀 for 迴圈 語句的語法:

for ( init; condition; increment )
{
   for ( init; condition; increment )
   {
      statement(s);
   }
   statement(s); // 可以放置更多的語句
}

C++ 中 巢狀 while 迴圈 語句的語法:

while(condition)
{
   while(condition)
   {
      statement(s);
   }
   statement(s); // 可以放置更多的語句
}

C++ 中 巢狀 do...while 迴圈 語句的語法:

do
{
   statement(s); // 可以放置更多的語句
   do
   {
      statement(s);
   }while( condition );
 
}while( condition );

關於巢狀迴圈有一點值得注意,可以在任何型別的迴圈內巢狀其他任何型別的迴圈。比如,一個 for 迴圈可以巢狀在一個 while 迴圈內,反之亦然。

8. 迴圈控制語句

參考自:http://www.runoob.com/cplusplus/cpp-loops.html

(1)break語句

C++ 中 break 語句有以下兩種用法:

  1. 當 break 語句出現在一個迴圈內時,迴圈會立即終止,且程式流將繼續執行緊接著迴圈的下一條語句。
  2. 它可用於終止 switch 語句中的一個 case。

如果使用的是巢狀迴圈(即一個迴圈內巢狀另一個迴圈),break 語句會停止執行最內層的迴圈,然後開始執行該塊之後的下一行程式碼。

流程圖

C++ break 語句

(2)continue語句

C++ 中的 continue 語句有點像 break 語句。但它不是強迫終止,continue 會跳過當前迴圈中的程式碼,強迫開始下一次迴圈。

對於 for 迴圈,continue 語句會導致執行條件測試和迴圈增量部分。對於 while 和 do...while 迴圈,continue 語句會導致程式控制回到條件測試上。

流程圖

C++ continue 語句

(3)goto語句

goto 語句允許把控制無條件轉移到同一函式內的被標記的語句。

注意:在任何程式語言中,都不建議使用 goto 語句。因為它使得程式的控制流難以跟蹤,使程式難以理解和難以修改。任何使用 goto 語句的程式可以改寫成不需要使用 goto 語句的寫法。

C++ 中 goto 語句的語法:

goto label;
..
.
label: statement;

在這裡,label 是識別被標記語句的識別符號,可以是任何除 C++ 關鍵字以外的純文字。標記語句可以是任何語句,放置在識別符號和冒號(:)後邊。

流程圖

C++ goto 语å¥