1、新概念C语言能力教程练习10答案10.1答案:结构型是一种数据类型,与int,float类似,用于规定相关存储单元的类型,但结构型是用户自己定义的数据类型。结构型变量与整型变量类似是相关存储单元的标识。结构型用于定义结构型变量。10.2答案:结构型中成员的类型可以是其它结构型。测试程序代码:#include #include struct date int year,month,day;struct student int no; char name10; struct date birthday; float fm,fe;int main() struct student stu1; stu
2、1.no=8; strcpy(stu1.name,张三); stu1.fm=stu1.fe=90.0; stu1.birthday.day=1;stu1.birthday.month=1;stu1.birthday.year=2012; printf(学号:%dn, stu1.no); printf(姓名:%sn, stu1.name); printf(生日:%d年%d月%d日n, stu1.birthday.year, stu1.birthday.month, stu1.birthday.day); printf(数学成绩:%.1fn,stu1.fm); printf(英语成绩:%.1fn,
3、 stu1.fe); return 0;10.3答案:#include #include struct student int no; char name10; float fm,fe;int main() struct student stu1,stu2; printf(请输入两个学生的学号,姓名,数学和英语成绩n); scanf(%d%s%f%f,&stu1.no,&stu1.name,&stu1.fm,&stu1.fe); scanf(%d%s%f%f,&stu2.no,&stu2.name,&stu2.fm,&stu2.fe); if(strcmp(stu1.name,stu2.nam
4、e)0) printf(学号:%d 姓名:%s 数学成绩:%.1f 英语成绩:%.1fn,stu1.no,stu1.name,stu1.fm,stu1.fe); printf(学号:%d 姓名:%s 数学成绩:%.1f 英语成绩:%.1fn,stu2.no,stu2.name,stu2.fm,stu2.fe); else printf(学号:%d 姓名:%s 数学成绩:%.1f 英语成绩:%.1fn,stu2.no,stu2.name,stu2.fm,stu2.fe); printf(学号:%d 姓名:%s 数学成绩:%.1f 英语成绩:%.1fn,stu1.no,stu1.name,stu1
5、.fm,stu1.fe); return 0;10.4答案:#include struct student int no; char name10; float fm,fe;int main() struct student stu5,temp; int i=0,j=0; printf(请输入5个学生的学号,姓名,数学和英语成绩n); for(i=0;i5;i+) scanf(%d%s%f%f,&stui.no,&stui.name,&stui.fm,&stui.fe); for(i=0;i5;+i) for(j=i+1;jstuj.fm) temp=stui; stui=stuj; stuj
6、=temp; printf(按照数学成绩升序排列:n); for(i=0;i更简便。通过变量直接使用结构型存储单元的成员变量时使用成员操作符。10.7答案:例10-2中construct()函数将两个double型小数“组合”成一个结构型的复数变量。#include struct date int year,month,day;struct date construct(int year,int month,int day) struct date temp;/仅进行了简单的检测 if(year0 & month0 &month0 & day 31) flag = 1; break; case
7、 2: if(d2.year%4=0 & d2.year%100!=0 | d2.year%400=0) if(d2.day 29) flag = 1; break; else if(d2.day 28) flag = 1; break; default: if(d2.day 30) flag = 1; if(flag = 1) d2.day = 1; +d2.month; if(d2.month = 13) d2.month = 1; +d2.year; return d2;10.9答案:测试程序如下:#include struct student int no; char name10;
8、float fm,fe;int main() struct student stu1; printf(%dn, sizeof(stu1); return 0;程序的输出结构型中成员分别占4个、10个、4个、4个,原本为22字节,但由输出结果可知,实际上占了24个字节。结构型变量所占存储单元空间之和有时并不等于各成员变量所占存储单元之和。在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储(成员之间可能有插入的空字节),第一个成员的地址和整个结构的地址相
9、同。C编译器缺省的结构成员自然对界条件为“N字节对齐”,N即该成员数据类型的长度。如int型成员的自然对界条件为4字节对齐,而double类型的结构成员的自然对界条件为8字节对齐。若该成员的起始偏移不位于该成员的“默认自然对界条件”上,则在前一个节面后面添加适当个数的空字节。C编译器缺省的结构整体的自然对界条件为:该结构所有成员中要求的最大自然对界条件。若结构体各成员长度之和不为“结构整体自然对界条件的整数倍,则在最后一个成员后填充空字节10.10答案:代码如下:#include #include struct student int no; char name10; float fm,fe;
10、int studentcmp(const void * p1, const void * p2) return (struct student * )p1)-fm - (struct student * )p2)-fm;int main() struct student stu5; int i=0,j=0; printf(请输入5个学生的学号,姓名,数学和英语成绩n); for(i=0;i5;+i) scanf(%d%s%f%f,&stui.no,&stui.name,&stui.fm,&stui.fe); qsort(stu,5,sizeof(struct student),studentc
11、mp); printf(按照数学成绩升序排列后:n); for(i=0;i5;+i) printf(学号:%d 姓名:%s 数学成绩:%.1f 英语成绩:%.1fn,stui.no,stui.name,stui.fm,stui.fe); return 0;10.11答案:#include #include struct student int no; char name10; float fm,fe; struct student * next;int main() struct student *phead,*ptemp,*stu; int i,n; phead = stu = NULL;
12、printf(请输入学生人数:n); scanf(%d,&n); for(i=1;ino, ptemp-name, &ptemp-fm, &ptemp-fe); if(i=1) phead = stu = ptemp; else stu-next=ptemp; stu=stu-next; if(stu != NULL/防止一个学生也没有 stu-next=NULL; printf(nn); for(ptemp=phead; ptemp!=NULL; ptemp=ptemp-next) printf(学号:%d 姓名:%s 数学成绩:%.1f 英语成绩:%.1fn,ptemp-no,ptemp-
13、name,ptemp-fm,ptemp-fe); return 0;10.12答案:#include #include struct student int no; char name10; float fm, fe; struct student *next;/假设头结点head为链表中第0个结点。int insert(struct student *phead, int n, struct student *pnew) int i=0; struct student *p1, *p2; if(pnew = NULL) return 2; for(p1=phead; p1!=NULL & i
14、next) +i; if(p1 = NULL) return 1; p2 = p1-next; p1-next = pnew; pnew-next = p2; return 0;int main( ) struct student head, *ptail = &head, *ptemp; int i, n; printf(请输入学生人数:n); scanf(%d, &n); for(i=1; ino, ptemp-name, &ptemp-fm, &ptemp-fe); ptail-next = ptemp; ptail = ptail-next; ptail-next = NULL; pt
15、emp = (struct student *)malloc(sizeof(struct student); if(ptemp = NULL) printf(内存分配失败!n); return -1; printf(请输入新加学生的位置:n); scanf(%d, &i); printf(请输入新加学生的信息:n); scanf(%d%s%f%f, &ptemp-no, ptemp-name, &ptemp-fm, &ptemp-fe); printf(%dn, insert(&head, i, ptemp); for(ptemp=head.next; ptemp!=NULL; ptemp=p
16、temp-next) printf(学号:%d 姓名:%s 数学成绩:%.1f 英语成绩%.1fn, ptemp-no, ptemp-name, ptemp-fm, ptemp-fe); return 0;10.13答案:int del(struct student *phead, int n) int i=0; struct student *p1, *p2; for(p1=phead; p1!=NULL & i!=n-1; p1=p1-next) +i; if(p1 = NULL | n next; if(p2 != NULL) p1-next = p2-next; delete p2;
17、return 0; return 2; 10.14答案:#include #include struct student int no; char name10; float fm, fe; struct student *next;int main( ) struct student head, *ptail = &head, *ptemp; int i, n; printf(请输入学生人数:n); scanf(%d, &n); for(i=1; ino, ptemp-name, &ptemp-fm, &ptemp-fe); ptail-next = ptemp; ptail = ptail
18、-next; ptail-next = NULL; for(ptemp=head.next; ptemp!=NULL; ptemp=ptemp-next) printf(学号:%d 姓名:%s 数学成绩:%.1f 英语成绩%.1fn, ptemp-no, ptemp-name, ptemp-fm, ptemp-fe); ptail = head.next; ptemp=ptail-next; ptail-next=NULL; while(ptemp!=NULL) head.next = ptemp; ptemp=ptemp-next; head.next-next = ptail; ptail
19、 = head.next; printf(转置后的链表:n); for(ptemp=head.next; ptemp!=NULL; ptemp=ptemp-next) printf(学号:%d 姓名:%s 数学成绩:%.1f 英语成绩%.1fn, ptemp-no, ptemp-name, ptemp-fm, ptemp-fe); return 0;10.15答案:#include #include struct student int no; char name10; float fm, fe; struct student *next;int main( ) struct student
20、head, *ptail = &head, *ptemp, *p1,*p2; int i, n; printf(请输入学生人数:n); scanf(%d, &n); for(i=1; ino, ptemp-name, &ptemp-fm, &ptemp-fe); ptail-next = ptemp; ptail = ptail-next; ptail-next = NULL; for(ptemp=head.next; ptemp!=NULL; ptemp=ptemp-next) printf(学号:%d 姓名:%s 数学成绩:%.1f 英语成绩%.1fn, ptemp-no, ptemp-n
21、ame, ptemp-fm, ptemp-fe); ptail = head.next-next; head.next-next = NULL; while(ptail != NULL) p1 = ptail; ptail = ptail-next; for(p2=&head; p2-next!=NULL & (p2-next)-fm fm; p2=p2-next) ; if(p2-next = NULL) p1-next = NULL; p2-next = p1; else p1-next = p2-next; p2-next = p1; printf(按数学成绩排序后的学生信息如下:n); for(ptemp=head.next; ptemp!=NULL; ptemp=ptemp-next) printf(学号:%d 姓名:%s 数学成绩:%.1f 英语成绩%.1fn, ptemp-no, ptemp-name, ptemp-fm, ptemp-fe); return 0;10.16答案:函数construct(int n) 是例10-4中construct函数的另一种形式,它通过函数的返回值给出了循环链表的一个结点的地址。10.17答案:函数play同样模拟了例10-4中的报数过程。10.18答
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1