1 实验九 结构体与共用体 一、实验目的 掌握结构体类型、共用体类型以及相应类型变量的定义方法和引用方法。 二、实验要求 1. 区别结构体类型和简单数据类型、结构体类型和共用体类型。 2. 掌握结构体类型、共用体类型以及相应类型变量的定义方法和引用。 3. 掌握链表的建立、查找、插入和删除操作。 4. 编写实验报告(九)。 三、实验内容 9-1 程序S9-1.C是按学生姓名查询其排名和平均成绩,查询可连续进行,直到 键入0时结束。试完善程序。 源程序S9-1.C #include <stdio.h> #include <string.h> #define NUM 4 struct student { int rank; char * name; float score; }; struct student stu [ ]= { 3, "Tom", 89.5, 4, "Mary", 76.5 1, "Jack ",98.0 2, "Jim" ,92.0 }; main() { char str [10]; int i; do { printf ("Enter a name: "); } -2 有4名学生,每人有两门课程的考试成绩。试完善程序S9-2.C,编写函数 index()检查总分高于160分和任意一科不及格的两类学生,将结果输出到 屏幕上,并写出运行结果。 源程序S9-2.C 2 #include "stdio.h" struct student {char name[10]; int num; float score1; float score2; }stu[4]={{"李一",1,84., 82.}, {"王二", 2, 71., 73.}, {"赵三",3,90., 68.}, {"刘四", 4, 67., 56}}; main() { struct student *p; int index (struct student * px); p=stu; index(p); } 9-3 分析并验证程序S9-3.C的结果。 源程序S9-3.C union ss for (i=0;i<4;i++) {int a; { s[i].a=n; int b; s[i].b=s[i].a+1; }; n=n+2; union ss s[4]; } union ss *p; p=&s[0]; main() { int n=1,i; printf("%d", p->a); printf("%d",++p->a) ; printf("\n"); } 9-4 程序S9-4.C使用单向链表,把一个整型数组的各个元素插入到链表中,并 以升序排列。分析并给该程序添加注释,说明每个函数的功能。 源程序S9-4.C # include (stdlib.h) struct slist { int info; struct slist * next; }; int a[8]={35,46,17,80,25,78,66,54}; struct slist * head=NULL; 3 void inlist(); void outlist(); main() { int i; struct slist * node; for (i=0; i<8; i++) { node=(struct slist *) malloc(sizeof(struct slist)); inlist (node, a[i]); } outlist(); return; } void inlist (node, value) struct slist * node; int value; { struct slist * cp; cp=head; node->info=value; if ( head= =NULL) { head=node; node->next=NULL; } else { if(cp->info>value) { head=node; node->next=cp; } else { while (cp->next!=NULL & & cp->next->info<value) cp=cp->next; node->next=cp->next; cp->next=node; 4 } } return } void outlist() { struct slist * cp=head; while (cp! =NULL) { printf ("%d\n", cp->info); cp=cp->next; } return; } 9-5 程序S9-5.C用于实现约瑟夫问题,试完成该程序。约瑟夫问题是十七世 纪法国的数学家斯帕在《数目的游戏问题》中讲的一个故事:15个基督 教徒和15个异教徒在海上遇险,必须将一半的人投入海中,其余的人才 能幸免于难,于是想了一个办法:30个人围成一个圆圈,从第一个人开 始依次报数,每数到第9个人就将其投入大海,如此循环进行直到剩下 15人为止。问怎样排法,才能使每次投入大海的都是异教徒。 源程序S9-5.C #include<stdio.h> #define N 31 struct node { int nextp; /* 指向下一个人,程序中用于存放下一个人的数组元素 下标 */ int inout; /* 用于标记该人是否被扔下海。1表示没被扔下海,0表示 被扔下海 */ }link[N]; main() { } 9-6 编写程序S9-6.C。其中包括如下功能: ①建立一学生成绩信息数据文件S9-6.DAT。其中包括(不少于30人的) 学号、姓名、平时成绩、期中考试成绩、期末考试成绩。从该文件中将数据 读到内存中; ②计算学期总成绩。学期总成绩是以平时成绩占30%、期中成绩占30%、 5 期末成绩占40%计算得到,其中的百分比可以根据用户的需要进行调整。 ③显示和输出。计算结果可由用户选择按学号或学期总成绩递减显示并 输出到文件S9-6.OUT中,显示和输出的信息包括学号、姓名、平时成绩、 期中考试成绩、期末考试成绩、学期总成绩,一页显示不下时,可以分页显 示。 ④修改学生信息。用户可以按学号修改学生的姓名、平均成绩、期中考 试成绩、期末考试成绩中的一项或多项(没有修改的仍然保留原来的数据)。 要求: ①用结构体实现; ②文件名S9-6.DAT和S9-6.OUT是默认文件名,用户可以重新指定。即 用户没有指定文件名时,系统采用默认文件名,否则使用用户指定的文件名; ③输出文件是ASCII文件; ④尽量考虑界面和操作的友好性。 *9-7 编写程序S9-7.C,模拟用户注册和登录的过程。将S8-7.C改为用结构体 实现。