当前位置:文档之家› 中南大学C语言课程设计-学生成绩管理系统

中南大学C语言课程设计-学生成绩管理系统

中南大学二○一三~二○一四学年第一学期信息科学与工程学院程序设计基础实践设计报告课程名称:程序设计基础实践班级:2013级物联网工程1302班学号:0919130205姓名:X晨指导教师:杨希二○一三年十二月目录/Contet课程设计题目 (1)题目初步分析 (1)程序总体设计 (2)程序具体设计………………………………………………………10程序调试测试………………………………………………………12心得与体会…………………………………………………………33源代码………………………………………………………………33课程设计题目学生成绩管理系统学生信息为:学号、XX、年龄、性别、出生年月、地址、、各科成绩等,试设计一个学生信息管理系统,使之能提供以下功能。

1.学生信息录入;2.学生信息浏览;3.按学号、XX查询;4.学生成绩排序;5.学生信息修改与删除。

6.综合信息输出。

题目初步分析对对象的处理1.由于每一个对象都包括多个成属性,所以要考虑数据的存储形式要用结构体类型来实现。

2.假如以数组的方式来存储,当然可以,但是定义一个数组,首先必须知道学生人数大概是多少,以便我们确定数组的大小,但是题目中没有给出,而且题目要求中有大量的删除、插入操作,所以用链表的方式比较方便。

3.由于题目中的数据需要长期保存,用普通的函数来写已经不可以满足要求了,所以需要用到文件来存储。

对过程的处理1.输入学生信息(设计一个生成链表程序,并将链表中的数据保存到一个数据文件中);2.插入(修改)学生信息(设计一个从数据文件中读数据的程序并将数据存放在链表中进行操作,最后将处理后链表中的数据再次保存到一个数据文件中);3.删除学生信息(设计一个从数据文件中读数据的程序并将数据存放在链表中进行操作,最后按照要求将链表中的某个数据删除后再次保存到一个数据文件中);4.浏览学生信息(设计一个从数据文件中读数据的程序并将数据存放在链表中进行操作,再将链表中的数据显示出来)。

5.将学生总分排序(设计一个从数据文件中读数据的程序并将数据先存在链表中,后用一个数组记录总分,进行排序,在查找回相应信息,输出)。

程序总体设计主要函数程序框图2.修改函数。

4.显示函数。

5.排序函数。

程序具体设计1.p():为了方便输出图形。

2.wele():调用了p()函数,实现打印出欢迎界面的功能。

3.seletionpage():打印出选择界面;4.file_():用来在打开程序时,装载文件数据到链表。

该函数返回值是student类型的指针变量head;5.save():用来在每次修改或者输入学生基本信息之后实时保存数据。

保存采用删除再写入的方式进行的。

6.input():调用了save()函数,主要实现建立链表和确定链表头尾节点。

该函数具有判断输入数据是否重复功能。

用键入字符的方式获取用户需要的操作。

7.search():主要是用来根据或者XX来筛选,它服务于后面的其他函数。

它返回的值是要搜寻的链节的上一节点。

但是它在返回是头的时候要分情况讨论。

用键入字符的方式获取用户需要的操作。

8.modifyone():主要功能是修改某一个数据的值。

使用了search()函数来在链表中检索检索。

用键入字符的方式获取用户需要检索的方式。

选择并用select来区分当search返回值是头时的两种情况。

返回值用来判断用户的下一步操作。

9.revise():主要功能是来执行modifyone,给modifyone()传递参数。

打印出修改界面;调用modifyone();用键入字符来判断用户的选择并且将参数传给modifyone。

10.deleteone():主要功能是删除一个数据。

为deletee服务的函数。

调用了search()函数来选择要删除的方式。

使用save()来保存。

通过输入字符来判断筛选方式。

11.deleteall():用一个循环一次性删除所有的数据。

使用save()来保存。

12.delete_():主要功能是来实现deleteone和deleteall,并给出界面来让用户选择。

用户键入选择删除方式,并将它传给deleteone作为实参。

13.displayAll():主要功能是显示出所有学生的信息。

通过遍历读取链表中的数据并显示。

14.displayOne():主要功能是显示一个学生的信息。

通过search()函数查询数据。

通过键入的方式选择通过学号还是名字查找。

15.display():主要功能是输出显示界面并进行选择。

调用了displayOne()和displayAll()。

16.sort():主要功能是通过选择排序进行排序和数据的输出。

将链表中的数据存储在数组中,再通过查找返回链表综合输出相关信息。

17.exit():显示退出界面。

18.Start():通过用户输入信息执行相应语句。

执行到exit()时退出系统。

调用了input()、revise()、delete()、display()、sort()和exit()函数。

19.main():组合wele()和Start()函数(附图:本程序所有编写的函数)程序调试与测试程序调试在做好主界面后,对函数进行编写,每次写完一个小函数之后都会编译运行来测试函数是否可用,发现出错后找出问题所在再修改,以确保函数的准确性。

大题框架完成后进行调试。

多次调试把出现的小错误分别解决。

在调试中遇到的主要问题(1).原本编译器选用了Turbo C2.0,但是很多语法规则无法兼容,而且不允许输入中文会影响到用户体验,因此最后选用了C-Free编译器来编译代码。

同时TC中特有的clrscr()函数需要相应替换成system(“cls”)。

(2).定义结构体没有想到把函数加进去,使得程序更加累赘。

(3).调试程序的时候,函数运行一次之后自动闪退,后加人一死循环,在满足returnToMain为特定值的时候才停止循环。

这样程序不至于闪退。

(4).原设计的密码验证系统后因为密码安全性过低而被迫取消。

这说明我们还有很多要学习的东西,还有很大进步的空间。

(5).search()函数中若返回值是头指针需要单独讨论,开始的时候没有注意到特殊位置的特殊性,导致头指针一直返回NUULL。

(6).sort()函数中排序的时候因为没有注意到成绩排名的降序性,排名倒序。

(7).sort()函数中的头指针需要特殊讨论,而且因为没有注意循环的间套和并列关系,导致排序没有完成就开始寻找结点。

(8).由于小组合作,每个人变量名和编程风格不同,导致换行和变量名的不一致,最后通过报错查找错误,统一了变量名。

程序测试1.欢迎界面。

2.选择界面。

3.输入学生信息。

4.修改学生信息。

5.显示学生信息。

(5)学生成绩排名。

(6)学生信息删除。

心得与体会1.这次课程设计活动让我感受到了合作的重要力量。

和同学们的交流和沟通,让我们彼此的知识互通有无,增加了我们与人交流沟通的能力。

我们通过互相帮助修改这些错误,完善了很多漏洞,也更加牢固的掌握了c语言的基本原则,促进了我们C语言的学习。

2.文件和链表的知识在上课的时候并没有精讲,此次课程设计正好起到了很好的补充。

及时复习了刚学过的C语言相关知识。

3.增强了亲手动手设计的能力,开拓了我的编程思想,让我对结构体,链表,文件的存储与读取有了更深刻的了解,并且学到了很多在书本上没有的东西,比如说动手实践、从不断重复的调试中发现问题的能力。

4.短短一周,我们的程序并不成熟。

比如通过学号排序,单科成绩排序,以及密码系统都尚未成功,以后的课余时间还要继续研究。

5.这周的练习也让我明白了理论和实践的联系,很多代码自己感觉算法语法都没问题,但是上机调试了以后才真正会感觉到区别,毕竟人脑非电脑。

所以我们需要更多的实践,这样才能真正提高自己编程的水平。

6.此次课程设计也让我意识到了,有思路就有出路,只要我们有思路,一定可以用各种方法解决问题!源代码/*这个程序是基于C-Free写的*/#include"stdio.h"#include"stdlib.h"#include"conio.h"#include"string.h"#define clrscr() system("cls")struct student{char name[30];char schnum[11];char birthday[11];char sex[7];char address[30];char tel[12];int age;float English;float Math;float Programming;void displayinfo(){printf("\: %s",name);printf("\n2.school number: %s",schnum);printf("\n3.birthday: %s",birthday);printf("\n4.sex: %s",sex);printf("\n5.address: %s",address);printf("\n6.telephone: %s",tel);printf("\n7.age: %d",age);printf("\n8.English: %f",English);printf("\n9.Math: %f",Math);printf("\n10.Programming: %f",Programming);printf("\n11.Total: %f",English+Math+Programming);}/*把输出写到结构体里面,方便操作*/struct student *next;};struct student *flag=NULL,*head=NULL,*last=NULL;int StudentNumber=0;void p(){printf(" * *\n");}/*欢迎界面*/void wele(){printf("========================================================================= ====\n");p();p();p();printf(" * Student Grade Manage System *\n");p();p();printf(" * Made by * \n");printf(" * zhangchen * \n");printf(" * caoxuechun * \n");printf(" * weijianshuang *\n");printf(" * qianyuqi * \n");printf(" * zhangcaitian * \n");p();p();printf(" * press any keys to enter *\n");p();p();p();p();p();p();printf("========================================================================= ====\n");getch();}/*选择界面*/void selectionpage(){clrscr();printf("==================================================================\n");printf("\n\n\n\n Student Grade Manage System\n\n\n");printf(" 1.input student's information\n") ;printf(" 2.delete student's information\n") ;printf(" 3.change student's information\n");printf(" 4.show student's information\n");printf(" 5.sort of students' grades\n");printf(" 6.end\n\n\n\n\n\n\n");printf(" press a right key to enter\n\n");printf("=================================================================\n");}/*打开程序时,装载文件数据到链表*/struct student *file_(){FILE *fp;fp=fopen("student.dat","rb");if(fp==NULL){fp=fopen("student.dat","wt+");/*判断有没有文件,没有就建立一个*/ fclose(fp);return NULL;}flag=(struct student *)malloc(sizeof(struct student));while(fread(flag,sizeof(struct student)-sizeof(struct student *),1,fp)==1) {flag->next=NULL;if(head==NULL){head=flag;last=head;}else{last->next=flag;last=last->next;}StudentNumber++;flag=(struct student *)malloc(sizeof(struct student));}last->next=NULL;free(flag);fflush(stdin);flag=NULL;fclose(fp);return head;}struct student *save(){FILE *fp;int i;struct student *p1=head;fp=fopen("Student.dat","w");fclose(fp);fp=fopen("Student.dat","a+");for(i=0;i<StudentNumber;i++){fwrite(p1,sizeof(struct student)-sizeof(struct student*),1,fp);p1=p1->next;}fclose(fp);}/*输入函数*/void input(){student *p1;int i;bool mark;while(1){clrscr();p1=head;int select = 0;flag = (student *) malloc (sizeof(student));if(flag == NULL){printf("========================================================================= =======\n");printf(" Input new information\n\n");printf("\nIt cannot be written\n");printf("\npress any ket to return");getch();break;}else{printf("\tSchool Number:");scanf("%s",flag->schnum);printf("\n\tName:");scanf("%s",flag->name);printf("\n\tBirthday:");scanf("%s",flag->birthday);printf("\n\tSex:");scanf("%s",flag->sex);printf("\n\tAddress:");scanf("%s",flag->address);printf("\n\tTelephone:");scanf("%s",flag->tel);printf("\n\tAge:");scanf("%d",&flag->age);printf("\n\tEnglish:");scanf("%f",&flag->English);printf("\n\tMath:");scanf("%f",&flag->Math);printf("\n\tProgramming:");scanf("%f",&flag->Programming);mark=true;for(i=0;i<StudentNumber;i++){if(strcmp(p1->schnum,flag->schnum)==0){system("cls");printf("========================================================================= =======\n");printf(" Input new information\n\n");printf("\n\t\twrong!!%sExisted\n",flag->schnum);p1->displayinfo();printf("\n\t\tpress any key to continue");getch();mark=false;break;}p1=p1->next;}if(mark){StudentNumber++;if(StudentNumber == 1)head = flag;elselast->next = flag;last = flag;last->next=NULL;}}save();system("cls");if(mark)printf("========================================================================= =======\n");printf(" Input new information \n\n");printf("\n\n\t\tSaved!");printf("\n\n\t\t1.Add more students\n");printf("\t\t0.return\n\n");printf("\t\tpress the right ket to enter:");do{select=getch();select-=48;}while(select<0||select>1);if(select != 1) break;}}struct student *search(char target[20],int select) {student *p=head,*r=head;if(select==2){while(p!=NULL){if(strcmp(target,p->name)==0)return r;else{r=p;p=p->next;}}}else{while(p!=NULL){if(strcmp(target,p->schnum)==0)return r;else{r=p;p=p->next;}}}}int modifyOne(int select12){int select = select12 + 1,m=0;char select2;struct student *result=NULL;while(1){system("cls");printf("========================================================================= =======\n");printf(" Change the information\n\n");char target[20];if(select == 2)printf("Input the name:");elseprintf("Input the number:");scanf("%s", target);result = search(target,select);system("cls");printf("========================================================================= =======\n");printf(" change the information\n\n");if( result==NULL )printf("\n\n\n Not exist #404");else{if(result==head){printf("%s",result->name);if(result->next)printf("%s",result->name);if((result->next)&&(!strcmp(result->next->schnum,target)||!strcmp(result->next->name,target)) )result=result->next;}elseresult=result->next;for(;;){clrscr();printf("========================================================================= =======\n");printf(" Change theinformation\n\n");result->displayinfo();printf("\n0.end");printf("\nWhat you want to change?\n");select2=getch();printf("School number locked!");printf("0 for 10");printf("2 for exit!");switch(select2){case '1':printf("name: ");scanf("%s", result->name);break;case '4':printf("sex: ");scanf("%s", result->sex); break;case '7':printf("age: ");scanf("%d", &result->age);break;case '8':printf("English: ");scanf("%f", &result->English);break;case '9':printf("Math: ");scanf("%f", &result->Math);break;case '0':printf("Programming: ");scanf("%f", &result->Programming);break;case '3':printf("birthday: ");scanf("%s", result->birthday);break;case '5':printf("address: ");scanf("%s", result->address);break;case'6':printf("telephone: ");scanf("%s",result->tel);break;case '2':m=1;break;}if(m==1)break;}}printf("\n\n\t\t Now you want to :");printf("\n\n\t\t1.Modify another student's information according to school number");printf("\n\t\t2.Modify another student's information according to school number");printf("\n\t\t3.return to edit");printf("\n\t\t4.return to menu");printf("\n\n\t\tpress the right key to enter ");do{select=getch();select-=48;}while(select<1||select>4);save();if(select > 2) {return select - 2; break;}}}/*修改函数*/void revise(){char select;int returnToMain = 0;while(1){clrscr();printf("========================================================================= =======\n");printf(" Change the information\n\n\n");printf(" 1.find out the student according to name\n");printf(" 2.find out the student according to school number\n");printf(" 0.return.\n\n\n\n\n");printf(" press the right key to enter...\n\n");printf("========================================================================= =======\n");select=getch();switch(select){case '1': returnToMain = modifyOne(1); break;case '2': returnToMain = modifyOne(2); break;case '0': returnToMain = 2; break;};if(returnToMain == 2) break;}}void deleteAll(){char deleteALL[10];clrscr();printf("========================================================================= =======\n");printf(" Delete the information\n\n\n\n");printf("\n\n\t\t!!Are you sure to delete all? !!!\n");printf("\t\tInpout delete to make sure\"delete\"\n\n\t\t");fflush(stdin);gets(deleteALL);if(!strcmp(deleteALL,"delete")){if(StudentNumber == 0)printf("\n\n\t\tNo more information already!\n");else if(StudentNumber == 1){free(head);head = NULL;}else{student *p1 = head, *p2 = head;for(int i = 0; i < StudentNumber - 1; i++){p1 = p1->next;free(p2);p2 = p1;}free(p1);head = NULL;}if(StudentNumber != 0)printf("\n\n\t\tAll deleted!\n");StudentNumber = 0;save();}}int deleteOne(int select23){int select = select23,m=select;while(1){system("cls");printf("========================================================================= =======\n");printf(" delete the information\n\n\n\n");char target[20];if(select == 2)printf("Input the name you want to delete:");elseprintf("Input the number you want to delete:");scanf("%s", target);student *result = search(target,select);system("cls");if( result==NULL )printf("\n\n\n\t\tNot exist!");else if(StudentNumber == 1){head = NULL;StudentNumber--;}else if(result==head){if(((m==1)&&(strcmp(result->next->schnum,target)==0))||((m==2)&&(strcmp(result->next->name ,target)==0))){result->next=result->next->next;StudentNumber--;}else{head=result->next ;StudentNumber--;}}else{result->next=result->next->next;StudentNumber--;}printf("\n\n\t\tDeleted!\n\t\tNow you want to:");printf("\n\n\t\t1.delete another student according to school number");printf("\n\t\t2.delete another student according to name");printf("\n\t\t3.Return to the delete menu");printf("\n\t\t4.Return to the main menu");printf("\n\n\t\tpress the right to enter\n");printf("=========================================================================do{select=getch();select-=48;}while(select<1||select>4);save();if(select > 2) return select - 2;}}/*删除函数*/void delete_(){char select;int returnToMain = 0;while(1){system("cls");printf("========================================================================= =======\n");printf(" Delete the information\n\n\n");printf(" 1.Delete all\n");printf(" 2.Delete one according to name\n");printf(" 3.Delete one according to school number\n");printf(" 0.Return\n\n\n\n");printf("Press the right key to enter...\n\n");printf("========================================================================= =======\n");select=getch();switch(select){case '1': deleteAll(); break;case '2': returnToMain = deleteOne(2); break;case '3': returnToMain = deleteOne(3); break;case '0': returnToMain = 2; break;};if(returnToMain == 2) break;}}{int select = 0;system("cls");int k = 1;student *p = head;printf("========================================================================= =======\n");printf(" Display the information\n\n");if(StudentNumber == 0) printf("\n\tNo more information.");while(k <= StudentNumber){printf("\nStudent %d\n",k++);p->displayinfo();p = p->next;}printf("\n\n\tNow: ");printf("\n\t1.Return the former page");printf("\n\t2.Return the main menu");printf("\n\n\tPress the right key to enter.\n");printf("========================================================================= =======\n");do{select=getch();select-=48;}while(select<1||select>2);return select;}int displayOne(int select23){int select = select23,m=select;while(1){system("cls");char target[20];printf("================================================================================\n");printf(" Show the information\n\n\n\n");if(StudentNumber == 0) printf("\n\n\tNot exist");else{if(select == 2) printf("\n\n\n\t\tInput name:\n\n");else printf("\n\n\n\t\tInput school number:\n\n");printf("\t\t");scanf("%s", target);system("cls");printf("========================================================================= =======\n");printf(" Show the information\n\n\n\n");student *result = search(target,select);if(result==NULL )printf("\n\n\n\t\tNot exist.");else if(StudentNumber == 1)result->displayinfo();elseif((result==head)&&!(((m==1)&&(strcmp(result->next->schnum,target)==0))||((m==2)&&(strcmp(r esult->next->name,target)==0)))){head->displayinfo();}else{result = result->next;result->displayinfo();}}printf("\n\n\t\tNow you can:");printf("\n\n\t\t1.Show another student according to name.");printf("\n\t\t2.Show another student according to school number.");printf("\n\t\t3.Return the former page");printf("\n\t\t4.Return the main menu");printf("\n\n\t\t press the right key to enter.");printf("========================================================================= =======\n");do{select=getch();select-=48;}while(select<1||select>4);if(select > 2) return select - 2;}}/*显示函数*/void display(){int select = 1;int returnToMain = 0;while(1){system("cls");printf("========================================================================= =======\n");printf(" Show the information\n\n\n");printf(" 1.Show all the students\n");printf(" 2.Show a student according to name\n");printf(" 3.Show a student according to school number\n");printf(" 0.return\n\n\n\n");printf(" press the right key to enter\n\n");printf("========================================================================= =======\n");select=getch();switch(select){case '1': returnToMain = displayAll(); break;case '2': returnToMain = displayOne(2); break;case '3': returnToMain = displayOne(3); break;case '0': returnToMain = 2; break;};if(returnToMain == 2) break;}}/*排序函数*/void sort(){int n=1,i,j,k,select=0;float total;student *p=head;float score[30],t;clrscr();printf("rank name school number score\n");printf("========================================================================= =======\n");if(StudentNumber==0)printf("\n\tNo more information can be sorted!!");while(n<=StudentNumber){total=p->English+p->Math+p->Programming;score[n-1]=total;p=p->next;n++;}p=head;for(i=0;i<StudentNumber;i++){k=i;for(j=i+1;j<StudentNumber;j++){if(score[k]>score[j]) k=j;if(k!=i){t=score[i];score[i]=score[k];score[k]=t;}}}for(i=0;i<(StudentNumber-1)/2;i++)t=score[i],score[i]=score[StudentNumber-1-i],score[StudentNumber-i-1]=t;for(i=0;i<StudentNumber;i++){p=head;t=score[i];while((p->English+p->Math+p->Programming)!=t){ p=p->next;}printf("%2d :",i+1);printf("\t%20.20s ",p->name);printf("\t%15.15s ",p->schnum);printf("\t%.2f ",p->English+p->Math+p->Programming);printf("\n");}printf("press any key to return...");getch();}/*退出函数*/void exit(){ printf("======================================================================= =========");printf("\n\n\n\n\n\n\n Thanks for your use\n\n\n\n\n\n\n\n\n");printf (" Wele to use agian\n\n\n\n\n\n\n\n");printf("========================================================================= =======\n");}void Start(){ head=file_();while(1){int select;selectionpage();scanf("%d",&select);switch(select){case 1: clrscr();input();break;case 2: clrscr();delete_();break;case 3: clrscr();revise();break;case 4: clrscr();display();break;case 5: clrscr();sort();。

相关主题