版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
C++程序設(shè)計(jì)(ForNOIP)結(jié)構(gòu)體結(jié)構(gòu)體的引出結(jié)構(gòu)體的定義結(jié)構(gòu)體的使用方法結(jié)構(gòu)體實(shí)例練習(xí)提高練習(xí)NOIP進(jìn)階主要內(nèi)容結(jié)構(gòu)體的引出原有處理方法的局限在存儲和處理大批量的數(shù)據(jù)時(shí),通常會使用數(shù)組來實(shí)現(xiàn),但是數(shù)組要求其元素的類型或含義必須一樣。對于同時(shí)處理不同類型數(shù)據(jù)的情況時(shí),需要同時(shí)建立多個一一對應(yīng)的數(shù)組?,F(xiàn)實(shí)中經(jīng)常會需要把不同類型,不同含義的數(shù)據(jù)當(dāng)作一個整體來進(jìn)行處理。比如,對于1000個學(xué)生的姓名、性別、年齡、體重、各科成績等進(jìn)行處理,此時(shí),使用多數(shù)組處理方式會非常繁瑣、復(fù)雜。結(jié)構(gòu)體的引出使用數(shù)組方案解決學(xué)生信息處理的局限1000名學(xué)生的數(shù)組處理方案,需要建立若干個數(shù)組,每個數(shù)組存儲一類數(shù)據(jù),管理起來非常困難,且很容易造成數(shù)據(jù)錯誤結(jié)構(gòu)體的引出最優(yōu)化的處理方式將歸屬同一個體的多種異類型數(shù)據(jù)集合在一起管理,比如將每個學(xué)生的編號、姓名、性別、年齡等信息集合在一起管理結(jié)構(gòu)體就是這樣允許由一系
列相同或不同類型的數(shù)據(jù)構(gòu)
成的數(shù)據(jù)集合。結(jié)構(gòu)體的定義結(jié)構(gòu)體的第一種定義方式先定義一個結(jié)構(gòu)體類型,再定義此類型的變量下面的示例,先定義了一個結(jié)構(gòu)體類型STUDENT,然后定義了兩個此類型的變量stu1、stu2(定義變量時(shí)struct可以省略)struct
結(jié)構(gòu)體類型名{
數(shù)據(jù)類型1成員名1;
數(shù)據(jù)類型2成員名2; …
數(shù)據(jù)類型n成員名n;};struct
結(jié)構(gòu)體類型名變量名;struct
STUDENT{ stringname; charsex; intage; floatheight;};struct
STUDENT
stu1,stu2;結(jié)構(gòu)體的定義
結(jié)構(gòu)體的第二種定義方式定義一個結(jié)構(gòu)體類型的同時(shí)定義此類型的變量下面的示例,在定義學(xué)生結(jié)構(gòu)體類型student的同時(shí),定義了一個此類型的數(shù)組,共有1000個元素struct結(jié)構(gòu)體類型名{
數(shù)據(jù)類型1成員名1;
數(shù)據(jù)類型2成員名2; …
數(shù)據(jù)類型n成員名n;}結(jié)構(gòu)體變量名;structSTUDENT{ stringname; charsex; intage; floatheight; intscore;}stu[1000];結(jié)構(gòu)體的使用
結(jié)構(gòu)體變量的初始化在定義結(jié)構(gòu)體變量的同時(shí)對其進(jìn)行初始化可以對結(jié)構(gòu)體變量的整體進(jìn)行操作,下面的示例將一個結(jié)構(gòu)體變量stu1像普通變量一樣賦值給同類型的結(jié)構(gòu)體變量stu2
struct
STUDENT
stu={“張芳”,‘F’,12,163};structSTUDENT
stu1={“張芳”,‘F’,12,163},stu2;stu2=stu1;結(jié)構(gòu)體的使用
結(jié)構(gòu)體變量的成員訪問引用結(jié)構(gòu)體變量中成員的格式:
結(jié)構(gòu)體變量名.成員名以下的示例創(chuàng)建了STUDENT類型的結(jié)構(gòu)體變量stu,并對其中的name和age成員進(jìn)行初始化。structSTUDENT
stu;cin>>stu.age=12;結(jié)構(gòu)體的使用
結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體也可以創(chuàng)建數(shù)組,使用方法和普通變量基本相同以下的示例創(chuàng)建了一個STUDENT類型的結(jié)構(gòu)體變量數(shù)組,并對其中一個元素的name和age成員進(jìn)行了初始化。structSTUDENT
stu[100];cin>>stu[0].namestu[0].age=12;問題描述輸入一個學(xué)生的信息,包括姓名、性別、年齡、體重,再輸出這些信息輸入格式一行,依次是學(xué)生的姓名、性別、年齡、體重,以空格間隔輸出格式一行,依次是學(xué)生的姓名、性別、年齡、體重,以空格間隔輸入樣例劉芳m1595.4輸出樣例劉芳m1595.4例1-學(xué)生信息參考代碼例1-學(xué)生信息#include<iostream>usingnamespacestd;structSTUDENT{ stringname;
charsex;
intage;
floatweight;};intmain(){
structSTUDENTstu; cin>>stu.name>>stu.sex; cin>>stu.age>>stu.weight; cout<<stu.name<<""; cout<<stu.sex<<""; cout<<stu.age<<""; cout<<stu.weight<<"";}結(jié)構(gòu)體定義主函數(shù)問題描述輸入N個學(xué)生的編號、姓名、語文和數(shù)學(xué)成績,并輸出總分最高的學(xué)生的所有信息輸入格式第一行,輸入一個整數(shù)N,取值范圍[1-100]下面N行,每行依次為編號、姓名、語文成績、數(shù)學(xué)成績輸出格式一行,依次是最高分學(xué)生的編號、姓名、語文成績、數(shù)學(xué)成績例2-統(tǒng)計(jì)學(xué)生成績輸入樣例4S1000劉芳8785S1001何蘭8678S1002李建8990S1003張鵬6580輸出樣例S1002李建8990例2-統(tǒng)計(jì)學(xué)生成績參考代碼#include<iostream>usingnamespacestd;structSTUDENT{ stringnum; stringname; intchinese; intmath;};intmain(){ structSTUDENTstu,temp;
intn; cin>>n; cin>>
stu.num>>
stu.name; cin>>
stu.chinese>>
stu.math; temp=stu; for(inti=1;i<n;i++) { cin>>
stu.num>>
stu.name; cin>>
stu.chinese>>
stu.math;
inttempTotal=temp.chinese+temp.math;
intcurTotal=stu.chinese+stu.math; //比較總分
if(tempTotal<curTotal)temp=stu;
}//輸出結(jié)果 cout<<temp.num<<""<<
<<""; cout<<temp.chinese<<""<<temp.math<<"";}例2-統(tǒng)計(jì)學(xué)生成績(使用函數(shù))結(jié)構(gòu)體定義主函數(shù)結(jié)構(gòu)體作為函數(shù)參數(shù)
結(jié)構(gòu)體變量可以像普通變量一樣作為函數(shù)參數(shù)使用函數(shù)定義函數(shù)調(diào)用intfunc(STUDENTstu,…){…}struct
STUDENT
{…}stu;//定義結(jié)構(gòu)體類型及變量//調(diào)用函數(shù),傳遞結(jié)構(gòu)體變量intresult=func(stu,…);問題描述輸入N個學(xué)生的編號、姓名、語文和數(shù)學(xué)成績輸出總分最高的學(xué)生的所有信息輸入格式第一行,輸入一個整數(shù)N,取值范圍[1-100]下面N行,每行依次為編號、姓名、語文成績、數(shù)學(xué)成績,以空格間隔輸出格式一行,依次是最高分學(xué)生的編號、姓名、語文成績、數(shù)學(xué)成績,以空格間隔輸入、輸出樣例(同例2)例3-統(tǒng)計(jì)學(xué)生成績(使用函數(shù))參考代碼#include<iostream>usingnamespacestd;structSTUDENT{ stringnum; stringname;
intchinese;
intmath;};intmain(){ structSTUDENTstu,temp;
intn; cin>>n; cin>>
stu.num>>
stu.name; cin>>
stu.chinese>>
stu.math; temp=stu; for(inti=1;i<n;i++) { cin>>
stu.num>>
stu.name; cin>>
stu.chinese>>
stu.math;
inttempTotal=temp.chinese+temp.math;
intcurTotal=stu.chinese+stu.math; //比較總分
if(tempTotal<curTotal)temp=stu;
}//輸出結(jié)果 cout<<temp.num<<""<<
<<""; cout<<temp.chinese<<""<<temp.math<<"";}例2-統(tǒng)計(jì)學(xué)生成績(使用函數(shù))結(jié)構(gòu)體定義主函數(shù)問題描述輸入N個學(xué)生的編號、姓名、語文和數(shù)學(xué)成績輸出總分最高的學(xué)生的所有信息輸入格式第一行,輸入一個整數(shù)N,取值范圍[1-100]下面N行,每行依次為編號、姓名、語文成績、數(shù)學(xué)成績,以空格間隔輸出格式一行,依次是最高分學(xué)生的編號、姓名、語文成績、數(shù)學(xué)成績,以空格間隔輸入輸出樣例(同例2)例3-統(tǒng)計(jì)學(xué)生成績(使用函數(shù)、結(jié)構(gòu)體數(shù)組)參考代碼(1/2)例3-統(tǒng)計(jì)學(xué)生成績(使用函數(shù)、結(jié)構(gòu)體數(shù)組)#include<iostream>usingnamespacestd;structSTUDENT{ stringnum; stringname;
intchinese;
intmath;};STUDENTFindMax(STUDENTstu[],intn){
STUDENTtemp; temp=stu[0];//先把第一個元素作為最大值
for(inti=0;i<n;i++)
{
inttempTotal=temp.chinese+temp.math;
intcurTotal=stu[i].chinese+stu[i].math;
//比較總分
if(tempTotal<curTotal)temp=stu[i];
}
returntemp;}結(jié)構(gòu)體定義FindMax函數(shù)參考代碼(2/2)例3-統(tǒng)計(jì)學(xué)生成績(使用函數(shù)與結(jié)構(gòu)體數(shù)組)STUDENTFindMax(STUDENTstu[],intn);//函數(shù)聲明intmain(){
STUDENTstu[10];
intn; cin>>n;
for(inti=1;i<n;i++)
{ cin>>stu[i].num>>stu[i].name; cin>>stu[i].chinese>>stu[i].math;
}
STUDENTtemp=FindMax(stu,n);//函數(shù)調(diào)用 cout<<temp.num<<""<<
<<""; cout<<temp.chinese<<""<<temp.math<<"";}主函數(shù)問題描述甲流盛行時(shí)期,為了更好地進(jìn)行分流治療,醫(yī)院在掛號時(shí)要求對病人的體溫和咳嗽情況進(jìn)行預(yù)檢,對于體溫超過37.5度(含),且咳嗽的病人,初步判定為甲流病人(初篩)?,F(xiàn)需統(tǒng)計(jì)某天前來掛號就診的病人中有多少人被初篩為甲流病人。輸入格式第一行是某天前來就診的病人數(shù)n(n<200)。其后有n行,每行是病人的信息,包括三個信息:姓名(字符串,不含空格,最多8個字符),體溫(float),是否咳嗽(1咳嗽,0否)。每行三個信息用一個空格間隔。常規(guī)練習(xí)-甲流病人初篩輸出格式第一行為正整數(shù),表示被篩選為甲流的病人數(shù)量其后按輸入順序依次輸出所有被篩選為甲流的病人的姓名,每個名字占一行常規(guī)練習(xí)-甲流病人初篩輸入樣例4張芳38.51李杰37.60何偉39.01劉華37.1
1輸出樣例2張芳何偉參考代碼(1/2)#include<iostream>usingnamespacestd;structPatient{ stringname;
floattem;//體溫
intcough;//是否咳嗽,1表示咳嗽,0否
intselect;//是否篩中,1表示初篩選中,0未選中};結(jié)構(gòu)體定義常規(guī)練習(xí)-甲流病人初篩參考代碼(2/2)常規(guī)練習(xí)-甲流病人初篩intmain(){
intn,cnt=0;
Patientpat[200]; cin>>n;
for(inti=0;i<n;i++){
cin
>>pat[i].name>>pat[i].tem>>pat[i].cough;
if(pat[i].tem>=37.5&&pat[i].cough==1){
pat[i].select=1;cnt++;//符合初篩條件
}
elsepat[i].select=0;
}
cout
<<cnt<<endl;//輸出數(shù)量
for(inti=0;i<n;i++)
{//依次輸出病人姓名 if(pat[i].select==1)cout<<pat[i].name<<endl;
}}主函數(shù)問題描述有n只猴子圍成一圈,從1-n編號,大家決定從中選出一個大王。經(jīng)過協(xié)商,決定選大王的規(guī)則為:從編號為1的猴子開始報(bào)數(shù),報(bào)到k的猴子出圈,然后再從下一只開始繼續(xù)報(bào)1到k……,最后剩下的那一只就是大王。要求編程從鍵盤輸入n,k,輸出成為大王的猴子編號。輸入格式一行兩個正整數(shù)n和k,2<=n<=1000,2<=k<=109。輸出格式一行一個正整數(shù),代表猴王的編號提高練習(xí)-猴子選大王輸入樣例32輸出樣例3思路思路1:使用一維結(jié)構(gòu)體數(shù)組,猴子狀態(tài)用0代表出圈,1為在圈內(nèi),每輪報(bào)數(shù)時(shí)一個猴子狀態(tài)將被置0,反復(fù)報(bào)數(shù)直至只剩下一個1(缺點(diǎn):存在重復(fù)掃描數(shù)組)思路2:建立一個模擬鏈表,鏈表元素為每只猴子的編號,每輪出圈猴子被移出鏈表,直到鏈表中只剩下一只猴子(優(yōu)點(diǎn):可以解決重復(fù)掃描問題)提高練習(xí)-猴子選大王思路1:使用一維結(jié)構(gòu)體數(shù)組猴子狀態(tài),用0代表出圈,1為在圈內(nèi),
每輪報(bào)數(shù)時(shí)將有一個猴子狀態(tài)置0,如此反
復(fù)報(bào)數(shù)直至
只剩下一個未出圈的1缺點(diǎn):存在重復(fù)掃描數(shù)組提高練習(xí)-猴子選大王參考代碼(1/2)提高練習(xí)-猴子選大王(思路1-1:使用一維結(jié)構(gòu)體數(shù)組)structMONKEY{
intcode;//猴子編號//是否出圈,true:出圈//false:不出圈
boolout;};結(jié)構(gòu)體定義intmain(){
intn,k;
cin
>>n>>k;
MONKEYmonkey[1000];
//先將全部猴子設(shè)置為未出圈
for(intj=0;j<n;j++){ monkey[j].code=j+1;//編號 monkey[j].out=false;//是否出圈
}//調(diào)用函數(shù)
intking=MonkeyKing(monkey,n,k);
cout
<<king;}主函數(shù)參考代碼(1/2)MonkeyKing函數(shù)提高練習(xí)-猴子選大王(思路1-1:使用一維結(jié)構(gòu)體數(shù)組)intMonkeyKing(MONKEYmonkey[],intn,intk){
intcnt=n,num=0,i=0;
while(cnt>1){
if(monkey[i].out==false){//找到一個未出圈的
num++;//報(bào)數(shù)
if(num==k){//是否報(bào)到k了?
monkey[i].out=true;//到k,出圈
num=0;//下一個從頭報(bào)數(shù)
cnt--;//剩余數(shù)量減一
}
} i++;//掃描下一個
if(i==n)i=0;//一輪掃描完,繼續(xù)下一輪
}
for(intj=0;j<n;j++)
//看看誰剩下了
if(monkey[i].out==false)
returnmonkey[i].code;}思考是否可以改進(jìn)?結(jié)構(gòu)數(shù)組使用了兩個字段,其中code字段專門用來存放猴子編號仔細(xì)思考一下:其實(shí)code字段無非就是一個增1的標(biāo)號,與數(shù)組的下標(biāo)有著一致的特性,完全可以直接使用數(shù)組下標(biāo)代替編號,只使用一個一維整型數(shù)組,這樣可以節(jié)省存儲空間。提高練習(xí)-猴子選大王(思路1-1:使用一維結(jié)構(gòu)體數(shù)組)structMONKEY{
intcode;//猴子編號
boolout;//是否出圈,true:出圈false:不出圈};參考代碼(1/2)主函數(shù)提高練習(xí)-猴子選大王(思路1-2:只使用一維數(shù)組)intmain(){
intn,k;
intcircle[1000];//最多1000只猴子 cin>>n>>k; //先將全部猴子設(shè)置為未出圈
for(intj=0;j<n;j++)
circle[j]=1;//0代表未出圈,1為出圈
intking=MonkeyKing(circle,n,k);//調(diào)用函數(shù) cout<<king;}參考代碼(2/2)intMonkeyKing(intcircle[],intn,intk){
intcnt=n,num=0,i=0;
while(cnt>1)
{
if(circle[i]==1)
{//找到一個未出圈的
num++;//報(bào)數(shù)
if(num==k){//是否報(bào)到k了?
circle[i]=0;//到k,出圈
num=0;//下一個從頭報(bào)數(shù)
cnt--;//剩余數(shù)量減一
}
} i++;//掃描下一個
if(i==n)i=0;//報(bào)完一輪,再從1開始報(bào)
}
for(intj=0;j<n;j++)
//看看誰剩下了
if(circle[j]==1)
returnj+1;//編號比下標(biāo)多一}MonkeyKing函數(shù)提高練習(xí)-猴子選大王(思路1-2:只使用一維數(shù)組)問題描述(1/3)某小學(xué)最近得到一筆贊助,打算拿出其中一部分為學(xué)習(xí)成績優(yōu)秀的前5名學(xué)生發(fā)獎學(xué)金。期末,每個學(xué)生都有3門課的成績:語文、數(shù)學(xué)、英語。先按總分從高到低排序,如果兩個同學(xué)總分相同,再按語文成績從高到低排序,如果兩個同學(xué)總分和語文成績都相同,那么規(guī)定編號小的同學(xué)排在前面,這樣,每個學(xué)生的排序是唯一確定的。任務(wù):先根據(jù)輸入的3門課的成績計(jì)算總分,然后按上述規(guī)則排序,最后按排名順序輸出前5名學(xué)生的編號和總分。注意,在前5名同學(xué)中,每個人的獎學(xué)金都不相同,因此,你必須嚴(yán)格按上述規(guī)則排序。NOIP進(jìn)階-獎學(xué)金(NOIP2007普及組復(fù)賽sort,1s,256MB)問題描述(2/3)例如,在某正確答案中,如果前兩行的輸出數(shù)據(jù)(每行輸出兩個數(shù):編號、總分)是:72795279這兩行數(shù)據(jù)的含義是:總分最高的兩個同學(xué)的編號依次是7號、5號。這兩名同學(xué)的總分都是279(總分等于輸入的語文、數(shù)學(xué)、英語三科成績之和),但編號為7的學(xué)生語文成績更高一些。如果你的前兩名的輸出數(shù)據(jù)是:52797279則按輸出錯誤處理,不能得分。NOIP進(jìn)階-獎學(xué)金(NOIP2007普及組復(fù)賽sort,1s,256MB)問題描述(3/3)例如,在某正確答案中,如果前兩行的輸出數(shù)據(jù)(每行輸出兩個數(shù):編號、總分)是:72795279這兩行數(shù)據(jù)的含義是:總分最高的兩個同學(xué)的編號依次是7號、5號。這兩名同學(xué)的總分都是279(總分等于輸入的語文、數(shù)學(xué)、英語三科成績之和),但編號為7的學(xué)生語文成績更高一些。如果你的前兩名的輸出數(shù)據(jù)是:52797279則按輸出錯誤處理,不能得分。NOIP進(jìn)階-獎學(xué)金(NOIP2007普及組復(fù)賽sort,1s,256MB)輸入格式第一行為一個正整數(shù)n,表示該校參加評選的學(xué)生人數(shù)。第2-n+1行,每行有3個數(shù)字,每個數(shù)字都在0–100之間。第j行的3個數(shù)字依次表示編號為j-1的學(xué)生的語文、數(shù)學(xué)、英語的成績。每個學(xué)生的編號按照輸入順序編號為1-n(恰好是輸入數(shù)據(jù)的行號減1)。所給的數(shù)據(jù)都是正確的不必校驗(yàn)。輸出格式共有5行,每行是兩個用一個空格隔開的正整數(shù),依次表示前5名學(xué)生的編號和總分。NOIP進(jìn)階-獎學(xué)金(NOIP2007普及組復(fù)賽sort,1s,256MB)輸入樣例16906780876691788991889977678964788998NOIP進(jìn)階-獎學(xué)金(NOIP2007普及組復(fù)賽sort,1s,256MB)輸出樣例162654264325822441237輸入樣例28808989889878906780876691788991889977678964788998輸出樣例282652264626412585258數(shù)據(jù)范圍50%的數(shù)據(jù)滿足:各學(xué)生的總成績各不相同。100%的數(shù)據(jù)滿足:6<=n<=300思路使用結(jié)構(gòu)體數(shù)組存儲所有學(xué)生的所有數(shù)據(jù)對冒泡排序法加以改進(jìn),在正常降序排序的同時(shí),當(dāng)總成績相同時(shí),再按語文成績和序號判定是否是否交換NOIP進(jìn)階-獎學(xué)金(NOIP2007普及組復(fù)賽sort,1s,256MB)參考代碼(1/2)structSTUDENT{
intnum; intchn; intmath; inteng;
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年辦公商業(yè)空間設(shè)計(jì)合作協(xié)議書
- 2024年抄紙助劑項(xiàng)目建議書
- 2024年二位二通電磁閥項(xiàng)目合作計(jì)劃書
- 2024年數(shù)字化電能表項(xiàng)目建議書
- 2024年生物質(zhì)干餾熱解系統(tǒng)項(xiàng)目合作計(jì)劃書
- 2024年地面測控管理設(shè)備項(xiàng)目建議書
- 2024年CDMA第三代蜂窩移動通信系統(tǒng)合作協(xié)議書
- 2024年輪式裝甲車玻璃系列項(xiàng)目合作計(jì)劃書
- 2024年虛擬演播室制作設(shè)備項(xiàng)目建議書
- 2023年中樞興奮藥項(xiàng)目評估分析報(bào)告
- 《圖形創(chuàng)意設(shè)計(jì)》課件-第1章 什么是圖形創(chuàng)意
- 電力儲能系統(tǒng)及解決方案
- 國家開放大學(xué)《民法學(xué)(1)》案例練習(xí)參考答案
- 建筑遺產(chǎn)的修復(fù)與保護(hù)方法
- 雪鐵龍DS6說明書
- 供配電系統(tǒng)安全操作規(guī)程培訓(xùn)
- 現(xiàn)澆混凝土路肩施工方案
- 道路監(jiān)測方案
- 2024年醫(yī)療器械培訓(xùn)記錄
- 醫(yī)療器械產(chǎn)業(yè)發(fā)展?fàn)顩r調(diào)查
- 新人教版高中日語第二冊課文匯總(標(biāo)音版+翻譯)
評論
0/150
提交評論