程序设计基础实践报告docWord下载.docx
《程序设计基础实践报告docWord下载.docx》由会员分享,可在线阅读,更多相关《程序设计基础实践报告docWord下载.docx(45页珍藏版)》请在冰点文库上搜索。
利用输入输出流创建新文件、打开文件、保存文件。
2、计算与统计功能:
采用静态数据成员与成员函数完成记录中相关数据的统计;
1)能够打开已存在的数据表文件,对数据表中与某关键字匹配的相关记录进行数据统计(包括:
工资总额、平均值)
2)计算每个职工的实发工资。
3、记录管理功能:
利用继承与派生思想创建不同的类;
记录的管理采用链表或者指针数组实现;
采用抽象类、虚函数等实现对象与函数的动态关联,体现多态性。
1)输入/添加/插入记录:
利用重载运算符“>
>
”完成对任意一条记录输入、添加或插入数据表中,并保存到数据文件中。
2)查询、显示记录:
能够打开已存在的数据表文件,根据用户要求按所给记录关键字查询一个或多个相关联记录的各项信息。
利用重载运算符“<
<
”输出个对象的信息。
3)修改记录:
能够打开已存在的数据表文件,并对确定的任意记录进行修改,在修改过程中,应显示记录信息,给出确认提示,并对更新的记录信息进行文件保存。
4)删除记录:
能够打开已存在的数据表文件,可以删除数据表中的任一记录,要求具备逻辑删除(具有恢复功能)和物理删除功能,并对新的数据表信息进行文件保存。
数据文件管理功能:
计算与统计功能:
用静态数据成员与成员函数完成记录中相关数据的统计;
记录管理功能:
实现输入,插入,删除,恢复等功能。
四、主体内容
4.1设计分析
设置基本类staff,并由此派生出正式职工类formal和临时工类casual.由于在派生类中都要用到同名的同功能函数,所以在基类中定义了虚函数,以实现对象与函数的动态关联。
在整个程序中定义了三个函数stringInputNormalInfo(istream&
input,stringtip,chartype);
(用于直到输入正确类型的数据才返回)voidSaveToFile(fstream&
file,staff*s);
(用于保存信息到指定文件)voidReadFromFile(fstream&
file,staff**s);
(用于从文件读取信息),InputNormalInfo函数用于对测试过程中一些由输入错误引起的错误的纠正。
最后在主函数中用SWITCH语句实现了对文件,信息的相关操作。
为了体现C++工程性的特点,本程序中的类,函数单独作为头文件和CPP文件,最后在主程序中调用即可。
即为了实现面向对象中的公用借口与私有实现的分离。
4.2程序结构
4.3各模块的功能及程序说明
a.函数模块(作为三个头文件)
①stringInputNormalInfo(istream&
input,stringtip,chartype);
用于直到输入正确类型的数据才返回。
执行过程中用户可能会由于不小心输入错误,而是系统终止运行,系统就会出错。
用这个函数检查用户的输入是否正确,提高程序的可行性。
②voidSaveToFile(fstream&
file,staff*s);
用于保存信息到指定文件。
此函数执行对职工数据的保存。
③voidReadFromFile(fstream&
用于从文件读取信息。
b.主函数模块(作为最终的主程序)
创建主菜单界面,以供用户选择。
用SWITCH语句和链表实现相关操作。
①职工信息文件模块:
case'
1'
:
(新建)
case'
2'
(打开)
3'
(保存)
4'
(另存为)
②职工信息输入模块:
5'
(输入信息)
③职工信息插入模块:
6'
(插入信息)
④职工信息显示模块:
7'
(显示信息)
⑤职工信息查询模块:
8'
(查询信息)
⑥职工信息统计关键字模块:
9'
(统计关键字(工资总额,平均值))
⑦职工信息删除模块:
a'
(删除信息)
⑧职工信息恢复模块:
b'
(恢复信息)
⑨退出系统模块:
q'
(退出程序)
c.类模块(每个类作为一个头文件,类的函数作为cpp文件)
①staff基本职工类:
classstaff{}定义了职工的基本信息,数据包括编号,姓名,年龄等。
设置输入输出重载友元函数,计算工资的虚函数。
②formal正式职工类:
classformal:
publicclassstaff{}增加正式职工的其他数据,比如保险之类的。
明确定义计算工资函数
③casual临时工类:
classcasual:
publicclassstaff{}增加临时工的附加信息。
明确定义计算工资函数。
4.4相关模块源程序
a.函数模块
①InputNormalInfo函数cpp文件源程序
#include"
staff.h"
formal.h"
casual.h"
stringInputNormalInfo(istream&
input,stringtip,chartype)//用于直到输入正确类型的数据才返回
{
stringstr;
//临时变量
while
(1)
{
boolwrong=false;
//记录是否输入错误
cout<
tip;
if(INT==type)
cout<
"
(请输入整数)"
;
elseif(DECIMAL==type)
(请输入小数或整数)"
cout.put('
'
);
getline(input,str);
if(INT==type)//整数
{
for(autoiter=str.cbegin();
iter!
=str.cend();
iter++)//使用迭代器检查是否输入的都是整数
{
if(!
isdigit(*iter))//不是数字
{
wrong=true;
break;
}
}
}
elseif(DECIMAL==type)//小数
boolpoint=false;
//记录是否已经读取到小数点
iter++)//使用迭代器检查是否输入的是小数
if('
.'
==*iter&
&
!
point)//第一次读取到小数点
{
point=true;
//已经读取小数点
continue;
}
//否则输入错误
//判断输入是否错误
if(!
wrong)
returnstr;
}
}
②SaveToFile函数cpp文件源程序
voidSaveToFile(fstream&
file,staff*s)//用于保存信息到指定文件
if(&
file==&
cout)
staff*p=s;
while(p)
*p<
'
\n'
p=p->
next;
else
fstreamtemp;
temp.open(path,ios:
out);
temp<
temp.close();
③ReadFromFile函数cpp文件源程序
voidReadFromFile(fstream&
file,staff**s)//用于从文件读取信息
file.seekg(0,ios:
beg);
if(*s)//如果已有信息
delete*s;
*s=NULL;
stringinput;
//记录读取到的一行
staff*p=NULL;
staff*tail=NULL;
//记录链表尾部
do//读取标题
getline(file,input);
if("
-正式工-"
==input)
p=newformal;
elseif("
-临时工-"
p=newcasual;
else
continue;
file>
*p;
//清除多余的信息
*s)//第一次读入
tail=*s=p;
tail=tail->
next=p;
}while(file.good());
file.clear();
b.主函数模块cpp文件源程序
//职工工资信息系统.cpp:
定义控制台应用程序的入口点。
#include"
stdafx.h"
#include<
string>
fstream>
cctype>
fstreamfile;
//文件流
stringpath;
//路径,记录打开的文件路径
stringinput;
//记录输入
staff*head=NULL;
//头指针
staff*recover=NULL;
//记录可恢复信息
intmain(intargc,char*argv[],char*envp[])
system("
color1A"
system("
cls"
if(file.is_open())//已打开文件
当前打开文件:
"
<
path<
endl;
1->
新建\n"
"
2->
打开\n"
3->
保存\n"
4->
另存为\n"
5->
输入信息\n"
6->
插入信息\n"
7->
显示信息\n"
8->
查询信息\n"
9->
统计关键字(工资总额,平均值)\n"
a->
删除信息\n"
b->
恢复信息\n"
q->
退出\n"
getline(cin,input);
switch(input[0])
case'
//新建
//询问是否保存已打开的文件
if(file.is_open())
cout<
是否保存当前已打开的文件?
(Y/N):
getline(cin,input);
if('
Y'
==input[0]||'
y'
==input[0])
SaveToFile(file,head);
cout<
保存成功......"
else
保存失败......"
file.close();
请输入新文件路经:
getline(cin,input);
//打开文件
file.open(input,ios:
in);
if(file)//文件已存在
//先关闭文件
文件已存在,是否替换?
stringtemp=input;
//临时保存文件路径
('
==input[0]))//取消新建
新建失败......"
已替换......"
input=temp;
if(head)//释放内存
deletehead;
head=NULL;
path=input;
file.open(path,ios:
in|ios:
out|ios:
trunc);
break;
//打开
请输入要打开的文件路径:
if(input==path)//已打开
已打开该文件!
break;
//是否存在文件
fstreamtemp;
temp.open(input,ios:
if(!
temp)
文件不存在,打开失败!
temp.close();
//询问是否保存
是否保存文件:
path=input;
(Y/N):
未保存......"
else
app);
ReadFromFile(file,&
head);
已读入信息:
\n"
SaveToFile((fstream&
)cout,head);
//保存
file.is_open())//未打开文件
当前未打开文件!
SaveToFile(file,head);
已保存到:
//另存为
请输入另存为的文件路径:
string_path=input;
//临时路径
temp.open(_path,ios:
if(temp)//文件已存在
==input[0]))//输入的不是Y/y则取消另存为
取消另存......"
//另存到_path
stringstr=path;
//保存path
path=_path;
SaveToFile(temp,head);
文件已另存到"
_path<
path=str;
//输入信息
staff*s=head;
if(s)//取得链表尾部
while(s->
next)s=s->
while
(1)
staff*p;
f(正式工)/c(临时工)/q(退出)\n"
f'
F'
p=newformal;
elseif('
c'
C'
p=newcasual;
Q'
continue;
cin>
head)
s=head=p;
s=s->
//插入信息
当前无信息,无法插入!
SaveToFile((fstream&
插入到多少编号的后面:
stringno=input;
staff*s=head;
//定位编号位置
boolflag=false;
//编号输入是否错误
GetNO()!
=no)
if(!
s->
next)//不存在指定编号
cout<
编号输入错误!
flag=true;
break;
if(flag)break;
//编号输入错误则退出
while
(1)
staff*p;
getline(cin,input);
p=newformal;
elseif('