C++講義——第一節C++基礎
第一節 C++程式設計基礎
C++在語法結構上和QBASIC有著很大的區別,QBASIC語言適合大多數初學者使用,初學者在學習時不用關心變數的定義,程式的結構等諸多的細節,甚至QBASIC程式設計環境可以幫初學者將程式進行標準化和有一定的改錯能力,讓初學者可以順利的學習程式設計的知識。但是QBASIC畢竟只是一種入門性語言,目前已經基本沒有任何實用價值。對於即將進入中學的學生,將要學習的就是C++程式設計。而C++語言無論從結構要求上,還是語法的嚴格性上和QBASIC都有著巨大的差別。
下面簡單列出C++程式的基本結構和相關語法說明。
一、C++的程式結構
【例1】分析下面的程式的功能:
#include <iostream> //“包含命令”,向程式提供輸入輸出所需的一些資訊
using namespace std; //“使用標準的名稱空間”
int main()
{
cout<<"This is a C++ program."; //輸出This is a C++ program.
cout<<endl; //輸出回車
system("pause"); //DOS螢幕處於等待狀態
return 0; //結束主函式並將值返回值
}
【例2】 分析下面的程式的功能:
#include <iostream>
using namespace std;
int main()
{
int x,y,sum; //宣告(定義)變數x,y,sun為整型數
cout<<"Input first integer: x="; //輸出(顯示)提示資訊
cin>>x; //從鍵盤上輸入一個整數並存儲在變數x中
cout<<"Input second integer: y="; //顯示提示資訊
cin>>y; //從鍵盤上輸入變數y的值
sum=x+y; //求x,y的和並存儲在變數sum中
cout<<"Sum is "<<sum<<endl; //輸出結果
system("pause");
return 0;
}
【例3】 輸入兩個整數a和b,輸出其中較大的一個數。
#include <iostream>
using namespace std;
int max(int a,int b) //自定義函式
{
If (a>b)
return a;
else
return b;
}
int main()
{
int a,b,m;
cout<<"Input a,b:";
cin>>a>>b;
m=max(a,b); //函式呼叫語句
cout<<"max="<<m<<endl;
system("pause");
return 0;
}
通過以上例題,可以看出C++程式的結構有以下特點:
(1)C++程式由一個或多個函式組成(即函式是C++程式的基本構成單位)
其中必須有且只能有一個主函式main(),程式從主函式開始執行,由主函式來呼叫其它函式。被呼叫的其它函式可以是系統提供的庫函式,也可以是使用者自定義的函式。例如,例3的C++程式就是由主函式main()和使用者自定義函式max()組成的。
(2)C++函式組成
① 函式說明部分:函式型別、函式名、函式引數(函式引數型別,函式引數名)
函式型別為函式返回值的型別,函式引數可以沒有,也可以有多個。
② 函式體{}:變數定義和執行語句兩部分。
(3)語句和資料說明以分號結束,分號是C++語句的必要組成部分。例如:int z;
(4)程式書寫規則
① 同一層語句同列書寫。同一層次的開花括號最好與對應的閉括號在同一列上。
② 內層語句縮排兩個字元的位置。
③ 函式定義第一列書寫。
(5)C++輸入/輸出通過流cin和cout來實現的
例如: cin>>a>>b; 用來輸入變數a和b的值。
又例如: cout<<"max="<<m<<endl; 用來輸出變數m的值。
(6)嚴格區分字母的大小寫
例如:int a,A; 表示定義兩個不同的變數a、A。
(7)註釋
① /* 註釋內容 */ ② // 註釋內容(單行註釋)
它表示從此開始到本行結束為註釋內容。例如://說明變數x,y,sun為整型數
(8)編譯預處理命令
以“#”開頭的行稱為編譯預處理命令。例如:#include <iostream>
二、C++的資料型別及變數定義
除了完整的程式結構的要求外,C++對資料型別的要求更加嚴格,不在C++程式中,未定義過的變數,是無法在程式中直接使用的。而C++也對變數的型別進行了嚴格的歸類。下面列出主要的資料型別和其數值範圍。1.7*10-380~1.7*10380
型別 |
型別標示 |
位元組 |
數值範圍 |
短整型 |
short int |
2 |
-32768~32767 |
整型 |
int |
4 |
-2147483648~2147483647 |
長整型 |
long int |
4 |
-2147483648~2147483647 |
字元型 |
char |
1 |
-128~127 |
單精度型 |
float |
8 |
-3.4*1038~3.4*1038 |
雙精度型 |
double |
8 |
-1.7*10380~1.7*10380 |
在把握了上面這些型別後,就可以定義不同的變數用來滿足程式的使用需求。定義形式如下:
int a;
long int b;
float f;
int shu1,shu2,shu3;
均是可以的。
三、C++的輸入/輸出語句
在程式設計中,最最基礎的就是輸入輸出命令。在C++中對輸入輸出語句都相應的做了簡化。如輸入語句cin,就是可以從鍵盤上得到一個值儲存在指定的變數中。它的使用形式如下:
int a;
cin>>a;
或
int a,b;
cin>>a>>b;
然後可以再利用輸入進來的值,進行相關運算。
而輸出語句cout,就是可以將相應的值或字元等資料輸出到螢幕上,它的使用形式如下:
int a;
a=100;
cout<<a*100;
四、C++的算術運算子
C++和其他的語言一樣有幾個極其重要的算術運算子,但是這些運算子有著重要的特點。
符 號 |
說明 |
+ |
加法運算,如3+2 |
- |
減法運算,如3-2 |
* |
乘法運算,如3*2 |
/ |
除法運算,如3/2 |
% |
取餘運算,如3%2。因為為取餘運算,所以%左右兩邊的資料必須為整數 |
這其中需要特殊說明的是,除法運算子,“/”。因為在C++中沒有單獨的整除符號,所有在處理整除時,採取一個特殊的方法,即:兩個整數相除的結果為整數。如5/3的結果值為1,捨去小數部分。但是,如果除數或被除數中有一個為負值,則舍入的方向是不固定的。例如,-5/3在有的C++系統上得到的結果為-1,有的C++系統則給出結果-2。但多數編譯系統採取“向零取整”的方法,即5/3的值等於1,-5/3的值為-1,取整後向零靠攏。
(特別需要說明的是,在DEV-C++中就是採取這種向零靠攏的形式,請各位選手一定注意。)
【例4】
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int n;
n=5/3;
cout<<n;
system("PAUSE");
return EXIT_SUCCESS;
}
在例4中,我們求的是5/3,因為5和3都是整數,且n的型別也為整數,所有輸出的n值為1。如果採取下面的變化,將n的型別改為float型別(實數)。則因為上面闡述的除法規則,得到的n值仍然為1。如【例5】所示。
【例5】
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
float n;
n=5/3;
cout<<n<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
但是,如果我們需要除的值為實數時,該如何處理呢?這就需要改變“/”號兩邊的值的型別,達到這樣的變化。如【例6】所示。
【例6】
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
float n;
n=5/3.0;
cout<<n<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
只是將5/3改為了5/3.0,看起來好像沒什麼變化,但是實質上,資料的型別就改變了。造成的結果也就不同。
上面舉出了C++中的基本運算子,在C++中不但有這些其他語言中有類似的運算子,還有兩個很有C++代表意義的運算子,就是自加運算子(++)和自減運算子(--)。
++和--是C++很有特點的運算子號,一個變數使用自加或自減運算子很類似於對這個變數做一次+1或-1的運算,如i++;很類似於i=i+1;但是有不完全相同,++或--符號可以放在變數之前也可以放在變數之後,但是具體操作起來的效果有著很大的不同。
【例7】
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int x,y;
int m,n;
x=1;
y=1;
m=x++;
n=++y;
cout<<m<<endl<<n<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
輸出的結果是m的值為1,而n的值為2,但是如果我們增加x和y值的顯示會發現x和y的值都變成了2。這就能夠體現出自加(或自減)運算子放在變數前後的區別。放在變數前,代表要先進行自加(或自減),再給左面的變數賦值;而放在變數後面時,則需要先把變數的值提取出來給“=”號左邊的變數賦值,然後再對自加(或自減)變數做加(或減)的操作。
但如果自加或自減運算子作為一個單獨的語句來使用,則其效果是完全一致的。如下:
x=1;
y=1;
x++;
y++;
cout<<x<<endl<<y<<endl;
這樣的使用就只相當於最基本的x=x+1;y=y+1;的使用了。
五、C++的檔案操作
C++的檔案操作,要比QBASIC方便的多,它的讀取路徑和儲存.cpp檔案的路徑一致。需要說明一下,如果採用新建工程的方法的話,則預設和工程檔案所在目錄一致。所以建議新建工程並儲存.cpp檔案後,關閉整個DEV-C++環境,再開啟.cpp檔案進行操作,這樣就不會因為目錄問題對檔案的讀取操作有任何的影響了。
在C++對檔案的操作要定義檔案操作命令,且需要引用fstream標頭檔案。
【例8】
#include <cstdlib>
#include <fstream>
using namespace std;
ifstream fin("file.in");
ofstream fout("file.out");
int main(int argc, char *argv[])
{
int x,y;
int m,n;
fin>>x>>y>>m>>n;
fout<<x+1<<endl<<y+1<<endl<<m+1<<endl<<n+1<<endl;
return EXIT_SUCCESS;
}
在【例8】中,將預設的iostream呼叫改為了fstream的呼叫,這是因為檔案的讀寫命令是包含在fstream標頭檔案中的,而如果程式中不使用cin或cout就可以不用呼叫iostream了。在例題中通過
ifstream fin("file.in");
ofstream fout("file.out");
兩句語句定義了兩個類似與cin和cout的命令fin和fout,並且把這兩個命令和輸入檔案”file.in”及輸出檔案”file.out”相關聯。輸入檔案應該和例題的.cpp檔案在同一個目錄下,而輸出檔案也會出現在相同目錄中。而關聯後的fin和fout命令的使用幾乎完全和cin及cout類似。
作業:
將2007年北京市小學生程式設計邀請賽的第一題,用C++完成,且要求使用檔案操作。