长春理工大学课程设计报告正文Word下载.docx
《长春理工大学课程设计报告正文Word下载.docx》由会员分享,可在线阅读,更多相关《长春理工大学课程设计报告正文Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
还有一些语句的运用,格式控制符等运用。
4.程序功能简介:
本程序具体功能如下:
(1)用户登录界面设计(以下结果展示图)。
(2)输入数据:
增加学生号码信息、成绩信息。
其中学生信息包括姓名、成绩、序号(学号自动生成)。
(3)信息查询:
查询时实现按姓名、序号查询、每次查询均具有详细提示。
使用函数重载,按提示进入不同界面,完成相应操作。
(4)修改成绩:
支持按学号或按姓名修改,修改完成有提示,不成功返回主菜单。
使用函数重载,按提示进入不同界面,完成相应操作
(5)输出所有:
将储存学生信息按列表输出,每一列对应“学号姓名成绩”输出格式,力求达到美观,有条理;
(6)统计功能:
在储存的学生信息中进行统计(原有数据保留,可添加),并输出及格(六十分及以上)与优秀(八十分及以上)人数;
(7)退出:
进入退出界面,系统自动储存保存信息,并生成(如没有)保存文件到程序运行根目录上,方便查看;
5.程序设计资料调研
本课程的要求是学生信息管理,要求完成其基本功能。
其信息经过搜索,查得学生信息表。
在进行某种学生信息管理操作时,通过是先显示所有的学生信息,再找到符合自己要找的学生的操作,本系统遵循了这一习惯,且查询方式灵活,方便。
6.关键算法
在本程序中使用了动态数组数据类型,所用最多的是WHILE循环结构和IF语句,然而这也正为了它的特色。
循环体的嵌套思路清晰,目的明确,格式规范,易于阅读和理解。
SWITCH语句的逐层运用,正形象化的描述了计算机工作流程,而且与人的一般习惯相吻合,简单明了,易于观察理解它的来龙去脉,思路清晰直观。
该程序是在汉化系统下编写完成的,所以它支持在汉化系统下运行,还支持在普通系统下运行,它允许完全用中文操作,包括对信息的添加浏览和查询等功能,它使用的指针是动态分配内存的,允许用户大量的信息录入,对它的长短不加限制,这样就方便了很多。
而且中文环境更加方便使用,一目了然。
7.存在的问题与次略
本课程设计是在汉化环境下操作的,对系统要求相对严格。
在输入信息时,每输入一条信息后用ENTER键结束,然后继续下一条信息的输入。
如果不能按照规定方法录入,为保护程序自动退出,只有重新启动系统开始新的输入。
策略是:
只有人为的去掌握输入方法,正确操作;
还有是对程序改进,使程序对一些非法输入给予忽略,提示重新输入或退出。
8.设计的思路(伪代码)
1.建立“学生信息管理系统”工程
2.建立Datebase.h,Datebase.cpp,Main.cpp文件并天加到工程中(准备工作完成)
3.创建学生类(classStudent),数据类(classDatebase)并关联到主程序中
3.为学生类添加基本属性(私有):
姓名,学号,成绩。
添加共有方法,体现其封装特性,共有方法有:
构造方法(多种),赋值函数重载,信息输出,等等。
4为数据类添加私有成员:
students【100】。
使用数组取代vector模板类极大简化操作。
5.为数据类添加add方法,将学生添加到数据中;
6.为数据类添加find方法,通过学号或名字查找到学生并显示其信息
7.为数据类添加update方法,可通过学号或名字找到学生并修改其成绩
8.为数据类添加statistic方法,统计及格及优秀人数
9.添加read方法,读取保存文件内的信息并添加到数据类
10.添加保存方法,在退出程序是将数据类内的信息保存实现再次读取
11在main函数中使用菜单,给用户提示,并使用循环与SWITCH使得重复选择操作变得可行
12在程序最后调用save方法保存,最后退出
13.最后在工程中使用Mian.exe就能实现上述全部功能
9.基本流程图
学生管理系统功能流程图
二、得意之处:
1.编码过程做到先构图后编译,保持较清晰的设计思路
2.严格遵守编译规范,对代码格式,注释都相当注意
3.使用switch使整个程序条理非常清晰,易读
4.适用面向对象的思想,对学生类有着较好的封装,对于每个私有成员都建立共有方法调用,控制对其访问
5.通过双静态整数计数方法,配合student构造方法完成对数组的管理,做到准确,简单
6.对于read方法不适用void返回而使用bool值,对外置文件读取起到监听的做用,一旦读取失败,使用自身数据初始化,避免重启程序而储存为空的尴尬
7.使用双储存方法,运用函数重载,对于第一次未储存及在原有储存文件基础上在储存有较好的应对策略
8.文件读取针对数据之间空格隔开的特性,做到准确读取数据并使文件储存到内存操作可进行
三、创意的技术实现:
通过双静态整数计数方法,配合student构造方法完成对数组的管理,做到准确,简单
对于read方法不适用void返回而使用bool值,对外置文件读取起到监听的做用,一旦读取失败,使用自身数据初始化,避免重启程序而储存为空的尴尬
使用双储存方法,运用函数重载,对于第一次未储存及在原有储存文件基础上在储存有较好的应对策略。
文件读取针对数据之间空格隔开的特性,做到准确读取数据并使文件储存到内存操作可进行
四、课程设计中存在的问题或者调试过程中发现的错误:
●将menu并入Datebase类
●为student类添加赋值构造函数
●为Student类添加赋值函数
●在Datebase类添加i/o文件方法
●修改部分方法返回值
●修改Student类析构函数改变计数方式
●find方法传参做改变
●对students数组访问方法作调整
●出现与头文件不匹配情况,已修正
●用数组取代vector模板类
●调整控制台输出格式,使其更美观
●简化添加,在主程序使用对象取代动态方法
●增加大量提示,方便用户
●增加if语句处理特殊情况
五、设计实践过程中的收获与体会
经过一个学期的学习和上机实践,使我对C++语言有了更认识和和了解,要想学好它要重在实践,要通过不断的上机操作才能更好的学习它,通过实践,我也发现我的好多不足之处,对各种控制结构及语句、数组的基本与高级应用、指针数组、字符数组、动态数组、函数的定义、调用方式;
函数在编程中的具体应用;
以及变量存储特征与标识符的作用域,通过实践,使我在这些方面有了认识和提高。
课程设计它是一项任务,更是一种挑战和历练。
在课程设计中,为了使用时方便,着重对不足方面的知识进行了分析与理解,在这一过程中对文件的操作有了很大的提高。
通过实际的演练,可以增强对知识的理解和运用能力程序在调试时发现了许多细节上的错误比如:
类定义是最后没有加分号,在主函数的ifelse结构中丢失或者多写花括号,命名空间的一些错误等。
这些错误并不是什么难点,就是平时打程序时不规范,没有良好的习惯导致这些错误的发生,我以后一定会规范自己,养成一个良好的打代码习惯,避免在一些小的细节错误上浪费时间。
我设计的这个程序其实还有一些地方不符合题目的要求,题目要求程序输入学生姓名,成绩,然后学号自动生成,但是我设计的程序是要求用户自己输入学生的学号,我认为这更满足现实情况,希望老师可以理解。
还有就是一些函数在执行前需要对文件内的数据进行转存,否则无法运行,我认为这占据了很大一部分内存并且,不断地调用文件内的数据容易出现错误,但是现在我还没有想出好的解决办法,所以只能先这样了。
这次课程设计历时数天,通过课程设计,我发现了自己的很多不足,知识上还存在很多漏洞,我看到了自己的实践经验还比较缺乏,理论联系实际的能力还急需提高。
为完成这次课程设计我确实付出很多,有苦有乐,这几天的工作日子,怎么形容呢,每次在教室回来就会心情不好,感觉自己什么都没有做成,慢慢的摸索着,开始入门,而且有了一点成就感,就这样每一次都比前一次收获多,心情也慢慢好了,而且我的系统也一天比一天的完善。
毕竟没有白费心血,以艰辛的付出最终还是获得不少回报!
总之,计算机是一门实践性很强的学科,要想学好,就必须多练习,多总结,只有这样,才能够更加深入地了解,才能够学会如何去运用它
参考文献
[1]吴乃陵,况迎辉.C++课程设计.北京:
高等教育出版社,20012
[2]孙建春,韦强.C++程序设计.北京:
人民邮电大学出版社,2014
附录
Datebase.h
/*
创建人:
140511526向闪闪
创建时间:
2015/7/14
内容:
声明学生类,菜单和数据类
修改履历:
调整计数count位置
将menu并入Datebase类
为student类添加赋值构造函数
为Student类添加赋值函数
在Datebase类添加i/o文件方法
修改部分方法返回值
修改Student类析构函数改变计数方式
find方法传参做改变
*/
#include<
fstream>
string>
iostream>
usingnamespacestd;
staticintcount=0;
staticintinitial_numb=0;
classStudent
{
//学生类的私有属性
private:
stringname;
//姓名
intnumb;
//学号
doublescore;
//成绩
public:
Student();
Student(conststring&
n,intscor);
Student(intnum,conststring&
name,intscore);
Student(constStudent&
s);
Student&
operator=(constStudent&
s);
voidshow()const;
voidsetScore(intn){score=n;
}
intgetNumb()const{returnnumb;
}
intgetScore()const{returnscore;
stringgetName()const{returnname;
~Student(){}
};
classDatebase
//使用学生类数组
Studentstudents[100];
Datebase(){}
voidmenu()const;
voidadd(constStudent&
voidfind(intnumb)const;
voidfind(conststring&
name)const;
voidupdate(intnumb);
voidupdate(conststring&
name);
voidlist()const;
voidstatistics()const;
voidsave_new();
voidsave();
boolread();
voidgetStudent();
voidinitial();
~Datebase();
Datebase.cpp
对学生类,菜单和数据类进行定义
将整个选项代码移入main函数中
对students数组访问方法作调整
出现与头文件不匹配情况,已修正
用数组取代vector模板类
调整控制台输出格式,使其更美观
简化添加,在主程序使用对象取代动态方法
增加大量提示,方便用户
增加if语句处理特殊情况
#include"
Datebase.h"
//构造空对象,不进行计数
Student:
:
Student(){
name="
null"
;
numb=0;
score=0;
//每调用一次,计数加一
Student(conststring&
n,intscor){
count++;
name=n;
score=scor;
numb=count;
Student(intnum,conststring&
if(!
num==count)
cout<
<
"
------请按序添加----"
<
endl;
//复制构造函数,保留学号不变
Student(constStudent&
s){
count++;
name=s.name;
score=s.score;
numb=s.numb;
//赋值构造,不计数
Student&
Student:
operator=(constStudent&
return*this;
//学生信息输出到控制台
voidStudent:
show()const{
cout<
getNumb()<
"
getName()
<
getScore()
//主菜单
voidDatebase:
menu()const{
cout<
"
学生成绩管理系统"
************************************"
**1--输入数据***********************"
**2--查询成绩***********************"
**3--修改成绩***********************"
**4--输出所有学生成绩***************"
**5--统计及格和优秀人数*************"
**6--退出系统***********************"
//添加方法
add(constStudent&
s){
students[count-1]=s;
//按学号查找信息
find(intnumb)const{
if(cout==0){
**没有学生,请先添加"
return;
students[(numb-1)].show();
//按姓名查找信息
find(conststring&
name)const{
if(count==0){
**没有学生,请先添加"
for(inti=0;
i<
count;
i++){
if(name==students[i].getName())
students[i].show();
//按学号修改成绩
update(intnumb){
--------输入新成绩------"
intn;
cin>
>
n;
students[numb-1].setScore(n);
//按名字修改成绩
update(conststring&
name){
students[i].setScore(n);
//遍历已加入数据类的学生信息
list()const{
students[i].getNumb()<
students[i].getName()
students[i].getScore()
//保存信息,创建并到Save_Date.txt文件中
save_new(){
**保存中*****"
ofstreamfout("
Save_Date.txt"
);
fout<
fout.close();
ifstreamfin("
fin)
**储存失败,检查内存****"
else
**储存成功**************"
fin.close();
//保存信息到已有文件中,
save(){
ofstreamfout;
fout.open("
ios_base:
out|ios_base:
app);
for(inti=initial_numb;
//在储存信息文件中读取,输出到控制台并添加到数据类
boolDatebase:
read(){
**进入只读界面***"
fin){
**读取失败,进入初始化阶段**"
initial();
fin.close();
returnfalse;
}else{
charch;
while(fin.get(ch)&
&
(!
fin.eof()))
cout<
ch;
**读取完成*****"
getStudent();
returntrue;
//从储存文件中读取信息并添加到数据类
getStudent(){
intscore;
******正在写入内存********"
while(!
fi