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改为用结构体
实现。