版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C++高級語言程序設(shè)計第4章
數(shù)組及其他自定義類型
北京郵電大學信息與通信工程學院
2025/10/9北京郵電大學信息與通信工程學院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)合型變量的定義及使用2025/10/9北京郵電大學信息與通信工程學院-2-4.1數(shù)組數(shù)組是具有一定順序關(guān)系的若干相同類型變量的集合,組成數(shù)組的變量稱為該數(shù)組的元素。數(shù)組屬于構(gòu)造類型。數(shù)組是實際編程中經(jīng)常使用的一種數(shù)據(jù)結(jié)構(gòu)。2025/10/9北京郵電大學信息與通信工程學院-3-4.1.1數(shù)組定義及初始化1.一維數(shù)組的定義一維數(shù)組定義的語法形式
類型標識符
數(shù)組名[常量表達式];說明
類型標識符:任何合法的類型標識符,用于說明數(shù)組元素的類型;數(shù)組名
:程序員對該數(shù)組的命名,數(shù)組的命名規(guī)則同變量命名;方括號及常量表達式:用于說明該數(shù)組中元素的個數(shù)。2025/10/9北京郵電大學信息與通信工程學院-4-4.1.1數(shù)組定義及初始化例:10級119班30名同學“C++程序設(shè)計”課程的成績
intCscore[30];
實驗,測得一組電阻R隨溫度T變化的值
floatRi[30];shortTc[30];2025/10/9北京郵電大學信息與通信工程學院-5-4.1.1數(shù)組定義及初始化一維數(shù)組在內(nèi)存中存儲映射
intscore[5];2025/10/9北京郵電大學信息與通信工程學院-6-4.1.1數(shù)組定義及初始化注意定義一個數(shù)組,系統(tǒng)為這個數(shù)組保留一定數(shù)量的連續(xù)內(nèi)存單元,數(shù)組元素依次占用這一連續(xù)內(nèi)存空間,這段內(nèi)存空間起始地址的外部標識就是數(shù)組名;數(shù)組名是一個地址常量,禁止給數(shù)組名賦值;數(shù)組各元素用數(shù)組名及下標(或稱索引值)來標識,score[0],score[1],…,score[4]分別表示數(shù)組的第1~5個元素;C語言和C++語言中,元素的下標從0開始計,數(shù)組元素的最大下標比元素個數(shù)少1,數(shù)組score最大下標對應(yīng)的元素是score[4],而不是score[5](訪問越界);2025/10/9北京郵電大學信息與通信工程學院-7-4.1.1數(shù)組定義及初始化注意數(shù)組名表示數(shù)組在內(nèi)存中的起始地址,可以將元素的下標理解為元素存放位置相對于數(shù)組名的偏移量,第i個元素score[i]的起始地址相對于數(shù)組的起始地址偏移了i個int型變量所占空間;每個元素可以視為一個同類型的變量,如score[i]可以視為一個整型變量;數(shù)組的每個元素占用空間大小與同類型變量占用的內(nèi)存大小一樣;數(shù)組占用的內(nèi)存空間是其全部元素所占空間的總和,如果數(shù)組有N個元素,它所占的字節(jié)數(shù)可以通過以下方式得到:sizeof(數(shù)組名)或
N*sizeof(數(shù)組類型)。2025/10/9北京郵電大學信息與通信工程學院-8-4.1.1數(shù)組定義及初始化2.數(shù)組初始化在定義數(shù)組時,直接給出賦給數(shù)組元素的值,稱為數(shù)組初始化。數(shù)組初始化語法形式
類型標識符
數(shù)組名[常量表達式]={以逗號隔開的初始化值};
2025/10/9北京郵電大學信息與通信工程學院-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]。注意不要丟掉語句最后的分號。2025/10/9北京郵電大學信息與通信工程學院-10-4.1.1數(shù)組定義及初始化注意初始化數(shù)組時,給定的初始化數(shù)值不能比數(shù)組元素多,但可以比數(shù)組元素少;如果少,初始化列表中的初始值將從下標0開始依次分配給各元素,后面沒有得到初始值的元素被初始化為0。
doubled[10]={1.0,2.0};如果使用初始化列表,則表內(nèi)至少包含一個初始值,否則編譯將出現(xiàn)錯誤。如果沒有初始化列表,即只定義不做初始化,一般在函數(shù)內(nèi)部定義的自動局部數(shù)組,其各元素的值是隨機值,使用時需要重新給數(shù)組元素賦值。2025/10/9北京郵電大學信息與通信工程學院-11-4.1.1數(shù)組定義及初始化如果在初始化列表中給定數(shù)組元素的全部值,可以省略中括號中元素個數(shù)常量表示式。上述score數(shù)組的初始化也可以寫成:
intscore[]={80,70,90,95,60};此時,編譯器自動計算出數(shù)組元素的個數(shù)為5,給score數(shù)組分配能夠存放5個int型數(shù)據(jù)的連續(xù)空間。思考題:如何將一個在某函數(shù)內(nèi)部定義的自動局部數(shù)組的所有元素都初始化為0?最簡單的方法是什么?2025/10/9北京郵電大學信息與通信工程學院-12-4.1.1數(shù)組定義及初始化例4-1定義各種基本類型的數(shù)組并初始化,利用debug調(diào)試方式觀察數(shù)組各元素得到的值、數(shù)組占用的空間、數(shù)組元素占用的空間。2025/10/9北京郵電大學信息與通信工程學院-13-2025/10/9北京郵電大學信息與通信工程學院-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;
2025/10/9北京郵電大學信息與通信工程學院-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;}運行結(jié)果:
?????
1,2,3,4,5,
10,0,0,0,0,
3.1,4.1,5,
3.14,6.28,0,0,0,說明符號常量N,用于說明數(shù)組的大??;使用符號常量說明數(shù)組的大小便于程序修改,如果想讓數(shù)組的大小為100,只需修改N的值即可,其他語句不需要修改;在多文件結(jié)構(gòu)中,可將一些符號常量的定義放在頭文件中,更利于工程的維護和修改。4.1.2訪問數(shù)組元素
數(shù)組元素是用下標來區(qū)分的,指定要訪問的數(shù)組元素的語法形式為:數(shù)組名[下標表達式]下標表達式:可以是常量、變量或表達式,其值大于或等于0,小于數(shù)組的大小。例:constintN=8;floatangle[N];for(intk=0;k<N;k++){angle[k]=3.14f/N*k;//給元素賦值,寫操作
cout<<angle[k]<<",";//讀取元素值
}2025/10/9北京郵電大學信息與通信工程學院-16-4.1.2訪問數(shù)組元素例4-2將正弦函數(shù)的一個周期2
分為N等份,定義數(shù)組分別存儲自變量值和函數(shù)值,并顯示數(shù)組元素的值。2025/10/9北京郵電大學信息與通信工程學院-17-2025/10/9北京郵電大學信息與通信工程學院-18-//例4-2用數(shù)組存儲和顯示正弦函數(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;}}運行結(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ù)組元素時需要注意(1)數(shù)組元素的下標表達式的結(jié)果必須為0或正整數(shù)。(2)數(shù)組元素的下標值不得超過數(shù)組聲明時所限定的上下界。數(shù)組元素下標的下界是0,上界是相應(yīng)維數(shù)大小減1。例:inta[10];//a數(shù)組可使用的有效下標為0~9floatf[50];//f數(shù)組可使用的有效下標為0~492025/10/9北京郵電大學信息與通信工程學院-19-4.1.2訪問數(shù)組元素訪問數(shù)組元素時需要注意(3)越界訪問問題如果訪問數(shù)組元素時,使用的下標不是有效范圍內(nèi)的值,會造成“越界訪問”錯誤。由于編譯器在編譯程序時不會檢查這種錯誤,所以編輯人員要特別小心,盡可能杜絕這類錯誤發(fā)生。使用面向?qū)ο蟪绦蛟O(shè)計技術(shù)的讀者可以定義下標不能越界的數(shù)組,也就是C++中的vector類,相關(guān)內(nèi)容可參見附錄。2025/10/9北京郵電大學信息與通信工程學院-20-4.1.3字符數(shù)組char型的數(shù)組稱為字符數(shù)組,通常用來存儲字符串。定義并且初始化字符數(shù)組:
charchArray[]="helloworld!";2025/10/9北京郵電大學信息與通信工程學院-21-4.1.3字符數(shù)組1.初始化字符數(shù)組兩種方法:(1)用雙引號內(nèi)的字符串初始化字符數(shù)組例:chararray[10]={"hello"};可以省略大括號,簡化為:
chararray[10]="hello";
用這種方法初始化時,系統(tǒng)自動在數(shù)組最后一個元素后面補'\0'(結(jié)束符)。2025/10/9北京郵電大學信息與通信工程學院-22-4.1.3字符數(shù)組(2)用字符常量來初始化字符數(shù)組例:
chararray[10]={'h','e','l','l','o','\0'};該方法將初始值一一列舉在初始化列表中,這種方法通常用于輸入不容易在鍵盤上生成的不可見字符。下面的代碼中初始化值包含兩個制表符。
chararray[10]={'\a','\t','\b','\t','\0'};注意,此種方式下,編程者要自己添加字符串結(jié)束符('\0'),同時不要忘記為最后的'\0'留出空間。2025/10/9北京郵電大學信息與通信工程學院-23-4.1.3字符數(shù)組2.字符數(shù)組的輸入和輸出字符數(shù)組的輸入是給數(shù)組各元素賦值的過程在循環(huán)中通過cin一個一個地輸入通過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');
2025/10/9北京郵電大學信息與通信工程學院-24-4.1.3字符數(shù)組2.字符數(shù)組的輸入和輸出字符數(shù)組的輸出逐元素輸出通過數(shù)組名輸出。例如,下面的語句輸出字符數(shù)組buffer中的字符串:cout<<buffer;例4-3從鍵盤輸入一行或多行字符串,用字符數(shù)組存儲,并統(tǒng)計所輸入的字符串中26個字母出現(xiàn)的次數(shù)。2025/10/9北京郵電大學信息與通信工程學院-25-2025/10/9北京郵電大學信息與通信工程學院-26-//例4-3輸入26個英文字符的分布統(tǒng)計#include<iostream>usingnamespacestd;voidmain(){//數(shù)組及變量定義;
constintN=80;charbuffer[N];intk=0;constintNUM=26;intcounts[NUM]={0};charletters[NUM];inti=0;
2025/10/9北京郵電大學信息與通信工程學院-27-do//循環(huán)輸入每一行字符
{cout<<"enterastring:\n";cin.getline(buffer,N,'\n');//獲得一行輸入字符串
k=0;
//對于輸入的每一行字符,統(tǒng)計字符出現(xiàn)的次數(shù)while(buffer[k]!='\0'){i=tolower(buffer[k])-'a';counts[i]++;k++;//counts[tolower(buffer[k++])-'a']++;//用此行可代替前三句
}}while(buffer[0]!='\0');
2025/10/9北京郵電大學信息與通信工程學院-28-cout<<"thestatisticsresult:"<<endl;for(i=0;i<NUM;i++)//輸出統(tǒng)計結(jié)果
{letters[i]=(char)('a'+i);if(counts[i]>0){cout<<letters[i]<<":"<<counts[i]<<endl;}}}思考題:如何統(tǒng)計一個txt文件中各種字符出現(xiàn)的次數(shù)?2025/10/9北京郵電大學信息與通信工程學院-29-4.1.4多維數(shù)組1.多維數(shù)組的定義定義多維數(shù)組語法形式如下。二維數(shù)組類型標識符
數(shù)組名標識符[常量表達式1][常量表達式2];三維數(shù)組類型標識符
數(shù)組名標識符[常量表達式1][常量表達式2][常量表達式3];n維數(shù)組類型標識符
數(shù)組名標識符[常量表達式1]…[常量表達式n];2025/10/9北京郵電大學信息與通信工程學院-30-4.1.4多維數(shù)組例:
boolseat[10][6];//座位
unsignedcharimage[256][128];//256行128列圖像
floatmatrix[3][3];//三元一次線性方程組的系數(shù)矩陣
chartable[5][8];//課表二維數(shù)組元素的下標從左至右稱為行、列。
charbook[200][32][40];//書三維數(shù)組元素的下標由左至右可稱為頁、行、列或?qū)?、行、列?025/10/9北京郵電大學信息與通信工程學院-31-4.1.4多維數(shù)組在定義多維數(shù)組時,需要注意首先要根據(jù)所要表示的對象內(nèi)容,選擇合適的數(shù)據(jù)類型(數(shù)組的類型,也就是數(shù)組元素的類型);其次確定數(shù)組的維數(shù),即幾維數(shù)組(有幾維就有幾對中括號);最后確定每一維的大小(中括號內(nèi))。特別強調(diào):數(shù)組每一維的大小必須用常量表達式聲明,否則,編譯會出錯。這也是C和C++數(shù)組的一大缺陷:數(shù)組的使用不夠靈活。2025/10/9北京郵電大學信息與通信工程學院-32-4.1.4多維數(shù)組2.多維數(shù)組在內(nèi)存中的映像例:intd1[5];intd2[2][3];intd3[2][3][2];2025/10/9北京郵電大學信息與通信工程學院-33-4.1.4多維數(shù)組2.多維數(shù)組在內(nèi)存中的映像一維數(shù)組在內(nèi)存中從數(shù)組名所代表的起始地址開始,按下標次序存儲;數(shù)組d1的第i個元素在內(nèi)存中的起始位置相對于數(shù)組名所代表的地址偏移了i個int型變量空間大小。2025/10/9北京郵電大學信息與通信工程學院-34-4.1.4多維數(shù)組2.多維數(shù)組在內(nèi)存中的映像二維數(shù)組在內(nèi)存中從數(shù)組名所代表的起始地址開始,按行優(yōu)先依次存儲;數(shù)組d2的第i行第j列元素在內(nèi)存中的起始位置相對于數(shù)組起始地址偏移了
行號
×
列數(shù)
+
列號個int型變量空間大小。例如,元素d2[i][j]的起始地址計算:&d2[0][0]+(i×3+j)2025/10/9北京郵電大學信息與通信工程學院-35-4.1.4多維數(shù)組2.多維數(shù)組在內(nèi)存中的映像三維數(shù)組在內(nèi)存中從數(shù)組名所代表的起始地址開始,按頁、行、列依次存儲,即按使數(shù)組元素最右邊的下標值最快地變化來存儲。數(shù)組d3的第k頁第i行第j列元素在內(nèi)存中的起始位置相對于數(shù)組起始地址偏移了頁號
×(行數(shù)
×
列數(shù))+
行號
×
列數(shù)
+
列號
個int型變量空間大小。例如,元素d3[k][i][j]的起始地址為:&d3[0][0][0]
+
(k
×
3
×
2
+
i
×
2
+
j)。2025/10/9北京郵電大學信息與通信工程學院-36-4.1.4多維數(shù)組3.初始化多維數(shù)組提供數(shù)組元素的全部初始值提供部分元素的初始值這些初始化值位于大括號內(nèi),構(gòu)成初始值列表,多維數(shù)組初始化時需要使用嵌套的括號。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}};2025/10/9北京郵電大學信息與通信工程學院-37-4.1.4多維數(shù)組3.初始化多維數(shù)組可以省略內(nèi)層的括號,只要程序好讀即可。例如用換行的方式:
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}; 2025/10/9北京郵電大學信息與通信工程學院-38-4.1.4多維數(shù)組3.初始化多維數(shù)組
多維數(shù)組的初始化,也可以只給出部分值;例:
inta[2][4]={4,3};則只有a[0][0]、a[0][1]分別得到初始值4和3,其余各元素的值為0??衫么颂匦詫⒁恍┯米鲇嫈?shù)器的多維數(shù)組初始化為0。例:定義并初始化二維整型計數(shù)器counts:intcounts[512][256]={0};這是將多維數(shù)組元素置0的最簡便方法之一。2025/10/9北京郵電大學信息與通信工程學院-39-4.1.4多維數(shù)組4.訪問多維數(shù)組的元素訪問多維數(shù)組的元素時,只要指定要訪問的數(shù)組元素的具體下標值即可,語法形式為:
數(shù)組名[下標表達式1]…[下標表達式n]其中,下標表達式的個數(shù)同數(shù)組維數(shù),“下標表達式i”(1≤i≤n)可以用常量、變量或表達式,其值大于或等于0,小于數(shù)組對應(yīng)維的大小,即
0≤下標表達式i的值<第i維的大小2025/10/9北京郵電大學信息與通信工程學院-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];//給元素賦值,寫操作}
}2025/10/9北京郵電大學信息與通信工程學院-41-4.1.4多維數(shù)組例4-5編程實現(xiàn)矩陣轉(zhuǎn)置功能,矩陣行數(shù)為M,列數(shù)為N,用二維數(shù)組表示矩陣。2025/10/9北京郵電大學信息與通信工程學院-42-2025/10/9北京郵電大學信息與通信工程學院-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;
2025/10/9北京郵電大學信息與通信工程學院-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;}
2025/10/9北京郵電大學信息與通信工程學院-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個學生用1~10的分數(shù)評價學生食堂的質(zhì)量(1表示很差,10表示很好),將40個分數(shù)放在整型數(shù)組中,并匯總調(diào)查結(jié)果。2025/10/9北京郵電大學信息與通信工程學院-46-2025/10/9北京郵電大學信息與通信工程學院-47-//例4-6匯總評分結(jié)果#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){constintcStuNum=40; //學生人數(shù)
constintcScoreNum=11;//分數(shù)個數(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};//全部分數(shù)
intcounts[cScoreNum]={0};//分數(shù)統(tǒng)計計數(shù)器,初始化為02025/10/9北京郵電大學信息與通信工程學院-48-intk;for(intk=0;k<cStuNum;k++)//統(tǒng)計分數(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編程實現(xiàn)計算兩個N階方陣乘積矩陣的功能,矩陣元素為整形,N=5。2025/10/9北京郵電大學信息與通信工程學院-49-2025/10/9北京郵電大學信息與通信工程學院-50-//例4-7求兩個N階方陣乘積矩陣#include<iostream>#include<iomanip>#include<ctime>usingnamespacestd;voidmain(){constintN=5;inta[N][N],b[N][N];//兩個相乘的矩陣
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;}}2025/10/9北京郵電大學信息與通信工程學院-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;}2025/10/9北京郵電大學信息與通信工程學院-52-//計算乘積矩陣c,并顯示
for(i=0;i<N;i++){for(j=0;j<N;j++){for(k=0;k<N;k++)//求c的一個元素
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ù)組,編程計算元素的均值和方差。2025/10/9北京郵電大學信息與通信工程學院-53-2025/10/9北京郵電大學信息與通信工程學院-54-//例4-8計算一組數(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;}2025/10/9北京郵電大學信息與通信工程學院-55-//統(tǒng)計均值
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;2025/10/9北京郵電大學信息與通信工程學院-56-//統(tǒng)計方差
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)計結(jié)果
cout<<"mean="<<mean<<";"<<"stdvar="<<var<<endl;}4.2枚舉類型C++語言不僅有豐富的基本數(shù)據(jù)類型,而且允許用戶自己定義數(shù)據(jù)類型。枚舉、結(jié)構(gòu)、聯(lián)合都屬于自定義類型2025/10/9北京郵電大學信息與通信工程學院-57-2025/10/9北京郵電大學信息與通信工程學院-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;//定義一個weekday類型的變量:變量day的取值范圍:類型定義時,表里列舉出來的七種標識符,把這些標識符看作符號常量。例如:day=sat;枚舉常量在機器內(nèi)部仍然是用整型數(shù)來存取定義某個枚舉類型的變量時,分配幾個字節(jié)的內(nèi)存空間呢?2025/10/9北京郵電大學信息與通信工程學院-59-自定義的數(shù)據(jù)類型枚舉元素或枚舉常量2025/10/9北京郵電大學信息與通信工程學院-60-使用枚舉類型注意:enumweekday{sun,mon,tue,wed,thu,fri,sat};在類型定義之后,對枚舉元素按常量處理,不能對它們賦值。sat=6;
枚舉元素具有默認值,它們依次為:0,1,2,……。也可以在類型聲明時另行指定枚舉元素的值。enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat}4.2.2枚舉變量定義及使用2025/10/9北京郵電大學信息與通信工程學院-61-使用枚舉類型注意:枚舉值可以進行關(guān)系運算。整數(shù)值不能直接賦給枚舉變量;如需要將整數(shù)值賦給枚舉變量,應(yīng)進行強制類型轉(zhuǎn)換.
例:intx=2;
weekdayday;day=x;?
day=(weekday)x;?
4.2.2枚舉變量定義及使用2025/10/9北京郵電大學信息與通信工程學院-62-例4-9讀入1-7之間的一個數(shù)代表今天,輸出明天是星期幾。#include<iostream>usingnamespacestd;enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat};voidmain(){ cout<<"今天是星期(請輸入一個數(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;}}2025/10/9北京郵電大學信息與通信工程學院-65-例:口袋中有紅、黃、藍、白、黑五種顏色的球若干個。每次從口袋中取出3個不同顏色的球,問有多少種取法。分析:由于球只能是五種顏色之一,故可用枚舉類型表示球的顏色。設(shè)取出的球為i、j、k,根據(jù)題意,i、j、k分別可以有五種取值,且i≠j≠k??梢杂酶F舉法,逐個檢驗每一種可能的組合,從中找出符合要求的組合并輸出。#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){//前兩個球不同
for(k=red;k<=black;k++)
if((k!=i)&&(k!=j)){
//第三個球不同于前兩個
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)實生活中意義密切相關(guān)的一組數(shù)據(jù)組合成一個整體,即由各種數(shù)據(jù)類型(可以是基本數(shù)據(jù)類型或已聲明的自定義數(shù)據(jù)類型)的數(shù)據(jù)組成一個集合,稱為結(jié)構(gòu)類型。例如,一個學生的學號、姓名、年齡、成績等,雖然分別屬于不同的數(shù)據(jù)類型,但它們之間是密切相關(guān)的,因為每一組信息屬于一個人。2025/10/9北京郵電大學信息與通信工程學院-69-2025/10/9北京郵電大學電信工程學院計算機技術(shù)中心-70-結(jié)構(gòu)類型的定義結(jié)構(gòu)的聲明形式:struct
結(jié)構(gòu)類型名{數(shù)據(jù)類型標識符1成員名1;數(shù)據(jù)類型標識符2成員名2;┇數(shù)據(jù)類型標識符n成員名n;};4.3.1結(jié)構(gòu)類型的定義和初始化structstudent{longnum;//學號
charname[20];//姓名
charsex;//性別
intage;//年齡
floatscore; //成績
charaddr[30];//住址};//必須以分號結(jié)束結(jié)構(gòu)的定義2025/10/9北京郵電大學信息與通信工程學院-71-2.結(jié)構(gòu)成員的訪問定義結(jié)構(gòu)類型的變量:
結(jié)構(gòu)類型名
結(jié)構(gòu)變量名;例:定義student類型的變量:students1;4.3.1結(jié)構(gòu)類型的定義和初始化2025/10/9北京郵電大學電信工程學院計算機技術(shù)中心-72-結(jié)構(gòu)類型的變量所占的存儲空間是結(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)類型的變量所占的存儲空間考慮到對齊的要求,系統(tǒng)會將占空間不是4的倍數(shù)的成員空間調(diào)整為4的倍數(shù):將成員sex調(diào)整為4字節(jié),將成員addr調(diào)整為32字節(jié),總共占用68字節(jié)。2025/10/9北京郵電大學信息與通信工程學院-73-結(jié)構(gòu)成員的訪問:
結(jié)構(gòu)變量名.成員名例:students1;
s1.num=1;cout<<s1.num<<endl;
cout<<<<endl;如同使用一個變量如同使用一個數(shù)組訪問結(jié)構(gòu)成員2025/10/9北京郵電大學信息與通信工程學院-74-3.結(jié)構(gòu)變量的初始化定義結(jié)構(gòu)變量時直接初始化students2={20041118,”LiLi”,18,90};分別給各個成員賦值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; //學號
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;}運行結(jié)果:20041118LiLiF182025/10/9北京郵電大學信息與通信工程學院-76-結(jié)構(gòu)體可以由不同數(shù)據(jù)類型的成員構(gòu)成,這些成員可能是基本數(shù)據(jù)類型,也可能是自定義的數(shù)據(jù)類型,例如已聲明的另一個結(jié)構(gòu)類型。
例4-11
訪問帶有結(jié)構(gòu)體類型成員的結(jié)構(gòu)體變量。
2025/10/9北京郵電大學信息與通信工程學院-77-//例4-11結(jié)構(gòu)體定義的嵌套#include<iostream>usingnamespacestd;structdate{ intyear; intmonth; intday;};structWeather{datetoday;doubletemp;//溫度
doublewind;//風力}2025/10/9北京郵電大學電信工程學院計算機技術(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<<"度,風力:"<<today_weather.wind<<"級"<<endl;}運行結(jié)果:2004年11月30日的天氣是:溫度:10度,風力:3.1級2025/10/9北京郵電大學信息與通信工程學院-79-4.結(jié)構(gòu)的賦值運算屬于同一結(jié)構(gòu)類型的各個變量之間可以相互賦值。這一點和數(shù)組不同,C++規(guī)定,不能直接進行數(shù)組名的賦值,因為數(shù)組名是一個常量,而結(jié)構(gòu)類型的變量可以賦值。
不同結(jié)構(gòu)的變量不允許相互賦值。
即使這兩個變量可能具有同樣的成員。4.3.1結(jié)構(gòu)類型的定義和初始化2025/10/9北京郵電大學信息與通信工程學院-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;//?2025/10/9北京郵電大學信息與通信工程學院-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ù)組2025/10/9北京郵電大學信息與通信工程學院-82-結(jié)構(gòu)數(shù)組
格式:
結(jié)構(gòu)名數(shù)組名[常量表達式];結(jié)構(gòu)數(shù)組的元素
結(jié)構(gòu)數(shù)組的每個元素都是該結(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;}2025/10/9北京郵電大學電信工程學院計算機技術(shù)中心-83-#include<iostream>usingnamespacestd;structEmployee{charname[20];unsignedlongid;floatsalary;};例4-12公司有六個員工,把他們按工資由低到高排序。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}};2025/10/9北京郵電大學信息與通信工程學院-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;}運行結(jié)果:
zhou275193110
zhang123453390
yang239874000
wang139164490
chen123355110
meng428
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 請示報告重大事項制度
- 計量檢定實驗室八項制度
- 行政人事部績效制度
- 銀川公司審計制度
- 2026湖北武漢武昌區(qū)中南電力設(shè)計院有限公司數(shù)智科技公司招聘4人參考考試試題附答案解析
- 2026年淄博周村區(qū)事業(yè)單位公開招聘綜合類崗位人員(9人)參考考試題庫附答案解析
- 2026山東事業(yè)單位統(tǒng)考省文物考古研究院招聘初級綜合類崗位2人備考考試題庫附答案解析
- 2026福建三明市永安市羅坊鄉(xiāng)人民政府招聘編外聘用駕駛員1人參考考試試題附答案解析
- 2026西藏昌都卡若區(qū)招聘社區(qū)工作者48人參考考試試題附答案解析
- 2026湖北武漢武昌區(qū)中南電力設(shè)計院有限公司數(shù)智科技公司招聘4人參考考試題庫附答案解析
- 管理學試題及參考答案 (一)
- 2025年廣西壯族自治區(qū)高職單招信息技術(shù)測試(信息技術(shù))
- 2025年電力交易員試題及答案解析
- 2024集中式光伏電站場區(qū)典型設(shè)計手冊
- 野山參課件教學課件
- 實施指南(2025)《HG-T 5026-2016氯堿工業(yè)回收硫酸》
- 無人機安全操控理論考試題及答案
- 2025年蘇州經(jīng)貿(mào)職業(yè)技術(shù)學院單招綜合素質(zhì)考試題庫附答案
- 儀表聯(lián)鎖培訓課件
- 華為固定資產(chǎn)管理制度
- 客運駕駛員培訓教學大綱
評論
0/150
提交評論