您的位置:首页 > 编程语言 > C语言/C++

C语言 共享单车管理系统(读取、写入、删除文件中数据)

2020-03-05 07:46 681 查看

代码在Dev Cpp中编译未出现错误,如果无法运行,请考虑不同编译器之间的差别适当改正代码(使用.cpp格式)

大一小学期学校要求制作不少于1000行的C语言代码程序,学习一年下来属实懵了,因为教学课程只有简单的几种代码,连封装函数我都不明白,在参考了很多资料后终于写出了一份果,虽然各种语句有不成熟的地方,甚至有些函数没用上,但是做下来这一轮项目,确实学会了很多东西,接下来把我的代码分享给大家,如果我的代码的一部分能帮助到各位,属实是我的荣幸。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#include<time.h>

//初始界面输入神秘代码10086进入????????界面

float bike_money;//定义金额
char gName[20];

void print(); //初始界面
void begin();//选择注册或登录
void regist();//注册
void creatInform();//用户基本信息
void after_regist();//创建后选择回到上一级或者登录
void login();//登录界面
int match(char a[20],char b[20]);//检测文件中账号密码 和输入是否匹配
void user_menu();//用户界面
void userKey();//用户选择
void use_bike();//租车
void print_time();//打印时间
void get_time();//获取当前时间并存入文件
int num_bike();//统计单车信息
void user_browseBike();//浏览单车信息
void return_bike();//还车
int num_use_bike();//统计使用中的单车个数
int calculate_time();//计算使用时间
int get_num(float data);//统计余额位数
float calculate_money(int data,float money);//计算用户花费金额
void delete_time();//删除用完的时间
void add_money();//充值系统
void check_money();//查看余额
void change_pas();//更改密码
void manage_menu();//管理员菜单
void keyDown();//对管理员菜单的选择
void add_bike();//添加单车
void delete_bike();//删除单车
void lookup_choice();//查找信息
void lookup_bike();//查找单车信息
void lookup_user();//查找用户信息
int num_user();//统计用户信息
void browseUser();//浏览用户信息
void browseBike();//浏览单车信息
float calculate();//资金流动情况

typedef struct User//用户登录信息
{
char username[20];
char userpas[20];
struct User *next;
}User,*uNode;

typedef struct Inform//用户账号信息
{
char username[20];
char name[20];
int age;
char sex[10];
char tel[12];
float money;
struct Inform *next;
}Inform,*iNode;

typedef struct Bike//单车信息
{
char address[100];//地址
char num[20];//单车编号
int usetime;//使用次数,每使用20次检查一遍并清空
float price;//每小时花费金额
float makemoney; //赚取的金额
float cost;//成本价格
struct Bike *next;
}Bike,*bNode;

typedef struct Time//时间信息
{
char num[20];
int time;
struct Time *next;
}Time,*tNode;

void print() //初始界面
{
system("cls");
printf("\n\n\n\n\n\n\t\t\t\t_______________________________________\n");
printf("\t\t\t\t|                                      |\n");
printf("\t\t\t\t|             请选择                   |\n");
printf("\t\t\t\t|                                      |\n");
printf("\t\t\t\t|         我已注册过——请按 1         |\n");
printf("\t\t\t\t|                                      |\n");
printf("\t\t\t\t|         我是新用户——请按 2         |\n");
printf("\t\t\t\t|                                      |\n");
printf("\t\t\t\t|         退      出——请按 0         |\n");
printf("\t\t\t\t|                                      |\n");
printf("\t\t\t\t|______________________________________|\n");
printf("\t\t\t\t请输入:");
begin();
}

void begin()//选择注册或登录
{
int choice=0;
scanf("%d",&choice);
switch(choice)
{
case 1:
login();
break;
case 2:
regist();
break;
case 10086:
manage_menu();
break;
case 0:
exit(1);
default:
print();
break;
}
}

void regist()//注册
{
system("title 创建账号");//改变标题
FILE *fp;
int hit;
char username[20],_username[20];
char userpas[20],userpas1[20],_userpas[20];
if((fp=fopen("user.txt","r"))==NULL)//如果不存在user.txt,创建user.txt
{
fp=fopen("user.txt","w+");
fclose(fp);
}
system("cls");
for(;;)
{
printf("\n\n\n\n\n\n\t\t\t\t_____________________________________________\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|                注册界面                    |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|           请输入用户名:                    |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|           请输入密  码:                    |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|           再次确认密码:                    |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|____________________________________________|\n");
COORD sin_up_name = { 57, 10 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_up_name);//改变光标位置
scanf("%s",&username);
fp=fopen("user.txt","r");
for(;!feof(fp);)
{
fscanf(fp,"%s%s",_username,_userpas);
if(strcmp(username,_username)==0)
{
COORD name_same = { 32, 18 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), name_same);
printf("该用户名已存在,请输入其他用户名.");
getch();
regist();
}
}
fclose(fp);
strcpy(gName,username);
COORD sin_up_pasword = { 57, 12 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_up_pasword);//改变光标位置
char key;
int i=0,j=0;
while((key=_getch())!='\r')//如果没有输入回车
{
if(i<19)
{
userpas[i++]=key;//每输入一个字符,打印一个*,让密码不可见
printf("*");
}
else
{
COORD sin_pas_too_long = { 32, 18 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_pas_too_long);
printf("密码过长,该密码不可用!\n");
printf("\t\t\t\t即将返回重新注册...");
getch();
regist();
}
}
COORD sin_up_pasword_again = { 57, 14 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_up_pasword_again);//改变光标位置
while((key=_getch())!='\r')//如果没有输入回车
{
if(j<19)
{
userpas1[j++]=key;
printf("*");
}
else
{
COORD sin_pas_again_too_long = { 32, 18 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_pas_again_too_long);
printf("\t密码过长,该密码不可用!\n");
printf("\t即将返回重新注册...");
getch();
regist();
}
}
if(strcmp(userpas,userpas1)==0)//对比两次输入密码是否一致
{
fp=fopen("user.txt","a");//打开user.txt指针指到文件最后
fprintf(fp,"%s\t%s\n",username,userpas);
break;
}
else
{
COORD sin_pas_error = { 28, 18 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_pas_error);
printf("\t两次密码不一致,请重新输入,退出请按ESC");
hit=getch();
if(hit=27) ;
system("cls");
print();
}
}
fclose(fp);
COORD sin_up_sucess = { 28, 18 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_up_sucess);
printf("\t创建成功,按任意键返回");
getch();
system("cls");
creatInform();
after_regist();
}

void creatInform()//用户基本信息
{
system("title 用户信息录入");
FILE *fp;
char username[20],name[20],sex[10],tel[12],s[12];
int age,i=0,j;
float money;
if((fp=fopen("Inform.txt","r"))==NULL)
{
fp=fopen("Inform.txt","w");
fclose(fp);
}
fp=fopen("Inform.txt","a");
system("cls");
printf("请输入您的基本信息,务必确认用户名输入正确,否则将无法使用单车!\n");
getch();
system("cls");
printf("\n\n\n\n\n\n\t\t\t\t_____________________________________________\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|                用户信息                    |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|           请输入用户名:                    |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|           姓        名:                    |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|           年        龄:                    |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|           性        别:                    |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|           电        话:                    |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|____________________________________________|\n");
COORD sin_up_name = { 57, 10 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_up_name);//改变光标位置
scanf("%s",&username);
if(strcmp(gName,username)!=0)
{
COORD user_name = { 31, 22 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), user_name);//改变光标位置
printf("用户名检测错误,请输入与注册时相同的用户名!");
getch();
creatInform();
}
COORD user_name = { 57, 12 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), user_name);//改变光标位置
scanf("%s",&name);
COORD user_age = { 57, 14 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), user_age);//改变光标位置
scanf("%d",&age);
COORD user_sex = { 57, 16 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), user_sex);//改变光标位置
scanf("%s",&sex);
for(;;)
{
COORD error = { 31, 22 };
COORD user_tel = { 57, 18 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), user_tel);
printf("            ");
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), user_tel);
scanf("%s",&tel) ;
strcpy(s,tel);
if(strlen(tel)!=11)
{
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), error);
printf("                        ");
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), error);
printf("请输入十一位电话号码!");
getch();
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), error);
printf("                        ");
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), user_tel);
}
for(j=0;(size_t)j<strlen(s);j++)
{
if(s[j]<'0'||s[j]>'9')
{
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), error);
printf("                                    ");
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), error);
printf("电话号只能为数字!重新输入!");
getch();
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), error);
printf("                                    ");
break;
}
}
if(strlen(tel)==11&&(size_t)j==strlen(s))
{
break;
}
}
fprintf(fp,"%s\t%s\t%d\t%s\t%s\t",username,name,age,sex,tel);
COORD over = { 31, 22 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), over);
printf("数据录入成功!");
getch();
system("cls");
printf("当前余额为%.1f,无法使用单车,请充值后使用",money);
printf("\n充值金额:");
scanf("%f",&money);
fprintf(fp,"%.1f\n",money);
fclose(fp);
}

void after_regist()//创建后选择回到上一级或者登录
{
system("cls");
printf("请选择登录(0)或返回(1):");
int choice=0;
scanf("%d",&choice);
switch(choice)
{
case 0:
login();
break;
case 1:
print();
break;
default:
after_regist();
break;
}
}

void login()//登录界面
{
system("title 登录");//改变标题
char username[20];
char userpas[20];
int i=2,j,k,n,m=0;
char hit=0;
do
{
system("cls");
printf("\n\n\n\n\n\n\t\t\t\t_____________________________________________\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|                登录界面                    |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|           请输入用户名:                    |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|           请输入密  码:                    |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|____________________________________________|\n");
COORD login_name = { 57, 10 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), login_name);//改变光标位置
scanf("%s",&username);
strcpy(gName,username);
COORD change_place = { 32, 16 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), change_place);//改变光标位置
printf("确认输入请按回车,重新输入请按ECS");
hit=getch();//暂停程序当i接收后继续下一条指令
for (;hit!=13&&hit!=27;)//保证只能是enter和ESC才能退出循环,输入其他字符无用,暂停程序,按'enter'继续。
{
hit=getch();
}
}while(hit==27);
COORD login_pas = { 57, 12 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), login_pas);//改变光标位置
char key;
while((key=_getch())!='\r')//如果没有输入回车
{
if(m<19)
{
userpas[m++]=key;
printf("*");
}
else
{
printf("\n\n\n\n\n\t\t\t\t错误:密码超过字数限制!\n\t\t\t\t请重新登录!");
getch();
login();
}
}
i=match(username,userpas);
if(i==1)
{
printf("\n\n\n\n\n\t\t\t\t登录成功!");
getch();
system("cls");
user_menu();
}
else
{
if(i==-1)
{
printf("\n\n\n\n\n\t\t\t\t密码输入错误,请确认后重试.");
getch();
print();
}
if(i==0)
{
printf("\n\n\n\n\n\t\t\t\t不存在此用户,即将回到上一级.");
getch();
print();
}
}
}

int match(char a[20],char b[20])//检测文件中账号密码 和输入是否匹配
{
FILE *fp;
char username[20];
char userpas[20];

if((fp=fopen("user.txt","r"))==NULL)
{
system("cls");
printf("不存在相关资料,请创建用户");
getch();
system("cls");
//放入菜单按钮
}

for(;!feof(fp);)//feof检测是否有结束符,如果有,返回0,没有返回非0
{
fscanf(fp,"%s %s",&username,&userpas);
if(strcmp(a,username)==0)
{
if(strcmp(b,userpas)==0)
return 1;
else
return -1;
}
}
return 0;
}

void user_menu()//用户界面
{
system("title 共享单车租用系统");
system("cls");
printf("\n\n\t\t\t\t__________________________________________\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|               用户界面                  |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|           1.借用单车                    |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|           2.查看可用单车                |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|           3.还车                        |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|           4.充值                        |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|           5.查看余额                    |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|           6.修改密码                    |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|           0.退出系统                    |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|_________________________________________|\n");
userKey();
}

void userKey()//用户选择
{
printf("\t\t\t\t请输入:");
int choice=0;
scanf("%d",&choice);
switch(choice)
{
case 1:
use_bike();
break;
case 2:
user_browseBike();
break;
case 3:
return_bike();
break;
case 4:
add_money();
break;
case 5:
check_money();
break;
case 6:
change_pas();
break;
case 0:
exit(1);
break;
default:
user_menu();
break;
}
}

void use_bike()//租车
{
system("title 租车系统");
system("cls");
bNode head=NULL;
bNode p,p1,p2;
FILE *fp,*fp1,*fp2,*fp3;
char username[20],name[20],sex[10], tel[12],_num[20];
char address[100]={'\0'},num[20]={'\0'},use_bike_num[20]={'\0'};
float price,makemoney,cost,money;
int usetime,age,time;
int n=0,m=0,j=0,q=0;
char i;
fp3=fopen("time.txt","r");
for(;!feof(fp3);)
{
fscanf(fp3,"%s%d",_num,&time);
if(strcmp(_num,gName)==0)
{
printf("不能同时借两辆单车,请先结束使用单车!");
getch();
user_menu();
}
}
fclose(fp3);
if((fp=fopen("bike.txt","r"))==NULL)
{
printf("未发现单车数据,请等待管理员添加.");
printf("\n即将返回上一级...");
getch();
user_menu();
}
else
{
fp=fopen("bike.txt","r");
n=num_bike();
if(n==0)
{
printf("单车被借光了,请等待其他用户结束使用.");
printf("\n即将返回上一级");
getch();
user_menu();
}
printf("请输入想要租借的单车编号:");
scanf("%s",use_bike_num);
printf("\n确认租借请回车,取消请按Esc\n");
i=getch();
for(;i!=13&&i!=27;)
i=getch();
if (i==27)
user_menu();
for(m=0;m<n;m++)
{
fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime);
if(strcmp(use_bike_num,num)==0)
{
fp2=fopen("Inform.txt","r");
fscanf(fp2,"%s%s%d%s%s%f",username,name,&age,sex,tel,&money);
if(money<price)
{
printf("余额不足,请充值后使用!");
getch();
add_money();
}
else
{
q++;
bike_money=price;
fp1=fopen("use_bike.txt","a");
fprintf(fp1,"%s\t%.1f\t%.1f\t%.1f\t%s\t%d\n",num,price,makemoney,cost,address,usetime);
fclose(fp1);
}
fclose(fp2);
}
if(strcmp(use_bike_num,num))
{
j++;//相同返回值为0不执行if语句继续循环,不同则执行直到将所有不同的书名建立成链表
if(j==1)//建立链表
{
p1=p2=(bNode)malloc(sizeof(Bike));
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(bNode)malloc(sizeof(Bike));//新建链表
}
strcpy(p1->num,num);//复制单车信息
p1->price=price;
p1->makemoney=makemoney;
p1->cost=cost;
strcpy(p1->address,address);
p1->usetime=usetime;
}
}
if (j==0)//如果单车只有一项且这一项刚好和要删除的相同
{
head=NULL;
}
else//建立链表的最后剩余一个储存空间,所以封底
{
p2->next=p1;
p1->next=NULL;
fclose(fp);
}
}
fp=fopen("bike.txt","w");//清空文件
fclose(fp);
fp=fopen("bike.txt","a");//追加文件
p=head;
for (;p!=NULL;)//把链表内容覆盖到文件
{
fprintf(fp,"%s\t%.1f\t%.1f\t%.1f\t%s\t%d\n",p->num,p->price,p->makemoney,p->cost,p->address,p->usetime);
p=p->next;
}
free(p);
fclose(fp);
if(q==0)
{
printf("单车租借失败:编号错误!");
getch();
user_menu();
}
else
{
system ("cls");
printf("租借成功! \n单车收费为每30分钟%.1f元\n",bike_money);
printf("前3分钟不收取费用\n") ;
printf("当前时间为:");
print_time();
get_time();
getch();//返回上一层
user_menu();
}
}

void print_time()//打印时间
{
time_t timep;
struct tm *p;
time(&timep);
p = localtime(&timep); //取得当地具体时间
printf("%d年 %d月 %d日 ", (1900 + p->tm_year), (1 + p->tm_mon), p->tm_mday);
printf("%d:%d:%d\n",  p->tm_hour, p->tm_min, p->tm_sec);
}

void get_time()//获取当前时间并存入文件
{
time_t timep;
time(&timep);
FILE*fp;
if((fp=fopen("time.txt","r"))==NULL)
{
fp=fopen("time.txt","w");
fclose(fp);
}
fp=fopen("time.txt","a");
fprintf(fp,"%s\t%d\n",gName,timep);
fclose(fp);
}

int num_bike()//统计单车信息
{
FILE *fp;
int n;
char num[20],address[100]={'\0'};
int usetime=0;
float price,makemoney=0,cost;
fp=fopen("bike.txt","r");
for(n=0;!feof(fp);n++)
fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime);
n--;
fclose(fp);
return(n);
}

void user_browseBike()//浏览单车信息
{
system("title 单车使用情况");
FILE *fp;
int n=0,m=0;
char num[15],address[100];
int usetime=0;
float price,makemoney=0,cost;
if ((fp=fopen("bike.txt","r"))==NULL)//打开文件
{
system ("cls");
printf("\n数据不存在!即将返回上一级...");
getch();
user_menu();
}
n=num_bike();
if(n==0)
{
system("cls");
printf("无任何信息!");
getch();
user_menu();
}
fp=fopen("bike.txt","r");
system ("cls");
printf("单车编号\t单车价格/min\t单车赚取利润\t单车成本\t单车地址\t\t单车使用次数\n");
for(m=0;m<n;m++)
{
fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime);
printf("%6s\t\t%.1f\t\t%.1f\t\t%.1f\t\t%s\t\t\t%d\n",num,price,makemoney,cost,address,usetime);
}
fclose(fp);
printf("\n按任意键返回\n");
getch();
user_menu();
}

void return_bike()//还车
{
system("title 还车系统");
system("cls");
bNode head=NULL;
bNode p,p1,p2;
FILE *fp,*fp1,*fp2,*fp3;
char username[20]={'\0'},name[20]={'\0'},sex[10]={'\0'},tel[12]={'\0'},_num[20];
int age,f=0,g=0;
float money,pmoney,add_money;
char address[100]={'\0'},num[20]={'\0'},use_bike_num[20]={'\0'};
float price,makemoney,cost;
int usetime,usemin,time;
int n=0,m=0,j=0,x=0;
char i;
fp3=fopen("time.txt","r");
for(;!feof(fp3);)
{
fscanf(fp3,"%s%d",_num,&time);
if(strcmp(_num,gName)==0)
{
x++;
}
}
fclose(fp3);
if(x==0)
{
printf("您当前并未租用单车,无需还车.");
printf("\n即将返回上一级...");
getch();
user_menu();
}
if((fp=fopen("use_bike.txt","r"))==NULL)
{
printf("未发现租用数据,请确认后选择.");
printf("\n即将返回上一级...");
getch();
user_menu();
}
else
{
fp=fopen("use_bike.txt","r");
n=num_use_bike();
if(n==0)
{
printf("当前没有租用中的单车,请确认后继续.");
printf("\n即将返回上一级");
getch();
user_menu();
}
printf("请输入想要归还的单车编号:");
scanf("%s",use_bike_num);
printf("\n确认归还请回车,取消请按Esc\n");
i=getch();
for(;i!=13&&i!=27;)
i=getch();
if (i==27)
user_menu();
for(m=0;m<n;m++)
{
fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime);
if(strcmp(use_bike_num,num)==0)
{
g++;
bike_money=price;
system ("cls");
printf("归还成功! \n单车收费为每30分钟%.1f元\n",bike_money);
printf("当前时间为:");
print_time();
usemin=calculate_time();//获取使用时间
printf("\n共使用%d分钟\n",usemin);
money=calculate_money(usemin,bike_money);//获取花费金额
printf("花费金额为%.1f元",money);
usetime=usetime+1;//使用次数+1
if(usetime>=20)//如果使用次数到20则检查维修一次,检查维修后使用次数置零
usetime=0;
makemoney=makemoney+money;//收费加入单车赚取金额
fp1=fopen("bike.txt","a");
fprintf(fp1,"%s\t%.1f\t%.1f\t%.1f\t%s\t%d\n",num,price,makemoney,cost,address,usetime);
fclose(fp1);
delete_time();
fp2=fopen("Inform.txt","r+");
for(;strcmp(gName,username)!=0;)//获取用户位置
{
fscanf(fp2,"%s%s%d%s%s%f",username,name,&age,sex,tel,&pmoney);
}
add_money=money;
f=get_num(pmoney)+1;
pmoney=pmoney-add_money;
printf("\n当前余额为:%.1f",pmoney);
fseek(fp2,-f,SEEK_CUR);//改变指针位置
fprintf(fp2,"%.1f",pmoney);//扣去费用
fclose(fp2);
}
if(strcmp(use_bike_num,num))
{
j++;//相同返回值为0不执行if语句继续循环,不同则执行直到将所有不同的书名建立成链表
if(j==1)//建立链表
{
p1=p2=(bNode)malloc(sizeof(Bike));
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(bNode)malloc(sizeof(Bike));//新建链表
}
strcpy(p1->num,num);//复制单车信息
p1->price=price;
p1->makemoney=makemoney;
p1->cost=cost;
strcpy(p1->address,address);
p1->usetime=usetime;
}
}
if (j==0)//如果单车只有一项且这一项刚好和要删除的相同
{
head=NULL;
}
else//建立链表的最后剩余一个储存空间,所以封底
{
p2->next=p1;
p1->next=NULL;
fclose(fp);
}
}
fp=fopen("use_bike.txt","w");//清空文件
fclose(fp);
fp=fopen("use_bike.txt","a");//追加文件
p=head;
for (;p!=NULL;)//把链表内容覆盖到文件
{
fprintf(fp,"%s\t%.1f\t%.1f\t%.1f\t%s\t%d\n",p->num,p->price,p->makemoney,p->cost,p->address,p->usetime);
p=p->next;
}
free(p);
fclose(fp);
if(g==0)
{
system("cls");
printf("还车失败:编号错误!");
printf("\n请确认单车编号后重试!");
getch();
user_menu();
}
getch();//返回上一层
user_menu();
}

int num_use_bike()//统计使用中的单车个数
{
FILE *fp;
int n;
char num[20],address[100]={'\0'};
int usetime;
float price,makemoney,cost;
fp=fopen("use_bike.txt","r");
for(n=0;!feof(fp);n++)
fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime);
n--;
fclose(fp);
return(n);
}

int calculate_time()//计算使用时间
{
int utime=0,usesec=0;
char name[20]={'\0'};
time_t timep;
time(&timep);
FILE*fp;
fp=fopen("time.txt","r");
for(;!feof(fp);)
{
fscanf(fp,"%s %d",name,&utime);
if(strcmp(name,gName)==0)
{
usesec=timep-utime;
usesec=usesec/60;
}
}
return usesec;
}

int get_num(float data)//统计余额位数
{
float num;
int i=0;
for(;data>=10;)
{
data=data/10;
i++;
}
i=i+2;
return i;
}

float calculate_money(int data,float money)//计算用户花费金额
{
data=data-3;
int i=0;
float m;
i=data/30;
if(data%30>=0)
i=i+1;
m=i*money;
return m;
}

void delete_time()//删除用完的时间
{
char num[20];
int time,n;
tNode head=NULL;
tNode p,p1,p2;
FILE *fp;
fp=fopen("time.txt","r+");
for(;!feof(fp);)
{
fscanf(fp,"%s %d",num,&time);
if(strcmp(num,gName))
{
n++;//相同返回值为0不执行if语句继续循环,不同则执行直到将所有不同的书名建立成链表
if(n==1)//建立链表
{
p1=p2=(tNode)malloc(sizeof(Time));
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(tNode)malloc(sizeof(Time));//新建链表
}
strcpy(p1->num,num);//复制单车信息
p1->time;
}
}
if (n==0)//如果单车只有一项且这一项刚好和要删除的相同
{
head=NULL;
}
else//建立链表的最后剩余一个储存空间,所以封底
{
p2->next=p1;
p1->next=NULL;
fclose(fp);
}
fp=fopen("time.txt","w");//清空文件
fclose(fp);
fp=fopen("time.txt","a");//追加文件
p=head;
for (;p!=NULL;)//把链表内容覆盖到文件
{
fprintf(fp,"%s\t%d\n",p->num,p->time);
p=p->next;
}
free(p);
fclose(fp);
}

void add_money()//充值系统
{
system("title 充值系统");
system("cls");
FILE*fp;
char username[20]={'\0'},name[20]={'\0'},sex[10]={'\0'},tel[12]={'\0'};
int age;
float money,add_money;
int p=0;
fp=fopen("Inform.txt","r+");
for(;strcmp(gName,username)!=0;)
{
fscanf(fp,"%s%s%d%s%s%f",username,name,&age,sex,tel,&money);
}
p=get_num(money)+1;
printf("请输入充值金额:");
scanf("%f",&add_money);
money=money+add_money;
fseek(fp,-p,SEEK_CUR);
fprintf(fp,"%.1f",money);
fclose(fp);
printf("\n充值成功!当前余额为:%.1f",money);
getch();
user_menu();
}

void check_money()//查看余额
{
system("title 充值系统");
system("cls");
FILE*fp;
char username[20]={'\0'},name[20]={'\0'},sex[10]={'\0'},tel[12]={'\0'},lookup[20]={'\0'};
int age;
float money,add_money;
int n=0,m=0,p=0;
fp=fopen("Inform.txt","r+");
for(;strcmp(gName,username)!=0;)
{
fscanf(fp,"%s%s%d%s%s%f",username,name,&age,sex,tel,&money);
}
printf("当前余额为:%.1f",money);
printf("\n按任意键返回上一级...");
getch();
user_menu();
}

void change_pas()//更改密码
{
system("title 创建账号");//改变标题
FILE *fp;
int hit,p=0;
char username[20];
char userpas[20],userpas1[20];
system("cls");
fp=fopen("user.txt","r+");//打开user.txt可读写
for(;strcmp(gName,username)!=0;)//定位指针
{
fscanf(fp,"%s%s",username,userpas);
}
p=strlen(userpas);
fseek(fp,-p,SEEK_CUR);
printf("新密码需与原密码长度一致.");
getch();
system("cls");
for(;;)
{
printf("\n\n\n\n\n\n\t\t\t\t_____________________________________________\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|              修改密码                      |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|           请输入新密码:                   |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|           再次确认密码:                   |\n");
printf("\t\t\t\t|                                            |\n");
printf("\t\t\t\t|____________________________________________|\n");
COORD change_pas = { 57, 10 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), change_pas);//改变光标位置
char key;
int i=0,j=0;
while((key=_getch())!='\r')//如果没有输入回车
{
if(i<19)
{
userpas[i++]=key;//每输入一个字符,打印一个*,让密码不可见
printf("*");
}
else
{
COORD sin_pas_too_long = { 28, 12 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_pas_too_long);
printf("\n\n\n\n\n\t\t\t\t密码过长!\n\t\t\t\t请重新输入!");
getch();

}
}
COORD change_pas_again = { 57, 12 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), change_pas_again);//改变光标位置
while((key=_getch())!='\r')//如果没有输入回车
{
if(j<19)
{
userpas1[j++]=key;
printf("*");
}
else
{
COORD sin_pas_again_too_long = { 28, 16 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_pas_again_too_long);
printf("\n\n\n\n\n\t\t\t\t密码过长!\n\t\t\t\t请重新输入!");
getch();
}
}
if(strcmp(userpas,userpas1)==0)//对比两次输入密码是否一致
{
fprintf(fp,"%s",userpas);
break;
}
else
{
COORD sin_pas_error = { 28, 16 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_pas_error);
printf("两次密码不一致,请重新输入,退出请按ESC");
hit=getch();
if(hit=27) ;
system("cls");
}
}
fclose(fp);
COORD sin_up_sucess = { 32, 16 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), sin_up_sucess);
printf("更改成功,按任意键返回");
getch();
user_menu();
}

void manage_menu()//管理员菜单
{
system("title 共享单车管理系统");
system("cls");
printf("\n\n\t\t\t\t__________________________________________\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|               管理界面                  |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|           1.添加单车                    |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|           2.浏览用户信息                |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|           3.单车使用情况                |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|           4.查找信息                    |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|           5.删除单车                    |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|           6.资金流动情况                |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|           0.退出系统                    |\n");
printf("\t\t\t\t|                                         |\n");
printf("\t\t\t\t|_________________________________________|\n");
keyDown();
}

void keyDown()//对管理员菜单的选择
{
printf("\t\t\t\t请输入:");
int choice=0;
scanf("%d",&choice);
switch(choice)
{
case 1:
add_bike();
break;
case 2:
browseUser();
break;
case 3:
browseBike();
break;
case 4:
lookup_choice();
break;
case 5:
delete_bike();
break;
case 6:
calculate();
break;
case 0:
exit(1);
break;
default:
manage_menu();
break;
}
}

void add_bike()//添加单车
{
system("title 添加单车");
FILE*fp;
char i;
char num[15],_num[15],address[100]={'\0'},_address[100];
int usetime=0,_usetime;
float price,_price,cost,_cost,_makemoney;
system("cls");
if ((fp= fopen("bike.txt","r"))==NULL)
{
fp=fopen("bike.txt","w");
fclose(fp);
}
for(;i!=27;)
{
printf("请输入单车编号:");
scanf("%s",&num);
fopen("bike.txt","r");
for(;!feof(fp);)
{
fscanf(fp,"%s%f%f%f%s%d",_num,&_price,&_makemoney,&_cost,_address,&_usetime);
if(strcmp(num,_num)==0)
{
printf("已存在该编号单车,请尝试其它编号.");
getch();
add_bike();
}
}
printf("\n请输入单车单价:");
scanf("%f",&price);
printf("\n请输入单车成本:");
scanf("%f",&cost);
printf("\n请输入单车位置:");
scanf("%s",&address);
float makemoney=0;
makemoney=makemoney-cost;
fp=fopen("bike.txt","a");
fprintf(fp,"%s\t%.1f\t%.1f\t%.1f\t%s\t%d\n",num,price,makemoney,cost,address,usetime);
printf("继续输入请按回车,结束输入请按ESC");
i=getch();//暂停程序当i接收后继续下一条指令
system("cls");
for(;i!=13&&i!=27;)//保证只能是enter和ESC才能退出循环,输入其他字符无用,暂停程序,按'enter'继续。
i=getch();
}
fclose(fp);
manage_menu();
}

void delete_bike()//删除单车
{
system("title 删除单车");
bNode head=NULL;
bNode p,p1,p2;
char address[100]={'\0'},num[20]={'\0'},lookup[20]={'\0'};
char i;
int n=0,j=0,k=0,f=0;
int usetime;
float price,makemoney,cost;
FILE*fp;
if((fp=fopen("bike.txt","r"))==NULL)
{
system("cls");
printf("数据不存在,请确认相关信息!");
printf("\n即将返回上一级...");
getch();
manage_menu();
}
else
{
system("cls");
fopen("bike.txt","r");
j=num_bike();
if(j==0)
{
system("cls");
printf("无任何单车信息!");
printf("\n即将返回上一级...");
getch();
manage_menu();
}
printf("请输入想要删除的单车编号:");
scanf("%s",lookup);
printf("\n确认删除请回车,取消请按Esc\n");
i=getch();
for(;i!=13&&i!=27;)
i=getch();
if (i==27)
manage_menu();
for(k=0;k<j;k++)
{
fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime);
if(strcmp(lookup,num)==0)//判断是否存在该编号单车
{
f++;
}
if(strcmp(lookup,num))
{
n++;//相同返回值为0不执行if语句继续循环,不同则执行直到将所有不同的书名建立成链表
if(n==1)//建立链表
{
p1=p2=(bNode)malloc(sizeof(Bike));
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(bNode)malloc(sizeof(Bike));//新建链表
}
strcpy(p1->num,num);//复制单车信息
p1->price=price;
p1->makemoney=makemoney;
p1->cost=cost;
strcpy(p1->address,address);
p1->usetime=usetime;
}
}
if (n==0)//如果单车只有一项且这一项刚好和要删除的相同
{
head=NULL;
}
else//建立链表的最后剩余一个储存空间,所以封底
{
p2->next=p1;
p1->next=NULL;
fclose(fp);
}
}
fp=fopen("bike.txt","w");//清空文件
fclose(fp);
fp=fopen("bike.txt","a");//追加文件
p=head;
for (;p!=NULL;)//把链表内容覆盖到文件
{
fprintf(fp,"%s\t%.1f\t%.1f\t%.1f\t%s\t%d\n",p->num,p->price,p->makemoney,p->cost,p->address,p->usetime);
p=p->next;
}
free(p);
fclose(fp);
if(f==0)
{
printf("\n删除失败:不存在该编号单车!");
getch();
manage_menu();
}
else
{
printf("\n删除成功 \n按任意键返回上一层\n");
getch();//返回上一层
manage_menu();
}
}

void lookup_choice()//查找信息
{
system("选择界面");
system("cls");
int choice=0;
printf("请输入查找选项:\n1.查找单车.\n2.查找用户.\n0.返回上一级\n");
printf("请输入:");
scanf("%d",&choice);
switch(choice)
{
case 1:
lookup_bike();
break;
case 2:
lookup_user();
break;
case 0:
manage_menu();
break;
default:
system("cls");
printf("请输入数字1-3!");
getch();
lookup_choice();
break;
}
}

void lookup_bike()//查找单车信息
{
system("title 查找单车");
system("cls");
FILE*fp;
char address[100]={'\0'},num[20]={'\0'},lookup[100]={'\0'};
int n=0,m=0,p=0;
int usetime;
float price,makemoney,cost;
if((fp=fopen("bike.txt","r"))==NULL)
{
system("cls");
printf("数据不存在,请确认相关信息!");
printf("\n即将返回上一级...");
getch();
manage_menu();
}
fp=fopen("bike.txt","r");
n=num_bike();
if(n==0)
{
system("cls");
printf("无任何单车信息!");
printf("\n即将返回上一级...");
getch();
manage_menu();
}
printf("请输入单车地址或编号:");
scanf("%s",lookup);
system("cls");
for(m=0;m<n;m++)
{
fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime);
if(!strcmp(lookup,address)||!strcmp(lookup,num))
{
if(p==0)
{
printf("查询结果:\n");
printf("单车编号\t单车价格/min\t单车赚取利润\t单车成本\t单车地址\t\t单车使用次数\n");
}
printf("%6s\t\t%.1f\t%.1f\t%.1f\t%s\t\t\t%d\n",num,price,makemoney,cost,address,usetime);
p++;
getch();
}
}
if(p==0)
{
system("cls");
printf("无符合记录!");
printf("\n即将返回上一级...");
getch();
manage_menu();
}
fclose(fp);
manage_menu();
}

void lookup_user()//查找用户信息
{
system("title 查找用户");
system("cls");
FILE*fp;
char username[20]={'\0'},name[20]={'\0'},sex[10]={'\0'},tel[12]={'\0'},lookup[20]={'\0'};
int age;
float money;
int n=0,m=0,p=0;
if((fp=fopen("Inform.txt","r"))==NULL)
{
system("cls");
printf("数据不存在,请确认相关信息!");
printf("\n即将返回上一级...");
getch();
manage_menu();
}
fp=fopen("Inform.txt","r");
printf("请输入用户名或姓名/电话:");
scanf("%s",lookup);
system("cls");
n=num_user();
if(n==0)
{
system("cls");
printf("无任何用户信息!");
printf("\n即将返回上一级...");
getch();
manage_menu();
}
for(m=0;m<n;m++)
{
fscanf(fp,"%s%s%d%s%s%f",username,name,&age,sex,tel,&money);
if(!strcmp(lookup,username)||!strcmp(lookup,name)||!strcmp(lookup,sex)||!strcmp(lookup,tel))
{
printf("查询结果:\n");
printf("用户名\t\t姓名\t年龄\t性别\t电话\t\t余额\n");
printf("%s\t%s\t%d\t%s\t%s\t%.1f\n",username,name,age,sex,tel,money);
getch();
p++;
}
}
if(p==0)
{
system("cls");
printf("无符合记录!");
printf("\n即将返回上一级...");
getch();
manage_menu();
}
fclose(fp);
manage_menu();
}

int num_user()//统计用户信息
{
FILE *fp;
int n;
char username[20],name[20],sex[10],tel[12];
int age;
float money;
fp=fopen("Inform.txt","r");
for(n=0;!feof(fp);n++)
fscanf(fp,"%s%s%d%s%s%f",username,name,&age,sex,tel,&money);
n--;
fclose(fp);
return(n);
}

void browseUser()//浏览用户信息
{
system("title 浏览用户信息");
FILE *fp;
int n=0,m=0;
char username[20],name[20],sex[10],tel[12];
int age;
float money;
if ((fp=fopen("Inform.txt","r"))==NULL)//打开文件
{
system ("cls");
printf("\n数据不存在!即将返回上一级...");
getch();
manage_menu();
}
n=num_user();
if(n==0)
{
system("cls");
printf("无任何信息!");
getch();
manage_menu();
}
fp=fopen("Inform.txt","r");
system ("cls");
printf("用户名\t\t姓名\t\t年龄\t性别\t电话\t\t余额\n");
for(m=0;m<n;m++)
{
fscanf(fp,"%s%s%d%s%s%f",username,name,&age,sex,tel,&money);
printf("%s\t\t%s\t\t%d\t%s\t%s\t%.1f\n",username,name,age,sex,tel,money);
}
fclose(fp);
printf("\n按任意键返回\n");
getch();
manage_menu();
}

void browseBike()//浏览单车信息
{
system("title 单车使用情况");
FILE *fp;
int n=0,m=0;
char num[15],address[100];
int usetime=0;
float price,makemoney=0,cost;
if ((fp=fopen("bike.txt","r"))==NULL)//打开文件
{
system ("cls");
printf("\n数据不存在!即将返回上一级...");
getch();
manage_menu();
}
n=num_bike();
if(n==0)
{
system("cls");
printf("无任何信息!");
getch();
manage_menu();
}
fp=fopen("bike.txt","r");
system ("cls");
printf("单车编号\t单车价格/min\t单车赚取利润\t单车成本\t单车地址\t\t单车使用次数\n");
for(m=0;m<n;m++)
{
fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime);
printf("%6s\t\t%.1f\t\t%.1f\t\t%.1f\t\t%s\t\t\t%d\n",num,price,makemoney,cost,address,usetime);
}
fclose(fp);
printf("\n按任意键返回\n");
getch();
manage_menu();
}

float calculate()//资金流动情况
{
system("title 资金流动情况");
system("cls");
float calculate,calculate1;
FILE *fp;
//单车的读取和计算
char address[100],num[20];
int n=0,m=0,j=0,k=0;
int usetime;
float price,makemoney,cost;//单车的资金计算
if ((fp=fopen("bike.txt","r"))==NULL)
{
system("cls");
printf("没有单车数据,当前无法盈利!\n");
printf("即将返回上一级...");
getch();
manage_menu();
}
n=num_bike();
if(n==0)
{
system("cls");
printf("无任何单车信息!");
getch();
manage_menu();
}
fp=fopen("bike.txt","r");
for(m=0;m<n;m++)
{
fscanf(fp,"%s\t%f\t%f\t%f\t%s\t%d",num,&price,&makemoney,&cost,address,&usetime);
calculate=calculate+makemoney;
}
printf("单车赚取利润为:\t\t%.1f",calculate);
fclose(fp);
getch();
//用户数据读取和计算
char username[20],name[20],sex[10],tel[12];
int age;
float money;
if ((fp=fopen("Inform.txt","r"))==NULL)//打开文件
{
system ("cls");
printf("无法找到用户数据!\n");
printf("即将返回上一级...");
getch();
manage_menu();
}
j=num_user();
if(j==0)
{
system("cls");
printf("没有任何用户信息!");
getch();
printf("\n总共盈损:\t\t%.1f",calculate) ;
getch();
manage_menu();
}
fp=fopen("Inform.txt","r");
for(k=0;k<j;k++)
{
fscanf(fp,"%s%s%d%s%s%f",username,name,&age,sex,tel,&money);
calculate1=calculate1+money;
}
printf("\n来自用户的利润为:\t%.1f",calculate1);
getch();
printf("\n总共盈损:\t\t%.1f",calculate+calculate1);
getch();
printf("\n即将返回上一级...");
getch();
manage_menu();
}

int main()
{
print();
return 0;
}

做下来这一个项目,参考了很多大佬的博客,有些东西我也解释不明白,贴下来我参考的文章,大家一起学习。

c语言:图书馆管理系统 //大部分是根据这位大佬的改编
https://blog.csdn.net/baidu_38760069/article/details/81014621

C语言利用链表与文件实现登录注册
https://blog.csdn.net/u011463794/article/details/82710787#comments

C/C++文件读写操作——FILE*、fstream、windowsAPI
https://blog.csdn.net/qq_15821725/article/details/78929344

C语言中fread(),fwrite(),fseek()用法和功能
https://blog.csdn.net/chichoxian/article/details/53458197

控制台光标(二):设置光标位置
https://blog.csdn.net/nocomment_84/article/details/53995015

消灭编译警告(Warning) //编译出现错误,这篇博文很有用
https://blog.csdn.net/myaccella/article/details/7003188

  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
Yyyyyam_ 发布了1 篇原创文章 · 获赞 1 · 访问量 368 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐