实验八结构体答案.docx
- 文档编号:25776025
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:41
- 大小:645.19KB
实验八结构体答案.docx
《实验八结构体答案.docx》由会员分享,可在线阅读,更多相关《实验八结构体答案.docx(41页珍藏版)》请在冰豆网上搜索。
实验八结构体答案
实验八结构体
一.实验目的与要求
1.掌握结构体和共用体类型定义的方法;
2.掌握结构体和共用体变量、数组、指针的定义和赋初值的方法;
3.掌握结构体和共用体变量、数组、指针的引用方法;
二.实验范例,熟悉下列程序,并掌握算法。
1.#include
main()
{union{inta;charb[2];}c;//共用体变量的所有成员共用一段内存,其内存大小为//所有成员中字节数最多成员的字节数
c.a=65;
puts(c.b);
printf("%d\n",sizeof(c));
}
运行结果:
2.main()
{union{
struct{intx,y;}in;
inta,b;
}e;
e.a=1;e.b=2;
e.in.x=e.a*e.b;
e.in.y=e.a+e.b;//共用体变量成员的赋值最后一次赋值为有效值
printf("%d%d",e.in.x,e.in.y);
}
运行结果:
3.structw{charlow;charhigh;};
unionu{structwbyte;intword;}uu;
main()
{
uu.word=0x1234;
printf("%04x\n",uu.word);printf("%02x\n",uu.byte.high);
printf("%02x\n",uu.byte.low);uu.byte.low=0xff;
printf("%04x\n",uu.word);
}
运行结果:
4.输入5本书的名称和单价,按照单价进行排序。
要求:
采用结构数组存储数据,使用冒泡或选择排序算法实现排序。
参考程序:
#include
structbook
{
charname[10];
floatprice;
};
voidsort(structbookbb[],intn)
{inti,j;
structbookt;
for(i=1;i for(j=0;j if(bb[j].price>bb[j+1].price) {t=bb[j];bb[j]=bb[j+1];bb[j+1]=t;} } voidmain() {inti; structbookb[5]={"计算机",23,"音乐",15,"语文",24,"数学",21,"英语",20}; sort(b,5); for(i=0;i<5;i++) printf("\n%s\t\t%.2f",b[i].name,b[i].price); printf("\n"); } 5.用结构体和函数调用方式编写程序。 要求实现: (1)在被调函数search()中,能根据学生姓名,查找学生,并返回是否查找成功。 (2)在主函数中,从键盘上输入5位学生的姓名和电话号码到结构体数组中,输入待查学生的姓名,调用search()函数,最后输出待查学生的电话号码。 参考程序: #include #include structstudent { charname[10]; chartel[12]; }; intsearch(structstudents[],charname[],intn) { inti; for(i=0;i if(strcmp(s[i].name,name)==0)returni; return-1; } voidmain() { structstudents[5]; inti,loc; charn[10]; printf("请输入5位学生的姓名和电话号码: "); for(i=0;i<5;i++) scanf("%s%s",s[i].name,s[i].tel); printf("请输入要查找学生的姓名: "); scanf("%s",n); loc=search(s,n,5); if(loc>=0) printf("要找学生的电话号码是: %s\n",s[loc].tel); elseprintf("该学生不存在\n"); } 6.用函数调用方式编写程序,要求实现: (1)在main函数中读入10名学生记录,存入结构数组s,调用fun函数,把平均成绩和分数最低的学生记录输出到屏幕上。 (2)被调函数fun求出10名学生的平均成绩并统计分数最低的学生记录(注意: 分数最低的学生可能不止一个),fun的参数是数组s的首地址和数组h的首地址(h中存放分数最低的学生记录),fun的返回值是分数最低的学生的人数。 一个学生记录放在如下结构中: structstudent {charnum[10]; intscore; }; 参考程序: #include structstudent {charnum[10]; intscore; }; intfun(structstudents[],structstudenth[],intn,float*aver) { inti,j=0,total,min; total=min=s[0].score; for(i=1;i { if(s[i].score total=total+s[i].score; } *aver=(float)total/n;//求平均成绩 for(i=0;i if(min==s[i].score)h[j++]=s[i]; returnj;//带回最低分数学生的人数 } voidmain() { structstudents[5],h[5]; inti,count; floataver; printf("请输入5位学号的姓名和考试成绩: "); for(i=0;i<5;i++) scanf("%s%d",s[i].num,&s[i].score); count=fun(s,h,5,&aver); printf("所有学生的平均成绩为: %f\n",aver); printf("分数最低学生记录为: \n"); for(i=0;i printf("%s\t%d\n",h[i].num,h[i].score); } 三、实验内容(按要求设计以下程序,并调试分析运行结果,此部分完成在实验报告上) 1.(sy8-1.c)已知学生的记录有学号和学习成绩构成,N名学生的数据已存入a结构体数组中。 请编写函数fun,该函数的功能是: 找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。 已给出函数的首部,请完成该函数。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 #include #include #include #defineN10 typedefstructss { charnum[10]; ints; }STU; voidfun(STUa[],STU*s) {inti,min; min=a[0].s; for(i=0;i if(a[i].s { min=a[i].s; *s=a[i]; } } main() { STUa[N]={{"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77}, {"A06",90},{"A07",79},{"A08",61},{"A09",80},{"A10",71}},m; inti; printf("****Theoriginaldata*****\n"); for(i=0;i printf("N0=%sMark=%d\n",a[i].num,a[i].s); fun(a,&m); printf("*****THERESULT*****\n"); printf("Thelowest: %s,%d\n",m.num,m.s); } 2.(sy8-2.c)学生的记录由学生成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是: 把分数最低的学生数据放在h所指的数组中,注意: 分数最低的学生可能不止一个,函数返回分数最低的学生的人数。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 #include #defineN16 typedefstruct { charnum[10]; ints; }STREC; intfun(STREC*a,STREC*b) { inti,j=0,min; min=a[0].s; for(i=1;i if(a[i].s for(i=0;i if(min==a[i].s)b[j++]=a[i]; returnj;//带回最低分数学生的人数 } main() { STRECs[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85}, {"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87}, {"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91}, {"GA011",91},{"GA017",64},{"GA018",64},{"GA016",72}}; STRECh[N]; inti,n; n=fun(s,h); printf("The%dlowestscore: \n",n); for(i=0;i printf("%s%4d\n",h[i].num,h[i].s); printf("\n"); } 3.(sy8-3.c)学生的记录有学号和成绩组成,N名学生的数据已在主函数中放入结构体函数组s中,请编写函数fun,它的功能是: 函数返回指定学号的学生数据,指定的学号在主函数中输出.若没找到指定学号,在结构提变量中给学号置空串,给成绩置-1,作为函数值返回(用于字符串比较的函数是strcmp)。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 #include #include #defineN16 typedefstruct { charnum[10]; ints; }STREC; STRECfun(STREC*a,char*b) { inti; STRECh; for(i=0;i if(strcmp(a[i].num,b)==0) { h=a[i]; break; } else { strcpy(h.num,""); h.s=-1; } returnh; } main() { STRECs[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85}, {"GA001",91},{"GA007",72},{"GA008",64},{"GA006",87}, {"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91}, {"GA011",77},{"GA017",64},{"GA018",64},{"GA016",72}}; STRECh; charm[10]; inti;FILE*out; printf("Theoriginaldata: \n"); for(i=0;i { if(i%4==0)printf("\n"); printf("%s%3d",s[i].num,s[i].s); } printf("\n\nEnterthenumber: "); gets(m); h=fun(s,m); printf("Thedata: "); printf("\n%s%4d\n",h.num,h.s); printf("\n"); } 四、实验要求: “实验内容”中的任务要求在实验课上完成,若未完成请在下次上课前利用课外时间完成。 五、实验报告填写要求: 1、第一页用《攀枝花学院实验报告》纸,其后用《实验报告附页》纸。 2、第一页填写项目: 实验课程: 计算机基础2-C语言实验项目: [本次实验名称]实验日期: [本次实验日期] 系: 班级: 姓名: 学号: 指导教师: 3、实验报告正文要求: 实验目的: (抄写本次实验目的) 实验仪器设备: PC机一套 实验步骤(内容): (要求完成以上第三部分内容,编程题要求抄写题目并写出程序源代码,并记录程序的运行结果) 实验结论: (分析通过本次实验掌握的知识或是还有什么遗留问题) 4、实验报告写好后将完成的实验报告纸订(或粘)在一起,于下一次上课前交给指导老师。 实验六 Verilog设计分频器/计数器电路 一、实验目的 1、进一步掌握最基本时序电路的实现方法; 2、学习分频器/计数器时序电路程序的编写方法; 3、进一步学习同步和异步时序电路程序的编写方法。 二、实验内容 1、用Verilog设计一个10分频的分频器,要求输入为clock(上升沿有效),reset(低电平复位),输出clockout为4个clock周期的低电平,4个clock周期的高电平),文件命名为fenpinqi10.v。 2、用Verilog设计一异步清零的十进制加法计数器,要求输入为时钟端CLK(上升沿)和异步清除端CLR(高电平复位),输出为进位端C和4位计数输出端Q,文件命名为couter10.v。 3、用Verilog设计8位同步二进制加减法计数器,输入为时钟端CLK(上升沿有效)和异步清除端CLR(低电平有效),加减控制端UPDOWN,当UPDOWN为1时执行加法计数,为0时执行减法计数;输出为进位端C和8位计数输出端Q,文件命名为couter8.v。 4、用VERILOG设计一可变模数计数器,设计要求: 令输入信号M1和M0控制计数模,当M1M0=00时为模18加法计数器;M1M0=01时为模4加法计数器;当M1M0=10时为模12加法计数器;M1M0=11时为模6加法计数器,输入clk上升沿有效,文件命名为mcout5.v。 5、VerilogHDL设计有时钟时能的两位十进制计数器,有时钟使能的两位十进制计数器的元件符号如图所示,CLK是时钟输入端,上升沿有效;ENA是时钟使能控制输入端,高电平有效,当ENA=1时,时钟CLK才能输入;CLR是复位输入端,高电平有效,异步清零;Q[3..0]是计数器低4位状态输出端,Q[7..0]是高4位状态输出端;COUT是进位输出端。 三、实验步骤 实验一: 分频器 1、建立工程 2、创建VerilogHDL文件 3、输入10分频器程序代码并保存 4、进行综合编译 5、新建波形文件 6、导入引脚 7、设置信号源并保存 8、生成网表 9、功能仿真 10、仿真结果分析 由仿真结果可以看出clockout输出5个clock周期的低电平和5个clock的高电平达到10分频的效果,设计正确。 实验二: 十进制加法计数器(异步清零) 1、建立工程 2、创建VerilogHDL文件 3、输入加法计数器代码并保存 4、进行综合编译 5、新建波形文件 6、导入引脚 7、设置信号源并保存 8、生成网表 9、功能仿真 10、仿真结果分析 由仿真结果可以看出异步清除端CLR高电平时,输出Q清零,CLR低电平则Q进行1到9的计数,超过9进位端C为1,Q从0开始重新计数如此循环。 因此设计正确。 实验三: 8位同步二进制加减计数器 1、建立工程 2、创建VerilogHDL文件 3、输入同步8位加减法计数器程序代码并保存 4、进行综合编译 5、新建波形文件 6、导入引脚 7、设置信号源并保存 8、生成网表 9、功能仿真 10、仿真结果分析 由仿真波形图可以看出当时钟clock的上升沿到来时,clr为低电平时清零,实现同步复位。 当updown为低电平时,计数器做减法操作;当updown为低电平时,计数器做加法操作。 所以设计正确。 实验四: 可变模数计数器 1、建立工程 2、创建VerilogHDL文件 3、输入可变模数计数器程序代码并保存 modulemcout5_ljj(M1,M0,CLK,out,c,CLR); inputM1,M0,CLK,CLR; outputc; output[5: 0]out; regc; reg[5: 0]M,N; reg[5: 0]out; always@(posedgeCLKorposedgeCLR) begin if(CLR) begin out<=0;N<=0; end else begin N<=M; case({M1,M0}) 'b00: M<=18; 'b01: M<=4; 'b10: M<=12; 'b11: M<=6; endcase if(N==M) begin if(out==(M-1)) begin out<=0;c<=~c; end else begin out<=out+1; end end else begin out<=0;c<=0; end end end endmodule 4、进行综合编译 5、新建波形文件 6、导入引脚 7、功能仿真 11、仿真结果分析 当M1M0=00时波形图,此时为模18的加法计数器 当M1M0=01时波形图,此时为模4加法计数器 当M1M0=10时波形图,此时为模12加法计数器 当M1M0=01时波形图,此时为模6加法计数器 实验五: 2位十进制计数器 1、建立工程 2、创建VerilogHDL文件 3、输入2位十进制计数器程序代码并保存 modulecounter8(clk,clr,ena,cout,ql,qh); inputclk,clr,ena; outputcout; output[3: 0]ql,qh; reg[3: 0]qh,ql; regcout; always@(posedgeclkorposedgeclr) begin if(clr) begin qh<=0; ql<=0; cout<=0; end elseif(ena) begin ql<=ql+1; if(ql=='b1010) begin ql<=0;qh<=qh+1; if(qh=='b1010) begin qh<=0; cout<=~cout; end end end end endmodule 4、进行综合编译 5、新建波形文件 6、导入引脚 7、设置信号源并保存 8、生成网表 9、功能仿真和结果分析 Q[3..0]是进位输出端,Q[7..3]是高四位的状态输出端,结果正确。 10、生成俩位十进制计数器元件
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 结构 答案