C++高級(jí)語言程序設(shè)計(jì)第四章課件_第1頁
C++高級(jí)語言程序設(shè)計(jì)第四章課件_第2頁
C++高級(jí)語言程序設(shè)計(jì)第四章課件_第3頁
C++高級(jí)語言程序設(shè)計(jì)第四章課件_第4頁
C++高級(jí)語言程序設(shè)計(jì)第四章課件_第5頁
已閱讀5頁,還剩88頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C++高級(jí)語言程序設(shè)計(jì)第4章

數(shù)組及其他自定義類型

北京郵電大學(xué)信息與通信工程學(xué)院

2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院1第4章

數(shù)組及其他自定義類型4.1數(shù)組數(shù)組基本概念、數(shù)組初始化、訪問數(shù)組元素、字符型數(shù)組、多維數(shù)組4.2枚舉類型枚舉類型的定義、枚舉型變量的定義及使用4.3結(jié)構(gòu)類型結(jié)構(gòu)類型的定義、結(jié)構(gòu)變量的定義及初始化、結(jié)構(gòu)變量的使用4.4聯(lián)合類型聯(lián)合類型的定義、聯(lián)合型變量的定義及使用2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-2-4.1數(shù)組數(shù)組是具有一定順序關(guān)系的若干相同類型變量的集合,組成數(shù)組的變量稱為該數(shù)組的元素。數(shù)組屬于構(gòu)造類型。數(shù)組是實(shí)際編程中經(jīng)常使用的一種數(shù)據(jù)結(jié)構(gòu)。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-3-4.1.1數(shù)組定義及初始化1.一維數(shù)組的定義一維數(shù)組定義的語法形式

類型標(biāo)識(shí)符

數(shù)組名[常量表達(dá)式];說明

類型標(biāo)識(shí)符:任何合法的類型標(biāo)識(shí)符,用于說明數(shù)組元素的類型;數(shù)組名

:程序員對(duì)該數(shù)組的命名,數(shù)組的命名規(guī)則同變量命名;方括號(hào)及常量表達(dá)式:用于說明該數(shù)組中元素的個(gè)數(shù)。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-4-4.1.1數(shù)組定義及初始化例:10級(jí)119班30名同學(xué)“C++程序設(shè)計(jì)”課程的成績

intCscore[30];

實(shí)驗(yàn),測得一組電阻R隨溫度T變化的值

floatRi[30];shortTc[30];2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-5-4.1.1數(shù)組定義及初始化一維數(shù)組在內(nèi)存中存儲(chǔ)映射

intscore[5];2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-6-4.1.1數(shù)組定義及初始化注意定義一個(gè)數(shù)組,系統(tǒng)為這個(gè)數(shù)組保留一定數(shù)量的連續(xù)內(nèi)存單元,數(shù)組元素依次占用這一連續(xù)內(nèi)存空間,這段內(nèi)存空間起始地址的外部標(biāo)識(shí)就是數(shù)組名;數(shù)組名是一個(gè)地址常量,禁止給數(shù)組名賦值;數(shù)組各元素用數(shù)組名及下標(biāo)(或稱索引值)來標(biāo)識(shí),score[0],score[1],…,score[4]分別表示數(shù)組的第1~5個(gè)元素;C語言和C++語言中,元素的下標(biāo)從0開始計(jì),數(shù)組元素的最大下標(biāo)比元素個(gè)數(shù)少1,數(shù)組score最大下標(biāo)對(duì)應(yīng)的元素是score[4],而不是score[5](訪問越界);2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-7-4.1.1數(shù)組定義及初始化注意數(shù)組名表示數(shù)組在內(nèi)存中的起始地址,可以將元素的下標(biāo)理解為元素存放位置相對(duì)于數(shù)組名的偏移量,第i個(gè)元素score[i]的起始地址相對(duì)于數(shù)組的起始地址偏移了i個(gè)int型變量所占空間;每個(gè)元素可以視為一個(gè)同類型的變量,如score[i]可以視為一個(gè)整型變量;數(shù)組的每個(gè)元素占用空間大小與同類型變量占用的內(nèi)存大小一樣;數(shù)組占用的內(nèi)存空間是其全部元素所占空間的總和,如果數(shù)組有N個(gè)元素,它所占的字節(jié)數(shù)可以通過以下方式得到:sizeof(數(shù)組名)或

N*sizeof(數(shù)組類型)。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-8-4.1.1數(shù)組定義及初始化2.數(shù)組初始化在定義數(shù)組時(shí),直接給出賦給數(shù)組元素的值,稱為數(shù)組初始化。數(shù)組初始化語法形式

類型標(biāo)識(shí)符

數(shù)組名[常量表達(dá)式]={以逗號(hào)隔開的初始化值};

2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-9-4.1.1數(shù)組定義及初始化例:定義并初始化整型數(shù)組score[5]的語句為:

intscore[5]={80,70,90,95,60};初始化列表中的數(shù)據(jù)依次賦給元素score[0]、score[1]、score[2]、score[3]、score[4]。注意不要丟掉語句最后的分號(hào)。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-10-4.1.1數(shù)組定義及初始化注意初始化數(shù)組時(shí),給定的初始化數(shù)值不能比數(shù)組元素多,但可以比數(shù)組元素少;如果少,初始化列表中的初始值將從下標(biāo)0開始依次分配給各元素,后面沒有得到初始值的元素被初始化為0。

doubled[10]={1.0,2.0};如果使用初始化列表,則表內(nèi)至少包含一個(gè)初始值,否則編譯將出現(xiàn)錯(cuò)誤。如果沒有初始化列表,即只定義不做初始化,一般在函數(shù)內(nèi)部定義的自動(dòng)局部數(shù)組,其各元素的值是隨機(jī)值,使用時(shí)需要重新給數(shù)組元素賦值。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-11-4.1.1數(shù)組定義及初始化如果在初始化列表中給定數(shù)組元素的全部值,可以省略中括號(hào)中元素個(gè)數(shù)常量表示式。上述score數(shù)組的初始化也可以寫成:

intscore[]={80,70,90,95,60};此時(shí),編譯器自動(dòng)計(jì)算出數(shù)組元素的個(gè)數(shù)為5,給score數(shù)組分配能夠存放5個(gè)int型數(shù)據(jù)的連續(xù)空間。思考題:如何將一個(gè)在某函數(shù)內(nèi)部定義的自動(dòng)局部數(shù)組的所有元素都初始化為0?最簡單的方法是什么?2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-12-4.1.1數(shù)組定義及初始化例4-1定義各種基本類型的數(shù)組并初始化,利用debug調(diào)試方式觀察數(shù)組各元素得到的值、數(shù)組占用的空間、數(shù)組元素占用的空間。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-13-2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-14-//例4-1數(shù)組的定義、初始化,查看數(shù)組的大小#include<iostream>usingnamespacestd;voidmain(){constintN=5;charchArray[N];shortintshArray[N]={1,2,3,4,5};intiArray[N]={10};floatfArray[]={3.1f,4.1f,5.0f};doubledArray[N]={3.14,6.28};intk;

2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-15-for(k=0;k<N;k++){ cout<<chArray[k]<<",";}cout<<endl;for(k=0;k<N;k++){ cout<<shArray[k]<<",";}cout<<endl;for(k=0;k<N;k++){ cout<<iArray[k]<<",";}cout<<endl;for(k=0;k<3;k++){ cout<<fArray[k]<<",";}cout<<endl;for(k=0;k<N;k++){ cout<<dArray[k]<<",";}cout<<endl;}運(yùn)行結(jié)果:

?????

1,2,3,4,5,

10,0,0,0,0,

3.1,4.1,5,

3.14,6.28,0,0,0,說明符號(hào)常量N,用于說明數(shù)組的大??;使用符號(hào)常量說明數(shù)組的大小便于程序修改,如果想讓數(shù)組的大小為100,只需修改N的值即可,其他語句不需要修改;在多文件結(jié)構(gòu)中,可將一些符號(hào)常量的定義放在頭文件中,更利于工程的維護(hù)和修改。4.1.2訪問數(shù)組元素

數(shù)組元素是用下標(biāo)來區(qū)分的,指定要訪問的數(shù)組元素的語法形式為:數(shù)組名[下標(biāo)表達(dá)式]下標(biāo)表達(dá)式:可以是常量、變量或表達(dá)式,其值大于或等于0,小于數(shù)組的大小。例:constintN=8;floatangle[N];for(intk=0;k<N;k++){angle[k]=3.14f/N*k;//給元素賦值,寫操作

cout<<angle[k]<<",";//讀取元素值

}2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-16-4.1.2訪問數(shù)組元素例4-2將正弦函數(shù)的一個(gè)周期2分為N等份,定義數(shù)組分別存儲(chǔ)自變量值和函數(shù)值,并顯示數(shù)組元素的值。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-17-2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-18-//例4-2用數(shù)組存儲(chǔ)和顯示正弦函數(shù)一周期內(nèi)的值#include<iostream>#include<cmath>#include<iomanip>usingnamespacestd;voidmain(){constintN=8;doublex[N];//自變量值

doubley[N];//函數(shù)值

constdoublePI2=3.14159*2;doubledelta=PI2/N;cout<<setw(8)<<"弧度"<<setw(12)<<"sin(x)"<<endl;for(intk=0;k<N;k++){x[k]=k*delta;y[k]=sin(x[k]);cout<<setw(10)<<x[k]<<","<<y[k]<<endl;}}運(yùn)行結(jié)果:

弧度sin(x)0,00.785397,0.7071061.57079,12.35619,0.7071083.14159,2.65359e-0063.92699,-0.7071044.71238,-15.49778,-0.707114.1.2訪問數(shù)組元素訪問數(shù)組元素時(shí)需要注意(1)數(shù)組元素的下標(biāo)表達(dá)式的結(jié)果必須為0或正整數(shù)。(2)數(shù)組元素的下標(biāo)值不得超過數(shù)組聲明時(shí)所限定的上下界。數(shù)組元素下標(biāo)的下界是0,上界是相應(yīng)維數(shù)大小減1。例:inta[10];//a數(shù)組可使用的有效下標(biāo)為0~9floatf[50];//f數(shù)組可使用的有效下標(biāo)為0~492023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-19-4.1.2訪問數(shù)組元素訪問數(shù)組元素時(shí)需要注意(3)越界訪問問題如果訪問數(shù)組元素時(shí),使用的下標(biāo)不是有效范圍內(nèi)的值,會(huì)造成“越界訪問”錯(cuò)誤。由于編譯器在編譯程序時(shí)不會(huì)檢查這種錯(cuò)誤,所以編輯人員要特別小心,盡可能杜絕這類錯(cuò)誤發(fā)生。使用面向?qū)ο蟪绦蛟O(shè)計(jì)技術(shù)的讀者可以定義下標(biāo)不能越界的數(shù)組,也就是C++中的vector類,相關(guān)內(nèi)容可參見附錄。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-20-4.1.3字符數(shù)組char型的數(shù)組稱為字符數(shù)組,通常用來存儲(chǔ)字符串。定義并且初始化字符數(shù)組:

charchArray[]="helloworld!";2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-21-4.1.3字符數(shù)組1.初始化字符數(shù)組兩種方法:(1)用雙引號(hào)內(nèi)的字符串初始化字符數(shù)組例:chararray[10]={"hello"};可以省略大括號(hào),簡化為:

chararray[10]="hello";

用這種方法初始化時(shí),系統(tǒng)自動(dòng)在數(shù)組最后一個(gè)元素后面補(bǔ)'\0'(結(jié)束符)。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-22-4.1.3字符數(shù)組(2)用字符常量來初始化字符數(shù)組例:

chararray[10]={'h','e','l','l','o','\0'};該方法將初始值一一列舉在初始化列表中,這種方法通常用于輸入不容易在鍵盤上生成的不可見字符。下面的代碼中初始化值包含兩個(gè)制表符。

chararray[10]={'\a','\t','\b','\t','\0'};注意,此種方式下,編程者要自己添加字符串結(jié)束符('\0'),同時(shí)不要忘記為最后的'\0'留出空間。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-23-4.1.3字符數(shù)組2.字符數(shù)組的輸入和輸出字符數(shù)組的輸入是給數(shù)組各元素賦值的過程在循環(huán)中通過cin一個(gè)一個(gè)地輸入通過cin整串輸入調(diào)用I/O流類的成員函數(shù)輸入,例如使用getline()函數(shù)輸入一行字符。

charbuffer[80];

for(intk=0;k<10;k++)

{

cin>>buffer[k];

}

cin>>buffer;

cin.getline(buffer,80,'\n');

2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-24-4.1.3字符數(shù)組2.字符數(shù)組的輸入和輸出字符數(shù)組的輸出逐元素輸出通過數(shù)組名輸出。例如,下面的語句輸出字符數(shù)組buffer中的字符串:cout<<buffer;例4-3從鍵盤輸入一行或多行字符串,用字符數(shù)組存儲(chǔ),并統(tǒng)計(jì)所輸入的字符串中26個(gè)字母出現(xiàn)的次數(shù)。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-25-2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-26-//例4-3輸入26個(gè)英文字符的分布統(tǒng)計(jì)#include<iostream>usingnamespacestd;voidmain(){//數(shù)組及變量定義;

constintN=80;charbuffer[N];intk=0;constintNUM=26;intcounts[NUM]={0};charletters[NUM];inti=0;

2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-27-do//循環(huán)輸入每一行字符

{cout<<"enterastring:\n";cin.getline(buffer,N,'\n');//獲得一行輸入字符串

k=0;

//對(duì)于輸入的每一行字符,統(tǒng)計(jì)字符出現(xiàn)的次數(shù)while(buffer[k]!='\0'){i=tolower(buffer[k])-'a';counts[i]++;k++;//counts[tolower(buffer[k++])-'a']++;//用此行可代替前三句

}}while(buffer[0]!='\0');

2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-28-cout<<"thestatisticsresult:"<<endl;for(i=0;i<NUM;i++)//輸出統(tǒng)計(jì)結(jié)果

{letters[i]=(char)('a'+i);if(counts[i]>0){cout<<letters[i]<<":"<<counts[i]<<endl;}}}思考題:如何統(tǒng)計(jì)一個(gè)txt文件中各種字符出現(xiàn)的次數(shù)?2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-29-4.1.4多維數(shù)組1.多維數(shù)組的定義定義多維數(shù)組語法形式如下。二維數(shù)組類型標(biāo)識(shí)符

數(shù)組名標(biāo)識(shí)符[常量表達(dá)式1][常量表達(dá)式2];三維數(shù)組類型標(biāo)識(shí)符

數(shù)組名標(biāo)識(shí)符[常量表達(dá)式1][常量表達(dá)式2][常量表達(dá)式3];n維數(shù)組類型標(biāo)識(shí)符

數(shù)組名標(biāo)識(shí)符[常量表達(dá)式1]…[常量表達(dá)式n];2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-30-4.1.4多維數(shù)組例:

boolseat[10][6];//座位

unsignedcharimage[256][128];//256行128列圖像

floatmatrix[3][3];//三元一次線性方程組的系數(shù)矩陣

chartable[5][8];//課表二維數(shù)組元素的下標(biāo)從左至右稱為行、列。

charbook[200][32][40];//書三維數(shù)組元素的下標(biāo)由左至右可稱為頁、行、列或?qū)?、行、列?023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-31-4.1.4多維數(shù)組在定義多維數(shù)組時(shí),需要注意首先要根據(jù)所要表示的對(duì)象內(nèi)容,選擇合適的數(shù)據(jù)類型(數(shù)組的類型,也就是數(shù)組元素的類型);其次確定數(shù)組的維數(shù),即幾維數(shù)組(有幾維就有幾對(duì)中括號(hào));最后確定每一維的大小(中括號(hào)內(nèi))。特別強(qiáng)調(diào):數(shù)組每一維的大小必須用常量表達(dá)式聲明,否則,編譯會(huì)出錯(cuò)。這也是C和C++數(shù)組的一大缺陷:數(shù)組的使用不夠靈活。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-32-4.1.4多維數(shù)組2.多維數(shù)組在內(nèi)存中的映像例:intd1[5];intd2[2][3];intd3[2][3][2];2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-33-4.1.4多維數(shù)組2.多維數(shù)組在內(nèi)存中的映像一維數(shù)組在內(nèi)存中從數(shù)組名所代表的起始地址開始,按下標(biāo)次序存儲(chǔ);數(shù)組d1的第i個(gè)元素在內(nèi)存中的起始位置相對(duì)于數(shù)組名所代表的地址偏移了i個(gè)int型變量空間大小。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-34-4.1.4多維數(shù)組2.多維數(shù)組在內(nèi)存中的映像二維數(shù)組在內(nèi)存中從數(shù)組名所代表的起始地址開始,按行優(yōu)先依次存儲(chǔ);數(shù)組d2的第i行第j列元素在內(nèi)存中的起始位置相對(duì)于數(shù)組起始地址偏移了

行號(hào)

×

列數(shù)

+

列號(hào)個(gè)int型變量空間大小。例如,元素d2[i][j]的起始地址計(jì)算:&d2[0][0]+(i×3+j)2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-35-4.1.4多維數(shù)組2.多維數(shù)組在內(nèi)存中的映像三維數(shù)組在內(nèi)存中從數(shù)組名所代表的起始地址開始,按頁、行、列依次存儲(chǔ),即按使數(shù)組元素最右邊的下標(biāo)值最快地變化來存儲(chǔ)。數(shù)組d3的第k頁第i行第j列元素在內(nèi)存中的起始位置相對(duì)于數(shù)組起始地址偏移了頁號(hào)

×(行數(shù)

×

列數(shù))+

行號(hào)

×

列數(shù)

+

列號(hào)

個(gè)int型變量空間大小。例如,元素d3[k][i][j]的起始地址為:&d3[0][0][0]

+

(k

×

3

×

2

+

i

×

2

+

j)。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-36-4.1.4多維數(shù)組3.初始化多維數(shù)組提供數(shù)組元素的全部初始值提供部分元素的初始值這些初始化值位于大括號(hào)內(nèi),構(gòu)成初始值列表,多維數(shù)組初始化時(shí)需要使用嵌套的括號(hào)。inta[2][4]={{4,3,2,1},{1,2,3,4}};

doubled[3][4]={{l.0,2.0,3.0,4.0},{5.0,6.0,7.0,8.0},

{9.0,10.0,11.0,12.0}};2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-37-4.1.4多維數(shù)組3.初始化多維數(shù)組可以省略內(nèi)層的括號(hào),只要程序好讀即可。例如用換行的方式:

inta[2][4]={4,3,2,1,1,2,3,4};

doubled[3][4]={l.0,2.0,3.0,4.0,

5.0,6.0,7.0,8.0,

9.0,10.0,11.0,12.0}; 2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-38-4.1.4多維數(shù)組3.初始化多維數(shù)組

多維數(shù)組的初始化,也可以只給出部分值;例:

inta[2][4]={4,3};則只有a[0][0]、a[0][1]分別得到初始值4和3,其余各元素的值為0??衫么颂匦詫⒁恍┯米鲇?jì)數(shù)器的多維數(shù)組初始化為0。例:定義并初始化二維整型計(jì)數(shù)器counts:intcounts[512][256]={0};這是將多維數(shù)組元素置0的最簡便方法之一。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-39-4.1.4多維數(shù)組4.訪問多維數(shù)組的元素訪問多維數(shù)組的元素時(shí),只要指定要訪問的數(shù)組元素的具體下標(biāo)值即可,語法形式為:

數(shù)組名[下標(biāo)表達(dá)式1]…[下標(biāo)表達(dá)式n]其中,下標(biāo)表達(dá)式的個(gè)數(shù)同數(shù)組維數(shù),“下標(biāo)表達(dá)式i”(1≤i≤n)可以用常量、變量或表達(dá)式,其值大于或等于0,小于數(shù)組對(duì)應(yīng)維的大小,即

0≤下標(biāo)表達(dá)式i的值<第i維的大小2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-40-4.1.4多維數(shù)組例:constintM=8,N=4;

charmatrix[M][N];

for(inti=0;i<M;i++)

{for(intj=0;j<N;j++)

{

cin>>matrix[i][j];//給元素賦值,寫操作}

}2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-41-4.1.4多維數(shù)組例4-5編程實(shí)現(xiàn)矩陣轉(zhuǎn)置功能,矩陣行數(shù)為M,列數(shù)為N,用二維數(shù)組表示矩陣。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-42-2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-43-//例4-5矩陣轉(zhuǎn)置#include<iostream>#include<ctime>#include<iomanip>usingnamespacestd;voidmain(){constintM=5;constintN=6;intmatrix[M][N];//矩陣

inttMatrix[N][M];//轉(zhuǎn)置矩陣

srand((unsignedint)time(NULL));inti,j;

2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-44-cout<<"matrix:"<<endl;for(i=0;i<M;i++)//生成矩陣

{for(j=0;j<N;j++){matrix[i][j]=rand()%100;//給數(shù)組元素賦值

cout<<setw(4)<<matrix[i][j]<<"";}cout<<endl;}

2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-45-cout<<"transposeofmatrix:"<<endl;for(i=0;i<N;i++) //得到轉(zhuǎn)置矩陣

{for(j=0;j<M;j++){tMatrix[i][j]=matrix[j][i];//給數(shù)組元素賦值

cout<<setw(4)<<tMatrix[i][j]<<"";}cout<<endl;}}4.1.5數(shù)組應(yīng)用舉例例4-640個(gè)學(xué)生用1~10的分?jǐn)?shù)評(píng)價(jià)學(xué)生食堂的質(zhì)量(1表示很差,10表示很好),將40個(gè)分?jǐn)?shù)放在整型數(shù)組中,并匯總調(diào)查結(jié)果。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-46-2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-47-//例4-6匯總評(píng)分結(jié)果#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){constintcStuNum=40; //學(xué)生人數(shù)

constintcScoreNum=11;//分?jǐn)?shù)個(gè)數(shù)

intscore[cStuNum]={1,2,6,4,8,5,9,7,8,10,1,6,3,8,6,10,3,8,2,6,6,5,6,8,7,7,5,5,6,7,4,6,8,10,3,1,2,7,9,6};//全部分?jǐn)?shù)

intcounts[cScoreNum]={0};//分?jǐn)?shù)統(tǒng)計(jì)計(jì)數(shù)器,初始化為02023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-48-intk;for(intk=0;k<cStuNum;k++)//統(tǒng)計(jì)分?jǐn)?shù)

{ counts[score[k]]++;}cout<<"score"<<setw(10)<<"counts"<<endl;for(k=1;k<cScoreNum;k++)//輸出結(jié)果

{ cout<<setw(6)<<k <<setw(10)<<counts[k]<<endl;}}4.1.5數(shù)組應(yīng)用舉例例4-7編程實(shí)現(xiàn)計(jì)算兩個(gè)N階方陣乘積矩陣的功能,矩陣元素為整形,N=5。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-49-2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-50-//例4-7求兩個(gè)N階方陣乘積矩陣#include<iostream>#include<iomanip>#include<ctime>usingnamespacestd;voidmain(){constintN=5;inta[N][N],b[N][N];//兩個(gè)相乘的矩陣

intc[N][N]={0}; //乘積矩陣

inti,j,k;srand((unsignedint)time(NULL));//生成矩陣a和bfor(i=0;i<N;i++) //行循環(huán)

{for(j=0;j<N;j++)//列循環(huán)

{a[i][j]=rand()%100;b[i][j]=rand()%100;}}2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-51-//顯示矩陣a,再顯示矩陣bcout<<"matrixa:"<<endl;for(i=0;i<N;i++){for(j=0;j<N;j++){cout<<setw(5)<<a[i][j];}cout<<endl;}cout<<"matrixb:"<<endl;for(i=0;i<N;i++){for(j=0;j<N;j++){cout<<setw(5)<<b[i][j];}cout<<endl;}2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-52-//計(jì)算乘積矩陣c,并顯示

for(i=0;i<N;i++){for(j=0;j<N;j++){for(k=0;k<N;k++)//求c的一個(gè)元素

c[i][j]+=a[i][k]*b[k][j];}}cout<<"matrixc:"<<endl;for(i=0;i<N;i++){for(j=0;j<N;j++){cout<<setw(10)<<c[i][j];}cout<<endl;}}4.1.5數(shù)組應(yīng)用舉例例4-8給定二維數(shù)組,編程計(jì)算元素的均值和方差。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-53-2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-54-//例4-8計(jì)算一組數(shù)據(jù)的均值和方差#include<iostream>#include<ctime>#include<iomanip>usingnamespacestd;voidmain(){constintROWS=20;constintCOLS=10;intmatrix[ROWS][COLS]={0};introw,col;srand((unsigned)time(NULL)); for(row=0;row<ROWS;row++)//生成數(shù)據(jù)

{for(col=0;col<COLS;col++){matrix[row][col]=rand()%100;cout<<setw(4)<<matrix[row][col]<<",";}cout<<endl;}2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-55-//統(tǒng)計(jì)均值

floatmean(0),var(0);for(row=0;row<ROWS;row++){for(col=0;col<COLS;col++)mean+=matrix[row][col];}intsize=ROWS*COLS;if(size>0)mean/=size;else mean=0;2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-56-//統(tǒng)計(jì)方差

for(row=0;row<ROWS;row++){for(col=0;col<COLS;col++)var+=(matrix[row][col]-mean)*(matrix[row][col]-mean);}if(size>0)var/=size;elsevar=0;//顯示統(tǒng)計(jì)結(jié)果

cout<<"mean="<<mean<<";"<<"stdvar="<<var<<endl;}4.2枚舉類型C++語言不僅有豐富的基本數(shù)據(jù)類型,而且允許用戶自己定義數(shù)據(jù)類型。枚舉、結(jié)構(gòu)、聯(lián)合都屬于自定義類型2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-57-2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-58-4.2.1枚舉類型定義枚舉型數(shù)據(jù)類型(簡稱枚舉類型)有些問題中所處理數(shù)據(jù)的取值可以一一列舉出來例:一周七天:星期日、星期1、星期2、星期3、星期4、星期5、星期6定義一種數(shù)據(jù)類型,一一列舉這種數(shù)據(jù)類型的變量的可能值,稱為枚舉類型,聲明形式為:enum枚舉類型名{枚舉元素列表};

可以使用這種自定義數(shù)據(jù)類型來定義變量。4.2.2枚舉變量定義及使用例如:enumweekday{sun,mon,tue,wed,thu,fri,sat};weekdayday;//定義一個(gè)weekday類型的變量:變量day的取值范圍:類型定義時(shí),表里列舉出來的七種標(biāo)識(shí)符,把這些標(biāo)識(shí)符看作符號(hào)常量。例如:day=sat;枚舉常量在機(jī)器內(nèi)部仍然是用整型數(shù)來存取定義某個(gè)枚舉類型的變量時(shí),分配幾個(gè)字節(jié)的內(nèi)存空間呢?2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-59-自定義的數(shù)據(jù)類型枚舉元素或枚舉常量2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-60-使用枚舉類型注意:enumweekday{sun,mon,tue,wed,thu,fri,sat};在類型定義之后,對(duì)枚舉元素按常量處理,不能對(duì)它們賦值。sat=6;

枚舉元素具有默認(rèn)值,它們依次為:0,1,2,……。也可以在類型聲明時(shí)另行指定枚舉元素的值。enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat}4.2.2枚舉變量定義及使用2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-61-使用枚舉類型注意:枚舉值可以進(jìn)行關(guān)系運(yùn)算。整數(shù)值不能直接賦給枚舉變量;如需要將整數(shù)值賦給枚舉變量,應(yīng)進(jìn)行強(qiáng)制類型轉(zhuǎn)換.

例:intx=2;

weekdayday;day=x;?

day=(weekday)x;?

4.2.2枚舉變量定義及使用2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-62-例4-9讀入1-7之間的一個(gè)數(shù)代表今天,輸出明天是星期幾。#include<iostream>usingnamespacestd;enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat};voidmain(){ cout<<"今天是星期(請(qǐng)輸入一個(gè)數(shù)1-7):";

intn; cin>>n;

weekdaytoday=(weekday)n; weekdaytomorrow=(weekday)((today+1)%7);tomorrow==0?sun:tomorrow;switch(tomorrow){casesun:cout<<"TomorrowisSunday."<<endl; break; casemon:cout<<"TomorrowisMonday."<<endl; break; casetue:cout<<"TomorrowisTuesday."<<endl;break;casewed:cout<<"TomorrowisWednesday."<<endl; break;casethu:cout<<"TomorrowisThursday."<<endl;break;casefri:cout<<"TomorrowisFriday."<<endl;break;casesat:cout<<"TomorrowisSaturday."<<endl;break;default:cout<<"inputerror!"<<endl;}}2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-65-例:口袋中有紅、黃、藍(lán)、白、黑五種顏色的球若干個(gè)。每次從口袋中取出3個(gè)不同顏色的球,問有多少種取法。分析:由于球只能是五種顏色之一,故可用枚舉類型表示球的顏色。設(shè)取出的球?yàn)閕、j、k,根據(jù)題意,i、j、k分別可以有五種取值,且i≠j≠k??梢杂酶F舉法,逐個(gè)檢驗(yàn)每一種可能的組合,從中找出符合要求的組合并輸出。#include<iostream.h>enumcolor{red,yellow,blue,white,black};voidmain(){enumcolorprint;intn,loop,i,j,k;charc;n=0;for(i=red;i<=black;i++) for(j=red;j<=black;j++)

if(i!=j){//前兩個(gè)球不同

for(k=red;k<=black;k++)

if((k!=i)&&(k!=j)){

//第三個(gè)球不同于前兩個(gè)

n=n+1; cout.width(4); cout<<n;

for(loop=1;loop<=3;loop++){

switch(loop){ case1:print=(enumcolor)i;break; case2:print=(enumcolor)j;break; case3:print=(enumcolor)k;break; default:break; }

switch(print){ casered:cout<<"red";break; caseyellow:cout<<"yellow";break; caseblue:cout<<"blue";break; casewhite:cout<<"white";break; caseblack:cout<<"black";break; default:break; }

}//endofforloop cout<<endl;

}//endofif

}//endofifcout<<"total:"<<n<<endl;}4.3結(jié)構(gòu)類型結(jié)構(gòu)類型把現(xiàn)實(shí)生活中意義密切相關(guān)的一組數(shù)據(jù)組合成一個(gè)整體,即由各種數(shù)據(jù)類型(可以是基本數(shù)據(jù)類型或已聲明的自定義數(shù)據(jù)類型)的數(shù)據(jù)組成一個(gè)集合,稱為結(jié)構(gòu)類型。例如,一個(gè)學(xué)生的學(xué)號(hào)、姓名、年齡、成績等,雖然分別屬于不同的數(shù)據(jù)類型,但它們之間是密切相關(guān)的,因?yàn)槊恳唤M信息屬于一個(gè)人。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-69-2023/7/24北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-70-結(jié)構(gòu)類型的定義結(jié)構(gòu)的聲明形式:struct

結(jié)構(gòu)類型名{數(shù)據(jù)類型標(biāo)識(shí)符1成員名1;數(shù)據(jù)類型標(biāo)識(shí)符2成員名2;┇數(shù)據(jù)類型標(biāo)識(shí)符n成員名n;};4.3.1結(jié)構(gòu)類型的定義和初始化structstudent{longnum;//學(xué)號(hào)

charname[20];//姓名

charsex;//性別

intage;//年齡

floatscore; //成績

charaddr[30];//住址};//必須以分號(hào)結(jié)束結(jié)構(gòu)的定義2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-71-2.結(jié)構(gòu)成員的訪問定義結(jié)構(gòu)類型的變量:

結(jié)構(gòu)類型名

結(jié)構(gòu)變量名;例:定義student類型的變量:students1;4.3.1結(jié)構(gòu)類型的定義和初始化2023/7/24北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-72-結(jié)構(gòu)類型的變量所占的存儲(chǔ)空間是結(jié)構(gòu)中所有成員所占空間的總和

例sizeof(student)=sizeof(long)+20*sizeof(char)+sizeof(char)+sizeof(int)+sizeof(float)+30*sizeof(char)

sizeof(s1)==sizeof(student)結(jié)構(gòu)類型的變量所占的存儲(chǔ)空間考慮到對(duì)齊的要求,系統(tǒng)會(huì)將占空間不是4的倍數(shù)的成員空間調(diào)整為4的倍數(shù):將成員sex調(diào)整為4字節(jié),將成員addr調(diào)整為32字節(jié),總共占用68字節(jié)。2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-73-結(jié)構(gòu)成員的訪問:

結(jié)構(gòu)變量名.成員名例:students1;

s1.num=1;cout<<s1.num<<endl;

cout<<<<endl;如同使用一個(gè)變量如同使用一個(gè)數(shù)組訪問結(jié)構(gòu)成員2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-74-3.結(jié)構(gòu)變量的初始化定義結(jié)構(gòu)變量時(shí)直接初始化students2={20041118,”LiLi”,18,90};分別給各個(gè)成員賦值students1;s1.num=20041118;strcpy(,“LiLi”);4.3.1結(jié)構(gòu)類型的定義和初始化例4-10結(jié)構(gòu)類型的聲明,變量的定義和初始化#include<iostream>#include<iomanip>usingnamespacestd;structstudent//聲明新的數(shù)據(jù)類型{longnum; //學(xué)號(hào)

charname[20];//姓名

charsex; //性別

intage; //年齡}stu={20041118,"LiLi",'F',18};voidmain(){cout<<setw(8)<<stu.num<<setw(10)<<<<setw(3)<<stu.sex<<setw(3)<<stu.age<<endl;}運(yùn)行結(jié)果:20041118LiLiF182023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-76-結(jié)構(gòu)體可以由不同數(shù)據(jù)類型的成員構(gòu)成,這些成員可能是基本數(shù)據(jù)類型,也可能是自定義的數(shù)據(jù)類型,例如已聲明的另一個(gè)結(jié)構(gòu)類型。

例4-11

訪問帶有結(jié)構(gòu)體類型成員的結(jié)構(gòu)體變量。

2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-77-//例4-11結(jié)構(gòu)體定義的嵌套#include<iostream>usingnamespacestd;structdate{ intyear; intmonth; intday;};structWeather{datetoday;doubletemp;//溫度

doublewind;//風(fēng)力}2023/7/24北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-78-voidmain(){Weathertoday_weather={2004,11,30,10.0,3.1};cout<<today_weather.today.year<<"年" <<today_weather.today.month<<"月" <<today_weather.today.day<<"日的天氣是:";

cout<<"溫度:"<<today_weather.temp;cout<<"度,風(fēng)力:"<<today_weather.wind<<"級(jí)"<<endl;}運(yùn)行結(jié)果:2004年11月30日的天氣是:溫度:10度,風(fēng)力:3.1級(jí)2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-79-4.結(jié)構(gòu)的賦值運(yùn)算屬于同一結(jié)構(gòu)類型的各個(gè)變量之間可以相互賦值。這一點(diǎn)和數(shù)組不同,C++規(guī)定,不能直接進(jìn)行數(shù)組名的賦值,因?yàn)閿?shù)組名是一個(gè)常量,而結(jié)構(gòu)類型的變量可以賦值。

不同結(jié)構(gòu)的變量不允許相互賦值。

即使這兩個(gè)變量可能具有同樣的成員。4.3.1結(jié)構(gòu)類型的定義和初始化2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-80-例:structstudent{intnum;charname[20];}s1={1,”zhang”},s2={2.”zhao”};studentsi;si=s1;例:structperson{intID;charname[20];}p1={1,”zhang”},p2={2.”zhao”};personpi;pi=p1;pi=s1;//?si=p1;//?2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-81-結(jié)構(gòu)類型的一些復(fù)雜的用法包括:結(jié)構(gòu)數(shù)組結(jié)構(gòu)指針用結(jié)構(gòu)傳遞函數(shù)參數(shù)用結(jié)構(gòu)作為函數(shù)的返回值類型4.3.2結(jié)構(gòu)數(shù)組2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-82-結(jié)構(gòu)數(shù)組

格式:

結(jié)構(gòu)名數(shù)組名[常量表達(dá)式];結(jié)構(gòu)數(shù)組的元素

結(jié)構(gòu)數(shù)組的每個(gè)元素都是該結(jié)構(gòu)類型的變量。4.3.2結(jié)構(gòu)數(shù)組例:structstudent{charname[15];intnum;intscore;}students[30];for(i=0;i<30;i++){cin>>s[i].name;cin>>s[i].num;cin>>s[i].score;}2023/7/24北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-83-#include<iostream>usingnamespacestd;structEmployee{charname[20];unsignedlongid;floatsalary;};例4-12公司有六個(gè)員工,把他們按工資由低到高排序。Employeeallone[6]={{"zhang",12345,3390.0},{"wang",13916,4490.0},{"zhou",27519,3110.0},{"meng",42876,6230.0},{"yang",23987,4000.0},{"chen",12335,5110.0}};2023/7/24北京郵電大學(xué)信息與通信工程學(xué)院-84-voidmain(){Employeetemp;

for(inti=1;i<6;i++)//排序

{

for(intj=0;j<=5-i;j++)//一輪比較

{

if(allone[j].salary>allone[j+1].salary){temp=allone[j];//結(jié)構(gòu)變量的交換

allone[j]=allone[j+1];allone[j+1]=temp;}

}

}

for(intk=0;k<6;k++)//輸出

cout<<allone[k].name<<""<<allone[k].id<<""<<allone[k].salary<<endl;}運(yùn)行結(jié)果:

zhou275193110

zhang123453390

yang239874000

wang139164490

chen123355110

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論