学生成绩簿设计目录一、实训的目的与要求 (1)二、题目说明 (1)三、总体设计 (2)3.1.主函数流程图 (2)3.2.子函数流程图及其他 (3)四、详细设计和实施 (4)4.1 模块1 (4)五、遇到的问题和解决方法 (5)六、实训总结 (6)七、参考文献 (6)附录(源程序代码) (6)一、实训的目的与要求1. C语言课程设计的主要目的是培养学生综合运用C语言程序设计课程所学到的知识,编写C程序解决实际问题的能力,以及严谨的工作态度和良好的程序设计习惯。
2.通过课程设计的训练,学生应该能够了解程序设计的基本开发过程,掌握编写、调试和测试C语言程序的基本技巧,充分理解结构化程序设计的基本方法。
3. C语言程序设计的主要任务是要求学生遵循软件开发过程的基本规范,运用结构化程序设计的方法,按照课程设计的题目要求,分析、设计、编写、调试和测试C语言程序及编写设计报告。
二、题目说明编制一个C语言成绩记录簿,每个学生信息包括:学号、姓名、C语言成绩。
具体功能:(1)创建学生信息并以磁盘文件保存;(2)读取磁盘文件并显示输出所有学生的成绩;(3)按学号或姓名查询成绩;(4)添加成绩记录;(5)修改指定姓名或学号的学生的成绩并可存盘;(6)显示输出60分以下、60~79、80~89、90分以上各分数段的学生信息(可选项)。
三、总体设计3.1.主函数流程图图1主函数流程图3.2.子函数流程图及其他流程图图2 子函数流程图图3 删除信息流程图图3查找信息流程图图4修改信息流程图四、详细设计和实施4.1 模块1步骤1:根据数字提示从1-5中选择要操作的功能,如图5所示:图5步骤2:按1键,会出现提示“插入信息”,按2,会出现“删除信息”,按3,“修改信息”,按4,会出现“查看信息”,按5,“保存”,按q 键即可退出,如图6所示:图6 步骤3:键入1回车,会出现提示“请输入要删除学生信息”,现在就可以删除学生信息,如图7所示:图7步骤4:键入2及Enter键,会出现提示“请输入要查找的学生信息”,然后根据提示将该学生的信息删除,如图8所示:图8五、遇到的问题和解决方法大多的语法错误在通过书本参考下能够修改。
主要是平时看书不仔细、不太注意而产生的。
如没有注意具体数据使用是有一定的范围限定;过分重视分号的重要性而在for、if、while语句中画蛇添足加分号;在使用文件的时候忘记将文件先打开,对打开的方式与使用的情况不太注意而造成不匹配;还有漏掉形参的定义是值不能传递等等。
这些语法错误有信息框的提示一般是能够排除的。
编译、连接的成功并不意味着程序的最终成功。
逻辑上的错误机器不易检查出来,这时需要对数据结果进行分析。
这种错误的查找是最难的,需要编程序的人有相当的耐心和细心去把问题找出来。
这也是本次程序编辑过程中碰到的最大的难题。
往往运行之后得不到另人满意的结果,此时解决的方法一则可以用“分段检查”的方法,在程序的不同位置设几个printf函数语句,输出有关变量的值,逐段往下检查,或用debug进行调试,对检查出的错误进行修改,当调试完毕将设置的printf都删去。
若在程序中找不到问题,则再来考虑算法是否逻辑严谨,再进行修改。
如此循环往复,直到最后程序运行成功。
在本次程序编辑过程中,我就是常遇到编译能通过,能够运行程序,但是总在输入、删除等操作完之后再想去看数据文件中存在的数据记录的时候,却一条记录也显示不出来,我怀疑是哪个对方对n变量的定义或使用出错了,于是在每个主要函数的操作过程中添加了printf语句用来显示n的变化,例如在执行某个函数前添加插入语句显示n的起始值,在执行完该个函数后再添加插入语句显示此时n的结果值,观察n的变化是否正确,如果错误了,也就说明该函数编写过程有错。
诸如这样的调试方法,不断缩小检查范围,最后将错误找到,进行修改。
所以到最后我找到了错误,及时改正,终于把程序完成了,一切功能显示正常。
六、实训总结在课程设计过程中,遇到了不少的问题。
这迫使我不得不参考一些课外资料,向同学和老师们请教。
不过,最后在我的努力和老师同学们的帮助下,还是把程序写出来了,这令我非常高兴。
但是在运行过程中又出现了问题。
一开始就出现了十几个错误,这令我的信心有所下降,有的错误我根本就不知道是啥意思,我就向同学以及上网查一下资料。
在经过几天的检查与修改后,终于能编译出来了,这又使得我非常高兴。
但是运行的结果不是很理想,没能够达到我预想的那样。
在运行出来之后,我有点不敢相信这是我通过努力做出来的,对于我这个编程新手,在课程设计中,刚开始真有点对自己失去信心,在硬着头皮的情况下,还是做出来了。
发现其实事情并不像刚开始自己想的那样。
现在回想起来好像就是开头克服自己最难了,这大概就是人们说的万事开头难。
七、参考文献[1] 李金祥,顾小晶.实用c语言程序设计教程模块六:213-215.[2] 严蔚敏,吴伟民. 数据结构(C语言版)清华大学出版社附录(源程序代码)#include<iostream.h>#include<string.h>#include<stdlib.h>#include<conio.h>#include<fstream.h>class student{private:student* next;public:char stu_num[15]; //学号char stu_name[30]; //姓名 float stu_score ; //成绩/*在该节点后插入一个几点*/void afterInsert(student *p);/*在该节点后删除一个节点*/void afterDelete( );/*获得下一个节点的指针*/student *getNext(){return next;}/***********查询学生信息************/void getMage( );/******学生信息修改******/void changeMage(int n,char *ptr);void changegrade(float p);/******构造*****/student(char *num,char *name ,float score); student();};void student::changegrade(float p){stu_score=p;}student::student() //构造{strcpy(stu_num,"\0");strcpy(stu_name,"\0");stu_score=0;next='\0';}///*********************构造//student::student(char *num,char *name, float score) {strcpy(stu_num,num);strcpy(stu_name,name);stu_score=score;next='\0';}void student::afterInsert(student *p)//插入节点{p->next=next;next=p;}void student::afterDelete( ) //删除节点{student *p=next;next=p->next;delete p;}void student::getMage() //获得信息{cout<<"学号:"<<stu_num <<" 姓名:"<<stu_name; cout<< " c++成绩:"<<stu_score<<endl;}void student::changeMage(int n,char *ptr){switch(n){case 1: strcpy(stu_num,ptr);break;case 2: strcpy(stu_name,ptr);}}//建立链表函数void construct_list(student *tail){student *p=new student;char very[20];float achieve;cout<<"请输入学号:"<<endl;cin>>very;p->changeMage(1,very);cout<<"请输入姓名:"<<endl;cin>>very;p->changeMage(2,very);cout<<"请输入c++成绩:"<<endl;cin>>achieve;p->changegrade(achieve);system("cls");cout<<"信息输入完毕"<<endl;for(;tail->getNext()!='\0';) tail=tail->getNext(); tail->afterInsert(p);}/*********查询信息*********/student *findmege(student *head ){loop:cout<<"1--按姓名查询 2--按学号查询 q--返回上一级菜单"<<endl;char p[5],ptr[20];student *mid=head;cin>>p;if(p[0]!='1'&&p[0]!='2'&&p[0]!='q'||strlen(p)>1){system("cls");cout<<"对不起,你的输入有误,请重新输入!"<<endl;goto loop;}switch(p[0]){case '1':{system("cls");cout<<"请输入要查找姓名:"<<endl;cin>>ptr;for(;strcmp(ptr,mid->stu_name)!=0;mid=mid->getNext())if(mid->getNext()=='\0'){cout<<"对不起,你要查找的人不存在,请确认你的输入是否正确!"<<endl;goto loop;}return mid;}case '2':{system("cls");cout<<"请输入您要查找的学号:"<<endl;cin>>ptr;for(;strcmp(ptr,mid->stu_num)!=0;mid=mid->getNext())if(mid->getNext()=='\0')cout<<"对不起,您要查找的内容不存在,请确认您的输入是否正确!"<<endl; goto loop;}return mid;}case 'q': return '\0';default:{system("cls");cout<<"对不起,您的输入有误,请重新输入!"<<endl;goto loop;}}}/******************删除链表节点***********************/void delete_list(student *head){student *p='\0';char selet[4];system("cls");cout<<"在删除前,系统会根据您的提示找到您要删除的学生信息!"<<endl;p=findmege(head);if(p!='\0'){cout<<"确认要删除吗(yes/任意键返回)"<<endl;cin>>selet;if(strcmp(selet,"yes")==0){for(;head->getNext()!=p;head=head->getNext());head->afterDelete();system("cls");cout<<"该信息删除成功!"<<endl;}}/*******************修改节点信息********************/void change_info(student *head){system("cls");cout<<"在您修改前,系统会根据您提供的信息找的您要修改的信息:"<<endl;student *p='\0';float achieve;p=findmege(head);if(p!='\0'){cout<<"请输入c++成绩:"<<endl;cin>>achieve;p->changegrade(achieve);system("cls");cout<<"修改成功"<<endl;}}/**************输出学生成绩信息**************/void output(student *head){system("cls");cout<<"1-查看指定学生信息;2-查看所有学生信息;3-分段输出学生信息"<<endl; char ch;int n=0;head=head->getNext();cin>>ch;switch(ch){case '1': head=findmege(head);if(head=='\0') break;head->getMage();break;case '2': while(head){head->getMage();head=head->getNext();}break;case '3': cout<<"a-60分以下;b-60~70分之间;c-70~80分之间;d-80~90分之间;e-90~100分之间:"<<endl;cin>>ch;switch(ch){case 'a': while(head){if(head->stu_score<=60) {head->getMage();n++;}head=head->getNext();}break;case 'b': while(head){if(head->stu_score>60&&head->stu_score<=70) {head->getMage();n++;} head=head->getNext();}break;case 'c': while(head){if(head->stu_score>70&&head->stu_score<=80) {head->getMage();n++;} head=head->getNext();}break;case 'd': while(head){if(head->stu_score>80&&head->stu_score<=90) {head->getMage();n++;} head=head->getNext();}break;case 'e': while(head){if(head->stu_score>90&&head->stu_score<=100) {head->getMage();n++;} head=head->getNext();}}if(n==0) cout<<"该分段内没有您要找的学生信息"<<endl;}}/*****************主菜单************************/void mainmenu(student *head){char selet[10];int n=1;ofstream outfile ;ifstream infile ;student *p,*ptr ;student *test=head,*mid ;cout<<"*************************欢迎进入学生信息管理系统*************************"<<endl;do{cout<<"********************************************************************** ****"<<endl;cout<<"1 插入信息; 2 删除信息; 3 修改信息; 4 查看信息; 5 保存"<<endl;cout<<"q键退出 "<<endl;cout<<"********************************************************************** ****"<<endl;cin>>selet;if(((selet[0]<'1'||selet[0]>'6')&&selet[0]!='q')||strlen(selet)>1)system("cls");cout<<"您的输入有误,请重新输入!"<<endl;break;}switch(selet[0]){case '1':output(head);break;case '2': delete_list(head);break;case '3': change_info(head);break;case '4': construct_list(head);break;case '5': outfile.open("students.txt", ios::out|ios::app); for(p=head->getNext();p!='\0';p=p->getNext()){outfile<< p->stu_name <<' ';outfile<< p->stu_num <<' ';outfile<< p->stu_score <<' ';outfile<<endl;}outfile.close();system("cls");cout<<"保存成功!"<<endl;break;case 'q': break;}}while(selet[0]!='q');}void main(){student head ;mainmenu(&head);。