广东海洋大学课程设计报告
课程名称:C/C++语言程序设计 课程编号:@@ 学生姓名:陈@@ 学生班级:信管1071 学 号: 实习地点:科技楼
起止时间:2008.12。29—2009。01。02 指导教师:@@
一、 目的与要求
通过本课程设计的实践,全面总结C++课程学习中的的数据类型、程序结构、数组、函数、指针、结构体、链表等基本概念,掌握其使用方法。掌握面向对象程序设计中有关类、对象、继承、重载、多态性、输入输出流类体系、文件操作的基本概念,初步学会用类与对象这种面向对象的程序设计方法编写应用程序。培养使用面向对象的程序设计方法编写计算机程序的能力。
通过设计一个《学生成绩统计管理》,进一步熟悉C++中类的概念、类的封装、继承的实现方式.了解系统开发的需求分析、类层次设计、模块分解、编码测试、模块组装与整体调试的全过程,加深对C++的理解与Visual C++环境的使用;逐步熟悉程序设计的方法,并养成良好的编程习惯。程序设计是一门实践性很强的课程,必须十分重视实践环节。许多实际的知识不是靠听课和看书学到的,而是通过长时间的实践积累的.
二、 设计内容
学生成绩管理系统
1.基本功能:
a) 成绩的输入(学号、姓名、英语、数学、C++语言…);
b) 成绩统计(各科平均成绩、各科成绩“优秀”、“良好”、“中等”、“及
格”、“不及格”的人数及其所占比例);
c) 总成绩统计(学生的总成绩、平均成绩及成绩排名) d) 成绩的统计结果显示。 2.扩展功能:
a) 学生数据的添加、修改、与删除 b) 学生数据的读取与存储 3.设计要求
1
a)采用面向对象的思想和方法完成设计,最好能够基于windows图形界面 。
b)至少设计四个类;学生类(描述学生基本信息);成绩类:班级类;课程类(描述课程信息:课程编号,科目名称(如高等数学,大学英语等);学生成绩及课程信息用文件保存,每个类一个文件,程序执行时从文件读入。
三、 过程与结果
主要内容如下:
1. 关键类的设计,继承层次关系,代码:
首先,创建了一个student类.在student类的共有部分声明程序所需函数;然后就是student类的函数实现部分,其中定义student类的带参数及不带参数构造函数;再是常用函数的调用,并定义系统菜单函数及其界面;最后就是主函数文件.
Student类的声明如下:
主要功能函数的设计:
1。 关于计算总成绩和平均成绩以及评定成绩等级的函数,而用于成绩统计中优秀、良好、
中等、及格、不及格的计算,不过为便于表达,此程序采用字母A,B,C,D,E来分别表达
2
上述
等级;代码如下:
2.此函数为查找函数的实现过程,通过while switch和if语句以及制
表格和setw的使用将输入的数据以表格的形式打印出来,等级一栏宽度略小;
3
3。此函数为删除函数的实现部分,巧妙运用字母i,定义i的值0为数据不存在,1为数据存在的情况,删除时考虑数据存在与否的问题;
4
4。排序函数中分四种情况排序,分别按学号,总分,平均分来排序,排序结果也能有升序或降序操作,通过while else语句以及制表格和case的使用将输入的数据排序出来;因函数体过于庞大,在后面代码清单罗列出来时会标示出来。
数据输入设计:数据输入以输出方式打开文件,通过this指针和地址引用把写入的数据加在文件末尾;
5
6
程序测试结果:
1运行程序。会出现如下画面,按照提示进行选择。
2. 首先选择1,然后按Enter键。按照提示对学生情况进行输入。如图:
7
3. 按任意键程序自动保存第一个同学的数据,并返回菜单,按照刚才的步骤继续输入第二
个、第三个同学等等的数据;
4. 选择4, 然后按Enter键.对数据进行进行有目的性的排序。如图:
5.譬如选择2按总分排序,按Enter键,再在接下来的提示框中选择降序排序类型,
再按一次Enter键,排序结果如图:符合设计要求,但各科成绩“优秀”、“良好\"、“中等\"、“及格”、“不及格”的人数及其所占比例因个人能力有限未能设计出来;
6。按任意键又返回菜单,继续接下来的操作;
8
四、 设计总结
这次课程设计基本上涵盖了大学一年级学习到的C++ 语言知识点,课程设计题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力.这次课设使我了解我编程思想和编程技巧,也认识了软件生命周期的各个环境,包括构思、设计、编写、调试、发布、文档化、维护和修订.
C++程序编译是一种要求特别精细的工作,小到一个分号(或点)都能影响整个程序的运行,这就要求我们编写程序时要特别细心,即使是一个符号,还是一个字母都不能乱用.在这次的编写过程中,我就因为错把case序列语句里的变量中的p写成q使整个程序瘫痪.它让我记住了学习需要认真、仔细、负责的态度对待.
这次课程设计虽说很辛苦,而且设计出来的程序不全具备课程所需的,不过扩展功能学生数据的添加、修改、与删除的函数嵌进去,而且排序功能关联升序和降序功能,正所谓鱼与熊掌不可得兼。这次课程设计,在整个程序中,我们通过使用while循环,switch语句,冒泡排序法,表格设计中的setw()以及类的定义及使用来完成程序设计,使我提高了对C++中语句的使用能力和组合能力,进一步加强了我对使用C++编程的能力。还让我掌握了高级程序设计语言的基本思想、基本概念、基本方法和基本技能,while语句,this指针,case作为程序的入口,一般结合switch使用等等。
一个星期以来的课程设计,感谢帮助我的同学和师长,通过和他们的交流,互相交流经验,我这次设计的程序中各大主函数体得以设计出来,感谢他们在我编程过程中为我做的提醒和指点,这真的很重要。
这次课程设计不仅让我修补了以前学习的漏洞,也让我知道一个道理:编程需要兴趣和实际动手。这应该可以借鉴在同学或者师长们的编程经验上。创新思维至关重要,相对于我这略感冗余却实现不了更多功能的程序来说,有必要写出精简的代码,也有助于开发出高效的程序。虽说我编写的程序离专业人员设计的还有好大一段距离,但它已经是我目前的极限。我相信,通过我的努力,在不久的将来,我会编出一组真正实用的程序的。
五、 成绩评定
9
成绩
指导教师 日期
六、 附件
程序源代码清单:
#include〈iostream〉 #include ///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////student类的实现 void err_char();//输入错误字符检测函数 10 void score_err();//成绩范围检测函数,当输入成绩不在0到100之间时提示重新输入 student::student():next(NULL)//不带参数的构造函数 { head=curnode=this; } //带参数的构造函数 student::student(string Number,string Name,double Computer,double ENglish,double Math,double Sum,double Ave,char Grade):next(NULL) { number=Number; name=Name; computer=Computer; English=ENglish; math=Math; sum=Sum; ave=Ave; grade=Grade; } void student::sum_score()///////////////////////计算总成绩 {sum=computer+English+math;} void student::ave_score()/////////////////////计算平均成绩 {ave=(computer+English+math)/3。0;} void student::grade_score()///////////////////计算成绩等级 { int i; i=ave; switch(i/10) { case 10: grade=’A’; break; case 9: grade=’A’; break; case 8: grade='B’; break; case 7: grade=’C'; break; case 6: grade='D’; break; default: grade=’E’; } } void student::app_score(string Number,string Name,double Computer,double ENglish,double Math)//动态建立节点 { curnode-〉next=new student(Number,Name,Computer,ENglish,Math); curnode=curnode—>next; } 11 void student::del_score()//////////////////////删除表中的全部数据 { student *p; curnode=head—>next; while(curnode!=NULL) { p=curnode—>next; delete curnode; curnode=p; } head—>next=NULL; curnode=head; cout〈〈\"┏━━━━━━━━━━━━━━━━━━━┓”〈 curnode—>sum_score(); cout<〈\"┃”< 13 { cout〈<”┏━━━━━━━━━━━━━━┓\"< while(1) { cout〈<\" 英 语:”; cin〉〉ENglish; while(cin。fail()) { err_char(); cout〈<\" 英 语:\"; cin〉〉ENglish; } if(ENglish〉=0&&ENglish〈=100) break; else score_err(); } while(1) { cout〈〈” 数 学:\"; cin>〉Math; while(cin.fail()) 14 { err_char(); cout〈〈” 数 学:\"; cin>〉Math; } if(Math>=0&&Math〈=100) break; else score_err(); } this—〉app_score(Number,Name,Computer,ENglish,Math); cout<〈\"┏━━━━━━━━┓\"〈 case 2: b=curnode-〉name==str;break; default: return; } if(b) { i=0; cout〈〈”┃\"<〈left< 16 bool b; //定义i=1,当找到数据时把i置为0.用于输出没有找到数据 int i=1; if(!(curnode=head-〉next)) { cout<<”┏━━━━━━━┓”〈〈endl; cout〈〈”┃!这是一个空表!┃\"〈〈endl; cout〈〈”┗━━━━━━━┛”〈〈endl; curnode=p; cout〈〈” ”;system(”pause\"); return; } while(curnode!=NULL) { switch(n) { case 1: b=curnode->number==str;break; case 2: b=curnode—〉name==str;break; default: return; } if(b) { i=0; pw—〉next=curnode—〉next; delete curnode; curnode=pw—>next; } else { pw=curnode; curnode=curnode—>next; } } //当i=1是代表没有找到数据 if(i) { cout<<\"┏━━━━━━━┓\"<〈endl; cout〈〈”┃没有匹配的数据┃”〈〈endl; cout〈<”┗━━━━━━━┛\"<〈endl; } else { cout<〈”┏━━━━━━━┓”< cout〈〈”┗━━━━━━━┛”< //////////////////////////////////////排序函数的实现 void student::compositor(int n,int m) { if(head—〉next==NULL) { cout〈〈”┏━━━━━━━━━━━┓\"〈〈endl; cout〈〈”┃!这是一个空表不能排序!┃”< p=q—〉next; while(s!=NULL) { while(p!=NULL) { switch(n) { case 1: { if(m==1) { 18 while(s—>number〈p—〉number) { q->next=p—〉next; r-〉next=p; p—〉next=s; s=p; p=q—>next; if(p==NULL) break; } } else { while(s—〉number>p—>number) { q—〉next=p—〉next; r-〉next=p; p—>next=s; s=p; p=q->next; if(p==NULL) break; } } break; } case 2: { if(m==1) { while(s—>sum〈p-〉sum) { q—>next=p—>next; r—>next=p; p—〉next=s; s=p; p=q—>next; if(p==NULL) break; } } else { while(s->sum〉p—〉sum) 19 { q—〉next=p-〉next; r—>next=p; p->next=s; s=p; p=q—>next; if(p==NULL) break; } case 3: { } default:} } } break; if(m==1) { while(s->ave〈p-〉ave) { q—〉next=p—〉next; r—〉next=p; p—>next=s; s=p; p=q—〉next; if(p==NULL) break; } } else { while(s—〉ave〉p-〉ave) { q-〉next=p—〉next; r—〉next=p; p->next=s; s=p; p=q-〉next; if(p==NULL) break; } } break; return; 20 if(p==NULL) { break; } q=p; p=p—>next; } r=s; s=s—>next; q=s; p=q-〉next; if(p==NULL) { break; } } cout〈〈\"┏━━━━━━━━━━━━━━━━━━┓\"〈〈endl; cout〈<\"┃!成功完成排序操作,即将输出排序结果!┃”〈〈endl; cout<<\"┗━━━━━━━━━━━━━━━━━━┛”〈 21 default: return; } if(b) { i=0; string Number; string Name; double Computer; double ENglish; double Math; cout<〈\"┏━━━━━━━━━━━━━━━━┓”〈〈endl; cout<〈\"┃!请在原数据后面输入要修改的数据!┃”〈〈endl; cout〈<\"┗━━━━━━━━━━━━━━━━┛”< } if(ENglish〉=0&&ENglish〈=100) break; else score_err(); } curnode-〉English=ENglish; while(1) { cout〈〈” 数 学:”〈〈curnode-〉math<〈\" \"; cin〉〉Math; while(cin。fail()) { err_char(); cout〈〈” 数 学:”<〈curnode—>math<<” cin>>Math; } if(Math〉=0&&Math<=100) break; else score_err(); } curnode—〉math=Math; } curnode=curnode-〉next; } if(i) { cout〈<”┏━━━━━━━━━━━┓”<〈endl; cout<<”┃!找不到需要修改的数据!┃”〈〈endl; cout<〈”┗━━━━━━━━━━━┛\"〈〈endl; } else { cout<<\"┏━━━━━━━━━┓”〈 ////////////////////////////////////////////////////////////////////////////////////常用函数调用 23 \"; void name_of_number();//选择姓名还是学号 void menu()//系统菜单函数的定义 { cout〈〈\"┏━━━━━━━━━━━━━━━━━┓”<〈endl; cout<〈”┃ 欢迎使用信管专业学生成绩管理系统 ┃”〈〈endl; cout<〈\"┃ ┃”〈 void fun_lookup(student &a) { int n; string str; name_of_number(); cout〈<” 你的选择是:\"; cin〉>n; while(cin.fail()) { err_char(); cout〈〈” 你的选择是:”; cin>>n; } if(n!=1&&n!=2) n=1; cout〈〈” 请输入查找关键字:\"; cin〉〉str; 24 a.lookup(n,str); } //修改函数 void fun_rework(student &a) { int n; string str; name_of_number(); cout<〈” 你的选择是:”; cin>>n; while(cin。fail()) { err_char(); cout〈<\" 你的选择是:”; cin〉〉n; } if(n!=1&&n!=2) n=1; cout〈〈\" 请输入修改关键字:\"; cin>〉str; a。rework(n,str); } //删除函数的调用 void fun_del(student &a) { int n; string str; name_of_number(); cout〈〈” 你的选择是:\"; cin>>n; while(cin。fail()) { err_char(); cout〈〈” 你的选择是:\"; cin>>n; } if(n!=1&&n!=2) n=1; cout〈〈” 请输入删除关键字:\"; cin〉>str; a.del_score(n,str); } //排序函数的调用 void fun_compositor(student &a) 25 { int n,m; cout〈<\"┏━━━━━━━━━━━━━━━━━┓”〈〈endl; cout<<\"┃ 请输入按什么排序 ┃”〈〈endl; cout〈<”┃ ┃”〈〈endl; cout〈<”┃ 1 按学号排序 2 按总分排序 ┃”〈〈endl; cout〈<”┃ 3 按平均分排 ┃\"〈〈endl; cout〈〈”┃ ┃”< while(cin.fail()) { err_char(); cout<<\" 你的选择是:”; cin〉>n; } if(n!=1&&n!=2&&n!=3) { n=1; } cout〈<”┏━━━━━━━━━━━━━━━━━┓\"〈〈endl; cout〈〈”┃ 请选择排序类型 ┃\"<〈endl; cout〈<”┃ ┃”〈〈endl; cout〈<”┃ 1 按降序排序 2 按升序排序 ┃\"〈〈endl; cout<〈\"┃ ┃”< if(n!=1&&n!=2) { m=1; } 26 //输出排序后的结果 a。compositor(n,m); } //成绩范围检测函数 void score_err() { cout〈〈\"┏━━━━━━━━━━━━━━━┓”< 27 //////////////////////////////////////////////////////////////////////////////////主函数文件 void fun_lookup(student &a);//查找函数的调用定义 void fun_del(student &a);//删除函数的调用定义 void fun_compositor(student &a);//排序函数的调用定义 void fun_rework(student &a);//修改函数的调用定义 void fun_exit();//退出程序函数的定义 void main() { student a; while(1) { int i; system(”cls”); //清屏功能 menu(); cin〉>i; if(cin。fail()) //输入非法字符时退出 fun_exit(); switch (i) { case 1: a。cin_app();break; //增加记录 case 2: fun_del(a);break; //删除记录 case 3: fun_rework(a);break; //修改记录 case 4: fun_compositor(a);break; //记录排序 case 5: a.displist();break; //查看记录 case 6: fun_lookup(a);break; //查找记录 case 7: a.del_score();break; //清空链表 default: fun_exit(); //其它键退出 } } } 28
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务