C++课程设计报告高校水电费管理系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

青岛理工大学
C ++面向对象课程设计报告
院(系):计算机工程学院
专业:软件工程
学生姓名:* * *
班级* * * * 学号:20 13 0 7 * * * 题目:高校水电费管理系统设计
起迄日期:_ 2 0 1 5 . 6 . 2 9 ~ 2 0 1 5 . 7 . 10
设计地点:计算机学院机房
指导教师:
完成日期 : 2 01 5 年 7 月 1 0 日
《C++面向对象课程设计》任务书
题目9“高校水电费管理系统设计”
1、问题描述
住宿学生信息包括:学号、姓名、性别、年龄、班级、用电量、用水量等信息。

教工信息包括职工号、姓名、性别、年龄、工作部门、用电量、用水量等信息。

能计算出学生和教工每月所要交的电费和水费。

定义一个人员类,实现学生和教工共同的信息和行为。

2、功能要求
( 1 )添加功能:程序能够添加不同学生和教工的记录,提供选择界面供用户选择所要添加的类别,要求编号号要唯一,如果添加了重复编号的记录时,则提示数据添加重复并取消添加。

( 2 )查询功能:可根据姓名、用水量、用电量信息对已添加的学生或教工记录进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。

( 3 )显示功能:可显示当前系统中所有学生和教工的记录,每条记录占据一行。

( 4 )编辑功能:可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。

( 5 )删除功能:主要实现对已添加的学生或教工记录进行删除。

如果当前系统中没有相应的记录,则提示“记录为空!”并返回操作。

( 6 )统计功能:能根据多种参数进行统计。

能统计学生和教工的用水用电量、所要交纳的电费和水费、未交纳水电费的人员信息等。

( 7 )保存功能:可将当前系统中各类记录存入文件中,存入方式任意。

( 8 )读取功能:可将保存在文件中的信息读入到当前系统中,供用户进行使用。

( 9 )计算电费和水费。

学生每月都有一定额度的水电是免费使用的,超过的部分需要交费。

3、问题的解决方案
根据系统功能要求,可以将问题解决分为以下步骤:
( 1 )应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;
( 2 )分析系统中的各个实体及它们之间的关系;
( 3 )根据问题描述,设计系统的类层次;
( 4 )完成类层次中各个类的描述;
( 5 )完成类中各个成员函数的定义;
( 6 )完成系统的应用模块;
( 7 )功能调试;
( 8 )完成系统总结报告。

目录
一、需求分析 (1)
1. 1 选做此课题或项的目的 (1)
1. 2 程序所实现功能 (1)
二、内容设计 (1)
2. 1 模块图 (1)
2. 2 流程图 (2)
2. 3 关键代码 (9)
三、调试分析 (17)
3. 1 实际完成情况的说明 (17)
3. 2 程序的性能分析 (17)
3. 3 上机过程中出现的问题及其解决方案 (17)
3. 4 程序中可以改进的地方说明 (18)
3. 5 程序中可以扩充的功能及设计实现构想 (18)
四、用户手册 (16)
五、设计总结 (30)
六、参考文献 (31)
七、附录 (31)
功 能 模 块 图 :
教 工 信 息 管 理
添 加
课程设计报告内容
一、需求分析 1.选做此课题或项的目的
此 课 题 为 高 校 水 电 费 管 理 系 统 ,选 做 此 课 题 是 想 对 自 己 这 学 期 的 C ++学 到 的 知 识 进 行 一 次 全 面 的 练 习 ,一 方 面 用 实 践 巩 固 已 掌 握 的 知 识 点 ,另 一 方 面 也 能 从 中 发 现 自 己 的 不 足 。

此 课 题 是 设 计 一 个 系 统 实 现 对 学 生 和 教 工 信 息 的 添 加 、查 询 、显 示 、编 辑 、删 除 、保 存 和 读 取 功 能 。

其 中 包 括 三 个 类 : Preson 、 S tudet 和 Teacher 的 设 计 , 还 有 功 能 函 数 的 编 写 。

由 于 考 虑 到 数 组 的 溢 出 问 题 ,所 以 我 选 择 了 使 用 链 表 ,而 对 于 指 针 ,我 一 直 觉 得 自 己 掌 握 的 不 是 太 熟 练 ,所 以 通 过 此 次 课 程 设 计 ,也 让 我 更 加 熟 悉 了 指 针 的 应 用 ,这 对 我 来 说 是 此 次 课 程 设 计 的 很 大 收 获 。

2.程序所实现的功能
( 1 ) 添 加 功 能 : 程 序 能 够 添 加 不 同 学 生 和 教 工 的 记 录 , 提 供 选 择 界 面 供 用 户 选 择 所 要 添 加 的 类 别 ,要 求 编 号 号 要 唯 一 ,如 果 添 加 了 重 复 编 号 的 记 录 时 ,则 提 示 数 据 添 加 重 复 并 取 消 添 加 。

( 2 ) 查 询 功 能 : 可 根 据 姓 名 、 用 水 量 、 用 电 量 信 息 对 已 添 加 的 学 生 或 教 工 记 录 进 行 查 询 , 如 果 未 找 到 , 给 出 相 应 的 提 示 信 息 , 如 果 找 到 , 则 显 示 相 应 的 记 录 信 息 。

( 3 ) 显 示 功 能 : 可 显 示 当 前 系 统 中 所 有 学 生 和 教 工 的 记 录 , 每 条 记 录 占 据 一 行 。

( 4 ) 编 辑 功 能 : 可 根 据 查 询 结 果 对 相 应 的 记 录 进 行 修 改 , 修 改 时 注 意 编 号 的 唯 一 性 。

( 5 ) 删 除 功 能 : 主 要 实 现 对 已 添 加 的 学 生 或 教 工 记 录 进 行 删 除 。

如 果 当 前 系 统 中 没 有 相 应 的 记 录 , 则 提 示 “ 记 录 为 空 !” 并 返 回 操 作 。

( 6 ) 统 计 功 能 : 能 根 据 多 种 参 数 进 行 统 计 。

能 统 计 学 生 和 教 工 的 用 水 用 电 量 、 所 要 交 纳 的 电 费 和 水 费 、 未 交 纳 水 电 费 的 人 员 信 息 等 。

( 7 ) 保 存 功 能 : 可 将 当 前 系 统 中 各 类 记 录 存 入 文 件 中 , 存 入 方 式 任 意 。

( 8 ) 读 取 功 能 : 可 将 保 存 在 文 件 中 的 信 息 读 入 到 当 前 系 统 中 , 供 用 户 进 行 使 用 。

( 9 ) 计 算 电 费 和 水 费 。

学 生 每 月 都 有 一 定 额 度 水 电 是 免 费 使 用 的 , 超 过 的 部 分 需 要 交 费 。

二、内容设计 1.根据所选题目,给出模块图
查 显 编 删 统 保 读 退 询
示 辑



取 出
高 校 水 电 费 管 理 系 统
学 生 信 息 管 理
退 出 系 统
2.画出主程序及其主要模块的流程图
图 2 .2 类图
开始
结束
图 2 .3 主函数 main() 流程图break;
w hile( c hoice)
Y
N
c in>>choice
choice= 1 choice=
2
choice=
default
student_ menu(); break; teacher_ menu();
break;
break;
欢迎下次使用 !
int choice=1
开 始
结束
图 2 .4 S tudent_ m enu() 函 数 流 程 图 ( (Teacher_m enu()) 与 其 相 同 )
de l ( ) ; bre a k ;
c ount(); bre a k ;
Y
w hile( n )
Y
cin>>n
n=1
n=2 n=3 n=4
n=5
n=6 n=7
n=8
n=0
a ppend(); find(); show ( ) ; edit(); brea k ;
brea k ;
brea k ;
brea k ;
退出管理系统
head1 ->read( head1 )
sa ve ( ) bre a k ;
rea d(); brea k ;
bre a k ;
int n=1
开始
结 束
图 2 .5 添 加 功 能
N
p->nex t
Y
Y
p->no==q->no
N
p=p->nex t
p?
Y
N
添 加 重 复
pre=p; p=p->nex t;
p->no< q->no
p=NU L L
N
pre=p
p=pre->nex t
pre->nex t=q; q->nex t=p;
pre->nex t=q; q->nex t=p;
! p
N
Y
p
N
Y 记 录 为 空 !
p->disp(); p=p->nex t;
开 始
结 束
图 2 .6 查 询 功 能
开 始
结 束
图 2 .7 显 示 功 能
p=p->nex t
c in>>choice
choice=1 choice=2 choice=3 default
按 用 水 量 查 找 break;
按 用 电 量 查 找 break;
按 姓 名 查 找 break;
break;
p=p->nex t;
开 始
结 束
图 2 .8 编 辑 功 能
开 始
图 2 .9 删 除 功 能
Y
N
! p N
w hile( p)
Y
Y
记 录 为 空
p->no==n
N
pre->nex t =p->nex t;
pre=p; p=p->nex t;
结 束
pre=p; p=p->nex t;
编 号 n Y
p=p->nex t
N
p& & p->no! =n
N
! p
Y
输 入 修 改 后 的 信 息
p->disp()
编 号 n p=p->nex t
统 计 未 缴 纳 水 费 人 员 break;
统 计 电 费 水 费 break;
break;
统 计 用 水 用 电 量 break;
开 始
结 束
图 2 .10 统 计 功 能
开 始
图 2 .11 保 存 功 能
N
Y
out.close()
! out
N
Y
P? 保 存 失 败
输 出 信 息 到 文 件 结 束
p=p->nex t;
ofstream out("S tudent.tx t");
p=p->nex t
cin>>choice
choice=1 choice=2 choice=3 default
p=p->nex t
Y
in.close()
q->nex t=p; p->nex t=NU L L ; q=p;
! in
N
读 取 信 息 不 空
Y N
文 件 读 取 失 败
i f strea m in("S tudent.tx t") ;
开 始
结 束
3.编写程序关键代码
图 2 .12 读 取 功 能
添 加 功 能 代 码 :
void S tudent:: append( S tudent * p,S tudent * q)/// 添 加 记 录 {
S tudent * pre=p; w hile( p->nex t) {
p=p->nex t; i f( p->no==q->no) /// 判 断 所 添 加 记 录 是 否 重 复
{
cout<<"记 录 重 复 ,添 加 失 败 ! "<<endl; return; } } p=pre; p=p->nex t; w hile( p ) {
if( q->no<p->no) /// 按 编 号 递 增 的 顺 序 添 加 记 录 {
pre->nex t=q; q->nex t=p; break; } pre=p;
p=p->nex t;
}
i f( p==NU L L)
{
pre->nex t=q;
q->nex t=p;
}
cout<<"该学生记录添加成功 ! "<<endl;///保存到链表中,并未写入文件
}
查找功能代码:
void S tudent:: find( S tudent* p)///查找记录, p 为头指针
{
int flag =0 ;
p=p->nex t;
int choice;
string s;
double w ;
double po;
cout<<"输入选择查询依据 : 1按姓名查询 2 按用水量查询 3 按用电量查询: ";
c in>>choice;
cout<<"-----------------------------------------------------------------------------"<<endl;
cout<<"编号 "<<'\t'<<"班级 "<<'\t'<<"姓名 "<<'\t'<<"性别 "<<'\t'<<"年龄 "<<'\t'<< "
用水量 "<<'\t'<<"交水费 "<<'\t'<<"用电量 "<<'\t'<<"交电费 "<<endl<<endl;
sw itch( choice)
{
case 1 : cout<<"输入要查询的姓名: "; c in>>s;///按姓名查找
w hile( p! =NU L L)
{
i f( p->name==s)
{ p->disp();///将所有符合的记录输出
flag =1 ;
}
p=p->nex t;
}
i f( ! flag )
{
cout<<"没有找到该记录 ! "<<endl;
return;
}
cout<<"-----------------------------------------------------------------------------"<<endl;
break;
case 2 : cout<<"输入查询的用水量: "; c in>>w ;///按用水量查询
w hile( p! =NU L L )
{
i f( p->w a ter==w )
{ p->disp();///将所有符合的记录输出
flag =1 ;
}
p=p->nex t;
}
i f( ! flag )
{
cout<<"没有找到该记录 ! "<<endl;
return;
}
cout<<"-----------------------------------------------------------------------------"<<endl;
break;
case 3 : cout<<"输入查询的用电量: "; c in>>po;///按用电量查询
w hile( p! =NU L L)
{
if( p->pow er==po)
{ p->disp();///将所有符合的记录输出
flag =1 ;
}
p=p->nex t;
}
i f( ! flag )
{
cout<<"没有找到该记录 ! "<<endl;
return;
}
cout<<"-----------------------------------------------------------------------------"<<endl;
break;
default : cout<<"无此项,输入错误 ! "<<endl; break;
}
}
显示功能代码:
void S tudent:: show ( S tudent* p) ///显示所有的学生记录{
p=p->nex t;
i f( ! p)
{
cout<<"记录为空 ! "<<endl;
return;
}
cout<<"----------------------------------------------------------------------------"<<endl;
cout<<"编号 "<<'\t'<<"班级 "<<'\t'<<"姓名 "<<'\t'<<"性别 "<<'\t'<<"年龄 "<<'\t'<< "
用水量 "<<'\t'<<"交水费 "<<'\t'<<"用电量 "<<'\t'<<"交电费 "<<endl<<endl;
w hile( p)
{
p->disp();
p=p->nex t;
}
cout<<"----------------------------------------------------------------------------"<<endl; }
编辑功能代码:
void S tudent:: edit( S tudent* p) ///编辑某学生记录{
string na;
string s;
int a ;
string C l ;
double w,p1 ;
int c 1 ,c 2 ,c 3 ,c 4,c 5 ,c 6 ,c 7 ,c 8 ;
cout<<"输入要修改学生的编号: ";
int n;
c in>>n;
p=p->nex t;
w hile( p! =NU L L& & p->no! =n)
{
p=p->nex t;
}
i f( p==NU L L)
{
cout<<"不存在该学生记录 ! "<<endl; return;
}
i f( p->no==n)
{
cout<<"是否修改班级 ( 1: Yes 0 : No) : ";
c in>>c 1 ;
i f( c1==1 )
{
cout<<"输入班级 : ";
cin>>C l; p->C lass=C l;
}
cout<<"是否修改姓名 ( 1: Y es 0 : No) : ";
c in>>c 2 ;
i f( c2==1 )
{
cout<<"输入姓名 : ";
cin>>na; p->nam e=na;
}
cout<<"是否修改性别 ( 1: Yes 0 : No) : ";
c in>>c 3 ;
i f( c3==1 )
{
cout<<"输入性别 : ";
cin>>s; p->sex=s;
}
cout<<"是否修改年龄 ( 1: Y es 0 : No) : ";
c in>>c 6 ;
i f( c6==1 )
{
cout<<"输入年龄 : ";
cin>>a; p->ag e=a;
}
cout<<"是否修改用水量 ( 1: Y es 0 : N o) : ";
c in>>c 4 ;
i f( c4==1 )
{
cout<<"输入用水量 : ";
cin>>w ; p->w a ter=w ;
p->w a term oney =0 .5 * ( p->w a ter-10 ) ;
}
cout<<"是否修改用电量 ( 1: Y es 0 : N o) : ";
c in>>c 5;
i f( c5==1 )
{
cout<<"输入用电量 : ";
cin>>p1 ; p->pow er=p1 ;
p->pow ermoney =0 .5 * ( p1 -10 ) ;
}
cout<<"是否修改所交水费 (1 : Yes 0 : N o) : ";
c in>>c 7;
i f( c7==1 )
{
cout<<"是否已交水费 ( 1: Y es 0 : N o) : ";
cin>>c 7 ;
if( c 7 ==1 )
p->realw a termoney =p->w a te rm oney ;
else
p->realw a termoney =0 .0 ;
}
cout<<"是否修改所交电费 (1 : Yes 0 : N o) : ";
c in>>c 8;
i f( c8==1 )
{
cout<<"是否已交电费 ( 1: Y es 0 : N o) : ";
c in>>c 8;
if( c 8 ==1 )
p->realpow ermoney =p->pow ermoney ;
else
p->realpow ermoney =0 .0 ;
}
cout<<"修改后的结果为 : "<<endl;
cout<<"编号 "<<'\t'<<"班级 "<<'\t'<<"姓名 "<<'\t'<<"性别 "<<'\t'<<"年龄 "<<'\t'<< "
用水量 "<<'\t'<<"交水费 "<<'\t'<<"用电量 "<<'\t'<<"交电费 "<<endl<<endl;
p->disp();
}
}
删除功能代码:
void S tudent:: del( S tudent * p)///删除某学生记录
{
S tudent * p re=p;
int n;
p=p->nex t;
i f( ! p)
{
cout<<"记录为空,无法删除 ! "<<endl;
return;
}
cout<<"输入要删除的学生编号: "; c in>>n;
w hile( p)
{
if( p->no==n)
{
pre->nex t=p->nex t;
cout<<"成功删除编号为 "<<n<<"的教工记录 ! "<<endl;
return;
}
pre=p;
p=p->nex t;
}
cout<<"所要删除的学生记录不存在 ! "<<endl;
}
统计功能代码:
void S tudent:: count( S tudent * p) ///统计学生水电量及水电费信息{
S tudent * q=p;
p=p->nex t;
double w =0 .0 ,p1 =0 .0 ,w m =0 .0 ,pm=0 .0 ,w m 1 =0 .0 ,pm 1 =0 .0 ;
int choice,count1 =0 ,count2 =0 ;
cout<<"输入统计选项: 1 用水用电量 2 电费水费 3 : 未缴纳水电费人员:";
c in>>choice;
sw itch( choice)
{
case 1 : w hile( p! =NU L L)
{
w +=p->w a ter;
p1 +=p->pow er;
p=p->nex t;
}
cout<<"学生总用水量为 : "<<w <<endl;
cout<<"学生总用电量为 : "<<p1 <<endl;
break;
case 2 : w hile( p! =NU L L)
{
case 3 :
w m+=p->w a termoney ;
w m 1 +=p->realw a termoney ;
pm+=p->pow ermoney ;
pm 1 +=p->realpow ermoney ;
p=p->nex t;
}
cout<<"学生所用总水费为 :"<<w m<<endl; c out<<"学生所用总电费为 :"<<pm<<endl; c out<<"学生实际所交总水费为 : "<<w m 1 <<endl; cout<<"学生实际所交总电费为 : "<<pm 1 <<endl; break;
cout<<"--------------------------------------------------"<<endl;
w hile( p! =NU L L)
{
if( p->w a ter>10 & & p->realw a termoney ==0 .0 )
{
cout<<"编号 : "<<p->no<<'\t'<<"姓名 : "<<p->nam e<<endl;
count1 ++;
}
p=p->nex t;
}
cout<<"未交水费的人数为 :"<<count1 <<endl;
cout<<"--------------------------------------------------"<<endl<<endl;
p=q;
p=p->nex t;
w hile( p)
{
if( p->pow er>10 & & p->realpow ermoney ==0 .0 )
{
cout<<"编号 : "<<p->no<<'\t'<<"姓名 : "<<p->name<<endl;
count2 ++;
}
p=p->nex t;
}
cout<<"未交电费的人数为 :"<<count2 <<endl;
cout<<"--------------------------------------------------"<<endl;
break;
default: cout<<"输入选项错误,失败 ! "<<endl;
break;
}
}
保存功能代码:
void S tudent:: s a ve( S tudent * p)///将信息保存到文件中
{
ofstream out("S tudent.tx t");
i f( ! out)
{
cout<<"保存失败 ! "<<endl;
return;
}
p=p->nex t;
w hile( p)
{
out<<p->no<<" "<<p->C la ss<<" "<<p->name<<" "<<p->sex <<" "<<p->ag e<<" "<<
p->w a ter<<" "<<p->realw a termoney <<" "<<p->pow er<<" "<<p->realpow erm oney <<endl;
p=p->nex t;
}
cout<<"保存成功 ! "<<endl;
out.close();
}
读取功能代码:
int S tudent:: r ead( S tudent* q)///从文件中读取所有学生信息
{
S tudent* p;
i f strea m in;
in.open("S tudent.tx t");
i f( ! in)
{
cout<<"读取失败 ! "<<endl;
return 0 ;
}
w hile( in>>no>>C la ss>>nam e>>sex >>ag e>>w a ter>>realw a termoney >>pow er>>realpow erm oney )
{
p=new S tudent( no,C la ss,name,sex ,ag e ,w a ter,pow er,realw a term oney,realpow ermoney ) ;
q->nex t=p;
p->nex t=NU L L;
q=p;
}
return 1 ;
in.close();
}
三、调试分析1.实际完成的情况说明(完成的功能,支持的数据类型等)。

( 1) 添加功能:程序能够按照编号递增的顺序添加不同学生和教工的记录,如果添加了重复编号的记录时,则取消添加。

( 2) 查询功能:可根据姓名、用水量、用电量信息对已添加的学生或教工记录进行查询。

( 3) 显示功能:可显示当前系统中所有学生和教工的记录,每条记录占据一行。

( 4) 编辑功能:可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。

( 5) 删除功能:对已添加的学生或教工记录进行删除。

( 6) 统计功能:能统计学生和教工的用水用电量、所要交纳的电费和水费、未交纳水电费的人员信息。

( 7) 保存功能:可将当前系统中各类记录存入文件中。

( 8) 读取功能:可将保存在文件中的信息读入到当前系统中,供用户进行使用。

( 9) 计算电费和水费。

学生每月都有一定额度的水电是免费使用的,超过的部分需要交费按照公式w a termoney /pow ermoney =0 .5 * ( w a ter/pow er-10 ) 计算。

支持的数据类型为 : i nt , s t r i ng , doubl e , 自定义的类类型Pe r s on, St ude nt , Te a c he r 。

2.程序的性能分析。

* 程序编写了三个类:Person、S t udent 和 Teacher,其中 S t udent 和 Teacher 类中又都包含了添加、查询、显示、编辑、删除、统计、保存、和读取功能,程序能够正常运行,且所编写功能都能成功实现,程序运行速度也较快,不会出现太长的反应时间。

空间复杂度上,该程序主要用到了两个链表,两个tx t文本。

总体来说,该程序性能良好。

3.上机过程中出现的问题及其解决方案
1 .程序运行时,由于所有的信息都储存在文件里,所以对信息处理的前提就是打开文件,而未完善前的程序时只能在学生或教工管理系统所包含的八个功能里选择,所以难免会忘记首先选择读取功能。

最后解决的方法是在student_ m enu() 和teacher_m enu() 函数中,分别加入
代码head1 ->read( head1 ) ;和head2 ->read( h ead2 ) ; 首先打开文件,再根据输入选择执行的功能。

2 .在对学生和教工信息记录进行添加处理是,未完善程序前,所添加的信息都是在指针尾部添加,写入文件也是按链表顺序写入,所以就会有编号就没有序。

最后解决方法是,每次添加信息,都按编号递增的顺序进行添加,使整个文件的信息有序。

3 .由于对学生信息操作,就可能引起学生信息的改变,未完善前的程序,是操作者必须想着是否保存文件,有时忘记选择保存功能,造成修改文件数据没有被保存。

最后解决办法,如果操作者没有保存文件,就会显示一个提示问操作者是否要保存文件。

4 .最初程序编译时,一直显示unex pect end of fi le ,可一直找不到错误,最后发现时由于一个函数里少了一个“}”。

5 . 在未完善程序时,水费和电费是根据水电量,按公式w a termoney /pow ermoney =0 .5 * ( w a ter/pow er-10 ) 进行赋值的,这样就不存在不交电费和水费的情况,所以进行统计时,未交水费和电费的人数永远是 0 。

最后解决的办法时,在 Person 类中又添加了两个数据成员:realw a termoney 和realpow erm oney ,非别代表学生或教工实际所交水、电费,若交了电费,则按照公式计算,若未交,则为 0 .0 ,统计未交水、电费人数时,若水、电费超过10 ,且实际所交水、电费为0 ,则未交费。

在统计水电费时会统计中,学生和教师所应交的水电费和实际所交的水电费。

6 .程序未完善时,只能统计未交水费、电费的人数,但并不能输出未交费的具体人员。

最后解决的办法时,将最初的一次循环改为两次,分开统计未交水费和电费的人,未交费就输出该条记录所对应的编号和姓名,最后输出未交费的人数。

4.程序中可以改进的地方说明
在进行信息添加、编辑和删除时可以加一个w hile( 1 ) 循环,这样就可以添加、编辑和删除多条记录,直到选择操作结束,才会退出功能函数。

5.程序中可以扩充的功能及设计实现构想
可以为每个用户设置一个账号,并且每个账号设置相应的密码。

每个用户进入高校水电费管理系统前,都要输入相应的用户账号和密码,而不是像现在这样直接进入系统,这样设置账号之后,就不是所有人都能直接进入系统进行,随意查看、修改信息,有利于保障信息安全。

可以建立一个用户文件,来保存用户的账号和密码信息,在主函数里添加输入用户名和密码的代码,并将输入的用户名和密码和文件里的信息相比对,如果符合,则进入高校水电费管理系统,接下来的实现就与该程序相同;如果没有符合的,则显示输入错误,不能进入系统。

四、用户手册(说明程序的运行环境,程序执行结果,详细列出每一步的操作步骤。

可以插图)
1 .程序运行环境: V C ++6 .0
2 .程序执行结果 ,如下所示:
进入高校水电费管理系统。

如图4 .1 所示:
图 4 .1
选择1 ,进入学生信息管理系统 (此时文件中的信息已被读取 ),并选择3 ,显示当前文件中的记录。

如图4 .2 所示:
图 4 .2
按任意键,返回学生管理系统界面,并选择1 ,进行信息添加。

如图4 .3 所示:
图 4 .3
按任意键,返回学生管理系统界面,并选择3 进行显示当前信息。

如图4 .4 所示:
图 4 .4
按任意键,返回学生管理系统界面,并选择1 ,继续进行信息添加。

如图4 .5 所示:
图 4 .5
按任意键,返回学生管理系统界面,并选择3 进行显示当前信息,根据显示结果可以看到是按学号递增的顺序添加信息的。

如图4 .6 所示:
图 4 .6
按任意键,返回学生管理系统界面,并选择2 进行查询,然后选择1 按姓名查询,并将查询结果输出。

如图4 .7 所示:
图 4 .7
按任意键,返回学生管理系统界面,并选择2 进行查询,然后选择2 按用水量查询,并将查询结果输出。

如图4 .8 所示:
图 4 .8
4 .9 所示:
图 4 .9
按任意键,返回学生管理系统界面,并选择5 进行删除编号为4 的学生记录。

如图4 .10 所示:
图 4 .10
4 .11 所示:
图 4 .11
按任意键,返回学生管理系统界面,并按7 进行保存修改的信息到文件中。

如图4 .12 所示:
图 4 .12
按任意键,返回学生管理系统界面,并选择8 读取文件信息。

如图4 .13 所示:
图 4 .13
按任意键,返回学生管理系统界面,按3 进行显示,说明修改的信息已保存成功。

如图4 .14 所示:
图 4 .14
按任意键,返回学生管理系统界面,并选 0 退出学生管理系统 (若对信息修改后没有进行保存,系统在退出时会显示是否保存更改,该功能在教工信息管理系统中有演示 ),如图 4 .15 所示。

然后按任意键返回高校管理系统界面,如图4 .16 所示:
图 4 .15
图 4 .16
选2 可进入教室信息管理系统,可以看到,其实现的功能与学生信息管理系统相同,操作也相同 ( 这里演示部分功能 )。

选择3 ,显示当前文件中的教工记录。

如图4 .17 所示:
图 4 .17
按任意键,返回教工管理系统,并选择1 添加编号为3 的记录,然后按任意键返回教工管理系统,选择3 显示添加后的信息。

如图4 .18 所示:
图 4 .18
按任意键,返回教工管理系统,并选择6 进行统计,然后选择 1 统计电费水费。

如图4 .19 所示:
图 4 .19
按任意键,返回教工管理系统,并选择6 ,然后选择3 统计未缴纳水电费人员。

如图4 .20 所示:
图 4 .20
按任意键,返回教工管理系统,并选择0 退出教工管理系统,由于进行了添加操作,而没有选择保存,所以系统会在退出时提示是否将更改保存到文件“ Teacher.tx t”中,选 1 保存,退出系统。

如图4 .21 所示:
图 4 .21
按任意键返回高校管理系统,并选择0 ,退出系统。

如图4 .22 所示:
图 4 .22
按任意键。

如图4 .23 所示:
图 4 .23
五、设计总结(可谈一谈本次课程设计的经验和体会)
本次课程设计,实现的是高校水电费管理系统的设计,由于考虑到数组的溢出问题,故采用了链表操作。

该高校水电管理系统,主要实现的是对学生和教工信息的管理,包括对学生和教工信息的添加、查询、显示、编辑、删除、统计、保存和读取功能的实现。

在设计程序时,我设计了一个 Person 类,一个S tudent 类和一个Teacher 类,P erson 类主要包括的是S tudent 和Teacher 公有的数据成员,在S tudent 类和Teacher 类中主要是系统功能的实现 ( 添加、查询、显示、编辑、删除、统计、保存和读取 )。

程序设计时,由于先写的是三个类的设计,而写的过程中,由于学生和教工类实现的功能相同,就思考如何潘盾是调用 S tudent 类函数还是 Teacher 类函数,后来就开始思索主函
数中对各方法的调用,在主函数里将高校水电费管理系统,分为学生管理系统和教工管理系统,两个管理系统分别进入两个管理菜单,这样就可以在各自的管理系统里调用各自的方法,而且将信息,分别写进两个文件,互不影响。

在程序编写时,由于整个程序使用的都是链表操作,所以要求对指针的使用必须非常娴熟。

平时编写程序时对链表的练习也比较少,所以此次选用指针对自己也是一个挑战,也正是通过这次课程设计,让我发现了平常使用指针过程中的一些问题。

通过实地操作,对指针的访问,链表中结点的建立,使用了new 来动态建立链表结点,以及头结点的使用有了更深的了解。

通过此次课程设计,我对这学期学习到的C ++知识点有了更好地掌握和巩固,也加深了对链表和指针的理解。

在此次程序设计时,由于我是直接将功能基本都实现后才进行编译,所以编译时报出了很多错误,看到这么多错误,虽然感到很失落甚至说是忧愁,不过最后还是耐心地一一改正,看到程序成功运行,也感到很有成就感。

通过此次设计,也警告我,以后写程序时,要分模块编写,编译无误后再继续添加新的代码,毕竟编写较大点的程序时,我们难免保证不出现
错误。

六、参考文献
[ 1 ] 李兰 , 任凤华 . C ++面向对象程序设计 . 西安 : 西安电子科技大学出版社 , 2010
[ 2 ] 李兰 , 任凤华 . 《 C ++面向对象程序设计》实验指导及习题解析 . 西安 : 西安电子科技大学出版社 , 2010
[ 3 ] 郑莉 , 董渊 . C ++程序设计基础教程 . 北京 : 清华大学出版社 , 2010
[ 4 ] 郑莉 . C ++程序设计基础教程学生用书 . 北京 : 清华大学出版社 , 2010
七、附录(要加上注释。


#include<iostream>
using nam espace std;
#include<string>
#include<iomanip>
#include<fstream>
#include <conio.h>
c la ss Person///公共基类Person 类
{
public:
Person( int n=0 ,string na="",string s="",int a=0 ,double w =0 .0 ,double p=0 .0 ,double w m =0 .0 ,double pm=0 .0 )///P erson 构造函数
{
no=n;
name=na;
sex =s;
ag e=a;
w a ter=w ;
pow er=p;
i f( w m<0 )
w m=0 ;
i f( p m<0 )
pm=0 ;
realw a termoney =w m ;
realpow erm oney =pm;
w a term oney =0 .5 * ( w a te r-10 ) ;
if( w <=10 )
w a termoney =0 ;
pow ermoney =0 .5 * ( pow er-10 ) ;
if( p<=10 )
pow ermoney =0 ;
}
int no;
string nam e ;
string sex ;
int ag e;
double w a ter;
double pow er;
double realpow erm oney ; ///实际所交电费
double realw a term oney ;///实际所交水费
double pow erm oney ; ///应交电费
double w a term oney ;///应交电费
};
class S tudent: public Person///学生类
{
public:
string C la ss; S
tudent* nex t;
public:
S tudent( int n=0 ,string C l="",string na="",string s="",int a=0 ,double w =0 .0 ,double p=0 .0 ,double w m=0 .0 ,double pm =0 .0 )///S tudent 构造函数
: Person(n,na,s,a,w,p,w m,pm )
{
C lass=C l ;
}
void disp();
void append( S tudent* p,S tudent* q);///添加
void find( S tudent* p);///查找
void show ( S tudent* p);///显示
void edit( S tudent* p);///编辑
void del( S tudent* p);///删除
void count( S tudent* p);///统计
void save( S tudent* p);
int read( S tudent* q);
};
void S tudent:: disp()///显示一个学生信息
{
cout<<no<<'\t'<<C la ss<<'\t'<<na me<<'\t'<<se x <<'\t'<<a g e<<'\t'<<
w a ter<<'\t'<<re a lw a termoney <<'\t'<<pow er<<'\t'<<re a lpow ermoney <<endl;
}
void S tudent:: append( S tudent * p,S tudent * q)///添加记录
{
S tudent * pre=p;
w hile( p->nex t)
{
p=p->nex t;
if( p->no==q->no) ///判断所添加记录是否重复
{
cout<<"记录重复 ,添加失败 ! "<<endl;。

相关文档
最新文档