一、程序改错
1、
/*下列给定程序中,函数fun的功能是:对N名学生的学习成绩,按从高到低的顺序找出前m(m<=10)名学生,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。
试题程序:*/
#include
#include
#include
#include
#define N 10
typedef struct ss
{ char num[10];
int s;
} STU;
STU *fun(STU a[], int m)
{ STU b[N],*t;
int i, j,k;
/**********ERROR**********/
*t=calloc(m,sizeof(STU)); 【参考答案】
t=calloc(m,sizeof(STU));
for(i=0;i for(k=0;k { for (i=j=0;i if(b[i].s>b[j].s) j=i; /**********ERROR**********/ t[k].num=b[j].num; 【参考答案】t[k]=b[j]; t[k].s=b[j].s; b[j].s=0; } return t; } outresult(STU a[],FILE *pf) { int i; for(i=0;i fprintf(pf, "No=%s Mark=%d\n ", a[i].num, a[i].s); fprintf(pf, "\n\n "); } void main() { STU a[N]={{ "A01 ",81},{ "A02 ",89},{ "A03 ",66},{ "A04 ",87},{ "A05 ",77}, { "A06 ",90},{ "A07 ",79},{ "A08 ",61},{ "A09 ",80},{ "A10 ",71}}; STU *pOrder; int i, m; printf("*****THE RESULT*****\n"); outresult(a,stdout); printf("\nGive the number of the students who have better score: "); scanf("%d",&m); while(m>10) { printf("\nGive the number of the students who have better score: "); scanf("%d",&m); } pOrder=fun(a,m); printf("***** THE RESULT*****\n"); printf("The top :\n"); for(i=0;i printf("%s %d\n",pOrder[i].num, pOrder[i].s); free(pOrder); } 2、 /*下列给定程序的功能是:建立一个带头节点的单向链表,并用随机函数为各节点数据域赋值。函数fun的作用是求出单向链表节点(不包括头节点)数据域中的最大值,并且作为函数值返回。 试题程序: */ #include #include typedef struct aa { int data; struct aa *next; } NODE; fun (NODE *h) { int max=-1; NODE *p; /**********ERROR**********/ p=h; 【参考答案】p=h->next; while(p) { if(p->data>max) max=p->data; /**********ERROR**********/ p->next=h; 【参考答案】p=p->next; } return max; } outresult(int s, FILE *pf) { fprintf(pf, "\nThe max in link :%d\n",s); } NODE *creatlink(int n, int m) { NODE *h,*p,*s; int i; h=p=(NODE *)malloc(sizeof(NODE)); h->data=9999; for(i=1;i<=n;i++) { s=(NODE *) malloc(sizeof(NODE)); s->data=rand()%m; s->next=p->next; p->next=s; p=p->next; } p->next=NULL; return h; } outlink(NODE *h,FILE *pf) { NODE *p; p=h->next; fprintf(pf, "\n The LIST :\n\n HEAD"); while(p) { fprintf(pf, "->%d",p->data); p=p->next;} fprintf(pf, "\n"); } main() { NODE *head; int m; head=creatlink(12,100); outlink(head,stdout); m=fun(head); printf("\nThe RESULT :\n"); outresult(m,stdout); } 3、 /*下列给定程序中的函数Creatlink的功能是:创建带头节点的单向链表,并为各节点数据域赋0到m-1的值。 试题程序: */ #include #include typedef struct aa { int data; struct aa *next; } NODE; NODE *Creatlink(int n, int m) { NODE *h=NULL,*p,*s; int i; s=(NODE *)malloc(sizeof(NODE)); h=s; /**********ERROR**********/ p->next=NULL; 【参考答案】p=s; for(i=1;i { s=(NODE *) malloc(sizeof(NODE)); /**********ERROR**********/ s->data=rand()%m; 【参考答案】 s->data=rand()%(m-1); s->next=p->next;p->next=s; p=p->next; } s->next=NULL; /**********ERROR**********/ return p; 【参考答案】return h; } outlink(NODE *h) { NODE *p; p=h->next; printf("\n The LIST :\n\n HEAD"); while(p) { printf("->%d",p->data); p=p->next;} printf("\n"); } main() { NODE *head; head=Creatlink(8,22); outlink(head); } 二、程序填空 1、 /*已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体中,给定程序的功能是找出成绩最低的学生记录,通过形参返回主函数。 本题程序: */ #include #include #define N 10 typedef struct ss /*定义结构体*/ { char num[10]; int s; } STU; fun(STU a[], STU *s) { /**********FILL**********/ 【1】h; 【参考答案】STU int i; h=a[0]; for(i=1;i if(a[i].s /**********FILL**********/ 【2】=a[i]; 【参考答案】h /**********FILL**********/ *s=【3】; 【参考答案】h } main() { STU a[N]={{ "A01",81},{ "A02",89}, { "A03",66},{ "A04",87},{ "A05",77}, { "A06",90},{ "A07",79},{ "A08",61}, { "A09",80},{ "A10",71}},m; int i; printf("*****The original data*****"); for(i=0;i printf("No=%s Mark=%d\n", a[i].num,a[i].s); fun(a,&m); printf("*****THE RESULT*****\n"); printf("The lowest :%s, %d\n",m.num,m.s); } 2、 /*人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组std中,且编号唯一。函数fun的功能是:找出指定编号人员的数据,作为函数值返回,由主函数输出,若指定编号不存在,返回数据中的编号为空串。 试题程序: */ #include #include #define N 8 typedef struct { char num[10]; int year,month,day; }STU; /**********FILL**********/ 【1】fun(STU *std,char *num) 【参考答案】STU { int i; STU a={"",9999,99,99}; for(i=0;i<=N;i++) /**********FILL**********/ if(strcmp(【2】,num)==0) 【参考答案】std[i].num /**********FILL**********/ return (【3】); 【参考答案】std[i] return a; } main() { STU std[N]={{"11111",1984,2,15},{"22222",1983,9,21},{"33333",1984,9,1}, {"44444",1983,7,15}, {"55555",1984,9,28},{"666666",1983,11,14},{"77777",1983,6,22},{"88 888",1984,8,18}}; STU p; char n[10]="666666"; p=fun(std,n); if(p.num[0]==0) { printf("\nNot found!\n"); } else { printf("\nSucceed!\n"); printf("%s %d-%d-%d\n",p.num,p.year,p.month,p.day); } /*请补充函数fun,该函数的功能是:建立一个带头结点的单向链表并输出到文件"out70.dat"和屏幕上,各结点的值为对应的下标,链表的结点数及输出的文件名作为参数传入。注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序: */ #include #include typedef struct ss { int data; struct ss *next; }NODE; void fun(int n,char*filename) { NODE *h,*p,*s; FILE *pf; int i; h=p=(NODE *)malloc(sizeof(NODE)); h->data=0; for(i=1;i s=(NODE *)malloc (sizeof (NODE)); /**********FILL**********/ s->data=【1】; 【参考答案】i /**********FILL**********/ 【2】; 【参考答案】p->next=s; /**********FILL**********/ p=【3】; 【参考答案】p->next } p->next=NULL; if((pf=fopen(filename,"w"))==NULL) { printf("Can not open out98.dat!"); exit(0); } p=h; fprintf(pf,"\n***THE LIST***\n"); printf("\n***THE LIST***\n"); while(p) { fprintf(pf,"%3d",p->data); printf("%3d",p->data); if(p->next!=NULL) { fprintf(pf,"->"); printf("->"); } p=p->next; } fprintf(pf,"\n"); printf("\n"); fclose(pf); p=h; while(p) { s=p; p=p->next; free(s); } } void main() { char *filename="out98.dat"; int n; printf("\nInput n:"); scanf("%d",&n); fun(n,filename); } 4、 /*给定程序中,函数fun的功能是:将形参std所指结构体数组中年龄最大者的数据作为函数值返回,并在main函数中输出。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。 试题程序: */ #include typedef struct { char name[10]; int age; }STD; STD fun(STD std[],int n) { STD max; int i; /**********FILL**********/ max=【1】; 【参考答案】std[0] 或者 *std for(i=1;i /**********FILL**********/ if(max.age<【2】) 【参考答案】std[i].age max=std[i];} return max; } main() { STD std[5]={"aaa",17,"bbb",16,"ccc",18,"eee",15}; STD max; max=fun(std,5); printf("\nThe result is: \n "); /**********FILL**********/ printf("\nName :%s,Age :%d\n",【3】,max.age); 【参考答案】https://www.doczj.com/doc/008996133.html, } 三、程序设计 1、 /*N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。 请编写函数fun,它的功能是:求出平均分,由函数值返回。 例如,若学生的成绩是85,76,69,91,72,64,87,则平均分应当是78.625。注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:*/ #include #include #define N 8 struct slist { double s; struct slist *next; }; typedef struct slist STREC; double fun(STREC *h) { /***********Begin***************/ double av=0.0; 第十一章习题结构体与共用体 1.以下C语言共用体类型数据的描述中,不正确的是( ) A) 共用体变量占的内存大小等于所需内存最大的成员所占的内存 B) 共用体类型可以出现在结构体类型定义中 C) 在定义共用体变量的同时允许对第一个成员的值进行初始化 D) 同一共用体中各成员的首地址不相同 2.下列对结构体类型变量定义不正确的是( ) A)struct teacher B) struct { int num; { int num; int age; }teach1; int age; }teach1,teach2; C) struct D) struct teacher { int num; { int num; int age; }teacher; int age; }; struct teacher teach1; struct teacher teach1; 3.若有定义: struct teacher { int num; char name[10]; char sex; int age; float score;}teacher1; 则变量teacher1所占用的内存字节数是( ) A) 5 B)14 C) 19 D) 20 4.以下程序的运行结果是( ) #include 一、程序改错 1、 /*下列给定程序中,函数fun的功能是:对N名学生的学习成绩,按从高到低的顺序找出前m(m<=10)名学生,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。 试题程序:*/ #include for(k=0;k 第八章结构体和共同体 一、单项选择 1. 若有以下定义: struct link { int data; struct link *next; }a,b,c,*p,*q; 且变量a和b之间已有如下图所示的链表结构,若指针p指向a,指针q指向c。 则能把c插入到a和b之间形成新的链表的语句是( C ) 2. 若有以下程序段: int a=1,b=2,c=3; struct dent { int n ; int *m ; } s[3] = {{101,&a},{102,&b},{103,&c}}; struct dent *p=s ; 则以下表达式中值为2的是( D )。 3. 下面程序的运行结果是( D )。 #iunclude }cnum[2]={1,3,2,7} ; printf(“%d\n”,cnum[0].y/cnum[0].x*cnum[1].x) ; return 0; } 二、程序设计 1. /*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s 中,请编写函数fun, 它的功能是:按分数的高低排列学生的记录,高分在前。注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: */ #include 习题六 1. 从下列四个选项中选择一个正确的填入括号中。 (1)在说明一个结构体变量时系统分配给它的存储空间是(D)。 A该结构体中第一个成员所需存储空间 B该结构体中最后一个成员所需存储空间 C该结构体中占用最大存储空间的成员所需存储空间 D该结构体中所有成员所需存储空间的总和 (2)在说明一个共用体变量时系统分配给它的存储空间是(D )。 A该共用体中第一个成员所需存储空间 B该共用体中最后一个成员所需存储空间 C该共用体中占用最大存储空间的成员所需存储空间 D该共用体中所有成员所需存储空间的总和 (3)共用体类型在任何给定时刻, (B)。 A所有成员一直驻留在内存中 B只有一个成员驻留在内存中 C部分成员驻留在内存中 D没有成员驻留在内存中 (4)以下定义结构体类型的变量st1,其中不正确的是(A ) A typedef stuct student { int num; int age; }STD; STD st1; B struct student { int num,age; }st1; C struct { int num; float age; }st1; D struct student { int num; int age; }; struct student st1; (5)已知职工记录描述为: struct workers { int no; char name[20]; char sex; struct { int day; int month; int year; }birth; }; struct workers w; 设变量w中的”生日”应是”1993年10月25日”,下列对”生日”的正确赋值方式是(C)。 A day=25; month=10; year=1993; B w.day=25w.month=10; w.year=1993; C w.birth.day=25; w.birth.month=10; w.birth.year=1993; D birth.day=25; birth.month=10; birth.year=1993; (6)设有如下定义: struct sk { int a; float b; }data,*p; 若有p=&data;则对data中的a成员的正确引用是(B)。 A (*p).data.a B (*p).a C p->data.a D p.data.a 2.填空 (1)若有以下说明和定义且数组w和变量k已正确赋值,则对w数组中第k个元素中各成员的正确引用形式是w[k-1].b、w[k-1].c 、w[k-1].d 。 struct aa { int b; char c; double d; }; struct aa w[10]; int k=3; (2)若有以下说明和定义,则对x.b成员的另外两种引用形式是x->b-> 和p.b. 。 struct st { int a; struct st *b; }*p, x; 试卷编号:825 所属语言:C语言 试卷方案:结构体与共用体 试卷总分:90分 共有题型:5种 一、填空共5题(共计10分) 第1题(2.0分)题号:205 结构体是不同数据类型的数据集合,作为数据类型, 必须先说明结构体【1】,再说明结构体变量. 答案: =======(答案1)======= 类型 第2题(2.0分)题号:208 将函数funl 的入口地址赋给指针变量p的语句是【1】. 答案: =======(答案1)======= p=funl; 第3题(2.0分)题号:232 设有以下结构类型说明和变量定义,则变量a在内存所占字节数是【1】 . struct stud { char num[6]; int s[4]; double ave; } a,*p; 答案: =======(答案1)======= 第4题(2.0分)题号:345 若在程序中用到"strlen()"函数时,应在程序开头写上包含命令# include "【1】". 答案: =======(答案1)======= string.h 第5题(2.0分)题号:803 预处理命令行都必须以【1】号开始. 答案: =======(答案1)======= # 二、单项选择共20题(共计40分) 第1题(2.0分)题号:464 以下描述中,正确的是()。 A:预处理是指完成宏替换和文件包含中指定的文件的调用 B:预处理指令只能位于C源文件的开始 C:C源程序中凡是行首以#标识的控制行都是预处理指令 D:预处理就是完成C编译程序对C源程序第一遍扫描,为编译词法和语法分析作准备答案:C 第2题(2.0分)题号:472 下列程序运行结果为: #define P 3 #define S(a) P*a*a main() {int ar; ar=S(3+5); printf("\n%d",ar); } A:192 B:29 第八章文件 一、单项选择题 1.C语言中,文件由(A)。 A.字符(字节)序列组成B.记录组成 C.数据行组成D.数据块组成 2.若文件型指针fp中指向某文件的末尾,则函数feof(fp)的返回值是(C)。 A.0 B.-1 C.非零值D.NULL 3. 下列语句将输出(B) #include 第九章结构体类型与公用体类型习题及其答案9-3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。 解:#include "stdio.h" struct date { char month[10] ; int daynumber ; } main() { int i ; date a[12] ={{"January",31},{"February",29},{"March",31},{"Aprial",30}, {"May",31},{"June",30},{"july",31},{"August",31},{"September",30} ,{"October",31},{"November",30},{"December",31}} ; for(i=0;i<12;i++); printf("%d 月:%s %d\n",i+1,a[i].month,a[i].daynumber) ; } 思考:如何对结构体变量进行初始化?对结构体变量的引用为何要体现为分量(或成员)的引用? 9-4 编写程序求空间任一点到原点的距离,点用结构体描述。并请考虑求空间中任意两点的距离的程序。 解:#include "stdio.h" #include "math.h" struct point { float x ; float y ; float z ; } void main() { double d1,d2,d ; point p1,p2 ; printf("请输入第一个点的坐标:"); scanf("%f,%f,%f",&p1.x,&p1.y,&p1.z); printf("请输入第二个点的坐标:"); scanf("%f,%f,%f",&p2.x,&p2.y,&p2.z); d1=sqrt(p1.x*p1.x+p1.y*p1.y+p1.z*p1.z); d2=sqrt(p2.x*p2.x+p2.y*p2.y+p2.z*p2.z); d=sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)+(p2.z-p1.z)*( p2.z-p1.z)); printf("第一个点到原点的距离:%f\n",d1); printf("第二个点到原点的距离:%f\n",d2); printf("两点间的距离:%f\n",d); } 9-5 编写输入、输出10个朋友数据的通讯录程序,每个朋友数据包括姓名、地址、邮编、电话、传呼、手机等数据。 解:#include "stdio.h" struct AddressBook { char name[10] ; char address[30] ; char mailnumber[7] ; char telphone[12] ; char byphone[16] ; char movephone[1] ; } void main() { int i ; AddressBook fd[10] ; for(i=0;i<10;i++) { printf("请输入第%d个朋友的信息:\n",i+1); printf("姓名:"); [课程]C语言一日一学第11课——结构体与共用体(2) 11.7 用指针处理链表 11.7.1 链表概述 链表是一种常见的重要的数据结构,是动态地进行存储分配的一种结构。链表的组成:头指针:存放一个地址,该地址指向一个元素 结点:用户需要的实际数据和链接节点的指针 用结构体建立链表: Code: struct student { int num; float score; struct student *next ; }; 其中成员num和score用来存放结点中的有用数据(用户需要用到的数据),next是指针类型的成员,它指向struct student类型数据(这就是next所在的结构体类型) 11.7.2 简单链表 Code: #include long num; float score; struct student *next; }; main() { struct student a,b,c,*head,*p; a. num=99101; a.score=89.5; b. num=99103; b.score=90; c. num=99107; c.score=85; head=&a; a.next=&b; b.next=&c; c.next=NULL; p=head; do { printf("%ld %5.1f\n",p->num,p->score); p=p->next; } while(p!=NULL); } 运行结果: Code: 1010189.5 1010390.0 1010785.0 程序分析: 开始时使head指向a结点,a.next指向b结点,b.next指向c结点,这就构成链表关系。“c.next=NULL” 的作用是使c.next不指向任何有用的存储单元。在输出链表时要借助p,先使p指向a结点,然后输出a 结点中的数据,“p=p->next” 是为输出下一个结点作准备。p->next的值是b结点的地址,因此执行 “p=p->next”后p就指向b结点,所以在下一次循环时输出的是b结点中的数据。 库函数提供动态地开辟和释放存储单元的 有关函数: (1) malloc函数 其函数原型为 Code: void *malloc(unsigned int size); 其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的值(即“返回值”)是一个指向分配域起始地址的指针(类型为void)。如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL)。 《程序设计语言 C1》随机作业题 做作业时间:2013-5-13 8:30:00至2013-6-30 22:00:00 1、在C语言中,下面那种数据类型不属于构造类型( ) (3分) A A、B、C、D、 A、枚举类型 B、数组类型 C、结构体类型 D、共用体类型 2、C语言结构体类型变量在程序执行期间 (3分) A A、B、C、D、 A、所有成员一直驻留在内存中 B、只有一个成员驻留在内存中 C、部分成员驻留在内存中 D、没有成员驻留在内存中 3、在下列定义中的共用体所占内存字节数是( ) union {char k[6]; struct {intm;float f; }a; double d; }b; (3分) A A、B、C、D、 A、8 B、14 C、18 D、10 4、当说明一个结构体变量时系统分配给它的内存是 (3分) A A、B、C、D、 A、各成员所需内存量的总和 B、结构中第一个成员所需内存量 C、成员中占内存量最大者所需的容量 D、结构中最后一个成员所需内存量 5、变量a所占内存字节数是 union U { char st[4]; inti; long l; }; struct A { int c; union U u; }a; (3分) C A、B、C、D、 A、4 B、5 C、6 D、8 6、设有以下语句 typedefstruct S { int g; char h;} T; 则下面叙述中正确的是 (3分) D A、B、C、D、 A、可用S定义结构体变量 B、可以用T定义结构体变量 C、S是struct类型的变量 D、T是struct S类型的变量 7、设有以下说明语句 structstu {int a; float b; }stutype; 则下面的叙述不正确的是 (3分) C A、B、C、D、 一、实验目的(参见实验指导书P159) 二、实验内容(参见课本及实验指导书) 实验内容提要:结构体、共用体、枚举类型、typedef使用具体内容: 1、有以下程序,程序运行后的输出结果是()。 struct s { int x, y; } data[2] = { 10, 100, 20, 200 } ; main ( ) { struct s *p = data; printf ( "%d\n", ++ ( p->x ) ) ; } 2、有以下程序,程序运行后的输出结果是()。 struct STU { char num[10]; float score[3]; } ; main ( ) { struct STU s[3] = { { "201201", 90, 95, 85 } , { "201202", 95, 80, 75 } , { "201203", 100, 95, 90 } }, *p = s; int i; float sum = 0; for ( i = 0;i<3;i++ ) sum = sum+p->score[i]; printf ( "%6.2f\n", sum ) ; } 3、下面程序的输出结果是( ) typedef struct{ float x ; char z ; }mytype; mytype a ; main() { printf("%d",sizeof(a)); } 4、下面程序的输出结果是( ) typedef union{ long a[1] ; char y ; char c[10]; }S; S a ; main() { printf("%d",sizeof(a)); } 5、下面程序的输出结果为() #include "stdio.h" main() { union{unsigned int t; unsigned char c; }u; u.c='a'; printf("%c\n",u.t); getch(); } 结论:一个共用体中可能有若干个不同类型的成员,但在任何时刻,只有一个成员的值被存储。 这就是最后赋给它的值。 6、设有以下语句 char x=3,y=6,z; z=x^y<<2; 则z的二进制值是多少?提示,左移的优先级高于^ 三、实验结果与思考 第八章结构体与共用体 一、选择题: 1.下面正确的叙述的是()。 A)结构一经定义,系统就给它分配了所需的内存单元 B)结构体变量和共用体变量所占内存长度是各成员所占内存长度之和 C)可以对结构类型和结构类型变量赋值、存取和运算 D)定义共用体变量后,不能引用共用体变量,只能引用共用体变量中的成员2.结构体类型变量在程序执行期间()。 A)所有成员驻留在内存中 B)只有一个成员驻留在内存中 C)部分成员驻留在内存中D)没有成员驻留在内存中 3.设有以下定义 struct date { int cat; char c; int a[4]; long m; }mydate; 则在VC6.0中执行语句: printf("%d", sizeof(struct date)); 的结果是()。 A)25B)28C)18D)8 4.在说明一个共用体变量时系统分配给它的存储空间是() A)该共用体中第一个成员所需存储空间 B)该共用体中最后一个成员所需存储空间 C)该共用体中占用最大存储空间的成员所需存储空间 D)该共用体中所有成员所需存储空间的总和 5.共用体类型变量在程序执行期间的某一时刻()。 A)所有成员驻留在内存中 B)只有一个成员驻留在内存中 C)部分成员驻留在内存中 D)没有成员驻留在内存中 6.对于下面有关结构体的定义或引用,正确的是()。 struct student { int no; int score; }student1; A)student.score=99; B)student LiMing; LiMing.score=99; C)stuct LiMing; LiMing.score=99; D)stuct student LiMing; LiMing.score=99;第8章练习 结构体与共用体
第8章 结构体与共用体
C语言题库第8章 结构体和共同体
结构体和共用体习题
结构体与共用体
第八章 文 件
第9章结构体类型与共用体类型习题及答案
结构体与共同体
复杂数据类型(结构体与共同体)
第八章结构体、共用体与枚举实验报告
c第八章 结构体与共用体