C语言程序设计电子课件、源代码、参考答案07单元5 构造类型程序设计_结构体.doc

上传人:本田雅阁 文档编号:2036662 上传时间:2019-02-07 格式:DOC 页数:34 大小:302.51KB
返回 下载 相关 举报
C语言程序设计电子课件、源代码、参考答案07单元5 构造类型程序设计_结构体.doc_第1页
第1页 / 共34页
C语言程序设计电子课件、源代码、参考答案07单元5 构造类型程序设计_结构体.doc_第2页
第2页 / 共34页
C语言程序设计电子课件、源代码、参考答案07单元5 构造类型程序设计_结构体.doc_第3页
第3页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《C语言程序设计电子课件、源代码、参考答案07单元5 构造类型程序设计_结构体.doc》由会员分享,可在线阅读,更多相关《C语言程序设计电子课件、源代码、参考答案07单元5 构造类型程序设计_结构体.doc(34页珍藏版)》请在三一文库上搜索。

1、C语言程序设计课程-源代码 软件技术专业国家教学资源库单元5 构造类型程序设计结构体源代码SC 01 02 01 05 3011源代码编号SC010201053012源代码来源单元5 构造类型程序设计例5-123问题描述计算一名学生的平均成绩。学生的信息包括学号、姓名、性别及C语言、VB程序设计、数据结构三门课程成绩,已知该学生的学号为:10001,姓名为:“WuHong”,性别为:F,三门课程的成绩要求从键盘输入,最后输出学生的全部信息,并计算三门课程的平均成绩。4程序代码#include#include/*定义学生结构体*/typedef struct studentchar num10;

2、 /*学号*/char name20; /*姓名*/char sex; /*性别*/float clan; /*C语言*/float vb; /*VB*/float datastr; /*数据结构*/STU;void exp(STU stu1)float avg;strcpy(stu1.num, 10001);strcpy(stu1.name,Wu Hong);stu1.sex=F;printf(请输入三门课程成绩:n);scanf(%f%f%f,&stu1.clan,&stu1.vb,&stu1.datastr );avg=(stu1.clan+stu1.vb+stu1.datastr)/3

3、;printf(学号:%s,姓名:%s,性别:%c,C:%6.2f,VB:%6.2f,数据结构:%6.2f,平均成绩:%6.2fn,stu1.num,stu1.name,stu1.sex,stu1.clan,stu1.vb,stu1.datastr,avg);int main()STU stu1;exp(stu1);return 0;第 34 页 共 34 页SC 01 02 01 05 3021源代码编号SC010201053022源代码来源单元5 构造类型程序设计例5-133问题描述统计候选人得票程序。某单位要评选先进工作者,假设有3个候选人:Li,Wu,Yang;每次输入一个得票的候选人

4、名字,最后输出各人的得票结果。假设共有10人投票。4程序代码#include#include#define N 3 /候选人数#define XP 10 /选票数typedef struct person char name10; /*姓名*/int count; /*得票数*/PER; void candidate(PER leader)/统计候选人得票int i,j;char leader_name20;for(i=1;i=XP;i+)/*XP=10张选票*/ printf(请输入第%d张选票:,i);gets(leader_name);for(j=0;jN;j+)if(strcmp(le

5、ader_name,leaderj.name)=0)leaderj.count+;void output(PER leader)/输出结构体数组的全部元素int i;for(i=0;iN;i+)printf(%10s:%dn,leaderi.name,leaderi.count);int main()PER leaderN=Li,0,Wu,0, Yang,0;candidate(leader);output(leader);return 0;SC 01 02 01 05 3031源代码编号SC010201053032源代码来源单元5 构造类型程序设计例5-143问题描述用指针访问结构体变量,改

6、写例5-12。4程序代码#include#include/*定义学生结构体*/typedef struct studentchar num10; /*学号*/char name20; /*姓名*/char sex; /*性别*/float clan; /*C语言*/float vb; /*VB*/float datastr; /*数据结构*/STU;void exp(STU *s) /输入、输出学生信息并计算学生的平均成绩float avg;strcpy(*s).num, 10001);strcpy(s-name,WuHong);stu1.sex=F;printf(请输入三门课程成绩:n);s

7、canf(%f%f%f,&s-clan,&s-vb,&s-datastr );avg=(*s).clan+(*s).vb+(*s).datastr)/3;printf(学号:%s,姓名:%s,性别:%c,C:%6.2f,VB:%6.2f,数据结构:%6.2f,平均成绩:%6.2fn,stu1.num,stu1.name,stu1.sex,stu1.clan,stu1.vb,stu1.datastr,avg);int main()STU stu1;exp(&stu1);return 0;SC 01 02 01 05 3041源代码编号SC010201053042源代码来源单元5 构造类型程序设计

8、例5-153问题描述一个工人工资管理系统,共10名工人,要求:从键盘输入他们的工号、姓名、基本工资、奖金和保险,求每名工人的实发工资,输出所有工人的全部信息,并输出实发工资最高的工人的姓名与实发工资。4程序代码#include#include#define N 10typedef struct workerchar num10; /*工号*/char name20; /*姓名*/float jbgz; /*基本工资*/float jj; /*奖金*/float bx; /*保险*/float sfgz; /*实发工资*/WOK;void input(WOK *w) /输入工人信息int i;c

9、har s10,*str=s;for(i=0;inum);gets(w-name);gets(str);w-jbgz=atof(str);gets(str);w-jj =atof(str);gets(str);w-bx=atof(str);int comp(WOK *w) /计算实发工资,及最高工资员工的姓名和实发工资int k=0,i;for(i=0;iwk.sfgz ) k=i;return k;void output(WOK *w) /输出全部工人信息int i;printf(工号t姓名t基本工资t奖金t保险t实发工资n);for(i=0;inum,w-name,w-jbgz, w-jj

10、,w-bx,w-sfgz);int main()WOK wN,*pw=w; int i;input(pw); /*结构体指针变量作实参*/i=comp(pw);output(w); /*结构体数组名作实参*/printf(最高实发工资的工人姓名为:%s,实发工资为:%.2fn,wi.name, wi.sfgz);return 0; SC 01 02 01 05 3051源代码编号SC010201053052源代码来源单元5 构造类型程序设计例5-163问题描述使用结构体变量作函数参数的方法实现两个复数加法运算。4程序代码#include#includetypedef struct comp f

11、loat x; /*实部*/float y; /*虚部*/CP;CP add(CP a,CP b) /复数加法运算CP c;c.x=a.x+b.x;c.y=a.y+b.y;return c;void show(CP c) /输出一个复数if(c.y0) printf(%.2f+%.2fi),c.x,c.y);else if(c.y0) printf(%.2f-%.2fi),c.x,-c.y);else printf(%.2f),c.x);int main()CP a,b,c;printf(输入复数1:);scanf(%f,%f,&a.x,&a.y);printf(输入复数2:);scanf(%

12、f,%f,&b.x,&b.y);c=add(a,b);show(a);putchar(+);show(b);putchar(=);show(c);putchar(n);return 0;SC 01 02 01 05 3061源代码编号SC010201053062源代码来源单元5 构造类型程序设计例5-173问题描述将上例中add函数的参数改为结构体指针变量。4程序代码#include#includetypedef struct comp float x; /*实部*/float y; /*虚部*/CP;CP add(CP *a,CP *b)CP c;c.x=a-x+b-x;c.y=a-y+b-

13、y;return c;void show(CP *c) /输出一个复数if(c-y0) printf(%.2f+%.2fi),c-x,c-y);else if(c-yx,-c-y);else printf(%.2f),c-x);int main()CP a,b,c;printf(输入复数1:);scanf(%f,%f,&a.x,&a.y);printf(输入复数2:);scanf(%f,%f,&b.x,&b.y);c=add(&a,&b);show(&a);putchar(+);show(&b);putchar(=);show(&c);putchar(n);return 0;SC 01 02

14、01 05 3071源代码编号SC010201053072源代码来源单元5 构造类型程序设计例5-183问题描述建立如图5-14所示的包含5个结点的单链表,每个结点定义如下:typedef struct nodechar no10;/学号 char name 20;/ 姓名struct node *next;NODE;并且实现根据姓名进行记录查找的功能。4程序代码#include #include #include /*包含一些字符串处理函数的头文件*/#include #define N 5typedef struct nodechar no10;/学号 char name 20;/ 姓名s

15、truct node *next;NODE;NODE * createlink() /*建立链表的函数*/NODE *r,*head,*s;int i;if(head=(NODE *)malloc(sizeof(NODE)=NULL)printf(不能分配内存空间!);exit(0);r=head;/尾指针初值也指向头结点for(i=0;ino);gets(s-name);r-next=s;/将新结点插到链表尾r=s;/尾指针指向新表尾r-next=NULL;return(head);int search(NODE *head,char *name) /*查找链表的函数,其中head指针是链表

16、的表头指针,x指针是要查找的人的姓名*/NODE *p; /*当前指针,指向要与所查找的姓名比较的结点*/int n=0; /*找到的记录个数*/p=head-next;while(p!=NULL)if(strcmp(p-name,name)=0) /*姓名比较*/n+;printf(%st%sn,p-no,p-name); /输出找到的结点信息p=p-next;return n;int main()int num;char fullname20;NODE *head; /*head是表头指针*/head=createlink();/*建立链表*/printf(请输入你要查找的人的姓名:);s

17、canf(%s,fullname);num=search(head,fullname); /*查找,返回找到的记录个数*/if(num) printf(共找到%d条记录!n,num);elseprintf(没有查找到该数据!n);return 0;SC 01 02 01 05 3081源代码编号SC010201053082源代码来源单元5 构造类型程序设计课堂实践5-103问题描述从键盘输入5位学生的信息,包括:学号、姓名、性别、年龄和成绩;并统计这5位学生的平均年龄、平均成绩和不及格的人数。4程序代码#include#include#define N 5struct student char

18、 num10; char name20; char sex; int age; float score;void input(struct student s)/函数功能:输入结构体数组的全部元素 int i;char a10,*str=a; for(i=0;iN;i+) printf(请输入第%d个学生的信息n,i+1); printf(学号:); gets(si.num); printf(姓名:); gets(si.name); printf(性别:); si.sex=getchar(); getchar(); printf(年龄:); gets(str); si.age=atoi(str

19、); printf(成绩:); gets(str); si.score=atof(str); void avg(struct student s)/函数功能:统计学生的平均年龄、平均成绩及不及格人数int i,c=0; /*c:不及格人数*/float avgscore=0,avgage=0; for(i=0;iN;i+) avgage+=si.age; avgscore+=si.score; if(si.score60) c+=1;printf(平均年龄:%6.2fn,avgage/N); printf(平均成绩:%6.2fn,avgscore/N);printf(不及格人数:%dn,c);

20、int main() struct student stuN; input(stu); avg(stu); return 0; SC 01 02 01 05 3091源代码编号SC010201053092源代码来源单元5 构造类型程序设计课堂实践5-113问题描述定义一个学生结构体:struct studentchar name20;/*姓名*/char sex; /*性别*/int age; /*年龄*/;再定义一个学生数组s5,编写函数:void input(struct student *); /*输入所有学生的数据*/void show(struct student *); /*显示所

21、有学生的数据*/void sort(struct student *); /*按年龄排序*/输入5个学生信息,并把学生按年龄大小顺序排列后依次输出。4程序代码#include#define N 5typedef struct studentchar name20; /*姓名*/ char sex; /*性别*/ int age; /*年龄*/STU;void input(STU *ps)/函数功能:输入N个学生的信息int i;for(i=0;iN;i+)printf(请输入第%d个学生的信息:n,i+1);printf(姓名t性别t年龄n);scanf(%s %c %d,psi.name,&

22、psi.sex,&psi.age);void sort(STU *ps) /*选择排序*/函数功能:将N个学生按年龄从大到小排序 int i,j,k; struct student t; for(i=0;iN-1;i+) k=i; for(j=i+1;jpsk.age)k=j; if(k!=i) t=psi;psi=psk;psk=t; void show(STU *ps)/函数功能:输出N个学生的信息 int i;for(i=0;iname,ps-sex,ps-age);int main()STU sN;input(s);sort(s);printf(按年龄大小排序的结果为:n);print

23、f(姓名t性别t年龄n);show(s);return 0;SC 01 02 01 05 3101源代码编号SC010201053102源代码来源单元5 构造类型程序设计课堂实践5-123问题描述编写代码:用头插法建带头结点的单链表以及用尾插法建不带头结点的单链表的算法实现。4程序代码/*头插法建带头结点的单链表*/LinkList CreatListHI(void)/返回单链表的头指针DataType ch;LinkList head; /头指针ListNode *s; /工作指针 / 建立头结点if(head=(ListNode *)malloc(sizeof(ListNode)=NULL

24、)printf(不能分配内存空间!);exit(0); head-next=NULL;printf(请输入链表各结点的数据(字符型):n);while(ch=getchar()!=n)if(s=(ListNode *)malloc(sizeof(ListNode )=NULL)printf(不能分配内存空间!);exit(0);s-data=ch;s-next=head-next;head-next=s;return head;LinkList CreatListRH(void)/*尾插法建不带头结点的单链表*/DataType ch; LinkList head; ListNode *s,*

25、r;/工作指针head=NULL; /头指针初值为空r=NULL;/尾指针初值为空 printf(请输入链表各结点的数据(字符型):n); while(ch=getchar()!=n)if(s=(ListNode *)malloc(sizeof(ListNode )=NULL)printf(不能分配内存空间!);exit(0);s-data=ch; if(head=NULL) head=s; else r-next=s;/将新结点插到链表尾r=s;/尾指针指向新表尾 if(r!=NULL) r-next=NULL; return head;SC 01 02 01 05 3111源代码编号SC0

26、10201053112源代码来源单元5 构造类型程序设计-结构体同步训练 程序设计题13问题描述学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把分数最高的学生数据放在h所指的数组中,注意:分数最高的学生可能不只一个,函数返回分数最高的学生的人数。4程序代码#include #define N 16#includetypedef struct char num10; int s;STREC;int fun (STREC *a, STREC *b )/*把分数最高的学生数据放在另一个数组中,注意:分数最高的学生可能不只一个。*/ int i

27、,j=0,n=0,max;max=a0.s;for(i=0;imax) max=ai.s;for(i=0;iN;i+)if(ai.s=max)*(b+j)=ai;j+;n+;return n;int main() STREC sN=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,77, GA017,64, GA018,64, GA016,72; STREC hN; int i,n; n=fun(s,h);

28、printf (最高分有%d人:n, n); for (i=0; in; i+) printf (%s %4dn, hi.num, hi.s); return 0;SC 01 02 01 05 3121源代码编号SC010201053122源代码来源单元5 构造类型程序设计-结构体同步训练 程序设计题23问题描述利用结构:struct complx int real;int im;编写求两个复数之积的函数cmult,并利用该函数求下列复数之积: (3+4i)(5+6i) (10+20i)(30+40i)。4程序代码#include typedef struct complx int real;

29、 /* real为复数的实部 */int im; /* im为复数的虚部 */COM;void cpr (COM za,COM zb,COM z);COM cmult(COM za,COM zb); int main( ) static COM za = 3,4; /* 说明结构静态变量并初始化 */static COM zb = 5,6;COM x, y, z;z=cmult(za, zb); /*计算*/cpr(za, zb, z); /*输出计算结果 */x.real = 10; x.im = 20;y.real = 30; y.im = 40; /* 下一组数据 */z = cmult

30、 (x, y);cpr (x, y, z);return 0;COM cmult(COM za,COM zb) /计算复数zazbCOM w;w.real = za.real * zb.real - za.im * zb.im;w.im = za.real * zb.im + za.im * zb.real;return (w); /* 返回计算结果,返回值的类型为结构 */void cpr (COM za,COM zb,COM z) /* */ /输出复数zazb=zprintf (%d+%di)*(%d+%di)=, za.real, za.im, zb.real, zb.im);prin

31、tf (%d+%di)n, z.real, z.im);SC 01 02 01 05 3131源代码编号SC010201053132源代码来源单元5 构造类型程序设计-结构体同步训练 程序设计题33问题描述编写程序,实现输入的时间屏幕显示一秒后的时间。显示格式为HH:MM:SS。程序需要处理以下三种特殊情况: 若秒数加1后为60,则秒数恢复到0,分钟数增加1;若分钟数加1后为60,则分钟数恢复到0,小时数增加1; 若小时数加1后为24,则小时数恢复到0。4程序代码#include struct time int hour;int minute;int second;void fun(struc

32、t time *t)/实现输入的时间屏幕显示一秒后的时间t-second+;if(t-second=60) t-second=0;t-minute+;if(t-minute=60)t-minute=0;t-hour+;if(t-hour=24)t-hour=0;int main() struct time now;printf(请输入时间:(HH,MM,SS)n);scanf(%d,%d,%d,&now.hour,&now.minute,&now.second);fun(&now);printf(n下一秒是:%02d:%02d:%02dn,now.hour,now.minute,now.sec

33、ond);return 0;SC 01 02 01 05 3141源代码编号SC010201053142源代码来源单元5 构造类型程序设计-结构体同步训练 程序设计题43问题描述简单地图书借阅程序,假定图书信息包括:编号、书名、价格、借阅人姓名、是否已借出标记。程序功能:根据输入的图书编号,查找库中是否有此图书,若无此图书,输出相应信息表示没有此书;若有,再查看是否已被借出,若没有被借出,则输入借阅人姓名并将此书标记为借出,若已被借出,输出相应信息表示已被借出。4程序代码#include#include#define N 3typedef struct BookList/*书的结构体*/ ch

34、ar num20;/*图书编号*/ char name20;/*书名*/ int price;/*书的价格*/ char person20;/*借阅人*/ int yes;/*判断书是否已经借出,1没有借出,0已借出*/ Book;void bookborrow(Book *b,int n,char *bh)/简单地图书借阅程序int i,flag=0;/0:要借阅的图书不存在,1:要借阅的图书存在for(i=0;inum,bh)=0) flag=1;break; if (flag)if(b-yes=1) printf(可借,请输入借阅人姓名:n );gets(b-name);b-yes=0;

35、printf(借阅成功!n );else printf(此书已被借出!n );elseprintf(没有此图书!n );int main()Book bN=J001,C语言程序设计,28,Mary,0,J002,JAVA程序设计,35,1,T001,数据结构,26,1;char bh20;printf(请输入要借阅的图书编号:n);gets(bh);bookborrow(b,N,bh);return 0;SC 01 02 01 05 3151源代码编号SC010201053152源代码来源单元5 构造类型程序设计-结构体同步训练 程序设计题53问题描述洗牌和发牌游戏模拟。定义一个扑克牌结构体s

36、truct cardchar *face; /面值char *suit; /花色;写三个函数:(1) void fillDeck(Card *wDeck,char *wFace,char *wSuit);功能:初始化一副牌。(2) void shuffle(Card *wDeck);功能:洗牌。(3) void deal(Card *wDeck);功能:发牌。4程序代码#include #include #includetypedef struct cardchar *face; /面值char *suit; /花色Card;void fillDeck(Card *wDeck,char *wFace,char *wSuit);void shuffle(Card *wDeck);void deal(Card *wDeck);int main()Card deck52;char *face=A,2,3,4,5,6,7,8,9,10,J,Q,K;char *suit=红桃,方块,黑桃,梅花;srand(time(NULL);fillDeck(deck,face,suit);/初始化一副牌shuffle(deck);/洗牌deal(deck);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1