【在校整理-01 车友俱乐部管理系统】(注:仅供参考学习使用)
一、课题内容和要求
1、问题描述
随着现代化生活水平的提高,家用汽车越来越成为生活中的必需品。了解车友信息便于车友之间的交流和组织活动。该系统要求开发一款车友俱乐部软件,通过该软件可以方便地查询车友信息,了解车友的动态信息,发起车友的活动等功能。通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些算法思想的应用。
2、基本要求
(1)车友信息应包括:车主信息(会员名,昵称,性别,职业,驾龄,年龄等),驾车信息(车辆品牌,车款,颜色等)等;(用结构体struct来储存车友的信息)
(2)要求进入系统需要输入口令验证;
(3)建立车友信息库,输入信息符合逻辑如驾龄为正值,相关信息符合实际标准等;
(4)实现车友会新加入会员信息和退会会员信息的动态更新,并对各个时间阶段的会员年龄组成变化进行统计和展示;
(5)有条件查询。可方便地根据姓名、性别、年龄、车款、入会时间等条件,查询车友信息,并用不同的排序算法进行排序。
(6)将该车友会的信息内容、查询信息等均以文件的形式存储。
二、需求分析
1、提供可操作的主菜单:输出菜单,用于显示以从文件中加载的总客户信息和若干个可选的功能选项。根据客户输入的选项来运行不同的功能,运行不同的函数。程序中存在多个菜单显示函数,需要进行循环调用显示。
2、一定的输入检测:本程序中需要用户进行选择的地方很多,菜单上之间也会相互调用,包括循环运行。用户在选择相应菜单选项时,会进行输入,这要求对用户输入进行一定的检测。
3、明晰的存储格式:再利用结构体数组进行用户信息存储时。以及对用户满意度调查信息存储时,要对文件格式进行一定的优化,使其清晰明了。并且在读取和保存的文件信息时能够灵活方便易于相应的操作。
三、概要设计
1、主要存储结构
// 代码很烂,轻喷。注:仅供参考学习使用。
//车友信息结构体
struct Club {
char id[20];//会员卡号
char name[20];//姓名
char sex[10];//性别
char age[10];//年龄
char job[20];//工作
char drive_age[20];//驾龄
char brand[20];//车的品牌
char style[20];//车的款式
char color[20];//车的颜色
char time_user[BUFLEN];//入会时间
};
typedef struct Club club;
存储图示如下:
2、主要函数流程
(1) 系统运行:在进入系统后会调用最外层的菜单函数进行口令和外层菜单显示。流程如图所示:
(2)菜单函数运行流程如图所示,本程序中有大量与此类似的菜单调用函数,此处只列出最主要的一个菜单函数进行实例。
(3)系统总框架
四、源程序代码
// 代码很烂,轻喷。注:仅供参考学习使用。
// 头文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
// #include<bits/stdc++.h>
// using namespace std;
//全局变量定义
#define USER_FILE "user.txt" //存放车友用户的信息文件
#define RESULT_FILE "result.txt" //满意度调查文件
#define CONSOLE "CON"//重定向使用,输出定向在控制台
#define BUFLEN 255//获取时间戳长度
#define NUM 50 //车友数量,按实际需要可以改变大小
#define PASSWORD 123//进入系统用的密码
//================结构体内容==================
//车友信息结构体
struct Club {
char id[20];//会员卡号
char name[20];//姓名
char sex[10];//性别
char age[10];//年龄
char job[20];//工作
char drive_age[20];//驾龄
char brand[20];//车的品牌
char style[20];//车的款式
char color[20];//车的颜色
char time_user[BUFLEN];//入会时间
};
typedef struct Club club;
//================函数声明相关内容==================
//函数声明;方便函数之间调用
void init(club* user);//初始化结构体
void readuser(club* user);//从文件读取车友用户信息到结构体中
void saveuser(club* user);//保存车友用户信息到文件里
int topmenu();//最外层主菜单
void user_result(club* user);//满意度调查函数
void menu(club* user);//主要程序功能的菜单
void showid(club* user);//根据id显示车友信息
void managemenu(club* user);//车友信息管理菜单
void add_user();//增加车友信息
void del_user(club* user);//删除车友
void modify_user(club* user);//修改信息
void sum_menu(club* user);//车友人数统计主菜单
void total_user(club* user);//统计车友总人数
void total_age(club* user);//各年龄段车友人数
void factor_menu(club* user);//条件查询主菜单
void find_sex(club* user);//根据性别查询信息
void find_style(club* user);//根据款式查询信息
void find_name(club* user);//根据姓名查询信息
void find_age(club* user);//根据年龄查询信息
void find_time(club* user);//根据入会时间查询信息
//================程序辅助相关内容==================
//初始化信息函数
void init(club* user) {
for (int i = 0; i < NUM;i++) {
strcpy(user[i].id, "");
strcpy(user[i].name, "");
strcpy(user[i].sex, "");
strcpy(user[i].age, "");
strcpy(user[i].job, "");
strcpy(user[i].drive_age, "");
strcpy(user[i].brand, "");
strcpy(user[i].style, "");
strcpy(user[i].color, "");
strcpy(user[i].time_user, "");
}
}
//从文件读取车友用户信息到结构体中
void readuser(club* user) {
//输入重定向,从文件输入
freopen(USER_FILE, "r", stdin);
for (int i = 0;i < NUM;i++) {
scanf("%s%s%s%s%s%s%s%s%s%s", user[i].id, user[i].name, user[i].sex, user[i].age, user[i].job, user[i].drive_age, user[i].brand, user[i].style, user[i].color, user[i].time_user);
}
//重定向返回控制台
//printf("%s,%s,%s,%s,%s,%s,%s,%s,%s",user[0].id, user[0].name, user[0].sex, user[0].age, user[0].job, user[0].drive_age, user[0].brand, user[0].style, user[0].color);
freopen("CON", "r", stdin);
}
//保存车友用户信息到文件里
void saveuser(club* user) {
freopen(USER_FILE, "w", stdout);
for (int i = 0;i < NUM;i++) {
if (strlen(user[i].id) != 0) {
printf("%s %s %s %s %s %s %s %s %s %s\n", user[i].id, user[i].name, user[i].sex, user[i].age, user[i].job, user[i].drive_age, user[i].brand, user[i].style, user[i].color, user[i].time_user);
}
}
freopen(CONSOLE, "w", stdout);
}
//================车友信息管理相关==================
//按照车友会员卡号id显示车友信息
void showid(club* user) {
readuser(user);
int flag = -1;
char num_id[20];
printf(" 请输入要显示的会员ID:");
scanf("%s", num_id);
for (int i = 0;i < NUM - 1;i++) {
if (strcmp(user[i].id, num_id) == 0) {
flag = i;
printf(" 会员卡号:%s", user[i].id);
printf(" 姓名:%s", user[i].name);
printf(" 性别:%s", user[i].sex);
printf(" 年龄:%s", user[i].age);
printf(" 职业:%s", user[i].job);
printf(" 驾龄:%s\n", user[i].drive_age);
printf(" 车辆品牌:%s", user[i].brand);
printf(" 车款:%s", user[i].style);
printf(" 颜色:%s", user[i].color);
printf(" 入会时间:%s\n", user[i].time_user);
}
}
if (flag == -1) printf(" 没有该卡!");
}
//添加车友信息函数
void add_user() {
char id[20];//会员卡号
char name[20];//姓名
char sex[5];//性别
char age[5];//年龄
char job[20];//工作
char drive_age[20];//驾龄
char brand[20];//车的品牌
char style[20];//车的款式
char color[20];//车的颜色
char time_user[BUFLEN];//入会时间
//获取时间
time_t t = time(0);
char tmpBuf[BUFLEN];
//这样时间是2020-11-27-23:01:23
//strftime(tmpBuf, BUFLEN, "%Y-%m-%d-%H:%M:%S", localtime(&t)); //格式化时间
//这样时间是2020-11-27
strftime(tmpBuf, BUFLEN, "%Y-%m-%d", localtime(&t)); //格式化时间
printf(" 输入会员卡号:"); scanf("%s", id);
printf(" 输入姓名:"); scanf("%s", name);
printf(" 输入性别:"); scanf("%s", sex);
printf(" 输入年龄:"); scanf("%s", age);
printf(" 输入职业:"); scanf("%s", job);
printf(" 输入驾龄:"); scanf("%s", drive_age);
printf(" 输入车辆品牌:"); scanf("%s", brand);
printf(" 输入车款:"); scanf("%s", style);
printf(" 输入颜色:"); scanf("%s", color);
// 文件指针
FILE* fp = fopen(USER_FILE, "a+");
// 输出到文件
fputs(id, fp); fputs(" ", fp);
fputs(name, fp); fputs(" ", fp);
fputs(sex, fp); fputs(" ", fp);
fputs(age, fp); fputs(" ", fp);
fputs(job, fp); fputs(" ", fp);
fputs(drive_age, fp); fputs(" ", fp);
fputs(brand, fp); fputs(" ", fp);
fputs(style, fp); fputs(" ", fp);
fputs(color, fp); fputs(" ", fp);
fputs(tmpBuf, fp); fputs("\n", fp);
fclose(fp);
printf("添加成功!");
}
//删除车友信息函数
void del_user(club* user) {
readuser(user);
int flag = -1;
char num[20];
printf(" 请输入要删除的卡号:"); scanf("%s", num);
for (int i = 0;i < NUM - 1;i++) {
//找到卡后置空
if (strcmp(user[i].id, num) == 0) {
flag = i;
strcpy(user[i].id, "");
strcpy(user[i].name, "");
strcpy(user[i].sex, "");
strcpy(user[i].age, "");
strcpy(user[i].job, "");
strcpy(user[i].drive_age, "");
strcpy(user[i].brand, "");
strcpy(user[i].style, "");
strcpy(user[i].color, "");
strcpy(user[i].time_user, "");
printf(" 删除成功!");
}
}
if (flag == -1) printf(" 查无此卡,请先注册!");
saveuser(user);
}
//修改车友信息函数
void modify_user(club* user) {
readuser(user);
int flag = -1, mod_ch = 0;
char num[20], change[20];
printf(" 请输入要修改信息的卡号:");scanf("%s", num);
for (int i = 0;i < NUM - 1;i++) {
//找到卡后置空
if (strcmp(user[i].id, num) == 0) {
flag = i;
printf("==请选择要修改的类型==\n");
printf(" Press 1 :修改姓名\n");
printf(" Press 2 :修改性别\n");
printf(" Press 3 :修改年龄\n");
printf(" Press 4 :修改职业\n");
printf(" Press 5 :修改驾龄\n");
printf(" Press 6 :修改车辆品牌\n");
printf(" Press 7 :修改车款\n");
printf(" Press 8 :修改颜色\n\n");
printf(" 请输入您的选择");
scanf("%d", &mod_ch);
printf(" 请输入修改后的信息:");scanf("%s", change);
switch (mod_ch)
{
case 1:strcpy(user[i].name, "");strcpy(user[i].name, change);break;
case 2:strcpy(user[i].sex, "");strcpy(user[i].sex, change);break;
case 3:strcpy(user[i].age, "");strcpy(user[i].age, change);break;
case 4:strcpy(user[i].job, "");strcpy(user[i].job, change);break;
case 5:strcpy(user[i].drive_age, "");strcpy(user[i].drive_age, change);break;
case 6:strcpy(user[i].brand, "");strcpy(user[i].brand, change);break;
case 7:strcpy(user[i].style, "");strcpy(user[i].style, change);break;
case 8:strcpy(user[i].color, "");strcpy(user[i].color, change);break;
}
printf(" 修改成功!");
}
}
if (flag == -1) printf(" 查无此卡,请先注册!");
saveuser(user);
}
//车友信息管理菜单
void managemenu(club* user) {
int re = 0;
printf("\n======== 车友信息管理 ========\n");
printf(" [---- Press 1 :增加车友信息----]\n");
printf(" [---- Press 2 :删除车友信息----]\n");
printf(" [---- Press 3 :修改车友信息----]\n");
printf(" [---- Press 0 :返回上级菜单----]\n");
printf(" 请输入您的选择:");scanf("%d", &re);
if (re >= 0 && re < 5) {
switch (re) {
case 1:fflush(stdin);add_user();break;//增加车友信息
case 2:fflush(stdin);del_user(user);break;//删除车友信息
case 3:fflush(stdin);modify_user(user);break;//修改信息
case 0:fflush(stdin);menu(user);break;//返回上级
}
}
else { printf(" 输入错误!\n");managemenu(user); }
}
//================车友人数统计相关==================
//统计车友总人数
void total_user(club* user) {
readuser(user);
int total = 0;
for (int i = 0;i < NUM;i++) {
if (strlen(user[i].id) != 0) {
total++;
}
}
printf(" 车友总人数为:%d", total);
}
//各年龄段车友人数;
void total_age(club* user) {
readuser(user);
int total[11];
memset(total, 0, 11 * sizeof(int));//初始化置零
for (int i = 0;i < NUM;i++) {
if (strlen(user[i].age) != 0) {
total[atoi(user[i].age) / 10]++;
}
}
for (int i = 0; i < 11; i++) {
printf(" %2d0 — %2d0年龄段的人数为:%d\n", i, i + 1, total[i]);
}
}
//车友统计人数菜单
void sum_menu(club* user) {
int re = 0;
printf("\n======== 车友人数统计菜单 ========\n");
printf(" [---- Press 1 :车友总人数------]\n");
printf(" [---- Press 2 :各年龄段人数----]\n");
printf(" [---- Press 0 :返回上级菜单----]\n");
printf(" 请输入您的选择:");scanf("%d", &re);
if (re >= 0 && re < 5) {
switch (re) {
case 1:fflush(stdin);total_user(user);break;//
case 2:fflush(stdin);total_age(user);break;//
case 0:fflush(stdin);menu(user);break;//返回上级
}
}
else { printf(" 输入错误!\n");sum_menu(user); }
}
//================根据条件查询相关==================
//条件查询主菜单
void factor_menu(club* user) {
int re = 0;
printf("\n======== 车友信息查询菜单 ========\n");
printf(" [---- Press 1 :根据性别查询----]\n");
printf(" [---- Press 2 :根据车款查询----]\n");
printf(" [---- Press 3 :根据姓名查询----]\n");
printf(" [---- Press 4 :根据年龄查询----]\n");
printf(" [---- Press 5 :根据入会时间查询]\n");
printf(" [---- Press 0 :返回上级菜单----]\n");
printf(" 请输入您的选择:");scanf("%d", &re);
if (re >= 0 && re < 6) {
switch (re) {
case 1:fflush(stdin);find_sex(user);break;//根据性别查询信息
case 2:fflush(stdin);find_style(user);break;//根据款式查询信息
case 3:fflush(stdin);find_name(user);break;//根据姓名查询信息
case 4:fflush(stdin);find_age(user);break;//根据年龄查询信息
case 5:fflush(stdin);find_time(user);break;//根据入会时间查询信息
case 0:fflush(stdin);menu(user);break;//返回上级菜单
}
}
else { printf(" 输入错误!\n");factor_menu(user); }
}
//根据性别查询信息
void find_sex(club* user) {
readuser(user);
int flag = -1;
char cx[20];
printf(" 请输入对应要查询的信息:");
scanf("%s", cx);
for (int i = 0;i < NUM - 1;i++) {
if (strcmp(user[i].sex, cx) == 0) {
flag = i;
printf(" 会员卡号:%s", user[i].id);
printf(" 姓名:%s", user[i].name);
printf(" 性别:%s", user[i].sex);
printf(" 年龄:%s", user[i].age);
printf(" 职业:%s", user[i].job);
printf(" 驾龄:%s\n", user[i].drive_age);
printf(" 车辆品牌:%s", user[i].brand);
printf(" 车款:%s", user[i].style);
printf(" 颜色:%s", user[i].color);
printf(" 入会时间:%s\n", user[i].time_user);
}
}
if (flag == -1) printf(" 很抱歉没有查询到您所需的信息!");
}
//根据款式查信息
void find_style(club* user) {
readuser(user);
int flag = -1;
char cx[20];
printf(" 请输入对应要查询的信息:");
scanf("%s", cx);
for (int i = 0;i < NUM - 1;i++) {
if (strcmp(user[i].style, cx) == 0) {
flag = i;
printf(" 会员卡号:%s", user[i].id);
printf(" 姓名:%s", user[i].name);
printf(" 性别:%s", user[i].sex);
printf(" 年龄:%s", user[i].age);
printf(" 职业:%s", user[i].job);
printf(" 驾龄:%s\n", user[i].drive_age);
printf(" 车辆品牌:%s", user[i].brand);
printf(" 车款:%s", user[i].style);
printf(" 颜色:%s", user[i].color);
printf(" 入会时间:%s\n", user[i].time_user);
}
}
if (flag == -1) printf(" 很抱歉没有查询到您所需的信息!");
}
//根据姓名查信息
void find_name(club* user) {
readuser(user);
int flag = -1;
char cx[20];
printf(" 请输入对应要查询的信息:");
scanf("%s", cx);
for (int i = 0;i < NUM - 1;i++) {
if (strcmp(user[i].name, cx) == 0) {
flag = i;
printf(" 会员卡号:%s", user[i].id);
printf(" 姓名:%s", user[i].name);
printf(" 性别:%s", user[i].sex);
printf(" 年龄:%s", user[i].age);
printf(" 职业:%s", user[i].job);
printf(" 驾龄:%s\n", user[i].drive_age);
printf(" 车辆品牌:%s", user[i].brand);
printf(" 车款:%s", user[i].style);
printf(" 颜色:%s", user[i].color);
printf(" 入会时间:%s\n", user[i].time_user);
}
}
if (flag == -1) printf(" 很抱歉没有查询到您所需的信息!");
}
//根据年龄查信息
void find_age(club* user) {
readuser(user);
int flag = -1;
char cx[20];
printf(" 请输入对应要查询的信息:");
scanf("%s", cx);
for (int i = 0;i < NUM - 1;i++) {
if (strcmp(user[i].age, cx) == 0) {
flag = i;
printf(" 会员卡号:%s", user[i].id);
printf(" 姓名:%s", user[i].name);
printf(" 性别:%s", user[i].sex);
printf(" 年龄:%s", user[i].age);
printf(" 职业:%s", user[i].job);
printf(" 驾龄:%s\n", user[i].drive_age);
printf(" 车辆品牌:%s", user[i].brand);
printf(" 车款:%s", user[i].style);
printf(" 颜色:%s", user[i].color);
printf(" 入会时间:%s\n", user[i].time_user);
}
}
if (flag == -1) printf(" 很抱歉没有查询到您所需的信息!");
}
//根据入会时间查信息
void find_time(club* user) {
readuser(user);
int flag = -1;
char cx[BUFLEN];
printf(" 请输入对应要查询的信息:");
scanf("%s", cx);
for (int i = 0;i < NUM - 1;i++) {
if (strcmp(user[i].time_user, cx) == 0) {
flag = i;
printf(" 会员卡号:%s", user[i].id);
printf(" 姓名:%s", user[i].name);
printf(" 性别:%s", user[i].sex);
printf(" 年龄:%s", user[i].age);
printf(" 职业:%s", user[i].job);
printf(" 驾龄:%s\n", user[i].drive_age);
printf(" 车辆品牌:%s", user[i].brand);
printf(" 车款:%s", user[i].style);
printf(" 颜色:%s", user[i].color);
printf(" 入会时间:%s\n", user[i].time_user);
}
}
if (flag == -1) printf(" 很抱歉没有查询到您所需的信息!");
}
//================顶层菜单里的内容==================
//车友信息的主菜单
void menu(club* user) {
int re = 0;
printf("\n======== 欢迎进入车友菜单 ========\n");
printf(" [---- Press 1 :显示车友信息----]\n");
printf(" [---- Press 2 :车友信息管理----]\n");
printf(" [---- Press 3 :车友人数统计----]\n");
printf(" [---- Press 4 :根据条件查询----]\n");
printf(" 请输入您的选择:");scanf("%d", &re);
if (re > 0 && re < 5) {
switch (re) {
case 1:fflush(stdin);showid(user);break;//按车友卡号id显示车友信息
case 2:fflush(stdin);managemenu(user);break;//车友信息管理
case 3:fflush(stdin);sum_menu(user);break;//车友人数统计
case 4:fflush(stdin);factor_menu(user);break;//根据条件查询
}
}
else { printf(" 输入错误!\n");menu(user); }
}
//满意度调查函数
void user_result(club* user) {
readuser(user);
int flag = -1;
char id[20], satis[20],feel[401];
printf(" 请输入您的id:"); scanf("%s", id);
for (int i = 0;i < NUM - 1;i++) {
if (strcmp(user[i].id, id) == 0) {
flag = i;
printf(" 请您为俱乐部打分(1-10):"); scanf("%s", satis);
printf(" 请输入您的个人感想:"); scanf("%s", feel);
printf(" 感谢您的填写,再见!");
FILE* fp = fopen(RESULT_FILE, "a+");
fputs(id, fp); fputs(" ", fp);
fputs(satis, fp); fputs(" ", fp);
fputs(feel, fp); fputs("\n", fp);
fclose(fp);
}
}
if (flag == -1) printf(" 查无此卡,请加入会员!");
}
//================顶层菜单和主函数==================
//进入程序的最外层菜单
int topmenu() {
int re = -1, password;
printf(" 请输入系统口令:");scanf("%d", &password);
if (password == PASSWORD) {
printf("\n======== 欢迎进入车友系统 ========\n");
printf(" [---- Press 1 :进入菜单----]\n");
printf(" [---- Press 2 :填写问卷----]\n");
printf(" [---- Press 0 :退出系统----]\n");
printf(" 请输入您的选择:");
scanf("%d", &re);
while (!(re >= 0 && re < 3)) {
printf(" 输入有误!请重新输入!");
printf("\n======== 欢迎进入车友系统 ========\n");
printf(" [---- Press 1 :进入菜单----]\n");
printf(" [---- Press 2 :填写问卷----]\n");
printf(" [---- Press 0 :退出系统----]\n");
printf(" 请输入您的选择:");
scanf("%d", &re);
}
return re;
}
else printf(" 您的口令有误,请确认后再试!");
return -1;
}
int main(void) {
club user[NUM];//初始化车友实体
init(user);//调用初始化函数进行初始化
//printf("Go:\n");
int re_menu = 0;//接收menu()的返回值
re_menu = topmenu();//menu()进入系统并返回要进行的操作
if (re_menu == 1) {
printf("\n 您将进入车友菜单!\n");
menu(user);//调用车友菜单
}
else if (re_menu == 2) {
printf("\n 您将进行问卷调查的填写!\n\n");
user_result(user);//调用问卷填写函数
}
else if (re_menu == 0) {
exit(0);
}
printf("\n");
system("pause");
return 0;
}
五、测试总结
001 qwe male 28 coder 2 maserati ghibli black 218-11-27
002 qqq female 33 lsp 5 maserati ghibli black 2019-11-27
003 www male 35 qwe 6 maserati ghibli yellow 2019-11-27
004 eee female 43 lkj 5 maserati ghibli red 2019-11-27
005 eee female 23 lkj 3 mahh ghi blue 2020-11-27
006 hhs male 56 haha 6 car 20 white 2020-11-27
010 nju male 35 tec 5 www 19 green 2020-11-27
以上是测试的所有初始数据(没有依据,自己瞎写的),数据会随测试发生变化,必要时,会截图对比,但在两次不同的测试之间不会进行用户数据的初始化。
注:上述数据分别代表:会员id、姓名、性别、年龄、职业、驾龄、车辆品牌、车款、颜色、入会时间。
程序运行的部分就不贴图啦。有兴趣的话,大家自己运行一下吧~
六、其他
以上以及博客中含有在校整理字样的博客内容,均是本人本科在校学习期间所写的代码,源文件以及数据文件等在个人主页资源区可以获取。本人水平很低,大佬轻喷。整理出来是为了帮助初学者学习的过程中,在有需要的情况下能够有所参考。再次声明:仅供学习交流使用。大家有什么问题,欢迎留言~