C++6389344815.doc_第1頁(yè)
C++6389344815.doc_第2頁(yè)
C++6389344815.doc_第3頁(yè)
C++6389344815.doc_第4頁(yè)
C++6389344815.doc_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

此文檔收集于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系網(wǎng)站刪除C+編程技巧小結(jié)一、使用new和delete進(jìn)行動(dòng)態(tài)內(nèi)存分配和釋放運(yùn)算符new和delete是C+新增的運(yùn)算符,提供了存儲(chǔ)的動(dòng)態(tài)分配和釋放功能。它的作用相當(dāng)于C語(yǔ)言的函數(shù)malloc()和free(),但是性能更為優(yōu)越。使用new較之使用malloc()有以下的幾個(gè)優(yōu)點(diǎn):(1)new自動(dòng)計(jì)算要分配類型的大小,不使用sizeof運(yùn)算符,比較省事,可以避免錯(cuò)誤。(2)自動(dòng)地返回正確的指針類型,不用進(jìn)行強(qiáng)制指針類型轉(zhuǎn)換。(3)可以用new對(duì)分配的對(duì)象進(jìn)行初始化。使用例子:(1)int p;p=new int10; /分配一個(gè)含有10個(gè)整數(shù)的整形數(shù)組delete p; /刪除這個(gè)數(shù)組(2)int p;p=new int (100);/動(dòng)態(tài)分配一個(gè)整數(shù)并初始化二、使用inline內(nèi)連函數(shù)替代宏調(diào)用對(duì)于頻繁使用的函數(shù),C語(yǔ)言建議使用宏調(diào)用代替函數(shù)調(diào)用以加快代碼執(zhí)行,減少調(diào)用開銷。但是宏調(diào)用有許多的弊端,可能引起不期望的副作用。例如宏:#define abs(a) (a)0?(-a):(a), 當(dāng)使用abs(I+)時(shí),這個(gè)宏就會(huì)出錯(cuò)。所以在C+中應(yīng)該使用inline內(nèi)連函數(shù)替代宏調(diào)用,這樣既可達(dá)到宏調(diào)用的目的,又避免了宏調(diào)用的弊端。使用內(nèi)連函數(shù)只須把inline關(guān)鍵字放在函數(shù)返回類型的前面。例如:inline int Add(int a,int b);/聲明Add()為內(nèi)連函數(shù)這樣編譯器在遇到Add()函數(shù)時(shí),就不再進(jìn)行函數(shù)調(diào)用,而是直接嵌入函數(shù)代碼以加快程序的執(zhí)行。三、使用函數(shù)重載在C語(yǔ)言中,兩個(gè)函數(shù)的名稱不能相同,否則會(huì)導(dǎo)致編譯錯(cuò)誤。而在C+中,函數(shù)名相同而參數(shù)不同的兩個(gè)函數(shù)被解釋為重載。例如:void PutHzchar str /在當(dāng)前位置輸出漢字void PutHzint xint ychar str /在x,y處輸出漢字使用函數(shù)重載可以幫助程序員處理更多的復(fù)雜問(wèn)題,避免了使用諸如intabs()、fabs()、dabs()等繁雜的函數(shù)名稱;同時(shí)在大型程序中,使函數(shù)名易于管理和使用,而不必絞盡腦汁地去處理函數(shù)名。四、使用引用(reference)代替指針進(jìn)行參數(shù)傳遞在C語(yǔ)言中,如果一個(gè)函數(shù)需要修改用作參數(shù)的變量值的時(shí)候 ,參數(shù)應(yīng)該聲明為指針類型。例如:void Addint a a+但是對(duì)于復(fù)雜的程序,使用指針容易出錯(cuò),程序也難以讀懂。在C+中,對(duì)于上述情況 可以使用引用來(lái)代替指針,使程序更加清晰易懂。引用就是對(duì)變量取的一個(gè)別名,對(duì)引用進(jìn)行操作,這就相當(dāng)于對(duì)原有變量進(jìn)行操作。例如使用引用的函數(shù)定義為:void Addint a a+ /a為一個(gè)整數(shù)的引用文件 I/O 在C+中比烤蛋糕簡(jiǎn)單多了。 在這篇文章里,我會(huì)詳細(xì)解釋ASCII和二進(jìn)制文件的輸入輸出的每個(gè)細(xì)節(jié),值得注意的是,所有這些都是用C+完成的。一、ASCII 輸出為了使用下面的方法, 你必須包含頭文件(譯者注:在標(biāo)準(zhǔn)C+中,已經(jīng)使用取代,所有的C+標(biāo)準(zhǔn)頭文件都是無(wú)后綴的。)。這是 的一個(gè)擴(kuò)展集, 提供有緩沖的文件輸入輸出操作. 事實(shí)上, 已經(jīng)被包含了, 所以你不必包含所有這兩個(gè)文件, 如果你想顯式包含他們,那隨便你。我們從文件操作類的設(shè)計(jì)開始, 我會(huì)講解如何進(jìn)行ASCII I/O操作。如果你猜是fstream, 恭喜你答對(duì)了! 但這篇文章介紹的方法,我們分別使用ifstream?和 ofstream 來(lái)作輸入輸出。如果你用過(guò)標(biāo)準(zhǔn)控制臺(tái)流cin?和 cout, 那現(xiàn)在的事情對(duì)你來(lái)說(shuō)很簡(jiǎn)單。 我們現(xiàn)在開始講輸出部分,首先聲明一個(gè)類對(duì)象。ofstream fout;這就可以了,不過(guò)你要打開一個(gè)文件的話, 必須像這樣調(diào)用ofstream:open()。fout.open(output.txt);你也可以把文件名作為構(gòu)造參數(shù)來(lái)打開一個(gè)文件.ofstream fout(output.txt);這是我們使用的方法, 因?yàn)檫@樣創(chuàng)建和打開一個(gè)文件看起來(lái)更簡(jiǎn)單. 順便說(shuō)一句, 如果你要打開的文件不存在,它會(huì)為你創(chuàng)建一個(gè), 所以不用擔(dān)心文件創(chuàng)建的問(wèn)題. 現(xiàn)在就輸出到文件,看起來(lái)和cout的操作很像。 對(duì)不了解控制臺(tái)輸出cout的人, 這里有個(gè)例子。int num = 150;char name = John Doe;fout Here is a number: num n;fout Now here is a string: name n;現(xiàn)在保存文件,你必須關(guān)閉文件,或者回寫文件緩沖. 文件關(guān)閉之后就不能再操作了, 所以只有在你不再操作這個(gè)文件的時(shí)候才調(diào)用它,它會(huì)自動(dòng)保存文件。 回寫緩沖區(qū)會(huì)在保持文件打開的情況下保存文件, 所以只要有必要就使用它?;貙懣雌饋?lái)像另一次輸出, 然后調(diào)用方法關(guān)閉。像這樣:fout flush; fout.close(); 現(xiàn)在你用文本編輯器打開文件,內(nèi)容看起來(lái)是這樣:Here is a number: 150 Now here is a string: John Doe很簡(jiǎn)單吧! 現(xiàn)在繼續(xù)文件輸入, 需要一點(diǎn)技巧, 所以先確認(rèn)你已經(jīng)明白了流操作,對(duì) 比較熟悉了, 因?yàn)槟憬酉聛?lái)還要用到他們。繼續(xù)二、ASCII 輸入輸入和cin 流很像. 和剛剛討論的輸出流很像, 但你要考慮幾件事情。在我們開始復(fù)雜的內(nèi)容之前, 先看一個(gè)文本:12 GameDev 15.45 L This is really awesome!為了打開這個(gè)文件,你必須創(chuàng)建一個(gè)in-stream對(duì)象,?像這樣。ifstream fin(input.txt);現(xiàn)在讀入前四行. 你還記得怎么用 操作符往流里插入變量和符號(hào)吧?好,?在 (提取) 操作符. 使用方法是一樣的. 看這個(gè)代碼片段.int number;float real;char letter, word8;fin number; fin word; fin real; fin letter;也可以把這四行讀取文件的代碼寫為更簡(jiǎn)單的一行。fin number word real letter;它是如何運(yùn)作的呢? 文件的每個(gè)空白之后, 操作符會(huì)停止讀取內(nèi)容, 直到遇到另一個(gè)操作符. 因?yàn)槲覀冏x取的每一行都被換行符分割開(是空白字符), 操作符只把這一行的內(nèi)容讀入變量。這就是這個(gè)代碼也能正常工作的原因。但是,可別忘了文件的最后一行。This is really awesome!如果你想把整行讀入一個(gè)char數(shù)組, 我們沒(méi)辦法用?操作符,因?yàn)槊總€(gè)單詞之間的空格(空白字符)會(huì)中止文件的讀取。為了驗(yàn)證:char sentence101; fin sentence;我們想包含整個(gè)句子, This is really awesome! 但是因?yàn)榭瞻? 現(xiàn)在它只包含了This. 很明顯, 肯定有讀取整行的方法, 它就是getline()。這就是我們要做的。fin.getline(sentence, 100);這是函數(shù)參數(shù). 第一個(gè)參數(shù)顯然是用來(lái)接受的char數(shù)組. 第二個(gè)參數(shù)是在遇到換行符之前,數(shù)組允許接受的最大元素?cái)?shù)量. 現(xiàn)在我們得到了想要的結(jié)果:“This is really awesome!”。你應(yīng)該已經(jīng)知道如何讀取和寫入ASCII文件了。但我們還不能罷休,因?yàn)槎M(jìn)制文件還在等著我們。三、二進(jìn)制 輸入輸出二進(jìn)制文件會(huì)復(fù)雜一點(diǎn), 但還是很簡(jiǎn)單的。首先你要注意我們不再使用插入和提取操作符(譯者注: 操作符). 你可以這么做,但它不會(huì)用二進(jìn)制方式讀寫。你必須使用read() 和write() 方法讀取和寫入二進(jìn)制文件. 創(chuàng)建一個(gè)二進(jìn)制文件, 看下一行。ofstream fout(file.dat, ios:binary);這會(huì)以二進(jìn)制方式打開文件, 而不是默認(rèn)的ASCII模式。首先從寫入文件開始。函數(shù)write() 有兩個(gè)參數(shù)。 第一個(gè)是指向?qū)ο蟮腸har類型的指針, 第二個(gè)是對(duì)象的大?。ㄗg者注:字節(jié)數(shù))。 為了說(shuō)明,看例子。int number = 30; fout.write(char *)(&number), sizeof(number);第一個(gè)參數(shù)寫做(char *)(&number). 這是把一個(gè)整型變量轉(zhuǎn)為char *指針。如果你不理解,可以立刻翻閱C+的書籍,如果有必要的話。第二個(gè)參數(shù)寫作sizeof(number). sizeof() 返回對(duì)象大小的字節(jié)數(shù). 就是這樣!二進(jìn)制文件最好的地方是可以在一行把一個(gè)結(jié)構(gòu)寫入文件。 如果說(shuō),你的結(jié)構(gòu)有12個(gè)不同的成員。 用ASCII?文件,你不得不每次一條的寫入所有成員。 但二進(jìn)制文件替你做好了。 看這個(gè)。struct OBJECT int number; char letter; obj;obj.number = 15;obj.letter = M;fout.write(char *)(&obj), sizeof(obj);這樣就寫入了整個(gè)結(jié)構(gòu)! 接下來(lái)是輸入. 輸入也很簡(jiǎn)單,因?yàn)閞ead()?函數(shù)的參數(shù)和 write()是完全一樣的, 使用方法也相同。ifstream fin(file.dat, ios:binary); fin.read(char *)(&obj), sizeof(obj);我不多解釋用法, 因?yàn)樗蛍rite()是完全相同的。二進(jìn)制文件比ASCII文件簡(jiǎn)單, 但有個(gè)缺點(diǎn)是無(wú)法用文本編輯器編輯。 接著, 我解釋一下ifstream 和ofstream 對(duì)象的其他一些方法作為結(jié)束.四、更多方法我已經(jīng)解釋了ASCII文件和二進(jìn)制文件, 這里是一些沒(méi)有提及的底層方法。檢查文件你已經(jīng)學(xué)會(huì)了open() 和close() 方法, 不過(guò)這里還有其它你可能用到的方法。方法good() 返回一個(gè)布爾值,表示文件打開是否正確。類似的,bad() 返回一個(gè)布爾值表示文件打開是否錯(cuò)誤。 如果出錯(cuò),就不要繼續(xù)進(jìn)一步的操作了。最后一個(gè)檢查的方法是fail(), 和bad()有點(diǎn)相似, 但沒(méi)那么嚴(yán)重。讀文件方法get() 每次返回一個(gè)字符。方法ignore(int,char) 跳過(guò)一定數(shù)量的某個(gè)字符, 但你必須傳給它兩個(gè)參數(shù)。第一個(gè)是需要跳過(guò)的字符數(shù)。 第二個(gè)是一個(gè)字符, 當(dāng)遇到的時(shí)候就會(huì)停止。 例子,fin.ignore(100, n);會(huì)跳過(guò)100個(gè)字符,或者不足100的時(shí)候,跳過(guò)所有之前的字符,包括 n。方法peek() 返回文件中的下一個(gè)字符, 但并不實(shí)際讀取它。所以如果你用peek() 查看下一個(gè)字符, 用get() 在peek()之后讀取,會(huì)得到同一個(gè)字符, 然后移動(dòng)文件計(jì)數(shù)器。方法putback(char) 輸入字符, 一次一個(gè), 到流中。我沒(méi)有見(jiàn)到過(guò)它的使用,但這個(gè)函數(shù)確實(shí)存在。寫文件只有一個(gè)你可能會(huì)關(guān)注的方法.?那就是 put(char), 它每次向輸出流中寫入一個(gè)字符。打開文件當(dāng)我們用這樣的語(yǔ)法打開二進(jìn)制文件:ofstream fout(file.dat, ios:binary);ios:binary是你提供的打開選項(xiàng)的額外標(biāo)志. 默認(rèn)的, 文件以ASCII方式打開, 不存在則創(chuàng)建, 存在就覆蓋. 這里有些額外的標(biāo)志用來(lái)改變選項(xiàng)。ios:app 添加到文件尾ios:ate 把文件標(biāo)志放在末尾而非起始。ios:trunc 默認(rèn). 截?cái)嗖⒏矊懳募os:nocreate 文件不存在也不創(chuàng)建。ios:noreplace 文件存在則失敗。文件狀態(tài)我用過(guò)的唯一一個(gè)狀態(tài)函數(shù)是eof(), 它返回是否標(biāo)志已經(jīng)到了文件末尾。 我主要用在循環(huán)中。 例如, 這個(gè)代碼斷統(tǒng)計(jì)小寫e 在文件中出現(xiàn)的次數(shù)。ifstream fin(file.txt);char ch; int counter;while (!fin.eof() ch = fin.get();if (ch = e) counter+;fin.close();我從未用過(guò)這里沒(méi)有提到的其他方法。 還有很多方法,但是他們很少被使用。參考C+書籍或者文件流的幫助文檔來(lái)了解其他的方法。結(jié)論你應(yīng)該已經(jīng)掌握了如何使用ASCII文件和二進(jìn)制文件。有很多方法可以幫你實(shí)現(xiàn)輸入輸出,盡管很少有人使用他們。我知道很多人不熟悉文件I/O操作,我希望這篇文章對(duì)你有所幫助。 每個(gè)人都應(yīng)該知道. 文件I/O還有很多顯而易見(jiàn)的方法,?例如包含文件 . 我更喜歡用流是因?yàn)樗麄兏境绦?1】題目:時(shí)間函數(shù)舉例11.程序分析:2.程序源代碼:#includestdio.h#includetime.hvoidmain()time_tlt;/*definealonginttimevarible*/lt=time(NULL);/*systemtimeanddate*/printf(ctime();/*englishformatoutput*/printf(asctime(localtime();/*tranfertotm*/printf(asctime(gmtime();/*tranfertoGreenwichtime*/=【程序92】題目:時(shí)間函數(shù)舉例21.程序分析:2.程序源代碼:/*calculatetime*/#includetime.h#includestdio.hmain()time_tstart,end;inti;start=time(NULL);for(i=0;i3000;i+)printf(1111111111n);end=time(NULL);printf(1:Thedifferentis%6.3fn,difftime(end,start);=【程序93】題目:時(shí)間函數(shù)舉例31.程序分析:2.程序源代碼:/*calculatetime*/#includetime.h#includestdio.hmain()clock_tstart,end;inti;doublevar;start=clock();for(i=0;ii)printf(pleaseinputalittlesmaller.n);scanf(%d,&guess);elseprintf(pleaseinputalittlebigger.n);scanf(%d,&guess);end=clock();b=time(NULL);printf(1:Ittookyou%6.3fsecondsn,var=(double)(end-start)/18.2);printf(1:ittookyou%6.3fsecondsnn,difftime(b,a);if(var15)printf(11Youareveryclever!11nn);elseif(var25)printf(11youarenormal!11nn);elseprintf(11youarestupid!11nn);printf(11Congradulations11nn);printf(Thenumberyouguessis%d,i);printf(ndoyouwanttotryitagain?(yy.or.n)n);if(c=getch()=y)gotoloop;=【程序95】題目:家庭財(cái)務(wù)管理小程序1.程序分析:2.程序源代碼:/*moneymanagementsystem*/#includestdio.h#includedos.hmain()FILE*fp;structdated;floatsum,chm=0.0;intlen,i,j=0;intc;charch4=,ch116=,chtime12=,chshop16,chmoney8;pp:clrscr();sum=0.0;gotoxy(1,1);printf(|-|);gotoxy(1,2);printf(|moneymanagementsystem(C1.0)2000.03|);gotoxy(1,3);printf(|-|);gotoxy(1,4);printf(|-moneyrecords-|-todaycostlist-|);gotoxy(1,5);printf(|-|-|);gotoxy(1,6);printf(|date:-|);gotoxy(1,7);printf(|);gotoxy(1,8);printf(|-|);gotoxy(1,9);printf(|thgs:-|);gotoxy(1,10);printf(|);gotoxy(1,11);printf(|-|);gotoxy(1,12);printf(|cost:-|);gotoxy(1,13);printf(|);gotoxy(1,14);printf(|-|);gotoxy(1,15);printf(|);gotoxy(1,16);printf(|);gotoxy(1,17);printf(|);gotoxy(1,18);printf(|);gotoxy(1,19);printf(|);gotoxy(1,20);printf(|);gotoxy(1,21);printf(|);gotoxy(1,22);printf(|);gotoxy(1,23);printf(|-|);i=0;getdate(&d);sprintf(chtime,%4d.%02d.%02d,d.da_year,d.da_mon,d.da_day);for(;)gotoxy(3,24);printf(Tab_browsecostlistEsc_quit);gotoxy(13,10);printf();gotoxy(13,13);printf();gotoxy(13,7);printf(%s,chtime);j=18;ch0=getch();if(ch0=27)break;strcpy(chshop,);strcpy(chmoney,);if(ch0=9)mm:i=0;fp=fopen(home.dat,r+);gotoxy(3,24);printf();gotoxy(6,4);printf(listrecords);gotoxy(1,5);printf(|-|);gotoxy(41,4);printf();gotoxy(41,5);printf(|);while(fscanf(fp,%10s%14s%fn,chtime,chshop,&chm)!=EOF)if(i=36)getch();i=0;if(i%36)16)gotoxy(41,4+i-17);printf();gotoxy(42,4+i-17);i+;sum=sum+chm;printf(%10s%-14s%6.1fn,chtime,chshop,chm);gotoxy(1,23);printf(|-|);gotoxy(1,24);printf(|);gotoxy(1,25);printf(|-|);gotoxy(10,24);printf(totalis%8.1f$,sum);fclose(fp);gotoxy(49,24);printf(pressanykeyto.);getch();gotopp;elsewhile(ch0!=r)if(j15)len=len+1;j=11;strcpy(ch1,);j=j-2;strncat(ch1,chtime,len);strcpy(chtime,);strncat(chtime,ch1,len-1);gotoxy(13,7);printf();gotoxy(13,7);printf(%s,chtime);ch0=getch();if(ch0=9)gotomm;if(ch0=27)exit(1);gotoxy(3,24);printf();gotoxy(13,10);j=0;ch0=getch();while(ch0!=r)if(j14)strncat(chshop,ch,1);j+;if(ch0=8)len=strlen(chshop)-1;strcpy(ch1,);j=j-2;strncat(ch1,chshop,len);strcpy(chshop,);strncat(chshop,ch1,len-1);gotoxy(13,10);printf();gotoxy(13,10);printf(%s,chshop);ch0=getch();gotoxy(13,13);j=0;ch0=getch();while(ch0!=r)if(j=a&stri=z)stri=stri-32;fputc(stri,fp);i+;fclose(fp);fp=fopen(test,r);fgets(str,strlen(str)+1,fp);printf(%sn,str);fclose(fp);=【程序99】題目:有兩個(gè)磁盤文件A和B,各存放一行字母,要求把這兩個(gè)文件中的信息合并(按字母順序排列),輸出到一個(gè)新文件C中。1.程序分析:2.程序源代碼:#includestdio.hmain()FILE*fp;inti,j,n,ni;charc160,t,ch;if(fp=fo

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論