/*===============================================
* 文件名称:2.c
* 创建日期:2022年12月28日
* 描 述:
================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <time.h>
#include <unistd.h>
#define size 20
typedef struct student{
long xuehao;
char name[size];
double score;
}stu;
typedef struct classrum{
stu st[size];
int last;
}class;
//初始化
class * cushihua()
{
class *seq = (class *)malloc(sizeof(class));
if(NULL ==seq)
{
perror("malloc");
return NULL;
}
memset( seq->st ,0,sizeof(stu)*size);//对数组清零 bzero(seq->data,sizeof(date_t)*SIZE);
seq->last=-1;
return seq;
}
//判空
int pankong(class *seq)
{
return (seq->last == -1)?1:0;
}
//判满
int panman(class *seq)
{
return (seq->last+1 == size)?1:0;
}
//求表长
int biaochang(class *seq)
{
return seq->last+1;
}
//输入
int charu(class *seq)
{
//1.判断表是否满了
if(panman(seq))
return -1;
int pos =0;
long xuehao1 = 0;
char name1[20] = {0};
double score1 = 0;
puts("请按格式输入 格式:序号 学号 姓名 成绩");
scanf("%d %ld %s %lf",&pos,&xuehao1,name1,&score1);
pos=pos-1;
//2.判断位置是否合法
int len = biaochang(seq);
if(pos < 0 || pos > len)
{
puts("该位置无法插入,请重新操作");
return -1;
}
int i;
for(i=seq->last; i>=pos; i--)
{
strcpy(seq->st[i+1].name,seq->st[i].name);
seq->st[i+1].xuehao = seq->st[i].xuehao;
seq->st[i+1].score = seq->st[i].score;
}
seq->st[pos].xuehao =xuehao1;
strcpy(seq->st[pos].name,name1);
seq->st[pos].score =score1;
seq->last++;
return 0;
}
//按学号进行删除
int shanchu(class *seq)
{
long xuehao1=0;
int pos =-1;
//1.判断表是否为空
if(pankong(seq))
return -1;
puts("请输入需要删除学生的学号:");
scanf("%ld",&xuehao1);
//2.判断学号是否存在
for(int j=0; j<=seq->last; j++)
{
if(seq->st[j].xuehao == xuehao1)
{
pos=j;
break;
}
}
if(pos==-1)
{
printf("该学号不存在\n");
return -1;
}
if(pos < 0 || pos > seq->last)
return -1;
int i;
for(i=pos; i<seq->last; i++)
{
seq->st[i].xuehao = seq->st[i+1].xuehao;
seq->st[i].score = seq->st[i+1].score;
strcpy(seq->st[i].name,seq->st[i+1].name);
}
seq->last--;
return 0;
}
//按序号进行删除
int xshanchu(class *seq)
{
//1.判断表是否为空
if(pankong(seq))
return -1;
int pos=0;
puts("请输入需要删除学生的序号:");
scanf("%d",&pos);
pos=pos-1;
//2.判断位置是否合法
if(pos < 0 || pos > seq->last)
{
puts("该序号不存在");
return -1;
}
int i;
for(i=pos; i<seq->last; i++)
{
seq->st[i].xuehao = seq->st[i+1].xuehao;
seq->st[i].score = seq->st[i+1].score;
strcpy(seq->st[i].name,seq->st[i+1].name);
}
seq->last--;
return 0;
}
//按序号进行修改
int xiugai(class *seq)
{
int pos =0;
long xuehao1 = 0;
char name1[20] = {0};
double score1 = 0;
//1.判断表是否为空
if(pankong(seq))
return -1;
puts("请输入需要修改的学生序号:");
scanf("%d",&pos);
pos=pos-1;
//2.判断位置是否合法
if(pos < 0 || pos > seq->last)
{
puts("该序号不存在");
return -1;
}
puts("请按格式修改学生信息 格式:学号 姓名 成绩");
scanf("%ld %s %lf",&xuehao1,name1,&score1);
seq->st[pos].xuehao =xuehao1;
seq->st[pos].score =score1;
strcpy(seq->st[pos].name,name1);
return 0;
}
//清空顺序表
void seqlistClear(class *seq)
{
seq->last = -1;
}
//销毁顺序表
void seqlistDestory(class **seq)
{
free(*seq);
*seq=NULL;
}
//打印顺序表
void dayin(class *seq)
{
int i;
for(i=0; i<=seq->last; i++)
{
printf("序号:%d ",i+1);
printf("学号:%ld ", seq->st[i].xuehao);
printf("姓名:%s ", seq->st[i].name);
printf("成绩:%f ", seq->st[i].score);
puts(""); //printf("\n"); putchar('\n');
}
}
void view()
{
puts("\033[31m---------------欢迎来到学生管理系统-----------------\033[0m");
puts("\033[31m1.插入学生信息\033[0m");
puts("\033[31m2.按学号删除学生信息\033[0m");
puts("\033[31m3.按序号删除学生信息\033[0m");
puts("\033[31m4.按序号修改学生信息\033[0m");
puts("\033[31m5.退出系统\033[0m");
puts("\033[31m(输入无效命令则需重新输入)\033[0m");
puts("\033[31m----------------------------------------------------\033[0m");
}
int main(int argc, const char *argv[])
{
int a = 0;
class *seq = cushihua();
if(seq == NULL)
{
perror("createSeqlist");
return -1;
}
while(1)
{
view();
dayin(seq);
printf("\033[34m输入操作命令:\033[0m");
scanf("%d",&a);
switch(a)
{
case 1: charu(seq);
break;
case 2: shanchu(seq);
break;
case 3: xshanchu(seq);
break;
case 4: xiugai(seq);
break;
case 5: seqlistDestory(&seq); printf("%p\n", seq);return 0;
break;
default :printf("请输入正确的操作命令:\n");
break;
}
printf("\033[34m正在执行操作,请等待...\033[0m\n");
sleep(1);
system("clear");
}
//销毁顺序表
seqlistDestory(&seq);
printf("%p\n", seq);
return 0;
}