任有缺陷,没有格式化输入,无登陆注册功能,无返回一级菜单功能等。没有再去完善,但是增删查改基本功能实现了,可以看着改成自己的。
编码格式UTF-8,不然会报错。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define h1 "===============数据如下==============\n"
#define h2 "|姓名 |学号|c语言|英语|高数|总成绩|\n"
#define h3 "=====|===========|=====|========\n"
#define h4 "|%-4s|%-4s|%4d|%4d|%4d|%4d|\n"
#define dataBase p->date.name,p->date.id,p->date.cResults,p->date.englishResults,p->date.mathematicsResults,p->date.total
#define END "------------------------------------\n"
int saveflog=0;
struct Student
{
char name[10];
char id[10];
int cResults;
int englishResults;
int mathematicsResults;
int total;
};
typedef struct Record
{
struct Student date;
struct Record *next;
} record,*connect;
void Query(connect pCur) ;
void Alter(connect pCur);
void keep(connect pCur);
void Read();
void Sort(connect pCur);
void Delete(connect pCur) ;
void menu();
void Unfind();
void Wrong();
void Output(record *pp);
void Header();
void Display(connect pCur);
void Add(connect pCur) ;
void Insert(connect pCur);
int main()
{
connect pCur;
record *p,*s;
FILE *fp;
pCur = (record *)malloc(sizeof(record));
s=pCur;
if(!pCur)
{
printf("没有申请到空间\n");
}
pCur->next=NULL;
fp=fopen("student","ab+");
if(fp==NULL)
{
printf("无法打开文档\n");
exit(0);
}
while(!feof(fp))
{
p=(record *)malloc(sizeof(record));
if(!p);
{
printf("没有申请成功\n");
}
if(fread(p,sizeof(record),1,fp)==1)
{
p->next=NULL;
s->next=p;
s=p;
}
}
fclose(fp);
printf("\n ==========>打开文件成功==========\n");
char ch='z';
int a;
while((ch!='m')&&(ch!='s'))
{
system("cls");
printf("************学生成绩管理系统***************\n");
printf("** 姓名: lz \n");
printf("** 班级: 软件17 \n");
printf("** 学号: \n");
printf("请选择进入系统的身份。\n");
printf("m, 管理员\ns, 学生\n");
printf("请选择:");
ch=getchar ();
if(ch=='m')
{
system("cls");
while(pCur)
{
printf("输入任意键继续");
getchar();
system("cls");
menu();
printf("输入操作指令,0为可进行保存:");
scanf("%d",&a);
if(a==0)
{
if(saveflog==1)
{
getchar();
printf("\n==是否要保存==\n");
char ch;
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
keep(pCur);
}
printf("=====保存成功=====");
getchar();
}
}
switch(a)
{
case 1:
Add (pCur);
break;
case 2:
Alter(pCur);
break;
case 3:
Query(pCur);
break;
case 4:
Delete(pCur);
break;
case 5:
Sort(pCur);
break;
case 6:
Insert(pCur);
break;
case 7:
Display(pCur);
break;
case 8:
exit(0);
break;
default :
system("cls");
printf("\n\n\n\n==========输入任意键返回菜单==========\n");
getchar();
menu();
break;
}
}
}
else if(ch=='s')
{
while(1)
{
char m;
m=0;
while((m!='a')&&(m!='b'))
{
system("cls");
printf("--------------欢迎你来到学生成绩管理系统------------------\n");
printf("a,查询成绩 b,学生成绩排名 c,退出系统\n");
printf("请你输入命令:");
m=getchar ();
if(m=='a')
{
Query(pCur);
getchar ();
}
else if(m=='b')
{
Sort(pCur);
getchar ();
}
else if(m=='c')
{
exit(0);
}
}
}
}
}
return 0;
}
void menu()
{
printf("\t***********************************\n");
printf("\t* 学生信息管理系统 * \n");
printf("\t************************************\n");
printf("\t************************************\n");
printf("\t* *1.添加信息 *2.修改信息 \n");
printf("\t* \n");
printf("\t* *3.查询信息 *4.删除信息 \n");
printf("\t* \n");
printf("\t* *5.数据排序 *6.插入信息 \n");
printf("\t* \n");
printf("\t* *7.打印数据 *0.保存数据 \n");
printf("\t* \n");
printf("\t* *8退出 \n");
printf("\t************************************* \n");
printf("\t*************************************\n");
}
void keep(connect pCur)//保存数据
{
FILE *fp;
record *p;
int a=0;
if((fp=fopen("student","wb"))==NULL)
{
printf("\t 打开文件失败...");
getch();
system("cls");
return;
}
p=pCur->next;
while(p)
{
if( fwrite(p,sizeof(record),1,fp)==1)
{
p=p->next;
a++;
}
else
{
break;
}
}
if(a>0)
{
printf("\n\t 数据保存成功...");
getchar();
system("cls");
}
else
{
system("cls");
printf("\n\t 数据保存失败...");
getchar();
}
fclose(fp);
}
void Alter(connect pCur)//信息修改
{
system("cls");
printf("\n----------------------------------------------------\n");
printf("\t ───修改信息───\n");
printf("\t *********************\n");
printf("\t *1.按学号修改 \n");
printf("\t * \n");
printf("\t *********************\n");
record *p=pCur->next;
char findmess[20];
printf("输出学生信息");
Display(pCur);
printf("输入要修改的学生学号:");
scanf("%s",findmess);
while(p)
{
if(strcmp(p->date.id,findmess)==0)
{
printf("输入学生的学号为");
scanf("%s",p->date.id);
printf("输入学生名字");
scanf("%s",p->date.name);
printf("输入新的c语言的成绩");
scanf("%d",&p->date.cResults);
printf("输入新的英语的成绩");
scanf("%d",&p->date.englishResults);
printf("输入新的高数的成绩");
scanf("%d",&p->date.mathematicsResults);
system("cls");
Display(p);
printf("\n=====》修改成功《=====\n");
break;
}
p=p->next;
}
if(p==NULL)
{
getchar();
printf("没有此学生");
}
}
void Query(connect pCur)//查询信息
{
system("cls");
printf("----------------------------------------------------\n");
printf("\t ───查询信息───\n");
printf("\t ┌─────────────┐\n");
printf("\t │1.按学号查询 \n");
printf("\t │ \n");
printf("\t └─────────────┘\n");
record *p=pCur->next;
char id[20];
printf("输入要查询的学生学号:");
scanf("%s",id);
while(p)
{
if(strcmp(p->date.id,id)==0)
{
Header();
Output(p);
printf(END);
getchar();
}
p=p->next;
}
if(p==NULL)
{
getchar();
printf("无此学生");
}
}
void Delete(connect pCur)//删除信息
{
system("cls");
printf("----------------------------------------------------\n");
printf("\t ───删除信息───\n");
printf("\t ********************\n");
printf("\t *1.按学号删除\n");
printf("\t *******************\n");
record *p=pCur->next;
record *pre=pCur,*r=p,*rpre=pre;
char findmess[20];
Display(pCur);
printf("输入要删除的学号");
scanf("%s",findmess);
if(p)
{
if(strcmp(p->date.id,findmess)==0)
{
r=p;
rpre=pre;
pre=p;
p=p->next;
rpre->next=r->next;
free(r);
getchar();
printf("删除成功\n");
saveflog=1;
}
else
{
getchar();
printf("无此学生");
}
}
}
void Sort(connect pCur)//数据排序
{
printf("----------------------------------------------------\n");
printf("\t ───数据排序───\n");
printf("\t ┌──────┐\n");
printf("\t │1.按总分排序│\n");
printf("\t │ │\n");
printf("\t │*************│\n");
printf("\t └──────┘\n");
connect pc;
record *p,*r,*s;
int i=0;
if(pCur->next==NULL)
{
system("cls");
printf("=====无学生记录=====");
getchar();
return ;
}// 判断传入的链表是否为空
pc = (record *)malloc(sizeof(record));//给pc空间
if(!pc)
{
printf("\n申请空间错误");
return ;
}//判断链表是否申请成功
pc->next=NULL;//完成链表申请
system("cls"); //进行清屏
Display(pCur);//显示排序前学生的信息
p=pCur->next;//将pCur->next的指针给p
while(p!=NULL)
{
s=(record *)malloc(sizeof(record));//新建节点给s空间,用于保存从原链表中取出的节点信息
if(!s)
{
printf("\n申请空间错误");
return ;//返回
}//判断是否申请成功
s->date=p->date;//将pCur的数据域给s
s->next=NULL;//指针域为空
r=pc;// 用于储存插入单个节点后保持排序的节点
//Pc为链表的头指针,每次插入从头开始
while(r->next!=NULL&&r->next->date.total>=p->date.total)
{
r=r->next;
//指针移动到比p所指总分小的节点位置
}
if(r->next==NULL)
{ //如果pc的所有节点的总分都比p->date.total大时,就将p指的节点加到尾部
r->next=s;
}
else
{//否则将该节点插入至第一个总分比它小的节点前面
s->next=r->next;
r->next=s;
}
p=p->next;//原链表的指针下移一个
}
pCur->next=pc->next;//pc中储存的是已经排好序的头指针
p=pCur->next;//排好序的头指针赋给p进行名次的填写
while(p!=NULL)
{
i++;//节点序号
p->date.total=i;//名次的赋值
p=p->next;//指针后移
}
Display(pCur);
}
void Insert(connect pCur)//数据插入
{
connect p,n,newinsert;
char id2[20];
char ch;
int flog=0;
n=pCur->next;
system("cls");
Display(pCur);
printf("输入要插入之前的学号:");
scanf("%s",id2);
while(pCur)
{
flog=0;
n=pCur->next;
while(n)
{
if(strcmp(n->date.id,id2)==0);
{
flog=1;
break;
}
n=n->next;
}
if(flog==1)
break;
else
{
getchar();
printf("学生学号不存在,输入y,Y继续,输入其他结束程序\n");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
continue;
}
else
{
return ;
}
}
}
printf("输入要插入的学号");
char id3[20];
scanf("%s",id3);
n=pCur->next;
while(n)
{
if(strcmp(n->date.id,id3)==0)
{
printf("此学号已存在");
Header();
Output(n);
printf("\n");
getchar();
return ;
}
n=n->next;
}
newinsert = (record *)malloc(sizeof(record));
if(newinsert==NULL)
{
printf("未申请到空间");
return ;
}
strcpy( newinsert->date.id,id3);
printf("输入学生学号:%s\n",newinsert->date.id);
printf("输入学生姓名:");
scanf("%s",newinsert->date.name);
printf("输入学生c语言成绩:");
scanf("%d",&newinsert->date.cResults);
printf("输入学生英语成绩:");
scanf("%d",&newinsert->date.englishResults);
printf("输入学生高数成绩:");
scanf("%d",&newinsert->date.mathematicsResults);
newinsert->date.total=newinsert->date.cResults+newinsert->date.englishResults+newinsert->date.mathematicsResults;
newinsert->next=NULL;
saveflog=1;
p=pCur->next;
while(pCur)
{
if(strcmp(p->date.id,id2)==0)
{
newinsert->next=p->next;
p->next=newinsert;
break;
}
p=p->next;
}
system("cls");
Display(pCur);
}
void Add(connect pCur)//数据添加
{
record *p,*r,*s;
char ch;
int flog=0;
char num[20];
r=pCur;
s=pCur->next;
system("cls");
Display(pCur);
while(r->next!=NULL)
{
r=r->next;
}
while(pCur)
{
while(pCur)
{
printf("输入学号进行对比,没有则继续,有则重新输入,0为返回进行保存");
printf("\n");
scanf("%s",num);
flog=0;
if(strcmp(num,"0")==0)
{
system("cls");
return ;
}
s=pCur->next;
while(s)
{
if(strcmp(s->date.id,num)==0)
{
flog=1;
break;
}
s=s->next;
}
if(flog==1)
{
getchar();
printf("学号重复是否重新输入,重新输入y或Y");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
continue;
}
else
{
menu();
}
}
else
{
break;
}
}
p=(record *)malloc(sizeof(record));
if(!p)
{
printf("未申请到空间");
return ;
}
printf("输入学号:");
scanf("%s",p->date.id);
printf("学生姓名:");
scanf("%s",p->date.name);
printf("学生c成绩:");
scanf("%d",&p->date.cResults);
printf("学生英语成绩:");
scanf("%d",&p->date.englishResults);
printf("学生高数成绩:");
scanf("%d",&p->date.mathematicsResults);
p->date.total=p->date.cResults+p->date.englishResults+p->date.mathematicsResults;
p->next=NULL;
r->next=p;
r=p;
saveflog=1;
}
return ;
}
void Display(connect pCur)//表格形式显示记录
{
record *p;
p=pCur->next;
if(!p)
{
printf("\n***************没有学生被记录***************\n");
getchar();
return;
}
printf("\n\n");
Header();
while(p)
{
Output(p);
p=p->next;
printf(h3);
}
getchar();
}
void Header()
{
printf(h1);
printf(h2);
printf(h3);
}
void Output(record *pp)
{
record* p;
p=pp;
printf(h4,dataBase);
}
void Unfind()
{
printf("\n=========>未查到此学生信息!<==========\n");
}