该课程设计只供大家参考,里面仍有许多小问题,希望使用者自己查看修改,谢谢
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
void create();//创建链表函数
void print();//输出链表函数
void dele();//删除链表节点函数
void open_file();//文件打开函数
void save_file();//文件保存函数
void modify();//信息修改函数
void search();//信息查询函数
void sort();//排序函数
void excheng(struct student *pStra,struct student *pMidd);//交换函数
struct grade
{
int Chin;
int Math;
int Eng;
int chem;
int sum;
float ave;
};
struct grade score;
struct student
{
char num[12];
char name[13];
char sex[3];
int age;
struct grade score;
struct student *next;
};
int iCount=0;
struct student *pHead=NULL;
main()
{
int select=-1;
char ff1[3];
// char ff2[3];
printf("系统初始化,是否打开磁盘中保存的文件(是/否)\n请选择:");
gets(ff1);
if(strcmp(ff1,"是")==0) {open_file(); printf("文件打开成功,按任意键继续"); getch();}
else {printf("文件没有打开,按任意键继续"); getch();}
while(select!=0)
{
system("cls");
printf("==============欢迎使用高校学生成绩管理系统V5.0==============\n");
printf("\t\t=======请选择功能列表=======\n");
printf("\t\t\t1.录入学生信息(lv4)\n");
printf("\t\t\t2.修改学生信息(lv4)\n");
printf("\t\t\t3.删除学生信息(lv4)\n");
printf("\t\t\t4.查询学生信息(lv4)\n");
printf("\t\t\t5.打印学生信息(lv4)\n");
printf("\t\t\t6.学生信息排序(lv4)\n");
printf("\t\t\t7.(打 开)(lv4)\n");
printf("\t\t\t8.(保 存)(lv4)\n");
printf("\t\t\t0.退出管理系统(lv4)\n");
printf("请选择:");
scanf("%d",&select);
switch(select)
{
case 1:
create();
break;
case 2:
modify();
break;
case 3:
dele();
break;
case 4:
search();
break;
case 5:
print();
break;
case 6:
sort();
break;
case 7:
open_file();
break;
case 8:
save_file();
break;
case 0:break;
default:
break;
}
}
// printf("你将要退出该系统,如果数据没有保存将会丢失,是否重新保存(是\否)\n请选择:");
//gets(ff2);
//if(strcmp(ff2,"是")==0)
//{
save_file();
// printf("文件保存成功,按任意键继续"); getch();}
// else {printf("文件没有重复,按任意键继续"); getch();}
}
//创建链表函数
void create()
{
//页面优化
system("cls");
printf("\n\n\t\t\t\t===================1.信息录入系统===================");
struct student *pEnd,*pNew;
struct student *p;
pEnd=pNew=(struct student *)malloc(sizeof(struct student));
printf("\n\n\n\n请输入学生信息(退出学号输0):");
//录入学号,学号不可以重复
int flag1=1,flag2,n; //11
int i,j,k;
struct student *pTemp;
printf("\n\n----------------录入第%d个人的信息----------------\n",iCount+1);
printf("学号:");
scanf("%s",pNew->num);
while(flag1)
{
if(strcmp(pNew->num,"0")==0)
{
flag1=1;
break;
}
else
{
pTemp=pHead;
n=iCount;
flag2=1;
while(n&&flag2)
{
if(strcmp(pTemp->num,pNew->num)==0) flag2=0;
pTemp=pTemp->next;
n=n-1;
}
if(flag2==0)
{
printf("请重新输入,学号%s存在!(退出请按0):\n",pNew->num);
printf("学号:");
scanf("%s",pNew->num);
flag1=1;
}
if(flag2==1) flag1=0;
}
}
//录入其他信息,如果flag1=0,则表明要退出,那么其他信息不用再录
if(flag1!=1)
{
i=1;j=1;k=1;
printf("姓名:");
scanf("%s",pNew->name);
//性别只能输入男或女,否则是不规范的
while(i)
{
printf("性别:");
scanf("%s",pNew->sex);
if(strcmp(pNew->sex,"男")==0||strcmp(pNew->sex,"女")==0) i=0;
else printf("性别输入不规范,请核对后重输!\n");
}
//成绩输入在0-150以外或其他格式是不规范的
while(j)
{
printf("年龄:");
scanf("%d",&pNew->age);
if(pNew->age>=0&&pNew->age<=150) j=0;
else printf("年龄输入不规范,请核对后重输!\n");
}
printf("请输入成绩信息:\n");
while(k)
{
printf("语文:");
scanf("%d",&pNew->score.Chin);
if(pNew->score.Chin>=0&&pNew->score.Chin<=150) k=0;
else printf("语文成绩输入不规范,请核对后重输!\n");
}
i=1;j=1;k=1;
while(i)
{
printf("数学:");
scanf("%d",&pNew->score.Math);
if(pNew->score.Math>=0&&pNew->score.Math<=150) i=0;
else printf("数学成绩输入不规范,请核对后重输!\n");
}
while(j)
{
printf("英语:");
scanf("%d",&pNew->score.Eng);
if(pNew->score.Eng>=0&&pNew->score.Eng<=150) j=0;
else printf("英语成绩输入不规范,请核对后重输!\n");
}
while(k)
{
printf("化学:");
scanf("%d",&pNew->score.chem);
if(pNew->score.chem>=0&&pNew->score.chem<=150) k=0;
else printf("化学成绩输入不规范,请核对后重输!\n");
}
//平均成绩
pNew->score.sum=pNew->score.Chin+pNew->score.Math+pNew->score.Eng+pNew->score.chem;
pNew->score.ave=pNew->score.sum/4.0;
printf("\n你录入第%d个人的信息如下,按任意键继续!\n",iCount+1);
printf("学 号 姓 名 性 别 年 龄 语 文 数 学 英 语 化 学 总 分 平均成绩\n");
printf("%-10s%-10s%-8s%-8d%-8d%-8d%-8d%-8d%-8d%-8.2f\n",pNew->num,pNew->name,pNew->sex,pNew->age,pNew->score.Chin,pNew->score.Math,pNew->score.Eng,pNew->score.chem,pNew->score.sum,pNew->score.ave);
getch();
} //11
while(strcmp(pNew->num,"0")!=0)
{
iCount++;
if(pHead==NULL)
// {
{
pNew->next=NULL;
pEnd=pNew;
pHead=pNew;
}
//}
else
{
p=pHead;
while(p&&p->next!=NULL) p=p->next;
{
p->next=pNew;
pNew->next=NULL;
}
}
pNew=(struct student *)malloc(sizeof(struct student));
printf("\n\n----------------录入第%d个人的信息----------------\n",iCount+1);
printf("学号:"); //22
scanf("%s",pNew->num);
flag1=1;//每次循环结束flag1=1退出;flag1=0则继续,所以要值0
while(flag1)
{
if(strcmp(pNew->num,"0")==0)
{
flag1=1;
break;
}
else
{
pTemp=pHead;
n=iCount;
flag2=1;
while(n&&flag2)
{
if(strcmp(pTemp->num,pNew->num)==0) flag2=0;
pTemp=pTemp->next;
n=n-1;
}
if(flag2==0)
{
printf("请重新输入,学号%s存在!(退出请按0):\n",pNew->num);
printf("学号:");
scanf("%s",pNew->num);
flag1=1;
}
if(flag2==1) flag1=0;
}
}
//录入其他信息,如果flag1=0,则表明要退出,那么其他信息不用再录
if(flag1!=1)
{
i=1;j=1;k=1;
printf("姓名:");
scanf("%s",pNew->name);
//性别只能输入男或女,否则是不规范的
while(i)
{
printf("性别:");
scanf("%s",pNew->sex);
if(strcmp(pNew->sex,"男")==0||strcmp(pNew->sex,"女")==0) i=0;
else printf("性别输入规范,请核对后重输!\n");
}
//成绩输入在0-150以外或其他格式是不规范的
while(j)
{
printf("年龄:");
scanf("%d",&pNew->age);
if(pNew->age>=0&&pNew->age<=150) j=0;
else printf("年龄输入不规范,请核对后重输!\n");
}
printf("请输入成绩信息(输入数字):\n");
while(k)
{
printf("语文:");
scanf("%d",&pNew->score.Chin);
if(pNew->score.Chin>=0&&pNew->score.Chin<=150) k=0;
else printf("语文成绩输入不规范,请核对后重输!\n");
}
i=1;j=1;k=1;
while(i)
{
printf("数学:");
scanf("%d",&pNew->score.Math);
if(pNew->score.Math>=0&&pNew->score.Math<=150) i=0;
else printf("数学成绩输入不规范,请核对后重输!\n");
}
while(j)
{
printf("英语:");
scanf("%d",&pNew->score.Eng);
if(pNew->score.Eng>=0&&pNew->score.Eng<=150) j=0;
else printf("英语成绩输入不规范,请核对后重输!\n");
}
while(k)
{
printf("化学:");
scanf("%d",&pNew->score.chem);
if(pNew->score.chem>=0&&pNew->score.chem<=150) k=0;
else printf("化学成绩输入不规范,请核对后重输!\n");
}
//平均成绩
pNew->score.sum=pNew->score.Chin+pNew->score.Math+pNew->score.Eng+pNew->score.chem;
pNew->score.ave=pNew->score.sum/4.0;
printf("\n你录入第%d个人的信息如下,按任意键继续!\n",iCount+1);
printf("学 号 姓 名 性 别 年 龄 语 文 数 学 英 语 化 学 总 分 平均成绩\n");
printf("%-10s%-10s%-8s%-8d%-8d%-8d%-8d%-8d%-8d%-8.2f\n",pNew->num,pNew->name,pNew->sex,pNew->age,pNew->score.Chin,pNew->score.Math,pNew->score.Eng,pNew->score.chem,pNew->score.sum,pNew->score.ave);
getch();
} //22
}
free(pNew);
printf("\n信息录入结束,按任意键退出!");
getch();
}
//输出链表函数
void print()
{
//页面优化
system("cls");
printf("\n\n\t\t\t\t===================5.打印报表系统===================");
struct student *pTemp;
printf("\n\n\n\n-----------------本名单中共有%d个学生:-----------------\n\n",iCount);
pTemp=pHead;
//没录入信息输出信息提示
if(iCount==0) printf("暂无数据,按任意键退出!\n");
else
{
printf("学 号 姓 名 性 别 年 龄 语 文 数 学 英 语 化 学 总 分 平均成绩\n");
while(pTemp!=NULL)
{
printf("%-10s%-10s%-8s%-8d%-8d%-8d%-8d%-8d%-8d%-8.2f\n",pTemp->num,pTemp->name,pTemp->sex,pTemp->age,pTemp->score.Chin,pTemp->score.Math,pTemp->score.Eng,pTemp->score.chem,pTemp->score.sum,pTemp->score.ave);
pTemp=pTemp->next;
}
}
if(iCount!=0) printf("\n信息公示完毕,按任意键退出!");
getch();
}
//信息查询函数
void search()
{
//页面优化
system("cls");
printf("\n\n\t\t\t\t===================4.查询系统===================");
// int result;
int select=-1;
while(select!=0)
{
printf("\n\t\t=======请选择功能列表=======\n");
printf("\t\t\t1.按学号查询(lv4)\n");
printf("\t\t\t2.按姓名查询(lv1)\n");
printf("\t\t\t0.退出此页面(lv4)\n");
printf("请选择:");
scanf("%d",&select);
int flag=1,flag1=1;
char number[12];
char name[12];
struct student *pTemp=pHead;
//按学号查询
if(select==1)
{
printf("请输入你要查找的学号:");
scanf("%s",number);
while(pTemp!=NULL&&flag)
{
if(strcmp(pTemp->num,number)==0)
{
printf("%s找到了,具体信息如下\n",number);
printf("学 号 姓 名 性 别 年 龄 语 文 数 学 英 语 化 学 总 分 平均成绩\n");
printf("%-10s%-10s%-8s%-8d%-8d%-8d%-8d%-8d%-8d%-8.2f\n",pTemp->num,pTemp->name,pTemp->sex,pTemp->age,pTemp->score.Chin,pTemp->score.Math,pTemp->score.Eng,pTemp->score.chem,pTemp->score.sum,pTemp->score.ave);
flag=0;
}
pTemp=pTemp->next;
}
if(flag==1) printf("学号%s不存在!\n",number);
}
//按姓名查询
if(select==2)
{
printf("请输入你要查找的姓名:");
scanf("%s",name);
while(pTemp!=NULL&&flag)
{
if(strcmp(pTemp->name,name)==0)
{
printf("%s找到了,具体信息如下\n",name);
printf("学 号 姓 名 性 别 年 龄 语 文 数 学 英 语 化 学 总 分 平均成绩\n");
printf("%-10s%-10s%-8s%-8d%-8d%-8d%-8d%-8d%-8d%-8.2f\n",pTemp->num,pTemp->name,pTemp->sex,pTemp->age,pTemp->score.Chin,pTemp->score.Math,pTemp->score.Eng,pTemp->score.chem,pTemp->score.sum,pTemp->score.ave);
flag=0;
}
pTemp=pTemp->next;
}
if(flag==1) printf("姓名%s不存在!",name);
}
//getch();
}
}
//信息修改函数
void modify()
{
//页面优化
system("cls");
printf("\n\n\t\t\t\t===================2.修改系统===================");
int post;
int flag=1,flag1;
char number[12];
struct student *pTemp=pHead,*pPre=pTemp
;
printf("\n请输入你要修改的学号:");
scanf("%s",number);
while(pTemp!=NULL&&flag)
{
if(strcmp(pTemp->num,number)==0)
{
printf("将要删除的学号%s具体信息如下\n",number);
printf("学 号 姓 名 性 别 年 龄 语 文 数 学 英 语 化 学 总 分 平均成绩\n");
printf("%-10s%-10s%-8s%-8d%-8d%-8d%-8d%-8d%-8d%-8.2f\n",pTemp->num,pTemp->name,pTemp->sex,pTemp->age,pTemp->score.Chin,pTemp->score.Math,pTemp->score.Eng,pTemp->score.chem,pTemp->score.sum,pTemp->score.ave);
flag=0;
}
pPre=pTemp;//保存pTemp
pTemp=pTemp->next;
}
if(flag==1) printf("你要修改的学号%s不存在!",number);
else
{
printf("确认修改请按1,放弃请按任意数字键!\n请选择:");
scanf("%d",&post);
while(post==1)
{
printf("请选择你要修改的项目(1.姓名 2.性别 3.年龄 4.语文 5.数学 6.英语 7.化学 8.修改全部)\n");
scanf("%d",&flag1);
if(flag1==1)
{
printf("新姓名:");
scanf("%s",pPre->name);
printf("修改完成,按任意键退出!");
}
if(flag1==2)
{
printf("新性别:");
scanf("%s",pPre->sex);
printf("修改完成,按任意键退出!");
}
if(flag1==3)
{
printf("新年龄:");
scanf("%d",&pPre->age);
printf("修改完成,按任意键退出!");
}
if(flag1==4)
{
printf("新语文:");
scanf("%d",&pPre->score.Chin);
printf("修改完成,按任意键退出!");
}
if(flag1==5)
{
printf("新数学:");
scanf("%d",&pPre->score.Math);
printf("修改完成,按任意键退出!");
}
if(flag1==6)
{
printf("新英语:");
scanf("%d",&pPre->score.Eng);
printf("修改完成,按任意键退出!");
}
if(flag1==7)
{
printf("新化学:");
scanf("%d",&pPre->score.chem);
printf("修改完成,按任意键退出!");
}
if(flag1==8)
{
printf("新姓名:");
scanf("%s",pPre->name);
printf("新性别:");
scanf("%s",pPre->sex);
printf("新年龄:");
scanf("%d",&pPre->age);
printf("新语文:");
scanf("%d",&pPre->score.Chin);
printf("新数学:");
scanf("%d",&pPre->score.Math);
printf("新英语:");
scanf("%d",&pPre->score.Eng);
printf("新化学:");
scanf("%d",&pPre->score.chem);
printf("修改完成!");
}
pPre->score.sum=pPre->score.Chin+pPre->score.Math+pPre->score.Eng+pPre->score.chem;
pPre->score.ave=pPre->score.sum/4.0;
printf("\n继续修改请按1,退出请按0\n请选择:");
scanf("%d",&post);
if(post==0) break;
}
}
getch();
}
//删除链表节点函数
void dele()
{
//页面优化
system("cls");
printf("\n\n\t\t\t\t===================3.删除信息系统===================");
if(iCount==0) printf("\n\n暂无数据无法进行此操作,按任意键退出!\n");
else
{ //33
char number[12];
int i,flag=1;
char option;
struct student *pTemp;
struct student *pPre;
pTemp=pHead;
int iIndex=0;
printf("\n请输入要删除学生的学号\n");
scanf("%s",number);
while(pTemp!=NULL&&flag)
{
if(strcmp(pTemp->num,number)==0)
{
printf("\n%s找到了,具体信息如下\n",number);
//显示将要删除人的信息
printf("学 号 姓 名 性 别 年 龄 语 文 数 学 英 语 化 学 总 分 平均成绩\n");
printf("%-10s%-10s%-8s%-8d%-8d%-8d%-8d%-8d%-8d%-8.2f\n",pTemp->num,pTemp->name,pTemp->sex,pTemp->age,pTemp->score.Chin,pTemp->score.Math,pTemp->score.Eng,pTemp->score.chem,pTemp->score.sum,pTemp->score.ave);
flag=0;
printf("确认删除请输1,否则按任意数字键退出\n");
scanf("%d",&option);
}
pTemp=pTemp->next;
iIndex++;
}
if(flag==1) {printf("学号%s不存在!",number); return;}
if(option==1)
{
pTemp=pHead;
pPre=pTemp;//可能多余
//printf("----------删除第%d个学生----------\n",iIndex);
if(iIndex!=1)
{
for(i=1;i<iIndex;i++)
{
pPre=pTemp;
pTemp=pTemp->next;
}
pPre->next=pTemp->next;
}
if(iIndex==1) pHead=pTemp->next;
free(pTemp);
iCount--;
printf("删除成功按任意键退出!");
}
else printf("删除失败按任意键退出!");
} //33
getch();
}
//文件打开函数
void open_file()
{
FILE *fp;
printf("\n输入该班的数据;\n");
fp=fopen("d:\\code\\test.txt","r");
if(fp==NULL)
{
printf("不能打开此文件,按任意键退出!");
getch();
exit(1);
}
else
{
fclose(fp);
fp=fopen("d:\\code\\test.txt","at+");
printf("该班数据为:\n");
printf("学 号 姓 名 性 别 年 龄 语 文 数 学 英 语 化 学 总 分 平均成绩\n");
struct student *pNew,*pEnd;
pEnd=pNew=(struct student *)malloc(sizeof(struct student));
while(fscanf(fp,"%s %s %s %d %d %d %d %d %d %f\n",pNew->num,pNew->name,pNew->sex,&pNew->age,&pNew->score.Chin,&pNew->score.Math,&pNew->score.Eng,&pNew->score.chem,&pNew->score.sum,&pNew->score.ave)!=EOF)
{
if(iCount==0)
{
pNew->next=NULL;
pEnd=pNew;
pHead=pNew;
printf("%-10s%-10s%-8s%-8d%-8d%-8d%-8d%-8d%-8d%-8.2f\n",pNew->num,pNew->name,pNew->sex,pNew->age,pNew->score.Chin,pNew->score.Math,pNew->score.Eng,pNew->score.chem,pNew->score.sum,pNew->score.ave);
}
else
{
pNew->next=NULL;
pEnd->next=pNew;
pEnd=pNew;
printf("%-10s%-10s%-8s%-8d%-8d%-8d%-8d%-8d%-8d%-8.2f\n",pNew->num,pNew->name,pNew->sex,pNew->age,pNew->score.Chin,pNew->score.Math,pNew->score.Eng,pNew->score.chem,pNew->score.sum,pNew->score.ave);
}
iCount++;
pNew=(struct student *)malloc(sizeof(struct student));
}
free(pNew);
}
fclose(fp);
getch();
}
//文件保存函数
void save_file()
{
FILE *fp;
fp=fopen("d:\\code\\test.txt","w");
if(fp==NULL)
{
printf("不能打开此文件,按任意键退出!");
getch();
exit(1);
}
else
{
fclose(fp);
fp=fopen("d:\\code\\test.txt","w");
struct student *pTemp;
pTemp=pHead;
while(pTemp!=NULL)
{
fprintf(fp,"%-10s%-10s%-8s%-8d%-8d%-8d%-8d%-8d%-8d%-8.2f\n",pTemp->num,pTemp->name,pTemp->sex,pTemp->age,pTemp->score.Chin,pTemp->score.Math,pTemp->score.Eng,pTemp->score.chem,pTemp->score.sum,pTemp->score.ave);
pTemp=pTemp->next;
}
}
fclose(fp);
printf("数据保存成功,按任意键退出!");
getch();
}
//交换函数
void excheng(struct student *pStra,struct student *pMidd)
{
int t;
struct student *pTemp;
pTemp=(struct student *)malloc(sizeof(struct student));
strcpy(pTemp->num,pStra->num);
strcpy(pStra->num,pMidd->num);
strcpy(pMidd->num,pTemp->num);
strcpy(pTemp->name,pStra->name);
strcpy(pStra->name,pMidd->name);
strcpy(pMidd->name,pTemp->name);
strcpy(pTemp->sex,pStra->sex);
strcpy(pStra->sex,pMidd->sex);
strcpy(pMidd->sex,pTemp->sex);
t=pMidd->age;
pMidd->age=pStra->age;
pStra->age=t;
t=pMidd->score.Chin;
pMidd->score.Chin=pStra->score.Chin;
pStra->score.Chin=t;
t=pMidd->score.Math;
pMidd->score.Math=pStra->score.Math;
pStra->score.Math=t;
t=pMidd->score.Eng;
pMidd->score.Eng=pStra->score.Eng;
pStra->score.Eng=t;
t=pMidd->score.chem;
pMidd->score.chem=pStra->score.chem;
pStra->score.chem=t;
t=pMidd->score.ave;
pMidd->score.ave=pStra->score.ave;
pStra->score.ave=t;
free(pTemp);
}
//排序函数
void sort()
{
//页面优化
system("cls");
printf("\n\n\t\t\t\t===================4.排序系统===================");
int i,j;
struct student *pStra,*pMidd;
int result;
int select=-1;
while(select!=0)
{
printf("\n\t\t=======请选择功能列表=======\n");
printf("\t\t\t1.按学号升序排序(lv4)\n");
printf("\t\t\t2.按姓名升序排序(lv1)\n");
//printf("\t\t\t3.按成绩升序排序(lv1)\n\n");
printf("\t\t\t4.按学号降序排序(lv4)\n");
printf("\t\t\t5.按姓名降序排序(lv1)\n");
//printf("\t\t\t6.按成绩降序排序(lv1)\n");
printf("\t\t\t0.退出此页面(lv4)\n");
printf("请选择:");
scanf("%d",&select);
switch(select)
{
case 1:
result=1;
break;
case 2:
result=2;
break;
case 3:
result=3;
break;
case 4:
result=4;
break;
case 5:
result=5;
break;
case 6:
result=6;
break;
default :result=0;
break;
}
if(iCount!=0&&result!=0)
{ //1222222
pStra=pHead;
pMidd=pStra->next;
if(result==1) printf("你的选择是按学号升序排序\n");
else if(result==2) printf("你的选择是按姓名升序排序\n");
//else if(result==3) printf("你的选择是按成绩升序排序\n");
else if(result==4) printf("你的选择是按学号降序排序\n");
else if(result==5) printf("你的选择是按姓名降序排序\n");
//else if(result==6) printf("你的选择是按成绩降序排序\n");
for(i=0;i<iCount;i++)
{
pStra=pHead;
pMidd=pStra->next;
for(j=0;j<iCount-i-1&&pMidd!=NULL;j++)
{
if(result==1) {if(strcmp(pStra->num,pMidd->num)>0) excheng(pStra,pMidd);}
else if(result==2) {if(strcmp(pStra->name,pMidd->name)>0) excheng(pStra,pMidd);}
//else if(result==3) {if(pStra->score.sum>pMidd->score.sum) excheng(pStra,pMidd);}
else if(result==4) {if(strcmp(pStra->num,pMidd->num)<0) excheng(pStra,pMidd);}
else if(result==5) {if(strcmp(pStra->name,pMidd->name)<0) excheng(pStra,pMidd);}
//else if(result==6) {if(pStra->score.sum<pMidd->score.sum) excheng(pStra,pMidd);}
pStra=pMidd;
pMidd=pMidd->next;
}
}
printf("\n排序成功,按任意键退出!");
}
else printf("排序失败按任意键继续!");
break;
}
getch();
}