机房收费管理系统《程序设计基础ⅱ》课程设计大学论文.docx
《机房收费管理系统《程序设计基础ⅱ》课程设计大学论文.docx》由会员分享,可在线阅读,更多相关《机房收费管理系统《程序设计基础ⅱ》课程设计大学论文.docx(91页珍藏版)》请在冰豆网上搜索。
![机房收费管理系统《程序设计基础ⅱ》课程设计大学论文.docx](https://file1.bdocx.com/fileroot1/2023-1/31/dc0687be-1912-4b16-9850-953b0024e13d/dc0687be-1912-4b16-9850-953b0024e13d1.gif)
机房收费管理系统《程序设计基础ⅱ》课程设计大学论文
东莞理工学院
课程设计报告
课程名称《程序设计基础Ⅱ》课程设计
题目机房收费管理系统
院系名称计算机学院
专业班级计科1班
学生学号
学生姓名
指导教师
完成时间
1、系统分析………………………………………………………………………………………
1.1功能需求分析………………………………………………………………………………
1.2数据需求分析………………………………………………………………………………
2、系统设计………………………………………………………………………………………
2.1函数调用关系设计…………………………………………………………………………
2.2函数设计……………………………………………………………………………………
3、系统编码…………………………………………………………………………………………
3.1程序文件模块……………………………………………………………………………
3.2程序代码…………………………………………………………………………………
4、系统调试与运行…………………………………………………………………………………
5、总结……………………………………………………………………………………………
5.1自我评价及收获……………………………………………………………………………
5.2有待解决的问题及进一步完善的思路……………………………………………………
6、参考文献…………………………………………………………………………………………
1.系统分析
1.1功能需要分析
开发设计一个机房收费管理软件,要求系统具有如下功能:
功能介绍
序号
模块
功能
说明
1
*卡管理
*添加卡
输入卡号、密码、开卡金额等卡信息,将卡信息保存到data文件夹的card.txt文件中
2
*查询卡
根据输入的卡号,查询卡号相同的卡信息,并以表格形式显示在控制台中
3
*注销卡
根据输入的卡号、密码,将对应卡的状态改为注销,注销卡不能进行上机
4
计费标准管理
新增计费标准
输入计费标准的信息,将输入的计费标准保存到data文件夹的rate.txt文件中
5
查询计费标准
根据上机时间,查询对应的计费标准
6
删除计费标准
从计费标准文件data文件夹的rate.txt文件中,删除一条计费标准
7
修改计费标准
修改一条计费标准
8
计费管理
上机
根据输入的卡号、密码,判断该卡能否上机,如果能上机,则保存计费信息
9
下机
根据输入下机卡的卡号,进行下机结算操作
10
*费用管理
*充值
给一条已经存在的卡进行充值。
11
*退费
将卡中余额返回给用户
12
查询统计
查询消费记录
查询一张卡在一段时间内的消费记录
13
统计总营业额
统计一段时间内,总营业额
14
统计月营业额
统计一年中,每个月上机次数、总营业额,将统计结果保存到文本文件中,并以列表形式显示在控制台中。
15
权限管理
*添加管理员
超级管理员添加一个管理员信息
16
*删除管理员
超级管理员删除一个管理员信息
17
配置权限
添加管理员时,配置管理员的权限
18
*系统
*登录
超级管理员和管理员登录系统
19
*退出
超级管理员和管理员退出系统
1.2数据需要分析
卡数据、管理员数据、计费标准数据是系统管理的主要数据,包括卡号、密码、余额、管理员账号、管理员密码、管理员权限、计费标准。
2.系统设计
2.1函数调用关系设计
系统分为六个模块,分别为卡管理、费用管理、权限管理、计费标准管理、计费管理、查询统计六个模块,每个模块分为2或3个子模块,每个子模块完成一项功能
2.2函数设计
主函数
。
功能:
读取文件信息,建立卡信息链表、管理员信息、计费标准链表。
判断管理员类型。
实现菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单。
。
返回值:
void
。
函数名:
main
。
形参表:
FILE*fp;
structcard*cardhead=NULL,*p3,*p4=NULL;
structmanager*managerhead=NULL,*p1,*p2=NULL;
structcharging_standard*standardhead=NULL,*p5,*p6=NULL;
intl=0,n,i=1,j=1,sel,flag=0,m,f,index;
charmanagernum[40],password[40];
。
算法:
定义文件指针fp、链表指针p1,p2和相关变量;
以“读”方式打开本文文件card.txt;
循环从文件读取卡信息,存入链表,直至文件结束;
while(!
feof(fp)){
。
开辟一个新节点:
让p1指向新结点,并令p1->next为NULL;
。
从文件将卡信息读入结点的数据域;
。
若为首结点,则令cardhead、p2均指向首结点,否则,把p1指向的新结点连接到表尾(则p2->next=p1)。
。
令p2指向新的表尾结点。
}
以相同方式建立管理员信息链表和计费标准链表。
依据输入的管理员类型判断是否与管理员信息链表中的信息相符,相符则依据管理员类型显示不同的菜单功能,不相符则返回。
主函数提供菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单(即分支调用函数card_manage(cardhead);cost_manage(cardhead);power_manage(managerhead)、standard_manage(standardhea)、count_cost_manage(cardhead)、query_count(cardhead);),直到选择“退出”为止。
由于循环次数未知,选while语句实现。
算法用类while结构描述如下:
while
(1){
显示菜单;
输入菜单选项;
选择执行菜单:
即分支调用input_score()、edit_score()、del_score()、count_sel()、print_sorce()或退出;
}
卡管理函数
。
功能:
实现菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单。
。
返回值:
无
。
函数名:
card_manage
。
形参表:
sel
。
算法:
提供菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单(即分支调用函数提供菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单(即分支调用函数add_card(cardhead);、query_card(cardhead);、delete_card(cardhead);),直到选择“退出”为止。
由于循环次数未知,一般选while语句实现。
算法用类while结构描述如下:
while
(1){
显示菜单;
输入菜单选项;
选择执行菜单:
即分支调用add_card(cardhead);、query_card(cardhead);、delete_card(cardhead);或退出;
}
权限管理函数
。
功能:
实现菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单。
。
返回值:
无
。
函数名:
power_manage
。
形参表:
sel
。
算法:
提供菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单(即分支调用函数提供菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单(即分支调用函数add_manager(managerhead);、delete_manage(managerhead);),直到选择“退出”为止。
由于循环次数未知,一般选while语句实现。
算法用类while结构描述如下:
while
(1){
显示菜单;
输入菜单选项;
选择执行菜单:
即分支调用add_manager(managerhead);、delete_manage(managerhead);或退出;
}
费用管理函数
。
功能:
实现菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单。
。
返回值:
无
。
函数名:
cost_manage
。
形参表:
sel
。
算法:
提供菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单(即分支调用函数提供菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单(即分支调用函数recharge(cardhead);、drawback(cardhead);),直到选择“退出”为止。
由于循环次数未知,一般选while语句实现。
算法用类while结构描述如下:
while
(1){
显示菜单;
输入菜单选项;
选择执行菜单:
即分支调用recharge(cardhead);、drawback(cardhead);;或退出;
}
计费管理函数
。
功能:
实现菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单。
。
返回值:
无
。
函数名:
count_cost_manage
。
形参表:
sel
。
算法:
提供菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单(即分支调用函数提供菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单(即分支调用函数oncpt(cardhead);、offcpt(cardhead);),直到选择“退出”为止。
由于循环次数未知,一般选while语句实现。
算法用类while结构描述如下:
while
(1){
显示菜单;
输入菜单选项;
选择执行菜单:
即分支调用oncpt(cardhead);、offcpt(cardhead);或退出;
}
查询统计函数
。
功能:
实现菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单。
。
返回值:
无
。
函数名:
query_count
。
形参表:
sel
。
算法:
提供菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单(即分支调用函数提供菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单(即分支调用函数query_cost_record(cardhead)、query_countmoney(cardhead)、count_year_money(cardhead);),直到选择“退出”为止。
由于循环次数未知,一般选while语句实现。
算法用类while结构描述如下:
while
(1){
显示菜单;
输入菜单选项;
选择执行菜单:
即分支调用query_cost_record(cardhead)、query_countmoney(cardhead)、count_year_money(cardhead);或退出;
}
计费标准管理函数
。
功能:
实现菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单。
。
返回值:
无
。
函数名:
standard_manage
。
形参表:
sel
。
算法:
提供菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单(即分支调用函数提供菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单(即分支调用函数query_charging_standard(standardhead);、add_charging_standard(standardhead);、delete_charging_standard(standardhead);、re_charging_standard(standardhead);),直到选择“退出”为止。
由于循环次数未知,一般选while语句实现。
算法用类while结构描述如下:
while
(1){
显示菜单;
输入菜单选项;
选择执行菜单:
即分支调用query_charging_standard(standardhead)、add_charging_standard(standardhead)、delete_charging_standard(standardhead)、re_charging_standard(standardhead)或退出;
}
计费标准管理函数
。
功能:
实现菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单。
。
返回值:
无
。
函数名:
standard_manage
。
形参表:
sel
。
算法:
提供菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单(即分支调用函数提供菜单功能,即循环显示菜单、输入菜单选项、选择执行菜单(即分支调用函数query_charging_standard(standardhead);、add_charging_standard(standardhead);、delete_charging_standard(standardhead);、re_charging_standard(standardhead);),直到选择“退出”为止。
由于循环次数未知,一般选while语句实现。
算法用类while结构描述如下:
while
(1){
显示菜单;
输入菜单选项;
选择执行菜单:
即分支调用query_charging_standard(standardhead)、add_charging_standard(standardhead)、delete_charging_standard(standardhead)、re_charging_standard(standardhead)或退出;
}
添加卡函数
。
功能:
向卡信息链表添加一个新的包含卡信息的结点,最后返回链表头指针;
。
返回值:
cardhead
。
函数名:
add_card
。
形参表:
structcard*newcard,*p1;
intm;
。
算法:
开辟一个新结点:
让newcard指向新结点,并令newcard->next为NULL;
输入新结点的数据域数据;
判断原链表是否为空,若为空,则将newcard指向的结点插入到cardhead之后并置该结点指针域为NULL;否则将newcard指向的结点插入到链表尾结点。
if(cardhead->countmoney<0){cardhead=newcard;cardhead->next=NULL;}//判断文件是否为空
else{
p1=cardhead;
while(p1->next!
=NULL)p1=p1->next;//将结点插入链表
p1->next=newcard;
newcard->next=NULL;
查询卡函数
。
功能:
根据输入的卡号,查询卡号相同的卡信息,并以表格形式显示在控制台中
。
返回值:
cardhead
。
函数名:
query_card
。
形参表:
intj=1,n;
structcard*p1;
charcardnum[40];
。
算法:
。
定义1个structcard结构体指针变量p1,设置p初值为cardhead;
。
根据卡号cardnum,从链表头开始顺序查找卡信息,直到找到或链表结束。
查找结点:
描述如下while(p1!
=NULL&&strcmp(cardnum,p1->cardnum)!
=0){
p1=p1->next;//查找卡号所在结点
}
显示数据:
描述如下if(p1!
=NULL)printf("%s%s%d\n",p1->cardnum,p1->cardpassword,p1->money);
注销卡函数
。
功能:
根据输入的卡号,删除链表中指定位置的结点,最后返回链表头指针;
。
返回值:
cardhead
。
函数名:
delete_card
。
形参表:
inti=1,j=1,n;
structcard*p1,*p2=NULL;
charcardnum[40],cardpassword[40];
。
算法:
。
定义2个structcard结构体指针变量p1和p2,设置p1初值为cardhead,p2初值为NULL。
。
根据卡号cardnum,从链表头开始顺序查找卡信息,直到找到或链表结束。
。
查找结点:
描述如下p1=cardhead;
while(p1!
=NULL&&(n=cardnum-p1->cardnum)!
=0){
p2=p1;p1=p1->next;
}
。
删除结点:
描述如下if(p1!
=NULL){
if(strcmp(p1->cardpassword,cardpassword)==0){
if(strcmp(p1->cardnum,cardhead->cardnum)==0)cardhead=p1->next;////删除卡号所在结点
elsep2->next=p1->next;
free(p1);//释放空间
j++;
}
elsei++;
}
if(j!
=1)printf("注销成功!
按回车键返回。
");
if(i!
=1)printf("密码错误!
按回车键返回。
");
if(p1==NULL)printf("操作失败!
无此卡信息,按回车键返回。
");
新增计费标准函数
。
功能:
在计费标准链表插入一个结点,最后返回链表头指针;
。
返回值:
standardhead
。
函数名:
add_charging_standard
。
形参表:
structcharging_standard*newstandard,*p1;
。
算法:
开辟一个新结点:
让newstandard指向新结点,并令newstandard->next为NULL;
输入新结点的数据域数据;
判断原链表是否为空,若为空,则将newstandard指向的结点插入到cardhead之后并置该结点指针域为NULL;否则将newcard指向的结点插入到链表尾结点。
用伪代码表示如下if(standardhead->num<0){standardhead=newstandard;standardhead->next=NULL;}
else{
p1=standardhead;
while(p1->next!
=NULL)p1=p1->next;
p1->next=newstandard;
newstandard->next=NULL;
}
查询计费标准函数
。
功能:
读取计费标准文件中的数据,并且显示在控制台上。
。
返回值:
standardhead
。
函数名:
query_charging_standard
。
形参表:
structcharging_standard*p1;
。
算法:
定义1个structcharging_standard结构体指针变量p1,设置p初值为standardhead;
逐个显示计费标准直到链表结束。
用伪代码表示如下:
while(p1->next!
=NULL){
printf("%d%s\n",p1->num,p1->ch);
p1=p1->next;
}
删除计费标准函数
。
功能:
根据输入的编号,删除链表中指定位置的结点,最后返回链表头指针。
。
返回值:
standardhead
。
函数名:
delete_charging_standard
。
形参表:
intj=1,n,num;
structcharging_standard*p1,*p2=NULL;;
。
算法:
定义2个structcharging_standard结构体指针变量p1和p2,设置p1初值为cardhead,p2初值为NULL。
。
根据编号num,从链表头开始顺序查找计费标准信息,直到找到或链表结束。
查找结点:
描述如下p1=standardhead;
while(p1!
=NULL&&(n=num-p1->num)!
=0){
p2=p1;p1=p1->next;
}
删除结点:
描述如下if(p1!
=NULL){
if(p1->num==standardhead->num)standardhead=p1->next;
elsep2->next=p1->next;
free(p1);
j++;
}
if(j!
=1)printf("删除成功!
按回车键返回。
");
if(p1==NULL)printf("操作失败!
无计费标准信息,按回车键返回。
");
修改计费标准函数
。
功能:
根据输入的编号,重新输入链表中指定位置的结点的数据域的数据,最后返回链表头指针。
。
返回值:
standardhead
。
函数名:
re_charging_standard
。
形参表:
intj=1,n,num;
charch[200];
structcharging_standard*p1,*p2=NULL;
。
算法:
定义2个structcharging_standard结构体指针变量p1和p2,设置p1初值为cardhead,p2初值为NULL。
定义char型变量储存新的计费标准。
查找结点:
描述如下p1=standardhead;
while(p1!
=NULL&&(n=num-p1->num)!
=0){
p2=p1;p1=p1->next;
}
修改数据域:
描述如下p1=standardhead;
while(p1!
=NULL&&(n=num-p1->num)!
=0){
p2=p1;p1=p1->next;
}
if(p1!
=NULL){
strcpy(p1->ch,ch);
j++;
}
if(j!
=1)printf("修改成功!
按回车键返回。
");
if(p1==NULL)printf("操作失败!
无此计费标准信息,按回车键返回。
");
上机函数
。
功能:
根据输入的卡号,修改链表中指定位置的结点的数据域的数据,最后返回链表头指针。
。
返回值:
cardhead
。
函数名:
oncpt
。
形参表:
structtm*local;
inti=1,j=1,n;
structcard*p1,*p2=NULL;
charcardnum[40],cardpassword[40]
。
算法:
定义int型变量cardnum,cardpassword,定义2个structcard结构体指针变量p1,p2.定义时间结构体指针local
根据卡号和密码,判断是否能上机,若能上机则将记录当月上机次数的数据加1:
描述如下p1=cardhead;
while(p1!
=NULL&&(n=cardnum-p1->cardnum)!
=0){
p2=p1;p1=p1->next;
}
if(p1!
=NULL){
if(p1->cardpassword==cardpassword){
if(p1->money>0){
j++;
p1->count=p1->count+1;
time_tt;
t=time(NULL);
local=localtime(&t);
p1->on[local->tm_mon]=p1->on[local->tm_mon]+1;
}
elseprintf("该卡欠费%d元,请先缴纳欠费!
按回车键返回。
",-p1->money);
}
elsei++;
}
if(j!
=