C语言复习2
1.实验类别:基础
2.实验目的:
(1)掌握结构体的定义及使用方法。
(2)掌握C语言的动态内存管理。
3.实验主要内容:
假设一个班由一名教师和若干学生(<=5人)组成,教师信息包括工号、姓名,学生信息包括学号、姓名和专业。请编写程序,用来模拟班级的管理(班级信息输出、查找学生(输出学生信息)、插入学生、删除学生)。
要求:(1)老师、学生需定义为结构体。
(2)班级中学生需根据学生实际人数动态分配空间。
(3)各功能需单独封装函数。
(4)代码编写规范(空行、注释、参数及类型命名等)
4.实验类型:综合、设计
5.实验要求:必修
6.主要仪器:计算机
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 3
//定义教师
//tno--老师工号,tname--老师姓名
typedef struct teacher
{
int tno;
char tname[MAXSIZE];
} Teacher;
//定义学生
//sno--学生学号,sname--学生姓名,major--学生专业
typedef struct student
{
int sno;
char sname[MAXSIZE];
char major[MAXSIZE];
} Student;
//定义班级
//tea--数据域,存放老师的地址;stu[MAXSIZE]--指针域,存放多个学生信息
typedef struct classinfo
{
Teacher tea;
Student* stu[MAXSIZE];
int n;
}Classinfo;
//初始化班级
//返回值:班级结构体指针
Classinfo *init()
{
//动态分配空间
Classinfo *pc=(Classinfo *)malloc(sizeof(Classinfo));
if(pc)
{
//初始化教师信息
printf("请输入教师信息(工号,姓名):");
scanf("%d,%s",&(pc->tea).tno,(pc->tea).tname);
//初始化学生信息
pc->n=0;
for(int i=0;i<MAXSIZE;i++)
pc->stu[i]=NULL;
}
return pc;
}
//打印学生信息
//参数ps:学生指针
void printStudent(Student *ps)
{
printf("%d\t%s\t%s",ps->sno,ps->sname,ps->major);
printf("\n");
}
//打印班级信息
//参数pc:班级指针
void printClassinfo(Classinfo *pc)
{
//打印教师信息
printf("教师信息(工号\t姓名):");
Teacher pt=pc->tea;
printf("%d\t%s\n",pt.tno,pt.tname);
//打印学生信息
printf("学生信息(学号\t姓名\t专业):\n");
for(int i=0;i<pc->n;i++)
printStudent(pc->stu[i]);
printf("\n");
}
//插入学生
//参数pc:班级指针,参数stu:学生指针
//返回值:1:成功,0:失败(空间满)
int inserStu(Classinfo *pc,Student *stu)
{
if(pc->n==MAXSIZE)
return 0;
else
{
pc->stu[pc->n]=stu;
pc->n++;
return 1;
}
}
//搜索学生所在位置
//参数pc:班级指针;返回值i:搜索学生的下标
int searchStu(Classinfo *pc)
{
int number,i=0;
printf("请输入你要查找的学生学号:");
scanf("%d",&number);
//判断是否有这名学生
while(number!=(pc->stu[i])->sno)
{
i++;
//判断i的值是否超过有效长度
if(i>=pc->n)
{
return -1;
}
}
return i;
}
int deleteStu(Classinfo *pc,Student *stu)
{
return 0;
}
//插入学生
//参数pc:班级指针
void Insert(Classinfo *pc)
{
int no;
char name[MAXSIZE],major[MAXSIZE];
//输入待插入学生的信息
printf("请输入要插入学生的学号:");
scanf("%d",&no);
printf("请输入要插入学生的姓名:");
scanf("%s",name);
printf("请输入要插入学生的专业:");
scanf("%s",major);
//构造待插入学生的指针
Student *stu=(Student *)malloc(sizeof(Student));
stu->sno=no;
strcpy(stu->sname,name);
strcpy(stu->major,major);
//插入操作
int ret=inserStu(pc,stu);
//输出插入结果
if(ret)
printf("插入成功\n");
else
printf("空间满,插入失败\n");
}
//搜索学生并打印该学生信息
//参数pc:班级指针
void Search(Classinfo *pc)
{
int i=searchStu(pc);
//判断是否搜索成功
if(i==-1)
{
printf("查无此人!\n");
return;
}
//输出学生信息
printf("查找学生的信息:");
printf("%d\t%s\t%s\n",(pc->stu[i])->sno,(pc->stu[i])->sname,(pc->stu[i])->major);
}
//删除学生
//pc:班级指针
void Delete(Classinfo *pc)
{
int i=searchStu(pc);
//判断是否搜索成功
if(i==-1)
{
printf("查无此人!\n");
return ;
}
//把该学生结构体所占的动态内存释放
free(pc->stu[i]);
//把指向该学生地址的指针置为空
pc->stu[i]=NULL;
//判断是否该i是否为数组最后一个下标,若不是,把后一个指针变量值覆盖前一个
for(;i<(pc->n)-1;i++)
{
pc->stu[i]=pc->stu[i+1];
}
//把原来有效长度最后一个指针指向NULL,防止指针越界
pc->stu[i]=NULL;
//有效个数减一
pc->n--;
printf("删除成功!\n");
}
//释放指针(*pc)指向的空间,同时将(*pc)值置为空
void destroy(Classinfo **pc)
{
if((*pc)!=NULL)
{
if((*pc)->n>0)
{
for(int i=0;i<(*pc)->n;i++)
{
free((*pc)->stu[i]);
(*pc)->stu[i]=NULL;
}
}
free((*pc));
(*pc)=NULL;
}
}
void printChoice()
{
printf("\n请选择功能:\n");
printf("\t1.打印班级信息\n");
printf("\t2.查找学生\n");
printf("\t3.插入学生\n");
printf("\t4.删除学生\n");
printf("\t5.退出程序\n");
printf("请选择:");
}
int main()
{
Classinfo *pc=init();
if(!pc)
{
printf("空间分配失败");
return 0;
}
int choice=-1;
while(1)
{
printChoice();
scanf("%d",&choice);
switch(choice)
{
//打印班级信息
case 1:
printClassinfo(pc);
break;
//查找学生
case 2:
Search(pc);
break;
//插入学生
case 3:
Insert(pc);
break;
//删除学生
case 4:
Delete(pc);
break;
//退出程序
case 5:
destroy(&pc);
return 0;
default:
printf("输入错误");
break;
}
}
}