![編寫(xiě)OI程序時(shí)可能會(huì)用到的C語(yǔ)法_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/26/0691878d-6c6a-466b-b258-7466b182b48c/0691878d-6c6a-466b-b258-7466b182b48c1.gif)
![編寫(xiě)OI程序時(shí)可能會(huì)用到的C語(yǔ)法_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/26/0691878d-6c6a-466b-b258-7466b182b48c/0691878d-6c6a-466b-b258-7466b182b48c2.gif)
![編寫(xiě)OI程序時(shí)可能會(huì)用到的C語(yǔ)法_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/26/0691878d-6c6a-466b-b258-7466b182b48c/0691878d-6c6a-466b-b258-7466b182b48c3.gif)
![編寫(xiě)OI程序時(shí)可能會(huì)用到的C語(yǔ)法_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/26/0691878d-6c6a-466b-b258-7466b182b48c/0691878d-6c6a-466b-b258-7466b182b48c4.gif)
![編寫(xiě)OI程序時(shí)可能會(huì)用到的C語(yǔ)法_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/26/0691878d-6c6a-466b-b258-7466b182b48c/0691878d-6c6a-466b-b258-7466b182b48c5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、信息學(xué)競(jìng)賽中可能用到的C+語(yǔ)法馮文科雖然我們總是習(xí)慣寫(xiě)“C/C+”,其實(shí)大家都知道C與C+是兩種不同的語(yǔ)言:C+是C的“超集”它“幾乎”完全兼容C的語(yǔ)法,同時(shí)也提供非常多特有的語(yǔ)法與概念。本文并不想全面介紹C+的語(yǔ)法與概念那足夠?qū)懸槐疽淮缍嗪竦膶I(yè)書(shū)籍只是將信息學(xué)競(jìng)賽中可能要用到的C+語(yǔ)法做個(gè)簡(jiǎn)要介紹,它們的加入將使您原有的C程序更簡(jiǎn)潔、清晰,書(shū)寫(xiě)更方便。首先要說(shuō)明的一點(diǎn)是:C+程序源文件的擴(kuò)展名是“cpp”,而不是C程序的“c”,這也是多數(shù)編譯器識(shí)別一個(gè)源程序是C+程序還是C程序的標(biāo)準(zhǔn)。由于C+是C的“超集”,因此您可以在“*.cpp”文件中原樣書(shū)寫(xiě)C程序而且“幾乎”不會(huì)遇到什么問(wèn)題。特別強(qiáng)
2、調(diào):本文中介紹的語(yǔ)法,都是只能在“*.cpp”文件中使用的C+語(yǔ)法,C語(yǔ)言的編譯器不會(huì)編譯通過(guò)。(本文中所有源程序都在Dev-C+中編譯通過(guò)。)一、輸入輸出流。C+中對(duì)輸入輸出部分做了很大的修改,C語(yǔ)言中使用scanf、fscanf、printf、fprintf進(jìn)行的輸入輸出工作都由對(duì)“流(stream)”的操作代替了。您可以向一個(gè)輸出流中用“<<”符號(hào)“插入”一些內(nèi)容相當(dāng)于輸出,也可以用“>>”符號(hào)從一個(gè)輸入流中“提取”一些內(nèi)容相當(dāng)于輸入。例1(從鍵盤(pán)讀入及向屏幕輸出)從鍵盤(pán)讀入兩個(gè)整數(shù),由小到大排序后輸出,用空格分開(kāi)。源程序#include <iostream
3、>/要使用輸入輸出流必須的頭文件,注意沒(méi)有“.h”using namespace std; /要使用cin與cout必須包括的命名空間int main(int argc, char *argv) int a, b; cin>>a>>b;/cin是標(biāo)準(zhǔn)輸入流,此語(yǔ)句從鍵盤(pán)輸入兩個(gè)整數(shù),依次存入a、b中 if(a<b) cout<<a<<' '<<b<<endl;/cout是標(biāo)準(zhǔn)輸出流,輸出到屏幕 else cout<<b<<' '<<a<&
4、lt;endl;/依次將“<<”連接的各項(xiàng)輸出,endl表示換行 return EXIT_SUCCESS;若從鍵盤(pán)輸入:43則輸出34通過(guò)上面的例子,相信您已經(jīng)對(duì)輸入輸出流的使用有了一個(gè)大概的了解。下面一個(gè)例子演示如何利用輸入輸出流對(duì)文本文件進(jìn)行讀寫(xiě)操作,您也將從這個(gè)例子開(kāi)始逐漸看到C+語(yǔ)法的方便之處。例2(文件的輸入輸出)從文件in.txt中輸入兩個(gè)整數(shù),由小到大排序后輸出到out.txt中,用空格分開(kāi)。源程序#include <fstream>/要使用文件輸入輸出流必須的頭文件using namespace std; /要使用ifstream與ofstream必須的
5、命名空間ifstream inf("in.txt"); /定義文件輸入流inf,并關(guān)聯(lián)到in.txtofstream ouf("out.txt");/定義文件輸出流ouf,并關(guān)聯(lián)到out.txtint main(int argc, char *argv) int a, b; inf>>a>>b;/從inf中輸入兩個(gè)整數(shù) if(a<b) ouf<<a<<' '<<b<<endl;/向ouf輸出結(jié)果。 else ouf<<b<<' &
6、#39;<<a<<endl; return EXIT_SUCCESS;如果in.txt的內(nèi)容為:43則out.txt的內(nèi)容為:34由例2可以看出,對(duì)文本文件的輸入輸出與標(biāo)準(zhǔn)輸入輸出從格式上講是一致的,只是需要定義一下文件輸入輸出流,且定義時(shí)只需說(shuō)明文件名即可,文件的打開(kāi)與關(guān)閉動(dòng)作是C+自動(dòng)完成的,用戶不必處理,這樣就不會(huì)出現(xiàn)忘記關(guān)閉文件而丟失數(shù)據(jù)的情況了。二、“/”開(kāi)始的單行注釋。上面的兩個(gè)例子中其實(shí)已經(jīng)使用這個(gè)語(yǔ)法了,一個(gè)語(yǔ)句行中從“/”開(kāi)始后面的文字都是注釋換行后就不是了,因此這是“單行注釋”,與常用的“/*”、“*/”不同。三、有了bool類型。C+也有“真正”的
7、布爾類型了,就是“bool”,布爾型的變量可以有兩個(gè)值true和false。其中“bool”、“true”和“false”都成為了C+的關(guān)鍵字。四、可以按需要隨時(shí)定義變量。在C語(yǔ)言中,變量只能定義在所有可執(zhí)行語(yǔ)句之前,這樣,每當(dāng)我們需要定義一個(gè)新變量時(shí),都要向前翻。在C+中就不用,您可以“隨時(shí)隨地”地定義變量,當(dāng)然,同一作用域中的變量仍然是不準(zhǔn)重名的。這在下面的例子中可以看到。五、結(jié)構(gòu)體(struct)的名稱、共用體(union)的名稱及枚舉(enum)的名稱都可以直接用做類型名而定義變量。直接用一個(gè)例子來(lái)說(shuō)明即可。例3(結(jié)構(gòu)體語(yǔ)法)從文件in.txt中讀入十個(gè)學(xué)生的姓名與成績(jī),將學(xué)生信息按成
8、績(jī)由大到小排序后輸出到out.txt中,每個(gè)學(xué)生一行。源程序#include <fstream>using namespace std;#define N 10ifstream inf("in.txt");ofstream ouf("out.txt");struct stu/定義結(jié)構(gòu)體stu char name20; int score;int main(int argc, char *argv) int i; stu data10; /結(jié)構(gòu)體名稱“stu”可以直接用于定義變量 for(i=0;i<N;i+) /輸入 inf>&g
9、t;>>datai.score; int j; /在使用前定義變量 for(i=0;i<N-1;i+)/以score為鍵值的大數(shù)上浮的冒泡排序 for(j=N-1;j>i;j-) if(dataj.score>dataj-1.score) stu t; t=dataj; dataj=dataj-1; dataj-1=t; for(i=0;i<N;i+) /輸出 ouf<<<<' '<<datai.score<<endl; return EXIT_SUCCE
10、SS;如果in.txt的內(nèi)容為:zhang 80wang 74li 95zhao 96chen 90xiao 100qian 80sun 66liu 75dong 80則out.txt的內(nèi)容為:xiao 100zhao 96li 95chen 90zhang 80qian 80dong 80liu 75wang 74sun 66六、new與delete。new與delete都是C+的關(guān)鍵字,用于動(dòng)態(tài)申請(qǐng)與歸還內(nèi)存,比C語(yǔ)言中原有的malloc與free函數(shù)要方便。例4(new與delete)new與delete的練習(xí)。源程序#include <iostream>using name
11、space std;int main(int argc, char *argv) int *p; p=new int;/為指針p申請(qǐng)一個(gè)整數(shù)的空間,new后的類型必須與*p的類型一致 *p=3; cout<<*p<<endl; delete p; /歸還空間,不必指出歸還多少 return EXIT_SUCCESS;程序最終輸出:3new與delete的另一個(gè)用途就是動(dòng)態(tài)數(shù)組即事先無(wú)法確定大小的數(shù)組,使用時(shí)按需分配空間,這里要用到C語(yǔ)言的一個(gè)概念:一維數(shù)組名實(shí)際是指針變量。例5(動(dòng)態(tài)數(shù)組)文件in.txt中有n個(gè)學(xué)生的姓名和成績(jī),請(qǐng)將學(xué)生信息按成績(jī)由大到小排序后輸出到o
12、ut.txt文件中。每個(gè)學(xué)生一行。in.txt文件的結(jié)構(gòu)為:首行一個(gè)整數(shù),表示學(xué)生個(gè)數(shù)n,以下n行每行一個(gè)姓名與成績(jī),用空格分開(kāi)。源程序#include <fstream>using namespace std;ifstream inf("in.txt");ofstream ouf("out.txt");struct stu char name20; int score;int main(int argc, char *argv) int i, n; stu *data; /定義一個(gè)stu的指針,用于分配數(shù)組 inf>>n; da
13、ta=new stun; /分配n個(gè)stu的空間,由data指向 for(i=0;i<n;i+) inf>>>>datai.score; /使用時(shí)與靜態(tài)數(shù)組沒(méi)區(qū)別 int j; for(i=0;i<n-1;i+) for(j=n-1;j>i;j-) if(dataj.score>dataj-1.score) stu t; t=dataj; dataj=dataj-1; dataj-1=t; for(i=0;i<n;i+) ouf<<<<' '<<da
14、tai.score<<endl; delete data; /回收空間,注意回收數(shù)組空間要用,不必指定歸還大小 return EXIT_SUCCESS;七、引用變量在C語(yǔ)言中,函數(shù)的參數(shù)可以用數(shù)值變量或指針來(lái)傳遞。在C+中,函數(shù)的參數(shù)有了第三種傳遞方法引用傳遞。效果上等同于PASCAL中的var變量,可以在函數(shù)中修改變量的實(shí)際參數(shù)的值。比如下面的例子就使用了引用參數(shù)。例6(引用參數(shù))寫(xiě)一個(gè)函數(shù),交換兩個(gè)變量的值。源程序#include <iostream>using namespace std;void swap(int &a, int &b)/引用參數(shù)
15、,形參前加&符號(hào)表示引用 int t; t=a;/交換變量的值 a=b; b=t;int main(int argc, char *argv) int a, b; cin>>a>>b; cout<<a<<' '<<b<<endl; swap(a, b);/實(shí)現(xiàn)變量值的交換 cout<<a<<' '<<b<<endl; return EXIT_SUCCESS;如果輸入23則輸出2332八、結(jié)構(gòu)體的構(gòu)造函數(shù)與析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)原本是
16、“類”中的概念,但在結(jié)構(gòu)體中也可以使用。大家知道結(jié)構(gòu)體中可以包括各種各樣的變量,稱做它的“成員”。在C+中,結(jié)構(gòu)體里面甚至可以包括函數(shù),稱為它的“方法”。其中最重要的兩個(gè)方法就是構(gòu)造函數(shù)與析構(gòu)函數(shù)。構(gòu)造函數(shù)是在定義結(jié)構(gòu)體變量(或用new分配空間時(shí))被自動(dòng)運(yùn)行的函數(shù),而析構(gòu)函數(shù)則是當(dāng)變量退出作用域(或用delete歸還空間)時(shí)被自動(dòng)運(yùn)行的函數(shù)。因此在構(gòu)造函數(shù)中通常放入初始化的代碼,比如指針清NULL之類,而在析構(gòu)函數(shù)中,大多放入清理代碼,比如歸還申請(qǐng)的空間等。由于這兩種函數(shù)是被自動(dòng)運(yùn)行的,因此可以避免結(jié)構(gòu)體成員沒(méi)有初始化、內(nèi)存沒(méi)有回收等問(wèn)題。構(gòu)造函數(shù)和析構(gòu)函數(shù)可以象定義變量一樣寫(xiě)在結(jié)構(gòu)體中,但名
17、字是確定的:構(gòu)造函數(shù)必須與結(jié)構(gòu)體名稱相同,析構(gòu)函數(shù)必須是結(jié)構(gòu)體名稱前加“”符號(hào)。下面通過(guò)一個(gè)例子來(lái)說(shuō)明。例7(結(jié)構(gòu)體中的構(gòu)造函數(shù)與析構(gòu)函數(shù))從輸入文件in.txt中讀入n(n>=10000)個(gè)整數(shù),然后查找m(m>=5000)個(gè)整數(shù)是否在其中,并將結(jié)果輸出到out.txt中。in.txt的結(jié)構(gòu):首行兩個(gè)整數(shù),分別表示n和m,其后是n+m行,每行一個(gè)整數(shù)。前n行是原始整數(shù),后m行是待查整數(shù)。out.txt中輸出m行,每行一個(gè)整數(shù),表示待查的整數(shù),空格后是“IN”或“OUT”,表示該數(shù)是否在原始集合中,輸出時(shí)請(qǐng)保持輸入時(shí)m個(gè)數(shù)的前后次序。算法分析由于原始集合較大,采用順序查找明顯是不行
18、的。因此決定使用二叉搜索樹(shù)(BST,當(dāng)然也可以考慮快速排序后的二分或用哈希表)。源程序#include <fstream>using namespace std;struct node /二叉樹(shù)結(jié)點(diǎn)結(jié)構(gòu)體 int data; node *left, *right; node() /構(gòu)造函數(shù),使初始化工作自動(dòng)完成,函數(shù)名與結(jié)構(gòu)體名相同 left=NULL; right=NULL; node() /析構(gòu)函數(shù),使清理工作自動(dòng)完成,函數(shù)名為結(jié)構(gòu)體名前加“” left=NULL; right=NULL; ;node *root=NULL;/BST的根int n, m;ifstream inf
19、("in.txt");ofstream ouf("out.txt");void build()/構(gòu)造BST int i, d; inf>>d; root=new node; /先讀入一個(gè),建個(gè)“最小的樹(shù)” root->data=d; for(i=0;i<n-1;i+) /讀入剩余的n-1個(gè)數(shù),插入到BST中 inf>>d; node *temp; temp=root; while(true) if(d>temp->data)/向右枝查找 if(temp->right!=NULL) temp=temp-
20、>right; else temp->right=new node; /插入 temp=temp->right; temp->data=d;/只處理data即可,left與right/已經(jīng)在new時(shí)通過(guò)構(gòu)造函數(shù)自動(dòng)設(shè)置為NULL了。 break; else if(d<temp->data)/向左枝查找 if(temp->left!=NULL) temp=temp->left; else temp->left=new node;/插入 temp=temp->left; temp->data=d; break; else /出現(xiàn)相同整數(shù),則不再處理 break; bool search(int d)/查找BST node *tem
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國(guó)牛角擦行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國(guó)梅毒確診試劑行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國(guó)智能積算儀行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國(guó)單缸液壓圓錐破碎機(jī)行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國(guó)低彈牛津布行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2030年中國(guó)非線性編緝機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)輪緣型鋼數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)蘆薈脫色全葉汁數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)相機(jī)皮套數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)生態(tài)活性刺參配合飼料數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 中學(xué)學(xué)校2024-2025學(xué)年工作計(jì)劃
- 四川省成都市2023年中考道德與法治真題試卷(含答案)
- 【初中生物】病毒課件2024-2025學(xué)年人教版生物七年級(jí)上冊(cè)
- 企業(yè)愿景和未來(lái)三年規(guī)劃
- 中華護(hù)理學(xué)會(huì)團(tuán)體標(biāo)準(zhǔn)-氣管切開(kāi)非機(jī)械通氣患者氣道護(hù)理
- YAMAHA(雅馬哈)貼片機(jī)編程培訓(xùn)教材
- 事故隱患內(nèi)部舉報(bào)獎(jiǎng)勵(lì)制度
- 工程可行性研究報(bào)告編寫(xiě)實(shí)施計(jì)劃方案
- 公司解散清算的法律意見(jiàn)書(shū)、債權(quán)處理法律意見(jiàn)書(shū)
- 城市防洪排澇規(guī)劃
- 中華小廚神(教學(xué)設(shè)計(jì))-五年級(jí)下冊(cè)勞動(dòng)人教版1
評(píng)論
0/150
提交評(píng)論