资源描述
C++ 课程设计报告
题 目: 水费管理系统——水费基本信息管理、查询、统计、存盘 和收费管理
学生姓名:
学 号:
专业班级:
同组姓名:
指导教师:
设计时间: 2008年下学期第15~16周
指导老师意见:
评定成绩: 签名: 日期:
1 系统(项目)设计
1.1 系统功能模块图
通过查阅相关资料和仔细分析,得出系统功能模块图如图1所示。系统主要由用户信息管理、收费管理、查询与统计、存盘等几个功能模块组成,我负责的是收费管理、查询与统计、存盘功能。
其中收费管理包括用户本月用水量、本月所收水费、收费时间,查询与统计包括用户信息查询与收费查询与统计,存盘包括用户信息和收费信息存盘。
图 1 水费管理系统模块
水 费 管 理 系 统
时间
收费时间
本月收水费
统计
水费
查询
本月用水量
添加
删除
修
改
编号
时
间
查询.统计
用户信息管理
收 费 管 理
记 录
1.2 系统登陆模块
系统登陆模块主要完成系统登陆和系统退出功能。其详细流程图如图2所示。
1、 密码输入;
2、 判断密码的正确与否,即当前用户是否具有进入系统运行的权限;
3、 主菜单中选择1、2、3、4,分别进入用户基本信息管理、收费管理、查询与统计、存盘操作;
4、 密码错误或主菜单中选择0,退出程序;
准 备
登 录 系 统
输 入 密 码
判 断 权 限
主 菜 单
操 作
是
否
0
1
2
3
4
子 菜 单
操 作
退 出
图 2 水费管理系统流程图
1.3 收费管理
收费管理模块主要完成对用户进行收费的功能,该模块包含用户本月所收水费、存盘等功能。其流程图如图3所示。
1.3.1 子菜单2模块
1、从子菜单2中选择1、2分别进入本月所收水费、存盘操作;
2、选择0,返回主菜单。
主菜单
操作
0
退出
子菜单2
2
操作选择
1
2
进入收费管理操作
0
0
图 3 子菜单2流程图
1.3.2 本月所收水费模块
该模块主要完成对用户本月收取水费的功能,其流程图如图 4所示。
1. 进入子菜单 2中选择 1,进行用户信息的添加;
2. 键盘输入要收水费用户的编、名称、收费时间和本月用水量,计算对该用户所收水费;
3. 一次用户信息输入完成,系统回到上一级菜单,提示存盘;
4. 输入2,进行存盘。
子菜单2
1
添加用户信息
键盘输入
计算水费
图 4 本月所收水费流程图
1.3.3 存盘模块
该模块主要完成用户收费信息的存盘,详情见流程图 5.所示。
1、 子菜单2中选择2,进行添加用户信息和所收水费存盘;
2、 继续输入用户信息或返回上级菜单。
图 5 存盘操作流程图
存 盘
计算水费
键盘输入
1
添加用户信息
子菜单 2
1.4 查询与统计模块
查询、统计模块主要完成对用户基本信息的和收费信息的查询和统计的功能,详情见流程图 6所示。
1、 从主菜单中选择3,进入查询与统计子菜单 3;
2、 从子菜单中选择1、2分别进行用户基本信息查询和收费记录的统计;
3、 输入要查询用户的名称或编号,系统从consumer文本文档中找到要查询用户的基本信息,屏幕输出信息,返回子菜单 3;
4、 输入要查询用户收费记录的日期,系统从charge文本文档中找到该用户信息及收费记录,在屏幕上输出,返回子菜单 3;
5、 如果没找到该用户信息,返回子菜单 3。
主菜单操作
退出
0
3
子菜单 3
1. 用户信息查询
2. 用户收费记录统计
输入查询条件
是否找到信息
是
屏幕输出用户信息或收费记录
否
0
图 6 查询与统计模块流程图
2 程序源代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fstream.h>
#include <iostream.h>
#define NULL 0
//定义用户基本信息类
由组员郭文君完成
//定义收费信息类
class charge{
char * name; //用户名称
char * kind; //用户类型
float volumn; //本月用水量
float money; //本月所收水费
char * time; //收费时间
public:
static int i; //交费次数
charge * next;//指向charge类对象的指针
charge(char * n,char * k,float v,float m,char * t)
{
name=new char[strlen(n)+1];
strcpy(name,n);
kind=new char[strlen(k)+1];
strcpy(kind,k);
volumn=v;
money=m;
time=new char[strlen(t)+1];
strcpy(time,t);
++i;
}
charge()
{
name=new char[10];
kind=new char[10];
volumn=0;
money=0;
time=new char[10];
++i;
}
~charge()//析构函数
{
--i;
delete []kind;
delete []name;
delete []time;
}
char *getname()
{
return name;
}
char *getkind()
{
return kind;
}
float getvolumn()
{
return volumn;
}
float getmoney()
{
return money;
}
char *gettime()
{
return time;
}
void setname(char *x)//用成员函数修改私有数据成员
{
strcpy(name,x);
}
void setkind(char *y)
{
strcpy(kind,y);
}
void setvolumn(float z)
{
volumn=z;
}
void setmoney(float p)
{
money=p;
}
void settime(char *q)
{
strcpy(time,q);
}
//声明运算符重载函数为charge类的友元函数
friend ostream & operator<< (ostream & os, charge &ob);
friend istream & operator>> (istream & is, charge &ob);
};
int charge::i=0;
//*重载<<运算符函数 *
ostream & operator << (ostream & os,charge &ob)
{
os<<ob.name<<" "<<ob.kind<<" "<<ob.volumn<<" "<<ob.money<<" "<<ob.time<<" ";
return os;
}
//*重载>>运算符函数 *
istream & operator >> (istream & is,charge &ob)
{
is>>ob.name;
is>>ob.kind;
is>>ob.volumn;
is>>ob.money;
is>>ob.time;
return is;
}
consumer *head=NULL;//用户信息类链表头初始化
charge *link=NULL; //收费标准类链表头
void load()//从硬盘读取用户基本信息
void save() //将用户信息存入硬盘
由组员郭文君完成
void Cload() //从硬盘读取收费信息
{
ifstream fin("charge.txt",ios::in|ios::nocreate);
if(!fin)
{
cout<<"不能打开文件"<<endl<<endl;
exit(0);
}
else
{
int count,x;
fin>>count; //读入收费类型数
x=1;
while(x<=count)
{
charge *temp= new charge;
fin>>*temp; //读入一个用户收费记录到内存
//将用户记录插入内存链表
if(link == NULL) //链表为空
{
link = temp;
temp->next=NULL;
}
else //将新节点插入到头结点之前
{
temp->next = link;
link=temp;
}
x++;
}
charge::i=count;
if(link == NULL) charge::i=0;
}
fin.close();
}
void Csave() //将用户收费信息存入硬盘
{
if(link==NULL) Cload();
ofstream fout("charge.txt",ios::out);
//存入用户收费记录总条数,以控制读取收费记录时的循环次数
fout<<charge::i<<" ";
charge *p=link;
while(p!=NULL)
{
fout<<*p;
p=p->next;
}
fout.close();
link=NULL;
cout<<"收费信息保存成功!"<<endl<<endl;
}
//**用户基本信息管理***
由组员郭文君完成
void sub2()//子菜单2
{
int x;
while(x)
{
void sub21();
cout<<"****水量使用管理****"<<endl;
cout<<"********************"<<endl;
cout<<"*1>本月所交水费 *"<<endl;
cout<<"*2>存盘 *"<<endl;
cout<<"*0>返回主菜单 *"<<endl;
cout<<"********************"<<endl;
cout<<"*请选择:";
cin>>x;
if(x>=0&&x<=2)
{
switch(x)
{
case 1:sub21();break;
case 2:Csave();break;
case 0:return;
}
}
else
cout<<"选择有误,请重新选择!"<<endl<<endl;
}
}
void sub21()
{
char N[20];
char L[20];
char K[20];
float V;
char D[20];
float P;
float sum;
cout<<"请输入用户编号:";
cin>>L;
cout<<"请输入用户类型:";
cin>>K;
cout<<"请输入收费月份:";
cin>>D;
cout<<"请输入本月用水量:";
cin>>V;
if(head == NULL) load();
consumer * ptr=head;
while(ptr!=NULL)
{
if(strcmp(ptr->getnum(),L)!=0)
ptr=ptr->next;
else
{
P=ptr->getprice();
strcpy(N,ptr->getname());
break;
}
}
charge *temp=new charge(N,K,V,P,D);
if(link ==NULL) Cload();
if(link==NULL)
{
link=temp;
temp->next=NULL;
}
else
{
temp->next=link;
link=temp;
}
sum=V*P;
cout<<"用户"<<N<<" "<<D<<"的用水量为:"<<V<<"吨。"<<endl;
cout<<"本月水费:"<<sum<<"元。"<<endl<<endl;
charge::i++;
cout<<"用户"<<N<<" "<<D<<"水费记录完成,储存请选择存盘!"<<endl<<endl;
}
//*3 查询、统计*
// 子菜单3
void sub3()
{
int x;
while(1)
{
void sub31(); //函数原型声明
void sub32(); //函数原型声明
cout<<"******查询、统计******"<<endl;
cout<<"**********************"<<endl;
cout<<"*1>用户信息查询; *"<<endl;
cout<<"*2>收费记录统计; *"<<endl;
cout<<"*0>返回主菜单; *"<<endl;
cout<<"**********************"<<endl;
cout<<"*请选择:";
cin>>x;
if(x>=0&&x<=2)
{
switch(x)
{
case 1:sub31();break;
case 2:sub32();break;
case 0:return;
}
}
else cout<<"选择有误,请重新选择!"<<endl<<endl;
}
}
void sub31()//用户信息查询
{
void sub311();
void sub312();
int x;
cout<<"******用户信息查询******"<<endl;
cout<<"************************"<<endl;
cout<<"*1>根据用户名称查询; *"<<endl;
cout<<"*2>根据用户编号查询; *"<<endl;
cout<<"*0>返回上一菜单; *"<<endl;
cout<<"************************"<<endl;
cout<<"*请选择:";
cin>>x;
if(x>=0&&x<=2)
{
switch(x)
{
case 1:sub311();break;
case 2:sub312();break;
case 0:return;
}
}
else cout<<"选择有误,请重新选择!"<<endl<<endl;
}
void sub311() //根据用户名称查询
{
char N[20];
consumer *p;
cout<<"请输入要查找用户的名称:"<<endl;
cin>>N;
if(head==NULL) load();
p=head;
while(p!=NULL)
{
if(strcmp(p->getname(),N)==0)
{
cout<<"*所查找用户的名称:"<<p->getname()<<endl;
cout<<"*用户的编号: "<<p->getnum()<<endl;
cout<<"*该用户所属类型: "<<p->getkind()<<endl;
cout<<"*该用户类型的价格 "<<p->getprice()<<endl;
return ;
}
p=p->next;
}
cout<<"该用户不存在!"<<endl;
return ;
}
void sub312()//按编号查找
{
char M[20];
consumer *q;
cout<<"请输入要查找用户的编号:"<<endl;
cin>>M;
if(head==NULL) load();
q=head;
while(q!=NULL)
{
if(strcmp(q->getnum(),M)==0)
{
cout<<"*所查找用户的名称:"<<q->getname()<<endl;
cout<<"*用户的编号: "<<q->getnum()<<endl;
cout<<"*该用户所属类型: "<<q->getkind()<<endl;
cout<<"*该用户类型的价格 "<<q->getprice()<<endl;
return ;
}
q=q->next;
}
cout<<"该用户不存在!"<<endl;
return ;
}
void sub32() //收费记录统计
{
char D[20];
cout<<"******收费记录统计******"<<endl;
cout<<"请输入要查询的时间(时间格式:2008/08):";
cin>>D;
if(link==NULL) Cload();
charge *p=link;
while(p!=NULL)
{
if(strcmp(p->gettime(),D)==0)
{
cout<<p->getname()<<" "<<D<<"的用水量为:"<<p->getvolumn()<<"吨。"<<endl;
cout<<"本月水费:"<<p->getmoney()*p->getvolumn()<<"元。"<<endl;
cout<<endl;
p=p->next;
}
else p=p->next;
}
}
//***主函数****
int main()
{
int i;
char pwd[10];
int count=0;
while(1)
{
cout<<"请输入密码:";
cin>>pwd;
if(strcmp(pwd,"water")!=0)//密码错误
{
cout<<"密码错误,请重新输入!"<<endl;
count++;
}
else break;//密码正确
if(count == 3)
{
cout<<"密码已输错三次!请重新运行程序!"<<endl;
return 0;
}
}
while(1)//主菜单
{
cout<<"**** 总管理系统 ****"<<endl;
cout<<"********************"<<endl;
cout<<"*1>用户信息管理; *"<<endl;
cout<<"*2>水费信息管理; *"<<endl;
cout<<"*3>查询、统计; *"<<endl;
cout<<"*4>存盘; *"<<endl;
cout<<"*0>退出; *"<<endl;
cout<<"********************"<<endl;
cout<<"请选择:";
cin>>i;
switch(i)
{
case 1:sub1();break;
case 2:sub2();break;
case 3:sub3();break;
case 4:save();Csave();break;
case 0:return 0;
}
}
}
3系统测试
系统各功能的运行时界面及使用说明。
1、 程序运行主菜单
图 7 主菜单
3、 收费管理功能
图 8 收费管理菜单
4.输入水费用户信息
图 9 用户信息输入
4、 计算水费并输出
图 10 计算并输出该用户水费信息
6、 存盘并返回上级菜单
图 11 水费信息存盘
7、 查询和统计功能
图 12 查询、统计菜单
8、 用户信息查询
图 13 用户信息查询
9、 由名称查询
图 13 由名称查询
10、由编号查询
图 14 编号查询
11、收费记录统计
图 15 收费记录统计
12 、存盘
图 16 用户信息收费信息存盘
13、退出系统
图 17 退出系统
4 小结
在这次课程设计课程之前,学习C语言和C++过程中,我所遇到的都是一些简单的程序,写的也是些简单的函数程序,在实验课中才自己进行编写一些简单程序,以此巩固自己的基本知识,从中积累了些自己编程时间的知识。
在这次15、16周的课程设计过程中,第一次接触复杂的程序,并且要自己进行编写和修改并运行测试,从中学到了很多东西,认识到以前对变成语言的认识不足,从中也看到了自己的很多不足,希望以后能去努力改正并多学习。首先最重要的一点就是很难处理较复杂程序,看到一个程序后不知道该从哪方面着手,不懂得去分析这个程序及需要用到哪方面的知识,必须要在老师的知道下才能有些思路。另外在分模块方面也遇到了不少麻烦,不知道如何划分模块,并把整个程序的框架整理好,对这方面以后要重点学习加强。
不过在这两周课程设计还是学到了不少东西,链表是这次课程设计中最重要的环节,通过这次学习,基本掌握了链表的使用,对文件的读写也有了一定的了解。还熟练掌握了流程图的制作以及截图操作,对Word文档使用也比较的熟练了。
在课程实际过程中,花了不少时间,学到了不少东西。感谢易明老师在课程实际过程中的指导。
5 参考文献
课程设计过程中所查阅的书籍、网站等。
[1] 谭浩强编著.C语言程序设计.--北京:清华大学出版社,2000.1(2007.5重印).338页
[2] 陈维兴,林小茶编著.C++面向对象程序设计.--2版.--北京:清华大学出版社,2004.8(2007重印).277页
[3] 刘振安等编著.C++课程设计.--北京:机械工业出版社,2007.1.224页
24 / 24
展开阅读全文