中小学生青少年C++程序设计(NOIP版)-结构体_第1页
中小学生青少年C++程序设计(NOIP版)-结构体_第2页
中小学生青少年C++程序设计(NOIP版)-结构体_第3页
中小学生青少年C++程序设计(NOIP版)-结构体_第4页
中小学生青少年C++程序设计(NOIP版)-结构体_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++程序设计(ForNOIP)结构体结构体的引出结构体的定义结构体的使用方法结构体实例练习提高练习NOIP进阶主要内容结构体的引出原有处理方法的局限在存储和处理大批量的数据时,通常会使用数组来实现,但是数组要求其元素的类型或含义必须一样。对于同时处理不同类型数据的情况时,需要同时建立多个一一对应的数组。现实中经常会需要把不同类型,不同含义的数据当作一个整体来进行处理。比如,对于1000个学生的姓名、性别、年龄、体重、各科成绩等进行处理,此时,使用多数组处理方式会非常繁琐、复杂。结构体的引出使用数组方案解决学生信息处理的局限1000名学生的数组处理方案,需要建立若干个数组,每个数组存储一类数据,管理起来非常困难,且很容易造成数据错误结构体的引出最优化的处理方式将归属同一个体的多种异类型数据集合在一起管理,比如将每个学生的编号、姓名、性别、年龄等信息集合在一起管理结构体就是这样允许由一系

列相同或不同类型的数据构

成的数据集合。结构体的定义结构体的第一种定义方式先定义一个结构体类型,再定义此类型的变量下面的示例,先定义了一个结构体类型STUDENT,然后定义了两个此类型的变量stu1、stu2(定义变量时struct可以省略)struct

结构体类型名{

数据类型1成员名1;

数据类型2成员名2; …

数据类型n成员名n;};struct

结构体类型名变量名;struct

STUDENT{ stringname; charsex; intage; floatheight;};struct

STUDENT

stu1,stu2;结构体的定义

结构体的第二种定义方式定义一个结构体类型的同时定义此类型的变量下面的示例,在定义学生结构体类型student的同时,定义了一个此类型的数组,共有1000个元素struct结构体类型名{

数据类型1成员名1;

数据类型2成员名2; …

数据类型n成员名n;}结构体变量名;structSTUDENT{ stringname; charsex; intage; floatheight; intscore;}stu[1000];结构体的使用

结构体变量的初始化在定义结构体变量的同时对其进行初始化可以对结构体变量的整体进行操作,下面的示例将一个结构体变量stu1像普通变量一样赋值给同类型的结构体变量stu2

struct

STUDENT

stu={“张芳”,‘F’,12,163};structSTUDENT

stu1={“张芳”,‘F’,12,163},stu2;stu2=stu1;结构体的使用

结构体变量的成员访问引用结构体变量中成员的格式:

结构体变量名.成员名以下的示例创建了STUDENT类型的结构体变量stu,并对其中的name和age成员进行初始化。structSTUDENT

stu;cin>>stu.age=12;结构体的使用

结构体数组结构体也可以创建数组,使用方法和普通变量基本相同以下的示例创建了一个STUDENT类型的结构体变量数组,并对其中一个元素的name和age成员进行了初始化。structSTUDENT

stu[100];cin>>stu[0].namestu[0].age=12;问题描述输入一个学生的信息,包括姓名、性别、年龄、体重,再输出这些信息输入格式一行,依次是学生的姓名、性别、年龄、体重,以空格间隔输出格式一行,依次是学生的姓名、性别、年龄、体重,以空格间隔输入样例刘芳m1595.4输出样例刘芳m1595.4例1-学生信息参考代码例1-学生信息#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<<"";}结构体定义主函数问题描述输入N个学生的编号、姓名、语文和数学成绩,并输出总分最高的学生的所有信息输入格式第一行,输入一个整数N,取值范围[1-100]下面N行,每行依次为编号、姓名、语文成绩、数学成绩输出格式一行,依次是最高分学生的编号、姓名、语文成绩、数学成绩例2-统计学生成绩输入样例4S1000刘芳8785S1001何兰8678S1002李建8990S1003张鹏6580输出样例S1002李建8990例2-统计学生成绩参考代码#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;

}//输出结果 cout<<temp.num<<""<<

<<""; cout<<temp.chinese<<""<<temp.math<<"";}例2-统计学生成绩(使用函数)结构体定义主函数结构体作为函数参数

结构体变量可以像普通变量一样作为函数参数使用函数定义函数调用intfunc(STUDENTstu,…){…}struct

STUDENT

{…}stu;//定义结构体类型及变量//调用函数,传递结构体变量intresult=func(stu,…);问题描述输入N个学生的编号、姓名、语文和数学成绩输出总分最高的学生的所有信息输入格式第一行,输入一个整数N,取值范围[1-100]下面N行,每行依次为编号、姓名、语文成绩、数学成绩,以空格间隔输出格式一行,依次是最高分学生的编号、姓名、语文成绩、数学成绩,以空格间隔输入、输出样例(同例2)例3-统计学生成绩(使用函数)参考代码#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;

}//输出结果 cout<<temp.num<<""<<

<<""; cout<<temp.chinese<<""<<temp.math<<"";}例2-统计学生成绩(使用函数)结构体定义主函数问题描述输入N个学生的编号、姓名、语文和数学成绩输出总分最高的学生的所有信息输入格式第一行,输入一个整数N,取值范围[1-100]下面N行,每行依次为编号、姓名、语文成绩、数学成绩,以空格间隔输出格式一行,依次是最高分学生的编号、姓名、语文成绩、数学成绩,以空格间隔输入输出样例(同例2)例3-统计学生成绩(使用函数、结构体数组)参考代码(1/2)例3-统计学生成绩(使用函数、结构体数组)#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;}结构体定义FindMax函数参考代码(2/2)例3-统计学生成绩(使用函数与结构体数组)STUDENTFindMax(STUDENTstu[],intn);//函数声明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);//函数调用 cout<<temp.num<<""<<

<<""; cout<<temp.chinese<<""<<temp.math<<"";}主函数问题描述甲流盛行时期,为了更好地进行分流治疗,医院在挂号时要求对病人的体温和咳嗽情况进行预检,对于体温超过37.5度(含),且咳嗽的病人,初步判定为甲流病人(初筛)。现需统计某天前来挂号就诊的病人中有多少人被初筛为甲流病人。输入格式第一行是某天前来就诊的病人数n(n<200)。其后有n行,每行是病人的信息,包括三个信息:姓名(字符串,不含空格,最多8个字符),体温(float),是否咳嗽(1咳嗽,0否)。每行三个信息用一个空格间隔。常规练习-甲流病人初筛输出格式第一行为正整数,表示被筛选为甲流的病人数量其后按输入顺序依次输出所有被筛选为甲流的病人的姓名,每个名字占一行常规练习-甲流病人初筛输入样例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未选中};结构体定义常规练习-甲流病人初筛参考代码(2/2)常规练习-甲流病人初筛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;//输出数量

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

{//依次输出病人姓名 if(pat[i].select==1)cout<<pat[i].name<<endl;

}}主函数问题描述有n只猴子围成一圈,从1-n编号,大家决定从中选出一个大王。经过协商,决定选大王的规则为:从编号为1的猴子开始报数,报到k的猴子出圈,然后再从下一只开始继续报1到k……,最后剩下的那一只就是大王。要求编程从键盘输入n,k,输出成为大王的猴子编号。输入格式一行两个正整数n和k,2<=n<=1000,2<=k<=109。输出格式一行一个正整数,代表猴王的编号提高练习-猴子选大王输入样例32输出样例3思路思路1:使用一维结构体数组,猴子状态用0代表出圈,1为在圈内,每轮报数时一个猴子状态将被置0,反复报数直至只剩下一个1(缺点:存在重复扫描数组)思路2:建立一个模拟链表,链表元素为每只猴子的编号,每轮出圈猴子被移出链表,直到链表中只剩下一只猴子(优点:可以解决重复扫描问题)提高练习-猴子选大王思路1:使用一维结构体数组猴子状态,用0代表出圈,1为在圈内,

每轮报数时将有一个猴子状态置0,如此反

复报数直至

只剩下一个未出圈的1缺点:存在重复扫描数组提高练习-猴子选大王参考代码(1/2)提高练习-猴子选大王(思路1-1:使用一维结构体数组)structMONKEY{

intcode;//猴子编号//是否出圈,true:出圈//false:不出圈

boolout;};结构体定义intmain(){

intn,k;

cin

>>n>>k;

MONKEYmonkey[1000];

//先将全部猴子设置为未出圈

for(intj=0;j<n;j++){ monkey[j].code=j+1;//编号 monkey[j].out=false;//是否出圈

}//调用函数

intking=MonkeyKing(monkey,n,k);

cout

<<king;}主函数参考代码(1/2)MonkeyKing函数提高练习-猴子选大王(思路1-1:使用一维结构体数组)intMonkeyKing(MONKEYmonkey[],intn,intk){

intcnt=n,num=0,i=0;

while(cnt>1){

if(monkey[i].out==false){//找到一个未出圈的

num++;//报数

if(num==k){//是否报到k了?

monkey[i].out=true;//到k,出圈

num=0;//下一个从头报数

cnt--;//剩余数量减一

}

} i++;//扫描下一个

if(i==n)i=0;//一轮扫描完,继续下一轮

}

for(intj=0;j<n;j++)

//看看谁剩下了

if(monkey[i].out==false)

returnmonkey[i].code;}思考是否可以改进?结构数组使用了两个字段,其中code字段专门用来存放猴子编号仔细思考一下:其实code字段无非就是一个增1的标号,与数组的下标有着一致的特性,完全可以直接使用数组下标代替编号,只使用一个一维整型数组,这样可以节省存储空间。提高练习-猴子选大王(思路1-1:使用一维结构体数组)structMONKEY{

intcode;//猴子编号

boolout;//是否出圈,true:出圈false:不出圈};参考代码(1/2)主函数提高练习-猴子选大王(思路1-2:只使用一维数组)intmain(){

intn,k;

intcircle[1000];//最多1000只猴子 cin>>n>>k; //先将全部猴子设置为未出圈

for(intj=0;j<n;j++)

circle[j]=1;//0代表未出圈,1为出圈

intking=MonkeyKing(circle,n,k);//调用函数 cout<<king;}参考代码(2/2)intMonkeyKing(intcircle[],intn,intk){

intcnt=n,num=0,i=0;

while(cnt>1)

{

if(circle[i]==1)

{//找到一个未出圈的

num++;//报数

if(num==k){//是否报到k了?

circle[i]=0;//到k,出圈

num=0;//下一个从头报数

cnt--;//剩余数量减一

}

} i++;//扫描下一个

if(i==n)i=0;//报完一轮,再从1开始报

}

for(intj=0;j<n;j++)

//看看谁剩下了

if(circle[j]==1)

returnj+1;//编号比下标多一}MonkeyKing函数提高练习-猴子选大王(思路1-2:只使用一维数组)问题描述(1/3)某小学最近得到一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定编号小的同学排在前面,这样,每个学生的排序是唯一确定的。任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前5名学生的编号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。NOIP进阶-奖学金(NOIP2007普及组复赛sort,1s,256MB)问题描述(2/3)例如,在某正确答案中,如果前两行的输出数据(每行输出两个数:编号、总分)是:72795279这两行数据的含义是:总分最高的两个同学的编号依次是7号、5号。这两名同学的总分都是279(总分等于输入的语文、数学、英语三科成绩之和),但编号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:52797279则按输出错误处理,不能得分。NOIP进阶-奖学金(NOIP2007普及组复赛sort,1s,256MB)问题描述(3/3)例如,在某正确答案中,如果前两行的输出数据(每行输出两个数:编号、总分)是:72795279这两行数据的含义是:总分最高的两个同学的编号依次是7号、5号。这两名同学的总分都是279(总分等于输入的语文、数学、英语三科成绩之和),但编号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:52797279则按输出错误处理,不能得分。NOIP进阶-奖学金(NOIP2007普及组复赛sort,1s,256MB)输入格式第一行为一个正整数n,表示该校参加评选的学生人数。第2-n+1行,每行有3个数字,每个数字都在0–100之间。第j行的3个数字依次表示编号为j-1的学生的语文、数学、英语的成绩。每个学生的编号按照输入顺序编号为1-n(恰好是输入数据的行号减1)。所给的数据都是正确的不必校验。输出格式共有5行,每行是两个用一个空格隔开的正整数,依次表示前5名学生的编号和总分。NOIP进阶-奖学金(NOIP2007普及组复赛sort,1s,256MB)输入样例16906780876691788991889977678964788998NOIP进阶-奖学金(NOIP2007普及组复赛sort,1s,256MB)输出样例162654264325822441237输入样例28808989889878906780876691788991889977678964788998输出样例282652264626412585258数据范围50%的数据满足:各学生的总成绩各不相同。100%的数据满足:6<=n<=300思路使用结构体数组存储所有学生的所有数据对冒泡排序法加以改进,在正常降序排序的同时,当总成绩相同时,再按语文成绩和序号判定是否是否交换NOIP进阶-奖学金(NOIP2007普及组复赛sort,1s,256MB)参考代码(1/2)structSTUDENT{

intnum; intchn; intmath; inteng;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论