中小學(xué)生青少年C++程序設(shè)計(jì)(NOIP版)-結(jié)構(gòu)體_第1頁
中小學(xué)生青少年C++程序設(shè)計(jì)(NOIP版)-結(jié)構(gòu)體_第2頁
中小學(xué)生青少年C++程序設(shè)計(jì)(NOIP版)-結(jié)構(gòu)體_第3頁
中小學(xué)生青少年C++程序設(shè)計(jì)(NOIP版)-結(jié)構(gòu)體_第4頁
中小學(xué)生青少年C++程序設(shè)計(jì)(NOIP版)-結(jié)構(gòu)體_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論