成绩管理系统改进

来源:互联网 发布:今天淘宝登录不上去 编辑:程序博客网 时间:2024/04/30 06:54

前段时间写的成绩管理系统进入查看》》.功能和健壮性不好.

这次改写了一些地方:

1:加入文件读写;

2:异常处理(效果是!但不是C标准库的异常处理函数setjmp,longjmp);

3:其他一些小地方改写;

看代码:


#include<stdio.h>#include<malloc.h>#include<string.h>#include<stdlib.h>#include<conio.h>typedef struct L{char Name[30];long long Num;float English;float C_language;struct L *Next;}*Node;void Menu();                    //功能菜单 void Search(Node p);            //查找 void Name_Search(Node p);        //按姓名查找 void Num_Search(Node p);          //按学号查找 void Initialization(Node p);      //初始化表 void Add(Node p);              // 添加 void Insert(Node p);             //插入 void Delet(Node p);               //删除 void Show(Node p);                 //显示 void Sort(Node p);            //排序 void C_Sort(Node p);           //c成绩排序 void En_Sort(Node p);           //英语成绩排序 void Num_Sort(Node p);       // 学号排序 void All_Sort(Node p);          //总成绩排序 void Most(Node p);                  //最大值 void DelName(Node p);         //按姓名删除 void DelNum(Node p);       //按学号删除 void Modify(Node p);            //修改 void Num_Modify(Node p);         //按学号修改 void Name_Modify(Node p);       //按姓名修改 void Menu1();                  //菜单void Explanation();              //说明void Import(Node p);           //从文件导入数据void Export(Node p);           //将数据导入到外部文件中int main(){Node p=new struct L;system("color 1a");Initialization(p);Menu();printf("\t选择:\n");printf("\t");int m;while(true){if(scanf("%d",&m)!=0){if(m==11){Explanation();getch();system("cls");break;}else{printf("\t请先看说明!\n");printf("\t");}}else {printf("\t输入有误!!结束!!\n");getch();exit(0);}}Menu1();printf("\t选择:\n");printf("\t");int n;while(scanf("%d",&n)!=EOF){switch(n){case 1:Add(p);fflush(stdin);break;case 2:Show(p);fflush(stdin);break;case 3:Insert(p);fflush(stdin);break;case 4:Sort(p);fflush(stdin);break;case 5:Delet(p);fflush(stdin);break;case 6:Search(p);fflush(stdin);break;case 7:Modify(p);fflush(stdin);break;case 8:fflush(stdin);return 0;case 9:Export(p);fflush(stdin);break;case 10:Import(p);fflush(stdin);break;case 11:Explanation();fflush(stdin);break;default :fflush(stdin);printf("\t没有该选项:\n");break;}getch();printf("\t");system("cls");Menu1();printf("\t选择:\n");printf("\t");}return 0;}void Menu(){printf("\n");printf("\t             成绩管理系统 \3\n");printf("        --------------------------------------\n");printf("\t|\t1:添加\t   |\t2:输出\t     |\n");printf("        --------------------------------------\n");printf("\t|\t3:插入\t   |\t4:排序\t     |\n");printf("        --------------------------------------\n");printf("\t|\t5:删除\t   |\t6:查询\t     |\n");printf("        --------------------------------------\n");printf("\t|\t7:修改\t   |\t8:退出\t     |\n");printf("        --------------------------------------\n");printf("\t|\t9:写出到文件\t             |\n");printf("        --------------------------------------\n");printf("\t|\t10:导入从文件\t             |\n");printf("        --------------------------------------\n");printf("\t|\t11:说明(必看!)\t     |\n");printf("        --------------------------------------\n");printf("\t");printf("\n");}void Initialization(Node p){p->Next=NULL;p->Num=0;}void Add(Node p){Node io=p;long long a;float b,c;char na[30];int len=p->Num;for(int i=0;i<len;++i){p=p->Next;}Node j=(Node)malloc(sizeof(struct L));printf("\t输入姓名:\n");printf("\t");scanf("%s",&na);printf("\t输入学号:\n");printf("\t");if(scanf("%lld",&a)==0){printf("\t输入类型与要求不符合,添加失败!!\n");getch();return ;}printf("\t输入英语成绩:\n");printf("\t");if(scanf("%f",&b)==0){printf("\t输入类型与要求不符合,添加失败!!\n");getch();return ;}printf("\t输入C语言成绩:\n");printf("\t");if(scanf("%f",&c)==0){printf("\t输入类型与要求不符合,添加失败!!\n");getch();return ;}strcpy(j->Name,na);j->Num=a;j->English=b;j->C_language=c;p->Next=j;j->Next=NULL;printf("\t添加成功!\n");io->Num++;getch();}void Insert(Node p){p->Num++;printf("\t输入插入位置:\n");int n;printf("\t");scanf("%d",&n);if(n<=0){printf("位置错误!\n");return;}n-=1;while(n--){p=p->Next;}Node q=(Node)malloc(sizeof(struct L));printf("\t输入姓名:\n");scanf("%s",&q->Name);printf("\t输入学号:\n");scanf("%lld",&q->Num);printf("\t输入英语成绩:\n");scanf("%f",&q->English);printf("\t输入C语言成绩:\n");scanf("%f",&q->C_language);q->Next=p->Next;p->Next=q;printf("\t插入成功!\n");getch();}void Delet(Node p){if(p->Num==0){printf("\t没有可删除的数据!\n");return;}p->Num--;printf("\t选择:\n");printf("\t1:按姓名删除:\n");printf("\t2:按学号删除:\n");int n;printf("\t");scanf("%d",&n);switch(n){case 1:DelName(p);break;case 2:DelNum(p);break;default:printf("\t无此选择!\n");break;}printf("\t删除成功!\n");getch();}void DelName(Node p){char s[30];printf("\t输入姓名:\n");printf("\t");scanf("%s",&s);Node q=p;for(q=q->Next;q->Next!=NULL;q=q->Next,p=p->Next){if(!strcmp(q->Name,s)){p->Next=p->Next->Next;}}getch();}void DelNum(Node p){long long n;printf("\t输入学号:\n");printf("\t");scanf("%lld",&n);Node q=p;for(q=q->Next;q->Next!=NULL;q=q->Next,p=p->Next){if(q->Num==n){p->Next=p->Next->Next;}}getch();}void Show(Node p){if(p->Num==0){printf("\t没有可显示的数据!\n");return;}int len=p->Num;p=p->Next;for(int i=0;i<len;++i){printf("        -------------------------------------------------\n");printf("\t|\t姓名:\t\t|\t%s\n",p->Name);printf("        -------------------------------------------------\n");printf("\t|\t学号:\t\t|\t%lld\n",p->Num);printf("        -------------------------------------------------\n");printf("\t|\t英语:\t\t|\t%.2f\n",p->English);printf("        -------------------------------------------------\n");printf("\t|\tC语言:\t\t|\t%.2f\n",p->C_language);printf("        -------------------------------------------------\n");printf("\t|\t总分:\t\t|\t%.2f\n",p->English+p->C_language);printf("        -------------------------------------------------\n");printf("\n");p=p->Next;}printf("\t总人数为:%d\n",len);printf("\t显示完!\n");getch();}void C_Sort(Node p){Node x,y;int len=p->Num;for(int i=0;i<len;++i){p=p->Next;x=p;y=p->Next;for(int j=i+1;j<len;++j){if(x->C_language>y->C_language){x=y;}y=y->Next;}float a,b;long long w;char s[30];w=x->Num;x->Num=p->Num;p->Num=w;strcpy(s,x->Name);strcpy(x->Name,p->Name);strcpy(p->Name,s);a=x->C_language;x->C_language=p->C_language;p->C_language=a;b=x->English;x->English=p->English;p->English=b;}printf("\t排序成功!\n");getch();}void Sort(Node p){if(p->Num==0){printf("\t没有可排序的数据!\n");return;}printf(" \t选择:\n");printf(" \t1:C语言成绩从小到大排序:\n");printf(" \t2:英语成绩从小到大排序:\n");printf(" \t3:总成绩从小到大排序:\n");printf(" \t4:学号从小到大排序:\n");int n;printf("\t");scanf("%d",&n);switch(n){case 1:C_Sort(p);break;case 2:En_Sort(p);break;case 3:All_Sort(p);break;case 4:Num_Sort(p);break;default:printf("\t无此选择!\n");break;}getch();}void En_Sort(Node p){Node x,y;int len=p->Num;for(int i=0;i<len;++i){p=p->Next;x=p;y=p->Next;for(int j=i+1;j<len;++j){if(x->English>y->English){x=y;}y=y->Next;}float a,b;char s[30];long long w;w=x->Num;x->Num=p->Num;p->Num=w;strcpy(s,x->Name);strcpy(x->Name,p->Name);strcpy(p->Name,s);a=x->C_language;x->C_language=p->C_language;p->C_language=a;b=x->English;x->English=p->English;p->English=b;}printf("\t排序成功!\n");getch();}void Search(Node p){if(p->Num==0){printf("\t没有可查找的数据!\n");return;}printf(" \t选择:\n");printf(" \t1:按姓名查询:\n");printf(" \t2:按学号查询:\n");int n;printf("\t");scanf("%d",&n);switch(n){case 1:Name_Search(p);break;case 2:Num_Search(p);break;default:printf("\t无此选择!\n");break;}getch();}void Name_Search(Node p){char ap[30];printf("\t输入姓名:\n");printf("\t");scanf("%s",&ap);int len=p->Num;p=p->Next;int i;for(i=0;i<len;++i){if(!strcmp(ap,p->Name)){printf("        -------------------------------------------------\n");printf("\t|\t姓名:\t\t|\t%s\n",p->Name);printf("        -------------------------------------------------\n");printf("\t|\t学号:\t\t|\t%lld\n",p->Num);printf("        -------------------------------------------------\n");printf("\t|\t英语:\t\t|\t%.2f\n",p->English);printf("        -------------------------------------------------\n");printf("\t|\tC语言:\t\t|\t%.2f\n",p->C_language);printf("        -------------------------------------------------\n");printf("\t|\t总分:\t\t|\t%.2f\n",p->English+p->C_language);printf("        -------------------------------------------------\n");break;}p=p->Next;}if(i>=len){printf("\t没有找到该学生!\n");}getch();}void Num_Search(Node p){long long sd;printf("\t输入学号:\n");printf("\t");scanf("%lld",&sd);int len=p->Num;p=p->Next;int i;for(i=0;i<len;++i){if(sd==p->Num){printf("        -------------------------------------------------\n");printf("\t|\t姓名:\t\t|\t%s\n",p->Name);printf("        -------------------------------------------------\n");printf("\t|\t学号:\t\t|\t%lld\n",p->Num);printf("        -------------------------------------------------\n");printf("\t|\t英语:\t\t|\t%.2f\n",p->English);printf("        -------------------------------------------------\n");printf("\t|\tC语言:\t\t|\t%.2f\n",p->C_language);printf("        -------------------------------------------------\n");printf("\t|\t总分:\t\t|\t%.2f\n",p->English+p->C_language);printf("        -------------------------------------------------\n");break;}p=p->Next;}if(i>=len){printf("\t没有找到该学生!\n");}getch();}void Modify(Node p){if(p->Num==0){printf("\t没有可修改的数据!\n");return;}printf(" \t选择:\n");printf(" \t1:输入姓名修改:\n");printf(" \t2:输入学号修改:\n");int n;printf("\t");scanf("%d",&n);switch(n){case 1:Name_Modify(p);break;case 2:Num_Modify(p);break;default:printf("\t无此选择!\n");break;}getch();}void Num_Modify(Node p){long long sd;printf("\t输入学号:\n");printf("\t");scanf("%lld",&sd);int len=p->Num;p=p->Next;int i;for(i=0;i<len;++i){if(sd==p->Num){printf("        -------------------------------------------------\n");printf("\t|\t姓名:\t\t|\t%s\n",p->Name);printf("        -------------------------------------------------\n");printf("\t|\t学号:\t\t|\t%lld\n",p->Num);printf("        -------------------------------------------------\n");printf("\t|\t英语:\t\t|\t%.2f\n",p->English);printf("        -------------------------------------------------\n");printf("\t|\tC语言:\t\t|\t%.2f\n",p->C_language);printf("        -------------------------------------------------\n");printf("\t这是之前的数据!\n");printf("\t现在请更改!\n");printf("\t输入姓名:\n");printf("\t");scanf("%s",&p->Name);printf("\t输入学号:\n");printf("\t");scanf("%lld",&p->Num);printf("\t输入英语成绩:\n");printf("\t");scanf("%f",&p->English);printf("\t输入C语言成绩:\n");printf("\t");scanf("%f",&p->C_language);printf("\t修改成功!\n");getch();break;}p=p->Next;}if(i>=len){printf("\t没有找到该学生!\n");}getch();}void Name_Modify(Node p){char ap[30];printf("\t输入姓名:\n");printf("\t");scanf("%s",&ap);int len=p->Num;p=p->Next;int i;for(i=0;i<len;++i){if(!strcmp(ap,p->Name)){printf("        -------------------------------------------------\n");printf("\t|\t姓名:\t\t|\t%s\n",p->Name);printf("        -------------------------------------------------\n");printf("\t|\t学号:\t\t|\t%lld\n",p->Num);printf("        -------------------------------------------------\n");printf("\t|\t英语:\t\t|\t%.2f\n",p->English);printf("        -------------------------------------------------\n");printf("\t|\tC语言:\t\t|\t%.2f\n",p->C_language);printf("        -------------------------------------------------\n");printf("\t这是之前的数据!\n");printf("\t现在请更改!\n");printf("\t输入姓名:\n");printf("\t");scanf("%s",&p->Name);printf("\t输入学号:\n");printf("\t");scanf("%lld",&p->Num);printf("\t输入英语成绩:\n");printf("\t");scanf("%f",&p->English);printf("\t输入C语言成绩:\n");printf("\t");scanf("%f",&p->C_language);printf("\t修改成功!\n");getch();break;}p=p->Next;}if(i>=len){printf("\t没有找到该学生!\n");}getch();}void All_Sort(Node p){Node x,y;int len=p->Num;for(int i=0;i<len;++i){p=p->Next;x=p;y=p->Next;for(int j=i+1;j<len;++j){if((x->English+x->C_language)>(y->English+y->C_language)){x=y;}y=y->Next;}float a,b;char s[30];long long w;w=x->Num;x->Num=p->Num;p->Num=w;strcpy(s,x->Name);strcpy(x->Name,p->Name);strcpy(p->Name,s);a=x->C_language;x->C_language=p->C_language;p->C_language=a;b=x->English;x->English=p->English;p->English=b;}printf("\t排序成功!\n");getch();}void Num_Sort(Node p){Node x,y;int len=p->Num;for(int i=0;i<len;++i){p=p->Next;x=p;y=p->Next;for(int j=i+1;j<len;++j){if(x->Num>y->Num){x=y;}y=y->Next;}float a,b;char s[30];long long w;w=x->Num;x->Num=p->Num;p->Num=w;strcpy(s,x->Name);strcpy(x->Name,p->Name);strcpy(p->Name,s);a=x->C_language;x->C_language=p->C_language;p->C_language=a;b=x->English;x->English=p->English;p->English=b;}printf("\t排序成功!\n");getch();}void Menu1(){system("color 1a");printf("\n");printf("\t             成绩管理系统 \3\n");printf("        --------------------------------------\n");printf("\t|\t1:添加\t   |\t2:输出\t     |\n");printf("        --------------------------------------\n");printf("\t|\t3:插入\t   |\t4:排序\t     |\n");printf("        --------------------------------------\n");printf("\t|\t5:删除\t   |\t6:查询\t     |\n");printf("        --------------------------------------\n");printf("\t|\t7:修改\t   |\t8:退出\t     |\n");printf("        --------------------------------------\n");printf("\t|\t9:写出到文件\t             |\n");printf("        --------------------------------------\n");printf("\t|\t10:导入从文件\t             |\n");printf("        --------------------------------------\n");printf("\t");printf("\n");}void Explanation(){system("cls");system("color 07");printf("------------------------------------------------------------------\n");printf("\t在编写过程中有很多地方使用了getch停顿\n");printf("------------------------------------------------------------------\n");printf("\t所以经常回车要按两次!也要看情况,有些地方一次就行了\n");printf("------------------------------------------------------------------\n");printf("\t如果按了一次回车没有反应,那就在按一次,\n");printf("------------------------------------------------------------------\n");printf("\t在输入文件地址的时候要输入绝对地址\n");printf("------------------------------------------------------------------\n");printf("\t请保证文件中的格式为 姓名 学号 英语成绩 C语言成绩\n");printf("------------------------------------------------------------------\n");printf("\t下一组数据换行,否则导入会出错的!\n");printf("------------------------------------------------------------------\n");printf("\t在win7下要在C盘写文件需要用管理员权限.\n");printf("------------------------------------------------------------------\n");printf("\t");getch();}void Import(Node p){printf("\t提示:此操作将使用文件中的数据衔接到此时内存中的缓存数据后面\n");char ch;printf("\n");printf("\t\t\t同意吗!(y/n)\n");fflush(stdin);printf("\t");scanf("%c",&ch);if(ch=='y'||ch=='Y'){//p->Num=0;FILE * a1;char lujing[100];printf("\t输入要导入文件的路径!\n");fflush(stdin);printf("\t");gets(lujing);a1=fopen(lujing,"rb");if(a1==NULL){printf("\t打开文件失败,操作失败!\n");return ;}Node JP=p,am=p;while(am->Next!=NULL)am=am->Next;Node w=am;int cnt=0;while(!feof(a1)){JP->Num++;Node NEW =new struct L;fscanf(a1,"%s%lld%f%f",NEW->Name,&NEW->Num,&NEW->English,&NEW->C_language);am->Next=NEW;NEW->Next=NULL;cnt++;am=am->Next;}for(int i=0;i<cnt-1;++i)w=w->Next;Node qw=w->Next;delete qw;w->Next=NULL;JP->Num--;printf("\t操作成功!\n");fclose(a1);getch();return ;}else if(ch=='n'||ch=='N'){printf("\t操作被取消!\n");getch();return ;}else{printf("\t输入有误!\n");getch();return ;}}void Export(Node p){printf("\t警告:此操作将覆盖源文件中的数据!!\n");char ch;printf("\n");printf("\t\t\t同意吗?(y/n)\n");fflush(stdin);printf("\t");scanf("%c",&ch);if(ch=='y'||ch=='Y'){FILE * a1;char lujing[100];printf("\t输入要导出文件的路径!\n");fflush(stdin);printf("\t");gets(lujing);a1=fopen(lujing,"wb");if(a1==NULL){printf("\t打开文件失败,导出数据失败!\n");return ;}int len=p->Num;for(int i=0;i<len;++i){p=p->Next;fprintf(a1,"%s %lld %.2f %.2f\n",p->Name,p->Num,p->English,p->C_language);}printf("\t操作成功!\n");fclose(a1);getch();return ;}else if(ch=='n'||ch=='N'){printf("\t操作被取消!\n");getch();return ;}else{printf("\t输入有误!\n");getch();return ;}}


原先为了解决那个输入错误问题,想了很多方法,近期看一个C函数手册发现scanf函数。。。。。。解决了!!其实scanf函数是有返回值的,

函数原型:int scanf(char *format[,argument,...]); 

如果输入有误则返回0;否则返回输入数据的个数,利用这点就可以解决IO异常;

以前听一个老师讲java异常的时候他说这类异常是C语言力所不能及的!!

现在才发现C语言的博大精深,很多很多不知道的C语言秘密,

原创粉丝点击