![C程序設(shè)計實踐教程中_第1頁](http://file4.renrendoc.com/view/0c8236ee6afda8bfdac59199fc2a8ac9/0c8236ee6afda8bfdac59199fc2a8ac91.gif)
![C程序設(shè)計實踐教程中_第2頁](http://file4.renrendoc.com/view/0c8236ee6afda8bfdac59199fc2a8ac9/0c8236ee6afda8bfdac59199fc2a8ac92.gif)
![C程序設(shè)計實踐教程中_第3頁](http://file4.renrendoc.com/view/0c8236ee6afda8bfdac59199fc2a8ac9/0c8236ee6afda8bfdac59199fc2a8ac93.gif)
![C程序設(shè)計實踐教程中_第4頁](http://file4.renrendoc.com/view/0c8236ee6afda8bfdac59199fc2a8ac9/0c8236ee6afda8bfdac59199fc2a8ac94.gif)
![C程序設(shè)計實踐教程中_第5頁](http://file4.renrendoc.com/view/0c8236ee6afda8bfdac59199fc2a8ac9/0c8236ee6afda8bfdac59199fc2a8ac95.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
會計學(xué)1C程序設(shè)計實踐教程中7.1宏定義宏定義:用預(yù)處理命令#define實現(xiàn)。宏定義分為:⑴帶參數(shù)的宏定義;⑵不帶參數(shù)的宏定義。第1頁/共260頁7.1.1不帶參數(shù)的宏定義格式:#define標(biāo)識符字符或字符串其中,標(biāo)識符稱為宏名。舉例:#definePI3.1415926其作用是將宏名PI定義為字符串3.1415926。在編譯預(yù)處理時,將該命令后所有出現(xiàn)PI處均用3.1415926替換。這種替換稱為“宏替換”或“宏擴展”或“宏展開”。宏替換的本質(zhì)是字符串替換。又如:#definePROMPT"面積為:"第2頁/共260頁例7.2宏定義的使用。#include<iostream.h>#definePI3.1415926#defineR2.8#defineAREAPI*R*R//A#definePROMPT"面積="
voidmain(void){cout<<PROMPT<<AREA<<'\n';}程序運行結(jié)果:面積=24.6301第3頁/共260頁不帶參宏說明⑴通常宏名用大寫字母表示,以別于變量名。當(dāng)然,從語法上來講,任一合法的標(biāo)識符均可用作宏名。⑵宏定義可出現(xiàn)在程序中的任何位置,但通常放在源程序文件的開始。宏名的作用域從宏定義開始到本源程序文件結(jié)束。⑶在宏定義中可用已定義的宏名。如例7.2中的A行,在宏定義AREA時,用到已定義的宏名PI和R。在編譯預(yù)處理時,先對該行中的PI和R作替換。替換后,A行為:#defineAREA3.1415926*2.8*2.8第4頁/共260頁⑷宏擴展時,只對宏名作字符串代換,不作任何計算,也不作任何語法檢查。若宏定義時書寫不正確,會得到不正確的結(jié)果或編譯時出現(xiàn)語法錯誤。如:#defineA3+5#defineBA*Acout<<B<<'\n';//C
C行輸出為23,而不是64。因C行宏擴展后為:
cout<<3+5*3+5<<'\n';⑸若要終止宏名的作用域,可用預(yù)處理命令:#undef宏名例如:#definePI3.1415926
…#undefPI//終止PI的作用域,其后不能再用PI第5頁/共260頁⑹當(dāng)宏名出現(xiàn)在字符串中時,編譯預(yù)處理不做宏擴展。例7.3宏名出現(xiàn)在字符串中時的編譯預(yù)處理。#include<iostream.h>#defineA"歡迎"#defineB"A參觀展覽會"
voidmain(void){cout<<B<<"!\n";}程序運行結(jié)果:
A參觀展覽會?、嗽谕粋€作用域內(nèi),同一個宏名不允許重復(fù)定義。第6頁/共260頁7.1.2帶參數(shù)的宏定義帶參數(shù)宏定義的形式:#define宏名(參數(shù)表)使用參數(shù)的字符或字符串帶參宏定義在宏擴展時,要對宏名和參數(shù)做替換。帶參數(shù)宏舉例:
#defineAREA(a,b)a*bb=AREA(2.0,7.8);宏定義中的參數(shù)稱為形參。例如:宏AREA有參數(shù)a和b。宏調(diào)用:使用帶參宏。在宏調(diào)用中給出的參數(shù)稱為實參。帶參宏擴展:先用實參替代宏定義中的形參,并將替代后的字符串替代宏調(diào)用。宏擴展僅作字符串替代,不作計算。舉例:宏調(diào)用經(jīng)宏擴展后為:
b=2.0*7.8;第7頁/共260頁帶參宏說明⑴宏調(diào)用中的實參若含表達(dá)式,則在宏定義中要用圓括號把形參括起來或在宏調(diào)用中把實參括起來,以免出錯。例如:#defineAREA(a,b)a*bc=AREA(2+3,3+4);//B
c的值不為35,而是15。出錯原因:因B行擴展后為:
c=2+3*3+4;解決方法:①將B行的宏調(diào)用改寫成:
c=AREA((2+3),(3+4));②將宏定義改為:#defineAREA(a,b)(a)*(b)則B行經(jīng)宏擴展后,成為:
c=(2+3)*(3+4);方法②更好。第8頁/共260頁⑵在宏定義時,宏名與左括號之間不能有空格。若在宏名后有空格,則將空格后的所有字符都作為無參宏所定義的字符串,而不作為形參。例如:#defineAREA(a,b)(a)*(b)則編譯預(yù)處理程序認(rèn)為無參宏AREA定義為“(a,b)(a)*(b)”,而不將(a,b)作為參數(shù)。⑶當(dāng)一個宏定義多于一行時必須使用續(xù)行符“\”,即在按換行符(Enter鍵)之前先輸入一個“\”。例如:#defineAREA(a,b)(a)*\(b)⑷帶參宏主要用來取代功能簡單、代碼短小、運行時間極短、調(diào)用頻繁的程序代碼,但因其使用時有一些副作用,故C++引入內(nèi)聯(lián)函數(shù)以取代帶參宏。第9頁/共260頁帶參宏與函數(shù)有些相似,但兩者有本質(zhì)區(qū)別⑴定義形式不同。宏定義只給出形參,而不指明形參類型;而函數(shù)定義必須指定每個形參的類型。⑵調(diào)用處理不同。宏由編譯預(yù)處理程序處理,而函數(shù)由編譯程序處理。宏調(diào)用僅作替換,不做任何計算;而函數(shù)調(diào)用是在目標(biāo)程序執(zhí)行期間,先依次求出各個實參的值,然后才執(zhí)行函數(shù)的調(diào)用。⑶函數(shù)調(diào)用要求實參類型必須與對應(yīng)的形參類型一致,即做類型檢查;而宏調(diào)用沒有參數(shù)類型檢查。⑷函數(shù)可用return語句返回一個值,而宏不返回值。⑸多次調(diào)用同一個宏時,要增加源程序的長度;而對同一個函數(shù)的多次調(diào)用,不會使源程序變長。第10頁/共260頁7.2“包含文件”處理文件包含:一個源文件可將另一個源文件的全部內(nèi)容包含進來。通過編譯預(yù)處理命令include實現(xiàn)。文件包含命令:格式1:#include<filename>按編譯系統(tǒng)規(guī)定的路徑(include目錄或其子目錄)查找包含文件。主要用于包含編譯系統(tǒng)預(yù)定義的頭文件。格式2:#include"filename"從當(dāng)前目錄查找包含的文件。主要用于包含用戶自定義的文件。第11頁/共260頁文件包含舉例設(shè)文件my.h的內(nèi)容為:
intx=2;設(shè)文件f.cpp的內(nèi)容為:#include"my.h"voidmain(void){cout<<x<<'\n';}上述程序經(jīng)過編譯預(yù)處理后,用文件my.h的內(nèi)容替換編譯預(yù)處理命令行產(chǎn)生一個臨時文件,其內(nèi)容為:
intx=2;voidmain(void){cout<<x<<'\n';}并把該臨時文件交給編譯程序進行編譯。第12頁/共260頁文件包含說明⑴包含文件的擴展名推薦用“.h”(head的縮寫)。當(dāng)然也可用其他擴展名或不用擴展名。⑵一個include命令只能指定一個被包含的文件,若要包含n個文件,則要用n個include命令。⑶在一個包含文件中可包含其他包含文件。⑷include命令可出現(xiàn)在程序中的任何位置,通常放在程序的開頭。⑸為了便于文件包含,允許在文件名前加路徑,例如:#include"c:\\my\\my.h"
第13頁/共260頁頭文件頭文件:因包含文件的擴展名“.h”(head)而得名。頭文件的內(nèi)容:聲明公用的數(shù)據(jù)類型、函數(shù)原型、宏定義、全局變量、命名空間等。頭文件的作用與用途:⑴頭文件是后續(xù)編程的約定;⑵頭文件便于后續(xù)編程時引用,便于時刻檢查引用頭文件的源程序是否嚴(yán)格遵守編程約定,為程序的模塊級編程與調(diào)試、系統(tǒng)級編程與調(diào)試帶來諸多便利。⑶頭文件是實現(xiàn)代碼重用的好辦法之一。⑷頭文件為設(shè)計復(fù)雜的或多人合作的程序提供了便利。第14頁/共260頁7.3條件編譯條件編譯:程序中的某些行僅在滿足某種條件時,才要編譯程序?qū)ζ渚幾g;否則不被編譯。條件編譯命令分類:⑴傳統(tǒng)條件編譯命令:根據(jù)宏名是否已經(jīng)定義來確定是否要編譯某些程序行;⑵現(xiàn)代的條件編譯命令:根據(jù)表達(dá)式的值來確定是否要編譯某些程序行。推薦使用。條件編譯命令可出現(xiàn)在程序中的任何位置。編譯預(yù)處理程序在處理條件編譯時,將要編譯的程序段寫到一個臨時文件中,供編譯程序編譯。第15頁/共260頁傳統(tǒng)條件編譯命令第16頁/共260頁現(xiàn)代的條件編譯命令第17頁/共260頁條件編譯用于程序調(diào)試程序調(diào)試時常要輸出調(diào)試信息,而調(diào)試結(jié)束不輸出,則可將輸出調(diào)試信息的語句用條件編譯括起來,如:#ifdefDEBUGcout<<"x="<<x<<'\n';#endif調(diào)試程序期間,在源程序的開頭增加宏定義:#defineDEBUG實現(xiàn)了輸出調(diào)試信息的目的。一旦程序調(diào)試結(jié)束,只要刪除DEBUG的宏定義,重新編譯程序,則所有的輸出調(diào)試信息的程序部分均不編譯。第18頁/共260頁條件編譯防止包含文件重復(fù)包含設(shè)文件a2.h的內(nèi)容:
floatarea;設(shè)文件a1.h的內(nèi)容:#include"a2.h"#definePI3.1415926f#defineR2.8f源程序文件a.cpp的內(nèi)容:#include<iostream.h>#include"a1.h"#include"a2.h"voidmain(void){area=PI*R*R;cout<<"圓面積="<<area<<'\n';}編譯源程序文件a.cpp時出錯。原因是變量area重復(fù)定義。第19頁/共260頁解決辦法:⑴同一頭文件在源程序文件中保證只包含一次。簡單程序可以做到,但復(fù)雜程序很難做到。⑵定義頭文件時,使用條件編譯,以保證同一頭文件不論被包含多少次,只有第一次的包含命令起作用。例如,上面的頭文件a2.h改寫為:
#ifndef_A2_H//A
#define_A2_H//Bfloatarea;
#endif//C條件編譯命令將頭文件的內(nèi)容括起來。第20頁/共260頁頭文件a1.h可以改寫為:#include"a2.h"
#ifndef_A1_H
#define_A1_H#definePI3.1415926f#defineR2.8f
#endif重新編譯源程序文件a.cpp時則無編譯錯誤。條件編譯命令將頭文件的內(nèi)容括起來。第21頁/共260頁7.4程序的多文件組織單文件組織程序:一個程序放在一個源程序文件中。多文件組織程序:一個程序放在一個以上的文件中。多文件組織程序的優(yōu)勢:便于代碼的設(shè)計、調(diào)試以及重用;便于多人協(xié)同編寫同一個程序等。多文件組織程序涉及:編譯、鏈接,一個文件中的函數(shù)調(diào)用另一個文件中的函數(shù)或使用另一個文件中的全局變量等。第22頁/共260頁7.4.1內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)也稱靜態(tài)函數(shù):僅限于本文件內(nèi)使用的函數(shù)。在定義函數(shù)時,函數(shù)的類型前加static,如:
staticfloatf()//內(nèi)部函數(shù){...}外部函數(shù)也稱全局函數(shù):既可在本文件內(nèi)使用,也可在其他文件中使用的函數(shù)。在定義函數(shù)時,函數(shù)的類型前加extern或省略extern,如:
externintf1()//外部函數(shù):用extern修飾{...}floatf2()//外部函數(shù):省略extern{...}第23頁/共260頁外部函數(shù)應(yīng)用舉例文件c1.cpp定義函數(shù)f():
intf(intx){returnx+1;}在文件c2.cpp中調(diào)用文件c1.cpp中定義的函數(shù)f(),在調(diào)用前必須增加如下函數(shù)原型說明:extern
intf(int);
...inti=f(x);函數(shù)原型說明,將f()函數(shù)的作用域擴展到本文件,以便此后調(diào)用。第24頁/共260頁外部變量文件t1.cpp的內(nèi)容為:
externintx=2;文件t2.cpp的內(nèi)容為:
#include<iostream.h>voidmain(void){externintx;
cout<<x<<'\n';}全局變量x的定義性說明(extern可省),一是獲得了靜態(tài)存儲區(qū)的內(nèi)存和初值,二是允許本文件和其它文件使用。若改成:
externintx;則是引用性說明。編譯上述兩個程序文件時無錯,但鏈接時出錯,原因是找不到全局變量x。t2.cpp文件的main()函數(shù)對外部變量x做了引用性說明,擴展了外部變量x的作用域,使main函數(shù)可以訪問外部變量x。上述兩個程序文件經(jīng)編譯鏈接,并運行后,輸出:
x=2第25頁/共260頁多文件組織程序的原則將一個程序按功能(面向過程)或按類(面向?qū)ο?分成若干模塊,再將每個模塊程序的接口和實現(xiàn)分離,分存于指定的頭文件(".h")和實現(xiàn)文件(".cpp")中。頭文件是模塊的接口,提取的是模塊實現(xiàn)(對內(nèi))和使用(對外)的關(guān)鍵信息,通常包含模塊中的全局類型定義、函數(shù)原型聲明、全局常量和變量的定義、模板和命名空間的定義、編譯預(yù)處理命令、注釋等。實現(xiàn)文件是模塊的實現(xiàn)細(xì)節(jié)。首先,在文件開始,用包含命令包含本模塊的頭文件;其次包含模塊中的函數(shù)定義、類類型的成員函數(shù)定義、編譯預(yù)處理命令、注釋等。第26頁/共260頁面向過程的多文件組織程序?qū)嵗?.4將例1.2的源程序改寫成多文件程序。程序由3個文件組成:頭文件Circle.h是Circle模塊的接口,聲明了函數(shù)area的原型;實現(xiàn)文件Circle.cpp是Circle模塊的實現(xiàn)細(xì)節(jié),即函數(shù)area的定義;程序的主文件mymain.cpp是Circle模塊的使用。⑴Circle.h
#ifndef_CIRCLE_H#define_CIRCLE_Hfloatarea(floatr);
#endif⑵Circle.cpp
#include"Circle.h"constfloatpi=3.1415f;floatarea(floatr){returnpi*r*r;}⑶mymain.cpp#include<iostream.h>
#include"Circle.h"voidmain(void){floatr;cout<<"輸入圓的半徑:";cin>>r;cout<<"半徑為"<<r<<"的圓的面積="<<area(r)<<'\n';}第27頁/共260頁面向過程的多文件組織程序?qū)嵗^文件Circle.h中,應(yīng)有避免其本身被重復(fù)包含的條件編譯命令。在模塊Circle的實現(xiàn)文件Circle.cpp和使用模塊Circle的主文件mymain.cpp中,都包含頭文件Circle.h。前者,用Circle模塊的接口來約束Circle模塊的實現(xiàn)。這樣,模塊的實現(xiàn)中若違反接口約定,則會在編譯時報錯。后者,通過Circle模塊的接口來規(guī)范Circle模塊的使用。一旦違規(guī)使用Circle模塊,也會在編譯時報錯。由此可見,頭文件Circle.h作為Circle模塊的接口,對于Circle模塊的實現(xiàn)和使用都至關(guān)重要。第28頁/共260頁7.4.2
多文件組織程序的編譯和鏈接編譯、鏈接一個由多文件組成的程序,有下列方式:⑴包含命令方式;⑵單獨編譯方式;⑶工程(或項目)文件方式。第29頁/共260頁包含命令方式在定義main()函數(shù)的文件中將組成同一程序的其他文件用包含命令包含進來,由編譯程序?qū)@些源程序文件一起編譯,并鏈接成一個可執(zhí)行的文件。這種方法比較適合規(guī)模不大的程序。但對于大程序來說,這種方法有明顯不足:⑴對任一文件的微小修改,均要重新編譯所有的文件,然后才能鏈接,非常費時;⑵用包含文件的方式將所有文件都包含在一個臨時文件中,使所有的全局性標(biāo)識符(如全局變量、全局類型、函數(shù)等)都在同一個文件作用域內(nèi),使得全局性標(biāo)識符的重名問題、干擾問題非常突出,非常棘手。第30頁/共260頁單獨編譯將各個源程序文件單獨編譯成目標(biāo)程序,然后用操作系統(tǒng)或編譯器提供的鏈接程序?qū)⑦@些目標(biāo)程序文件鏈接成一個可以執(zhí)行的程序文件。這是最原始的多文件組織方法,通常在命令行狀態(tài)下操作,需要記憶常用的編譯選項。雖然,目前的C++編譯器均支持這種方式,但很少有非專業(yè)人士愿意使用。第31頁/共260頁工程(或項目)文件將組成一個程序的所有文件都加到工程(或項目)文件中,由編譯器自動完成這些文件的編譯和鏈接。這是多數(shù)流行C++IDE推薦的方法,使用簡便。有關(guān)工程(或項目)文件的詳細(xì)說明,可查閱有關(guān)C++編譯器的使用手冊。右圖給出了例7.4在VC++6.0IDE中的項目文件結(jié)構(gòu),讀者不妨一試。第32頁/共260頁第8章數(shù)組8.1一維數(shù)組的定義、初始化和使用8.2多維數(shù)組的定義、初始化和使用8.3數(shù)組作為函數(shù)參數(shù)8.4字符數(shù)組8.5字符串處理函數(shù)8.6數(shù)組應(yīng)用舉例作業(yè):3,4,6,12,15
第33頁/共260頁8.1一維數(shù)組的定義、初始化和使用什么是數(shù)組?數(shù)目固定、類型相同的若干個變量的有序的集合。
為什么引入數(shù)組?通過數(shù)組,可以方便地存儲和處理許多同類型數(shù)據(jù)。第34頁/共260頁1.一維數(shù)組的定義
①格式:數(shù)據(jù)類型數(shù)組名[常量表達(dá)式];值必須為正整數(shù)例:intscore[100];floatsalary[3];bool
married[2];charname[4];表示元素個數(shù)第35頁/共260頁1.一維數(shù)組的定義(續(xù))
②數(shù)組的存儲特點:在內(nèi)存中占據(jù)一組連續(xù)的存儲單元。...a[0]a[1]a[2]a[9]例:inta[10];...下標(biāo)的取值范圍:0~數(shù)組元素個數(shù)-1第36頁/共260頁1.一維數(shù)組的定義(續(xù))
③注意點:用常量:constintnum=20;intscore[num];能否用變量?intnum=
20;intscore[num];
!數(shù)組的大小在編譯時必須確定,在程序執(zhí)行過程中不能改變。第37頁/共260頁2.一維數(shù)組的初始化定義數(shù)組時,可以給其中的元素賦初值,稱為數(shù)組的初始化。例:intarr[5]={9,8,7,6,5};數(shù)據(jù)類型數(shù)組名[個數(shù)]={元素1初值,元素2初值,……};初始化方法第38頁/共260頁2.一維數(shù)組的初始化(續(xù))①形式1:對所有元素賦初值。
例如:
inta[10]={0,1,2,3,4,5,6,7,8,9};a[0]...012...9a[1]a[2]a[9]第39頁/共260頁2.一維數(shù)組的初始化(續(xù))①形式1:對所有元素賦初值。
例如:
inta[10]={0,1,2,3,4,5,6,7,8,9};inta[]={0,1,2,3,4,5,6,7,8,9};可省略大小編譯器根據(jù)初值表中元素的個數(shù)自動確定數(shù)組的大小第40頁/共260頁2.一維數(shù)組的初始化(續(xù))②形式2:對部分元素賦初值。
例如:
intb[8]={1,2,3,4,5};
b[0]1235b[1]b[2]4b[3]b[4]b[5]000b[6]b[7]只給前面部分元素賦初值時,后面其余元素的初值自動賦為0第41頁/共260頁3.一維數(shù)組的使用①使用數(shù)組中某一個元素的格式:數(shù)組名[下標(biāo)表達(dá)式]例如:inta[10];a[0]=1,a[9]=2;
第42頁/共260頁3.一維數(shù)組的使用(續(xù))②越界問題若一個數(shù)組含有n個元素,訪問元素時,必須保證下標(biāo)表達(dá)式的值是從0到n-1之間的整數(shù)。如果表達(dá)式的值超出該范圍,這種現(xiàn)象稱為越界。例如:inta[5];a[5]=3;
a[0]a[1]a[2]a[3]a[4]a[5]3數(shù)組存儲空間之外的內(nèi)存單元
錯誤!第43頁/共260頁3.一維數(shù)組的使用(續(xù))③兩個數(shù)組的相互賦值inta[5]={1,2,3,4,5},b[5];b=a;
for(inti=0;i<5;i++)
b[i]=a[i];//錯:數(shù)組之間不能直接相互賦值。第44頁/共260頁3.一維數(shù)組的使用(續(xù))④如何輸入數(shù)組?intscore[5];cin>>score;intscore[5];for(inti=0;i<5;i++)
cin>>score[i];第45頁/共260頁3.一維數(shù)組的使用(續(xù))
⑤如何輸出數(shù)組?inta[5]={1,2,3,4,5};cout<<a;
inta[5]={1,2,3,4,5};for(inti=0;i<5;i++)
cout<<a[i];第46頁/共260頁4.一維數(shù)組的應(yīng)用舉例例8.1
用一維數(shù)組存放前20個斐波那契(Fibonacci)數(shù)并輸出。斐波那契數(shù)的第一和第二個數(shù)分別為0和1,從第三個開始,每個斐波那契數(shù)是前兩個斐波那契數(shù)的和。#include<iostream.h>voidmain(){intfib[20]={0,1};//定義數(shù)組,并初始化
for(inti=2;i<20;i++)//通過循環(huán)依次訪問數(shù)組元素
fib[i]=fib[i-1]+fib[i-2];//置當(dāng)前元素為前兩元素之和
for(i=0;i<20;i++)//輸出前20個斐波那契數(shù)
cout<<fib[i]<<"";}第47頁/共260頁例8.2
某學(xué)校有若干名學(xué)生參加了100米短跑測試,成績分別為13.6、14.8、12.0、12.7、15.6、13.4、14.9、12.6秒,求出其中最快和最慢的成績。
#include<iostream.h>voidmain(){doublescore[]={13.6,14.8,12.0,//100米短跑成績
12.7,15.6,13.4,14.9,12.6},max=score[0],//記錄當(dāng)前最慢成績
min=score[0];//記錄當(dāng)前最快成績
intlen=sizeof(score)/sizeof(double);//計算數(shù)組大小
for(inti=1;i<len;i++)if(score[i]>max)max=score[i];elseif(score[i]<min)min=score[i];cout<<"最快成績:"<<min<<"秒,最慢成績:"<<max<<"秒\n";}第48頁/共260頁8.2多維數(shù)組的定義、初始化和使用
1.二維數(shù)組的定義
數(shù)據(jù)類型數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]例:inta[3][4];floatdata[4][4];第49頁/共260頁理解二維數(shù)組二維數(shù)組可以看作一種特殊的一維數(shù)組,它的每個元素又是一個一維數(shù)組。二維數(shù)組在內(nèi)存中的存儲:按行存放。a[0]-------a[0][0],a[0][1],a[0][2],a[0][3]a[1]-------a[1][0],a[1][1],a[1][2],a[1][3]a[2]-------a[2][0],a[2][1],a[2][2],a[2][3]a第50頁/共260頁2.二維數(shù)組的使用引用數(shù)組元素的一般形式:數(shù)組名[行標(biāo)][列標(biāo)]訪問二維數(shù)組的每個元素,一般通過二重循環(huán)。例如:
intx[2][3];for(inti=0;i<2;i++)for(intj=0;j<3;j++)x[i][j]=i*3+j+1;
第51頁/共260頁3.二維數(shù)組的初始化分行給二維數(shù)組賦值。
inta[2][3]={{1,2,3},{4,5,6}};去掉行的界限賦初值。
inta[2][3]={1,2,3,4,5,6};如果對數(shù)組的全部元素都賦初值可以省略第一維的大小。
inta[][3]={1,2,3,4,5,6};也可只對部分元素賦初值而省略第一維大小,但應(yīng)分行賦初值。
intb[][4]={{3,3,3},{},{1,3}};第52頁/共260頁4.二維數(shù)組應(yīng)用舉例例8.3
某超市有4個連鎖店,定義二維數(shù)組存放各店2006年各個季度的銷售額,計算各店一年的銷售總額。
#include<iostream.h>voidmain(){doublesales[4][5]={0};第53頁/共260頁
for(inti=0;i<4;i++){cout<<"輸入第"<<i+1<<"個店的數(shù)據(jù):";for(intj=0;j<4;j++){cin>>sales[i][j];sales[i][4]+=sales[i][j];}}
cout<<"一季度\t二季度\t三季度\t四季度\t總額\n";for(i=0;i<4;i++,cout<<endl)for(intj=0;j<5;j++)cout<<sales[i][j]<<'\t';}第54頁/共260頁8.3數(shù)組作為函數(shù)參數(shù)
1.?dāng)?shù)組元素作為函數(shù)的實參
若函數(shù)的形參是普通變量,則調(diào)用該函數(shù)時可以用數(shù)組元素做實參,參數(shù)的結(jié)合屬于按值傳遞。
例8.5
數(shù)組元素作為函數(shù)的實參。#include<iostream.h>inlineintsquare(intx){returnx*x;}第55頁/共260頁
voidmain(){inta[5][2],i;for(i=0;i<5;i++){a[i][0]=i+1;a[i][1]=square(a[i][0]);
//數(shù)組元素做square函數(shù)的實參
}for(i=0;i<5;i++)cout<<a[i][0]<<'\t'<<a[i][1]<<'\n';}第56頁/共260頁2.一維數(shù)組作為函數(shù)的參數(shù)數(shù)組名代表該數(shù)組所占內(nèi)存的起始位置值。若一維數(shù)組做函數(shù)的形參,則調(diào)用該函數(shù)時,相應(yīng)的實參用數(shù)組名。用數(shù)組名作函數(shù)實參時,傳遞給形參的是實參數(shù)組所占內(nèi)存的起始位置值,這樣兩個數(shù)組就合用實參數(shù)組的內(nèi)存單元。12345a[0]a[1]a[2]a[3]a[4]x[0]x[1]x[2]x[3]x[4]8a[7]x[7]…mul函數(shù)中main函數(shù)中合用內(nèi)存第57頁/共260頁例8.6
設(shè)計一個函數(shù),完成數(shù)與向量的乘法運算。#include<iostream.h>voidmul(inta[],intsize,intn){for(inti=0;i<size;i++)a[i]*=n;}voidmain(){inti,x[8]={1,2,3,4,5,6,7,8};for(i=0;i<8;i++)cout<<x[i]<<'\t';cout<<endl;
mul(x,8,2);for(i=0;i<8;i++)cout<<x[i]<<'\t';}第58頁/共260頁例8.7
設(shè)計一個函數(shù),計算一維整型數(shù)組元素總和。#include<iostream.h>intsum(inta[],intsize)//size為形參數(shù)組大小{inttotal=0;//存放總和,置初值0for(inti=0;i<size;i++)//逐個訪問元素
total+=a[i];//累加
returntotal;}voidmain(void){inta[]={1,2,3,4,5,6,7,8,9,10},b[]={78,90,98,76,82};cout<<"數(shù)組a的元素之和:"<<sum(a,sizeof(a)/4)<<endl;cout<<"數(shù)組b的元素之和:"<<sum(b,sizeof(b)/4)<<endl;}第59頁/共260頁3.二維數(shù)組作為函數(shù)的參數(shù)voidTranspose(inta[][4],intn){for(inti=0;i<n;i++)for(intj=i;j<4;j++){intt=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}}例8.8
設(shè)計程序,將一個4行4列的二維數(shù)組a中行和列元素互換。應(yīng)明確指明列數(shù)此處指定行數(shù)無效需另設(shè)參數(shù)指定行數(shù)第60頁/共260頁8.4字符數(shù)組字符數(shù)組:元素是字符的數(shù)組。字符數(shù)組初始化:
chars1[3]={‘c',‘a(chǎn)',‘r'};chars2[4]={‘c',‘a(chǎn)',‘r‘,‘\0'};chars2[]={“car”};//字符串后自動加'\0'chars2[]=“car”;//字符串后自動加'\0'‘\0’:字符串字符串結(jié)束標(biāo)志。主要用于字符串的處理和輸出。第61頁/共260頁字符數(shù)組的輸入和輸出:可整體進行。
chars4[20];cin>>s4;//輸入一個字符串存入s4數(shù)組
cout<<s4;//輸出s4數(shù)組中存放的字符串運行時若輸入:
JiangsuChina↙
則輸出為:
Jiangsu
而不是
JiangsuChina注意:cin輸入時,若遇空白符,則認(rèn)為字符串結(jié)束。輸出時,若遇字符‘\0’,則認(rèn)為字符串結(jié)束。第62頁/共260頁函數(shù)cin.getline():用于輸入包含空白符的字符串。第一個參數(shù):字符數(shù)組名;第二個參數(shù):允許輸入的最多字符個數(shù)。例8.9使用函數(shù)cin.getline()實現(xiàn)字符串的輸入。
#include<iostream.h>voidmain(void){charstr[51];cout<<"輸入一行字符串:";cin.getline(str,50);cout<<"str="<<str<<'\n';}第63頁/共260頁8.5字符串處理函數(shù)字符串的比較、賦值等操作只能用字符串處理函數(shù)。字符串處理函數(shù):在頭文件string.h中聲明。strlen(字符串):求字符串中第一個‘\0’前的字符個數(shù),不含‘\0’。例如:
cout<<strlen("abcd");//結(jié)果為4cout<<strlen(“\t\v\\\0will\n\0”);//結(jié)果為3
調(diào)用該函數(shù)時也可用字符數(shù)組名做實參。例如:
chars1[]="today";cout<<strlen(s1);第64頁/共260頁字符串復(fù)制函數(shù)
strcpy(字符數(shù)組名1,字符數(shù)組名2)
功能:將字符數(shù)組2中第一個‘\0’前的字符(包括結(jié)束標(biāo)志)復(fù)制到字符數(shù)組1中去。例:
chara[]="flower";charb[]="red\0white";strcpy(a,b);cout<<a<<endl;//輸出結(jié)果為red第65頁/共260頁字符串連接函數(shù)
strcat(字符數(shù)組名1,字符數(shù)組名2)
功能:將字符數(shù)組名2中的第一個‘\0’前的字符連接到字符數(shù)組名1的第一個‘\0’開始的單元中。例如:
chars1[20]="note\0this",s2[10]="book\0s";strcat(s1,s2);cout<<s1<<endl;//輸出結(jié)果為notebook第66頁/共260頁字符串比較函數(shù)
strcmp(字符串1,字符串2)功能:比較兩個字符串,并返回一個int型值。比較的規(guī)則從第一個字符開始,依次對字符串1和字符串2對應(yīng)位置上的字符按ASCII代碼的大小進行比較,直至出現(xiàn)一對不同的字符或遇到字符串的結(jié)束符‘\0’為止。若兩個字符串中的字符都相同,則認(rèn)為兩個字符串相等;當(dāng)兩個字符串不等時,以最先出現(xiàn)的兩個不同字符的比較結(jié)果作為字符串的比較結(jié)果。例如:strcmp(“cap”,“cap”)//相等為0strcmp(“pen”,“pencil”)//小于0strcmp(“chinese”,“china”)//大于0第67頁/共260頁例8.11輸入三個字符串,按升序排序后輸出。
#include<iostream.h>#include<string.h>voidstrswap(chara[],charb[])//交換兩個字符串
{chart[20];strcpy(t,a);strcpy(a,b);strcpy(b,t);}voidmain(void){chars[3][20];cout<<"輸入三行字符串(每行不超過20個字符):\n";cin>>s[0]>>s[1]>>s[2];//輸入三個字符串
if(strcmp(s[0],s[1])>0)strswap(s[0],s[1]);if(strcmp(s[0],s[2])>0)strswap(s[0],s[2]);if(strcmp(s[1],s[2])>0)strswap(s[1],s[2]);cout<<"排序后的結(jié)果為:\n";for(inti=0;i<3;i++)cout<<s[i]<<'\n';}第68頁/共260頁8.6
數(shù)組應(yīng)用舉例8.6.1排序排序:將一個序列,按元素值的大小重新排列成一個有序序列。數(shù)據(jù)處理的基本操作。升序:元素從小到大降序:元素從大到小常用排序方法:選擇排序冒泡排序插入排序第69頁/共260頁1.選擇排序法基本思想(以升序為例):首先從所有元素中找出最小元素,并將其與序列中的第一個元素交換。此時第一個元素作為新序列的第一個元素,不再參與后續(xù)排序。第二次從剩下的元素中找出最小元素,將其與序列中第二個元素進行交換。依次類推,直到待排序序列中只剩下一個元素。第70頁/共260頁圖8-6選擇排序過程示意圖第71頁/共260頁例8.12
輸入10個整數(shù),用選擇排序法進行排序(升序)。voidSelectSort(inta[],intsize){intminIndex,t;for(inti=0;i<size;i++){//i為排序趟數(shù)
minIndex=i;//設(shè)本趟最小元素的下標(biāo)初值
for(intj=i+1;j<size;j++)if(a[j]<a[minIndex])
minIndex=j;//發(fā)現(xiàn)更小元素,記錄其下標(biāo)
if(minIndex!=i)//把本趟的最小元素交換至前面
t=a[i],a[i]=a[minIndex],a[minIndex]=t;}}每趟最多交換一次第72頁/共260頁#include<iostream.h>voidSelectSort(inta[],intsize);voidmain(){inta[10],i;cout<<"Pleaseinput10integers:\n";for(i=0;i<10;i++)//輸入10個整數(shù)
cin>>a[i];
SelectSort(a,10);//排序
for(i=0;i<10;i++)//輸出排序后的數(shù)組
cout<<a[i]<<"";}第73頁/共260頁2.冒泡排序法
基本思想(以升序為例):首先比較序列中第一個元素與第二個元素,若為逆序,則交換兩元素,然后比較第二、第三個元素,依次進行下去,直到對最后兩個元素進行了比較和交換。這是第一趟排序過程,結(jié)果把最大元素交換到最后位置。最后一個元素不再參加排序。然后再從前往后訪問剩余元素組成的序列,比較相鄰元素,把其中最大元素交換到最后位置。如此繼續(xù),直到某一趟未發(fā)生任何交換或新序列中只剩下一個元素,排序結(jié)束。第74頁/共260頁圖8-7冒泡排序過程示意圖第75頁/共260頁例8.13輸入10個整數(shù),用冒泡排序法進行排序(升序)。
voidBubbleSort(inta[],intsize){inti,j,t,flag;for(i=1;i<size;i++)//i為排序趟數(shù)
{flag=0;//設(shè)標(biāo)志判斷本趟是否有交換
for(j=0;j<size-i;j++)if(a[j]>a[j+1])//相鄰元素比較和交換
t=a[j],a[j]=a[j+1],a[j+1]=t,flag=1;
if(!flag)break;//本趟無交換,說明序列已有序,不必再排序。
}}第76頁/共260頁#include<iostream.h>voidBubbleSort(inta[],intsize);
voidmain(void){inta[10],i;cout<<"Pleaseinput10integers:\n";for(i=0;i<10;i++)//輸入10個整數(shù)
cin>>a[i];
BubbleSort(a,10);//冒泡排序
for(i=0;i<10;i++)//輸出排序后的數(shù)組
cout<<a[i]<<"";}第77頁/共260頁8.6.2查找
查找:在序列中尋找某個或某些數(shù)據(jù)的過程。查找的方法:順序查找法二分查找法……第78頁/共260頁1.順序查找法
順序查找法的思想:按照從前到后的順序依次訪問序列中的元素,并將其與待查值進行比較,直到找到與待查值相等的元素或序列結(jié)束。如果查找至序列結(jié)束時,仍未發(fā)現(xiàn)與待查值相等的元素,則查找不成功。第79頁/共260頁例8.14用順序查找法在輸入的10個整數(shù)中查找指定值。
#include<iostream.h>intSeqSearch(inta[],intsize,intkey){for(inti=0;i<size;i++)if(a[i]==key)//若找與待查值相等的元素
returni;//則返回其元素的下標(biāo)
return-1;//查找不成功,返回-1}voidmain(){inta[]={45,89,87,12,34,22,90,77,53,10};if(SeqSearch(a,10,26)!=-1)cout<<"Found!\n";elsecout<<"Notfound!\n";}第80頁/共260頁2.二分查找法適用條件:有序序列。基本思路:首先比較待查值與序列中中間元素值的大小,如果相等,則查找成功;否則在序列的前半部分和后半部分二者中,選擇可能包含待查值的那半部分繼續(xù)查找。重復(fù)上述過程直至找到與待查值相等的元素,或者查找范圍的長度小于零表示查找不成功。第81頁/共260頁第82頁/共260頁例8.15用二分查找法在元素呈升序排列的數(shù)組中查找指定值。
intHalfSearch(inta[],intsize,intkey){intstart=0,end=size-1,mid;//設(shè)首、末元素下標(biāo)
while(start<=end){mid=(start+end)/2;//計算中間元素下標(biāo)
if(key==a[mid])//找到待查元素
returnmid;//返回其下標(biāo)
elseif(key>a[mid])//若待查值大于中間元素,
start=mid+1;//取后半部分繼續(xù)查找
elseend=mid-1;//否則取前半部分繼續(xù)查找
}return–1;//未找到,返回-1}第83頁/共260頁#include<iostream.h>intHalfSearch(inta[],intsize,intkey);voidmain(void){inta[10],value,n,i;cout<<"請輸入10個升序的整數(shù):\n";for(i=0;i<10;i++)cin>>a[i];cout<<"請輸入待找的整數(shù):\n";cin>>value;if((n=HalfSearch(a,10,value))!=-1)cout<<"數(shù)組中找到"<<value<<",是第"<<n+1<<"個元素!\n";elsecout<<"數(shù)組中沒有要找的值!\n";}第84頁/共260頁8.6.3統(tǒng)計統(tǒng)計:對序列中的數(shù)據(jù)進行分析計算,得出一些匯總數(shù)據(jù)。例如,獲得:總和平均值最大值最小值均方差分布在特定范圍的數(shù)據(jù)個數(shù)第85頁/共260頁例8.16一個班級有20名學(xué)生,編寫程序,從鍵盤輸入所有學(xué)生的英語考試成績,求出全班該門課程的平均成績。并統(tǒng)計考試成績優(yōu)秀(90分以上,包括90分)的學(xué)生人數(shù)和不及格(60分以下)的學(xué)生人數(shù)。#include<iostream.h>constintnum=20;voidmain(){intscore[num],//存放20名學(xué)生成績
sum=0,//累計總成績
HighScoreCount=0,//記錄優(yōu)秀的人數(shù)
UnPassedCount=0;//記錄不及格的人數(shù)第86頁/共260頁
for(inti=0;i<num;i++)//統(tǒng)計
{cin>>score[i];//輸入一個成績
sum+=score[i];//累加一個成績
if(score[i]>=90)//大于90分
HighScoreCount++;//優(yōu)秀人數(shù)增1elseif(score[i]<60)//小于60分
UnPassedCount++;//不及格人數(shù)增1}cout<<”平均成績:”<<(sum/num)<<”,優(yōu)秀人數(shù):”<<HighScoreCount<<”,不及格人數(shù):”<<UnPassedCount<<endl;}第87頁/共260頁8.6.4字符處理例8.17
有一封待發(fā)的電文,請按以下規(guī)律譯成密碼:
A→Za→zB→Yb→yC→Xc→x
……
即第一個字母變成第26個字母,第i個字母變成第(26-i+1)個字母。非字母字符不變。要求編程實現(xiàn)上述加密功能,輸入原文,輸出密文,然后解密并顯示解密后的效果。第88頁/共260頁#include<iostream.h>#include<string.h>voidencrypt(char[],int);voidmain(void){chartext[1024];//定義字符數(shù)組,存放字符串
cout<<"輸入明文:";
cin.getline(text,1024);//輸入字符串
intlen=strlen(text);//計算字符串長度
encrypt(text,len);
//加密
cout<<"密文為:"<<text<<endl;
encrypt(text,len);
//解密與加密方法相同
cout<<"解密后為:"<<text<<endl;}第89頁/共260頁//加密函數(shù)voidencrypt(charstr[],intsize){for(inti=0;i<size;i++)
if(str[i]>='A'&&str[i]<='Z')str[i]='A'+'Z'-str[i];//替換成密碼字符
elseif(str[i]>='a'&&str[i]<='z')
str[i]='a'+'z'-str[i];//替換成密碼字符}第90頁/共260頁第9章結(jié)構(gòu)體、共用體和枚舉類型9.1結(jié)構(gòu)體的定義及應(yīng)用9.2位域*9.3共用體的定義及應(yīng)用9.4枚舉類型作業(yè):3,6,7第91頁/共260頁9.1結(jié)構(gòu)體的定義及應(yīng)用設(shè)每個學(xué)生的數(shù)據(jù)包括:姓名:字符型數(shù)組年齡:無符號整型成績:單精度浮點類型如何存放10位學(xué)生的原始數(shù)據(jù)?解:定義3個數(shù)組分別存放10位學(xué)生的姓名、年齡和成績,用數(shù)組下標(biāo)區(qū)別不同的學(xué)生:charname[10][20];//存放10位學(xué)生的姓名intage[10];//年齡floatscore[10];//成績用name[i]、age[i]和score[i]表示第i個學(xué)生數(shù)據(jù)。第92頁/共260頁不足:變量多、未能直接反映同一學(xué)生數(shù)據(jù)間的聯(lián)系。改進:①定義結(jié)構(gòu)體類型,描述同一學(xué)生的多個數(shù)據(jù):
structstudent{//反映同一學(xué)生數(shù)據(jù)間的聯(lián)系charname[20];//姓名intage;//年齡floatscore;//成績};②定義student類型的數(shù)組,存放10位學(xué)生的數(shù)據(jù):
students[10];//變量少結(jié)構(gòu)體可將不同類型的數(shù)據(jù)組織為一個整體。第93頁/共260頁9.1.1結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型需先定義后使用,其定義格式:
struct結(jié)構(gòu)體類型名{類型1成員1;類型2成員2;
……};說明結(jié)構(gòu)體類型名用標(biāo)識符表示。成員可以是基本類型或?qū)С鲱愋偷淖兞?,不能指定存儲類型為auto、register、extern,但可指定存儲類型為static。定義結(jié)構(gòu)體類型用分號“;”表示結(jié)束。結(jié)構(gòu)體類型是一個存儲模型,本身不占內(nèi)存,僅當(dāng)定義其變量時,系統(tǒng)才按此存儲模型為其變量分配相應(yīng)的內(nèi)存。第94頁/共260頁9.1.2結(jié)構(gòu)體類型變量的定義定義結(jié)構(gòu)體類型變量的格式為:結(jié)構(gòu)體類型名變量列表;或struct結(jié)構(gòu)體類型名變量列表;其中,結(jié)構(gòu)體類型名為已定義的類型;多個變量之間用逗號分隔;后一種格式與C兼容。例如:
students1,s2,s3[10];或
structstudents1,s2,s3[10];第95頁/共260頁student類型變量s1的內(nèi)存分配圖…按student類型的存儲模型為其變量s1分配內(nèi)存。student類型的存儲模型所需內(nèi)存字節(jié)數(shù):
sizeof(student)s1變量各成員在內(nèi)存中的順序與其類型中成員說明的順序一致。name占20字節(jié)age占4字節(jié)score占4字節(jié)第96頁/共260頁結(jié)構(gòu)體類型變量定義的其他形式結(jié)構(gòu)體類型變量也可在聲明結(jié)構(gòu)體類型的同時定義。例如:
structDate{intyear,month,day;}today,yesterday;再如:struct{//定義一個無名結(jié)構(gòu)類型inta;floatb;}x,y;無名結(jié)構(gòu)體類型不能在該類型定義之外定義其變量。第97頁/共260頁結(jié)構(gòu)體類型變量的初始化結(jié)構(gòu)體變量的初始化:與數(shù)組的初始化方式類似,在花括號中,按結(jié)構(gòu)體成員說明的順序依次列出其值。例如:students1={"Jenny",20,98};Datetoday={2007,1,2};
structComplex{floatreal,image;}c1={2.0f,3.0f},c2;第98頁/共260頁9.1.3結(jié)構(gòu)體類型變量的使用訪問結(jié)構(gòu)體變量成員的格式為:結(jié)構(gòu)體變量.成員名其中“.”是成員訪問運算符。例如:
today.year表示訪問結(jié)構(gòu)體變量today的成員year。相同結(jié)構(gòu)體類型的變量之間可直接賦值。例如:
structweather{doubletemp,wind;}w1={7.5,3.2},w2=w1;其中“w2=w1;”等同于:
w2.temp=w1.temp;w2.wind=w1.wind;第99頁/共260頁結(jié)構(gòu)體類型變量不能直接輸入/輸出,其成員能否直接輸入/輸出,取決于其成員的類型,若是基本類型或字符數(shù)組,則可直接輸入/輸出。如:
cin>>s1;//錯誤
cin>>>>s1.age>>score;//正確
cout<<s1;//錯誤
cout<<<<s1.age<<score;//正確結(jié)構(gòu)體類型變量做函數(shù)的形參時,調(diào)用函數(shù)的實參必須是相同結(jié)構(gòu)體類型的變量。參數(shù)的傳遞方式為值傳遞,系統(tǒng)將實參的每個成員逐個拷貝給對應(yīng)的形參成員。結(jié)構(gòu)體類型變量也可做函數(shù)的返回值。第100頁/共260頁例9.1編寫求兩分?jǐn)?shù)之和的函數(shù),并用它求1/8+5/24。#include<iostream.h>structFraction{intnum,den;//分別為分?jǐn)?shù)的分子和分母};
intgcd(intm,intn)//求m和n的最大公約數(shù){intt;if(m<n){t=m;m=n;n=t;}while(t=m%n){m=n;n=t;}returnn;}第101頁/共260頁
Fractionadd(Fractionx,Fractiony)//求分?jǐn)?shù)和{Fractionz;z.num=x.num*y.den+y.num*x.den;//求分子
z.den=x.den*y.den;//求分母
inta=gcd(z.num,z.den);
z.num/=a;z.den/=a;//約分化簡returnz;}voidmain(){Fractionx={1,8},y={5,24},z;
z=add(x,y);//調(diào)用函數(shù)求分?jǐn)?shù)之和
cout<<"x+y="<<z.num<<‘/’<<z.den<<endl;}第102頁/共260頁例9.2電視臺舉報青年歌手大獎賽,請輸入每位選手的姓名、編號及演唱得分、綜合素質(zhì)得分、新歌得分(演唱新歌加0.3分),計算每人的總分,然后輸出每人的全部信息。#include<iostream.h>structSinger{//定義結(jié)構(gòu)體類型,描述青年歌手
charname[10];//姓名charno[8];//編號floatsingScore,//演唱得分diaScore,//綜合素質(zhì)得分newScore;//新歌得分floatsum;//總分};constintn=3;//參賽青年歌手人數(shù)第103頁/共260頁voidmain(){Singers[n];//定義結(jié)構(gòu)體數(shù)組
for(inti=0;i<n;i++){cout<<"輸入第"<<i+1<<“位選手的姓名、編號和三項得分:”;cin>>s[i].name>>s[i].no>>s[i].singScore>>s[i].diaScore>>s[i].newScore;s[i].sum=s[i].singScore+s[i].diaScore+s[i].newScore;//求總分}
for(i=0;i<n;i++)cout<<s[i].name<<'\t'<<s[i].no<<'\t'<<s[i].singScore<<'\t'<<s[i].diaScore<<'\t'<<s[i].newScore<<'\t'<<s[i].sum<<endl;}第104頁/共260頁9.2位域*內(nèi)存浪費現(xiàn)象比比皆是。例如:人的性別只需1個二進制位就可精確表示,但通常用字符型或字符型數(shù)組表示。人的年齡只需7個二進制位就可精確表示,但通常用整型變量表示。針對上述情況,如何節(jié)約使用內(nèi)存?位域:結(jié)構(gòu)體中指定了存儲位數(shù)的成員稱為位域。使用位域可解決上述問題。位域類型:含有位域的結(jié)構(gòu)體類型。第105頁/共260頁定義位域類型格式為:
struct位域類型名{類型名位域名1:二進制位數(shù);//定義位域類型名位域名2:二進制位數(shù);//定義位域
……//定義其它成員};其中,位域類型名用標(biāo)識符表示,類型名只能是整型和字符型,二進制位數(shù)必須是大于或等于0的整數(shù)。第106頁/共260頁例如:
structdata{unsignedshortflaga:1;//取值0或1unsignedshortflagb:3;//取值0~7unsignedshortflagc:4;//取值0~15shortflagd:4;//取值-8~7}f1;位域類型data的變量f1的內(nèi)存分配圖1514131211109876543210注:同一字中位域的分配方向因系統(tǒng)而異,可能從右到左,也可能從左到右。VC++從右到左。第107頁/共260頁若要跳過幾個二進位,可定義無名位域。若無名位域的位數(shù)為0,則表示下一位域從新單元開始。如:
structPackedData{unsignedflaga:4;unsigned:2;//跳過2個二進位,預(yù)留
unsigned:0;//下一位域從新單元開始unsignedflagd:7;};
flagd位域從下一個unsigned存儲單元開始存儲。這樣PackedData類型需要2個unsigned存儲單元。第108頁/共260頁位域類型變量的定義、初始化和使用位域類型變量的定義、初始化和用法與結(jié)構(gòu)體類型變量相同。例如:
dataf2={0,4,10,-1};f2.flagc=12;注意:位域賦值時,若所賦數(shù)值超出位域的表示范圍,則取其低位數(shù)字。例如:
f2.flagb=10;因10已超出flagb位域0~7的表示范圍,故賦給flagb位域的是10的二進制表示的低三位:10的二進制為1010即f2.flagb實際為2。位域變量節(jié)省內(nèi)存,但存取費時。使用時注意權(quán)衡。第109頁/共260頁例9.3用位域來存放學(xué)生的信息。#include<iostream.h>constintnum=2;structstudent{charname[10];//姓名:非位域成員
unsignedshortsex:1;//性別:位域成員
unsignedshortage:7;//年齡:位域成員
unsignedshortscore:7;//成績:位域成員};voidmain(){cout<<"sizeof(student)="<<sizeof(student)<<endl;students[num]={{"Tonny",1,19,98},{"Jenny",0,18,85}};for(inti=0;i<num;i++)cout<<s[i].name<<','<<s[i].sex<<','<<s[i].age<<','<<s[i].score<<endl;}第110頁/共260頁9.3共用體的定義及應(yīng)用有時希望多個變量共用同一塊內(nèi)存,可通過定義共用體類型的變量來實現(xiàn)。共用體類型的定義格式:
union共用體類型名{數(shù)據(jù)類型成員名1;數(shù)據(jù)類型成員名2;
……};在定義和使用形式上,共用體與結(jié)構(gòu)體相似:由多個成員組成,成員的類型可以不同。在內(nèi)存分配上,共用體與結(jié)構(gòu)體有本質(zhì)區(qū)別:結(jié)構(gòu)體的每個成員都有自己的獨占內(nèi)存;而共用體的每個成員共用同一塊內(nèi)存。共同體存儲區(qū)域的大小由占用最大存儲區(qū)的成員決定。第111頁/共260頁例如:
unionudata{charc;inti;doubled;};共用體類型定義后,即可定義
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 保險代理居間合同委托書
- 服裝企業(yè)辦公大廈居間協(xié)議
- 液態(tài)化學(xué)試劑配送合同
- 2025年度工業(yè)控制系統(tǒng)安全工程師勞動合同
- 娛樂場所泔水運輸合作協(xié)議
- 家具城配送服務(wù)合同模板
- 煤矸石清運施工方案
- 綿陽市道路施工方案
- 完善教育評價體系:深化改革的策略與路徑探索
- 初中藏文版數(shù)學(xué)試卷
- 康復(fù)評定頸椎病
- 公司安全生產(chǎn)事故隱患內(nèi)部報告獎勵工作制度
- H3CNE認(rèn)證考試題庫官網(wǎng)2022版
- 感統(tǒng)訓(xùn)練培訓(xùn)手冊(適合3-13歲兒童)
- 公司章程范本(完整版)
- 廠房委托經(jīng)營管理合同范本
- 《保險科技》課件-第二章 大數(shù)據(jù)及其在保險領(lǐng)域中的應(yīng)用
- 父母贈與田地協(xié)議書范本
- 中藥甘草課件
- 解讀國有企業(yè)管理人員處分條例(2024)課件(全文)
- 煙草企業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化規(guī)范1-200題附有答案
評論
0/150
提交評論