C语言综合实验(三)之计费管理系统的文件存储管理

  • Post author:
  • Post category:其他




实验内容

(1)搭建三层架构

① 在数据访问层实现添加卡,在card_file.c文件中,定义saveCard()函数

② 在业务逻辑层实现添加卡,修改addCard()函数,在此函数中调用数据访问层里的saveCard函数,保存卡信息。

③ 在表示层实现添加卡

④ 编译并运行程序

(2)在数据访问层,实现用文件保存添加的卡

① 实现saveCard()函数,将卡信息保存到文件。

② 调用saveCard函数,将添加的卡信息保存到工程目录下的card.txt文件

(3)读取文件中的卡信息

① 在card_file.c文件中,定义readCard()函数

② 编写readCard()函数,实现从文件中读取卡信息的功能

③编译并运行程序

(4)解析读取的卡信息

①在card_file.c文件中,定义praseCard()函数

②编写praseCard()函数,实现解析卡信息字符串的功能

③在tool.c文件中,定义stringToTime()函数

④编写stringToTime()函数,将字符串转换为time_t类型的数据

⑤在praseCard()函数中,调用stringToTime()函数

⑥在readCard()函数中,调用praseCard()函数

⑦编译并运行程序

(5)根据卡号查询卡信息

沿用第一次的main.cpp

沿用第二次的menu.h

沿用第二次的card.h

menu.cpp

菜单源文件

#define _CRT_SECURE_NO_WARNINGS//消除scanf警告
#include"stdio.h"
#include"stdlib.h"
#include "string.h"
#include"menu.h"
#include"card.h"
#include"card_file.h"
#include"time.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");
			/*
			查询统计
			*/ 
			break;
		}
		case '8': {
			system("cls");
			printf("以下为注销卡的菜单界面\n");
			/*
			注销卡
			*/ 
			break;
		}
		default: {
			system("cls");
			printf("请输入正确的1-8数字\n");
			break;
		}
		}
	} while (1);
}
void add() {
	system("cls");
	card=readCard();
	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");
	card=readCard();
	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累计使用\t使用次数\t上次使用时间\n");
	struct tm *p = localtime(&t->tLast);
	printf("%s\t%d\t%.1f\t%.1f\t\t%d\t", t->aName, t->nStatus,t->fBalance,t->fTotalUse,t->nUseCount);
	printf("%4d-", p->tm_year + 1900);
	printf("%02d-", p->tm_mon + 1);
	printf("%02d ", p->tm_mday);  
	printf("%02d:%02d:%02d\n", p->tm_hour, p->tm_min, p->tm_sec);
	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.cpp

卡处理源文件

#define _CRT_SECURE_NO_WARNINGS//消除scanf警告
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "card.h"
#include "card_file.h"
#include "time.h"
void addCard(Card *card,char no[],char pwd[],float balance) {
	Card *t;
	t = (Card*)malloc(sizeof(Card));
	strcpy(t->aName, no);
	strcpy(t->aPwd, pwd);
	t->nStatus = 0;
	t->fTotalUse = 0;
	t->fBalance = balance;
	t->nUseCount = 0;
	t->nDel = 0;
	t->next = card->next;
	card->next = t;
	saveCard(t);
}
Card* initial() {
	Card *card;
	card= (Card*)malloc(sizeof(Card));
	card->next = NULL;
	return card;
}
Card* queryCard(Card *card,char no[]) {
	Card *t = card->next;
	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;
}

card_file.h

卡文件处理头文件

#include "card.h"
void saveCard(Card *card);
Card* readCard();

card_file.cpp

卡文件处理源文件

#define _CRT_SECURE_NO_WARNINGS//消除scanf警告
#include "stdio.h"
#include"stdlib.h"
#include "card.h"
#include "time.h"
#include "string.h"
#include "tool.h"
void saveCard(Card *card) {
	FILE *file;
	time_t t = time(NULL);
	struct tm *p = localtime(&t);
	if ((file = fopen("C:\\Users\\HU\\Desktop\\card.txt", "a")) != NULL) {
		fprintf(file, "%s\t%s\t%d\t%4d%02d%02d-%02d:%02d:%02d\t%4d%02d%02d-%02d:%02d:%02d\t%.1f\t%4d%02d%02d-%02d:%02d:%02d\t%d\t%.1f\t%d\n",
			card->aName, card->aPwd, card->nStatus, p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec,
			p->tm_year + 1901, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, card->fTotalUse,
			p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, card->nUseCount, card->fBalance, card->nDel);
	}
	else printf("文件打开失败!\n");
	fclose(file);
}
Card* readCard() {
	Card *card = initial();
	FILE *file;
	file = fopen("C:\\Users\\HU\\Desktop\\card.txt", "a");  //如果文件不存在则创建一个文件
	fclose(file);
	char time_start[50],time_end[50],time_last[50];
	//time_t t_start, t_end, t_last;
	if ((file = fopen("C:\\Users\\HU\\Desktop\\card.txt", "r")) != NULL) {
		while (!feof(file)) {
			Card *t;
			t = (Card*)malloc(sizeof(Card));
			if(fscanf(file, "%s %s %d %s %s %f %s %d %f %d",
				t->aName, t->aPwd, &t->nStatus, time_start, time_end,
				&t->fTotalUse, time_last, &t->nUseCount, &t->fBalance, &t->nDel)==EOF) break;
			t->tStart = stringToTime(time_start);
			t->tEnd = stringToTime(time_end);
			t->tLast = stringToTime(time_last);
			/*t_start = t->tStart;
			//t_end = t->tEnd;
			//t_last = t->tLast;
			//struct tm *p = localtime(&t_start);
			//printf("%s\t%s\t%d\t", t->aName, t->aPwd, t->nStatus);
			//printf("%4d%02d%02d-%02d:%02d:%02d\t", p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
			//p = localtime(&t_end);	
			//printf("%4d%02d%02d-%02d:%02d:%02d\t", p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
			//printf("%.1f\t", t->fTotalUse);
			//p = localtime(&t_last);	
			//printf("%4d%02d%02d-%02d:%02d:%02d\t", p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
			//printf("%d\t%.1f\t%d\n", t->nUseCount,t->fBalance,t->nDel);
			*/
			t->next = card->next;
			card->next = t;
		}
	}
	else {
		printf("文件读取失败!");
	}
	fclose(file);
	return card;
}

tool.h

工具头文件(可以不创建,将函数定义写在card_file.h里)

#include"stdio.h"
time_t stringToTime(char s[]);

tool.cpp

工具源文件(可以不创建,将函数实现写在card_file.cpp里)

#include"stdio.h"
#include"time.h"
time_t stringToTime(char s[]) {
	time_t t;
	struct tm tm1;
	int year, mon, day, hour, min, sec;
	tm1.tm_year = (s[0] - '0') * 1000 + (s[1] - '0') * 100 + (s[2] - '0') * 10 + s[3] - '0' - 1900;
	tm1.tm_mon = (s[4] - '0') * 10 + s[5] - '0' - 1;
	tm1.tm_mday = (s[6] - '0') * 10 + s[7] - '0';
	tm1.tm_hour = (s[9] - '0') * 10 + s[10] - '0';
	tm1.tm_min = (s[12] - '0') * 10 + s[13] - '0';
	tm1.tm_sec = (s[15] - '0') * 10 + s[16] - '0';	
	t = mktime(&tm1);
	return t;
}



版权声明:本文为m0_37650503原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。