class.h
#ifndef __CLASS_H__
#define __CLASS_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
/*
* 注意scanf的垃圾字符处理问题
*/
typedef struct Student
{
char name[20];
char id; //身份 S:学生 T: 老师
union
{
double score;
char subject[10];
};
} Stu;
//定义班级结构体
typedef struct Class
{
struct Student s[MAX]; //学生数组
int count; //表示当前班级的人数
} clsSeqList;
double input(clsSeqList *cls);
void output(clsSeqList *cls);
clsSeqList * create_class();
int class_empty(clsSeqList *cls);
int class_full(clsSeqList *cls);
int class_add(clsSeqList *cls,Stu s);
int class_insert_pos(clsSeqList *cls,int pos,Stu s);
int class_delete_pos(clsSeqList *cls,int pos);
void input_student(Stu *stu);
#endif
class.c
#include "class.h"
clsSeqList * create_class()
{
//1.在堆区申请一个顺序表的空间
clsSeqList *cls = (clsSeqList *)malloc(sizeof(clsSeqList));
if (NULL == cls)
{
printf("class顺序表创建失败\n");
return NULL;
}
//2.初始化顺序表
cls->count=0;//初始化数组长度
printf("创建class顺序表成功\n");
return cls;
}
double input(clsSeqList *cls)
{
double sum_score = 0;
while (1)
{
printf("请输入学生的姓名:\n");
//scanf("%s",s[i].name);
scanf("%s",cls->s[cls->count].name);
printf("请输入学生的id:\n");
//吸收垃圾字符 "%*c%c" getchar()
scanf("%*c%c",&cls->s[cls->count].id);
if (cls->s[cls->count].id == 'T')
{
printf("请输入老师的课程:\n");
scanf("%s",cls->s[cls->count].subject);
}
if (cls->s[cls->count].id == 'S')
{
printf("请输学生的分数:\n");
scanf("%lf",&cls->s[cls->count].score);
sum_score += cls->s[cls->count].score;
}
cls->count++;
printf("是否继续(yes|no):\n");
char feedback[20];
scanf("%s",feedback);
if (strcmp(feedback,"yes") == 0)
{
if (cls->count > MAX)
{
printf("班级人数已满,无法继续录入\n");
break;
}
} else if (strcmp(feedback,"no") == 0)
{
break;
}
}
return sum_score;
}
void output(clsSeqList *cls)
{
//输出所有人员信息
for (int i = 0; i < cls->count; i++)
{
if (cls->s[i].id=='T')
{
printf("%d\t老师姓名:%s\tid:%c\t所教课程:%s\n",i+1,cls->s[i].name,cls->s[i].id,cls->s[i].subject);
}
if (cls->s[i].id=='S')
{
printf("%d\t学生姓名:%s\tid:%c\t成绩:%.2lf\n",i+1,cls->s[i].name,cls->s[i].id,cls->s[i].score);
}
}
}
int class_empty(clsSeqList *cls)
{
return cls->count == 0;
}
int class_full(clsSeqList *cls)
{
return cls->count == MAX;
}
int class_add(clsSeqList *cls,Stu s)
{
if (NULL == cls || class_full(cls))
{
printf("添加学生信息失败\n");
return -1;
}
//添加逻辑
cls->s[cls->count] = s;
//表长变化
cls->count++;
printf("添加学生信息成功\n");
}
int class_insert_pos(clsSeqList *cls,int pos,Stu s)
{
if (NULL==cls || class_full(cls) || pos < 0 || pos > cls->count)
{
printf("插入学生信息失败\n");
return -1;
}
//腾空
for (int i = cls->count-1; i >= pos; i--)
{
cls->s[i+1] = cls->s[i];
}
cls->s[pos] = s;
cls->count++;
printf("插入学生信息成功\n");
}
int class_delete_pos(clsSeqList *cls,int pos)
{
if (NULL==cls || class_empty(cls) || pos < 0 || pos >= cls->count)
{
printf("删除学生信息失败\n");
return -1;
}
for (int i = pos; i < cls->count; i++)
{
cls->s[i] = cls->s[i+1];
}
cls->count--;
printf("删除学生信息成功\n");
}
void input_student(Stu *stu)
{
printf("请输入学生的姓名:\n");
//scanf("%s",s[i].name);
scanf("%s",stu->name);
printf("请输入学生的id:\n");
//吸收垃圾字符 "%*c%c" getchar()
scanf("%*c%c",&stu->id);
if (stu->id == 'T')
{
printf("请输入老师的课程:\n");
scanf("%s",stu->subject);
}
if (stu->id == 'S')
{
printf("请输学生的分数:\n");
scanf("%lf",&stu->score);
}
}
main.c
#include "class.h"
#include "class.h"
int main(int argc, char const *argv[])
{
double sum_score = 0;
clsSeqList *cls = create_class();
if (NULL == cls)
{
printf("class 类分配内存失败,请稍后重试");
return -1;
}
sum_score = input(cls);
output(cls);
//求出所有学生的总成绩
printf("所有学生的总成绩为:%.2lf\n",sum_score);
printf("*****按位插入*********\n");
Stu stu;
input_student(&stu);
class_insert_pos(cls,1,stu);
output(cls);
printf("*******按位删除*******\n");
class_delete_pos(cls,1);
output(cls);
free(cls);
cls=NULL;
return 0;
}