使用输出语句来实现界面。计划使用数字键来代表各自的功能。
//主菜单界面voidwelcome(){ printf("************************\n"); printf("**学生成绩管理系统**\n"); printf("**作者:咸鱼君**\n"); printf("****\n"); printf("**增加学生信息---1**\n"); printf("**删除学生信息---2**\n"); printf("**修改学生信息---3**\n"); printf("**查询学生信息---4**\n"); printf("**输出学生信息---5**\n"); printf("**退出管理系统---0**\n"); printf("请输入对应的功能键(数字):");}
先处理好整个功能框架,通过输入数字,进行分支判断,不同的数字代表不同的功能。先将要实现的功能做个简易的版本出来,之后再慢慢填充细节。想的是执行完某些功能后还能继续进行操作,所以将程序放入循环中,并在操作执行完成后,询问继续操作,再根据选择进行处理。
围绕学生信息进行处理,那么思考学生具有哪些信息。包含,学号,姓名,性别,语文,数学,英语成绩,还有个总分。将对应属性集合在一块,采用结构体方式进行数据操作。并使用链表的方式将数据进行串联。
FILE*fpr=fopen("文件名","操作方式");fscanf(fpr,"%d",&intValue);文件名需要加上后缀名,操作方式因为是要从文件中读取信息,所以写r。如果是进行信息的写入则是w。之后需要将读取的信息以链表的方式组织起来,打算采用尾插法的方式插入数据。
//尾插法t->next=s;//链表尾指针的后一个结点指向新结点t=s;//更新尾结点t->next=NULL;//链表尾指针的后一个结点指向NULL读取函数
//文件输入intreadFile(Node*L){ FILE*fpr=fopen("studentInfo.txt","r"); node*t=L; nodest; node*s; if(fpr==NULL){ return0; }else{ //fscanf() while(fscanf(fpr,"%d%s%s%d%d%d%d",&st.id,st.name,st.sex,&st.ch,&st.ma,&st.en,&st.sum)!=EOF){ s=(node*)malloc(sizeof(node)); *s=st; //尾插法 t->next=s;//链表尾指针的后一个结点指向新结点 t=s;//更新尾结点 t->next=NULL;//链表尾指针的后一个结点指向NULL } } fclose(fpr);//关闭文件指针 return1;}输出所有学生信息接下来完成所有学生信息的输出。此处需要考察链表的遍历。
接下来是增加学生的信息,此处采用头插法将链表结点进行插入。将学生信息的增加分成了两部分,一部分是界面的打印,一部分是底层数据的处理。
界面实现:
这部分和文件的读取部分相似,思路是将整个链表内容存储到文件中。
使用fprintf()将文件信息进行存储。
//保存文件intsaveFile(node*L){ FILE*fpw=fopen("studentInfo.txt","w"); if(fpw==NULL)return0; node*p=L->next; while(p!=NULL){ fprintf(fpw,"%d%s%s%d%d%d%d\n",p->id,p->name,p->sex,p->ch,p->ma,p->en,p->sum); p=p->next; }fclose(fpw);//关闭文件指针 return1;}再在学生信息的增加过程中添加文件数据的保存操作。
接下来是实现学生信息查询功能,计划也是页面输出部分与逻辑实现部分进行分离。打算,可以通过学号与姓名两个关键值进行信息的查找。因为是链表结构,为了方便之后的操作,逻辑函数会返回查找到的学生信息的前一个结点位置,这样的话也能在删除学生信息与修改学生信息中进行函数的复用了。
思路是遍历整个链表,逐一对关键信息进行比较。
按学号进行查找,找不到返回NULL,找到了返回前一个结点位置
//按学号进行查找node*searchStuInfoById(intid,node*L){ node*p=L; while(p->next!=NULL){ if(p->next->id==id){ returnp; } p=p->next; } returnNULL;}按姓名进行查找,找不到返回NULL,找到了返回前一个结点位置
依旧是分成两部分,先输出界面,过程逻辑的话就沿用学生信息查询的部分。实现逻辑是这样的:先查到要查询的学生信息,在对信息修改,改完了再保存到文件中。
页面和实现部分:
接下来实现学生信息删除部分。页面部分输出提示,之后输入学号查询要删除的学生信息。利用之前实现的查询信息的函数得到结点位置,之后再根据位置删除对应的结点,再将修改后的信息保存至文件中去。
页面部分
//删除学生信息voidprintDeleteStuInfo(node*L){ system("cls"); intid; node*p; printf("请输入要查找的学生学号"); scanf("%d",&id); node*st=searchStuInfoById(id,L); p=st; if(st==NULL){ printf("查无此人!"); return; } st=st->next; printf("________________________________________________________\n"); printf("|学号\t|姓名\t|性别\t|语文\t|数学\t|英语\t|总分\t|\n"); printf("________________________________________________________\n"); printf("%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d\t|\n",st->id,st->name,st->sex,st->ch,st->ma,st->en,st->sum); printf("________________________________________________________\n"); deleteStuInfo(p); saveFile(L); }结点删除部分
到此为止,这个小系统的基础功能都已经完成了。接下来把结束界面处理下。
学生成绩管理系统V1.0版本到此也就完结了。之后也可以在此基础上进行其他功能的开发,比如,程序排序,最高分,平均分等等的处理。大体都是围绕链表的遍历,插入和删除操作来执行的。再结合自己对界面的设计即可。