(1)在“搭建程序框架”功能迭代上进行开发,数据设计。
根据“计费管理系统”需求,分析出系统数据信息包括:卡信息、计费信息、充值退费信息、计费标准信息、管理员信息。对以上各类信息做出相应的表设计。
(2)定义卡信息变量。
步骤一:直接定义卡信息变量。
根据数据设计内容定义卡信息变量。
步骤二:用结构体定义卡信息。
卡信息的结构体类型定义如下:
//定义卡信息结构体
Typedef struct Card
{
char aName[18]; //卡号
char aPwd[8]; //密码
int nStatus; //卡状态(0-未上机;1-正在上机;2-已注销;3-失效)
time_t tStart; //开卡时间
time_t tEnd; //卡的截止时间
float fTotalUse; //累计金额
time_t tLast; //最后使用时间
int nUseCount; //使用次数
float fBalance; //余额
int nDel; //删除标识 0-未删除,1-删除
}Card;
(3)添加卡信息。
在“数据结构”的基础上进行迭代开发,添加一张新的卡,将卡信息存到结构体变量中。
卡信息包括:卡号、密码、开卡金额、卡状态、开卡时间、截止时间、最后使用时间、使用次数、累积金额和删除标识。
(4)显示卡信息。
从卡信息结构体中,获取卡号,密码,开卡金额,卡状态,并以列表方式显示。
使用printf()函数和制表符“t”,按照表格的形式显示卡号,密码,开卡金额,卡状态。
(5)保存添加的卡信息。
将添加卡的信息保存到结构体数组中,上一次迭代,是将添加的卡信息保存在卡的结构体中,这样只能保存一条卡信息。
(6)查询对应的卡信息。
根据输入的卡号,查询卡号相同的卡信息。
(7)显示查询到的卡信息。
沿用第一次的main.cpp
menu.h
菜单头文件
void outputmenu();
void add();
void query();
menu.cpp
菜单源文件
#define _CRT_SECURE_NO_WARNINGS//消除scanf警告
#include"stdio.h"
#include"stdlib.h"
#include "string.h"
#include"menu.h"
#include"card.h"
Card *card = initial();
void outputmenu() {
do {
char i;
printf("以下为本账户管理系统的菜单界面\n");
printf("1.添加卡\n");
printf("2.查询卡\n");
printf("3.上机\n");
printf("4.下机\n");
printf("5.充值\n");
printf("6.退费\n");
printf("7.查询统计\n");
printf("8.注销卡\n");
printf("0.退出\n");
printf("请输入0-8数字来进行选择\n");
scanf("%c", &i);
switch (i) {
case '0': {
exit(0);
break;
}
case '1': {
add();
break;
}
case '2': {
query();
break;
}
case '3': {
system("cls");
printf("以下为上机的菜单界面\n");
system("pause");
/*
上机
*/
break;
}
case '4': {
system("cls");
printf("以下为下机的菜单界面\n");
system("pause");
/*
下机
*/
break;
}
case '5': {
system("cls");
printf("以下为充值的菜单界面\n");
system("pause");
/*
充值
*/
break;
}
case '6': {
system("cls");
printf("以下为退费的菜单界面\n");
system("pause");
/*
退费
*/
break;
}
case '7': {
system("cls");
printf("以下为查询统计的菜单界面\n");
system("pause");
/*
查询统计
*/
break;
}
case '8': {
system("cls");
printf("以下为注销卡的菜单界面\n");
system("pause");
/*
注销
*/
break;
}
default: {
system("cls");
printf("请输入正确的1-8数字\n");
break;
}
}
} while (1);
}
void add() {
system("cls");
printf("以下为添加卡的菜单界面\n");
printf("请输入卡号(长度1-18):\n");
char no[50];
scanf("%s", no);
while (strlen(no) > 18||queryCard(card,no)!=NULL) {
if(strlen(no)>18) printf("卡号超过18位,请重新输入卡号(长度1-18):\n");
else printf("该卡号已存在请重新输入卡号(长度1-18):\n");
scanf("%s", no);
}
char pwd[30];
printf("请输入密码(长度1-8):\n");
scanf("%s", pwd);
while (strlen(pwd) > 8) {
printf("密码超过8位,请重新输入密码(长度1-8):\n");
scanf("%s", pwd);
}
float balance;
printf("请输入开卡金额(人民币):\n");
scanf("%f", &balance);
printf("添加卡的信息如下:\n");
printf("卡号\t密码\t状态\t金额\n");
printf("%s\t%s\t0\t%.1f\n", no, pwd, balance);
addCard(card, no, pwd, balance);
int i;
printf("1.继续添加\n");
printf("2.返回上级菜单\n");
printf("0.退出\n");
scanf("%d", &i);
switch (i) {
case 0: {
exit(0); break;
}
case 1: {
add(); break;
}
case 2: {
break;
}
}
}
void query() {
system("cls");
printf("以下为查询卡的菜单界面\n");
printf("请输入卡号(长度1-18):\n");
char no[50];
scanf("%s", no);
while (strlen(no) > 18 || queryCard(card, no) == NULL) {
if (strlen(no) > 18) printf("卡号超过18位,请重新输入卡号(长度1-18):\n");
else printf("该卡号不存在请重新输入卡号(长度1-18):\n");
scanf("%s", no);
}
Card *t = queryCard(card, no);
printf("查询卡的信息如下:\n");
printf("卡号\t密码\t状态\t金额\n");
printf("%s\t%s\t%d\t%.1f\n", t->aName, t->aPwd,t->nStatus,t->fBalance);
int i;
printf("1.继续查询\n");
printf("2.返回上级菜单\n");
printf("0.退出\n");
scanf("%d", &i);
switch (i) {
case 0: {
exit(0); break;
}
case 1: {
query(); break;
}
case 2: {
break;
}
}
}
card.h
卡片头文件
typedef struct Card {
char aName[18]; //卡号
char aPwd[8]; //密码
int nStatus; //卡状态(0-未上机;1-正在上机;2-已注销;3-失效)
time_t tStart; //开卡时间
time_t tEnd; //卡的截止时间
float fTotalUse; //累计金额
time_t tLast; //最后使用时间
int nUseCount; //使用次数
float fBalance; //余额
int nDel; //删除标识 0-未删除,1-删除
struct Card* next; //指向下一个卡的指针
}Card;
Card* addCard(Card *card,char no[],char pwd[],float balance);
Card* initial();
Card* queryCard(Card *card,char no[]);
card.cpp
卡片源文件
#define _CRT_SECURE_NO_WARNINGS//消除scanf警告
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "card.h"
#include "time.h"
Card* addCard(Card *card,char no[],char pwd[],float balance) {
Card *t,*s=card;
t = (Card*)malloc(sizeof(Card));
strcpy(t->aName, no);
strcpy(t->aPwd, pwd);
t->nStatus = 0;
t->tStart = time(0);
t->tEnd = time(0) + 60 * 60 * 24 * 365;
t->fTotalUse = 0;
t->fBalance = balance;
t->tLast = time(0);
t->nUseCount = 0;
t->nDel = 0;
t->next = s->next;
s->next = t;
return card;
}
Card* initial() {
Card *card;
card= (Card*)malloc(sizeof(Card));
card->next = NULL;
return card;
}
Card* queryCard(Card *card,char no[]) {
Card *t = card;
int flag = 0;
for (; t != NULL; t = t->next) {
if (strcmp(t->aName, no) == 0) {
flag = 1;
break;
}
}
if(flag) return t;
else return NULL;
}