|
|
#include<stdio.h>
|
|
|
#include<stdlib.h>
|
|
|
#include<string.h>
|
|
|
void xiugai()
|
|
|
{
|
|
|
int i,num; //i是循环变量,num是switch选择结构中的判断条件
|
|
|
char c[10]; //用来存放输入数据(密码)的字符数组
|
|
|
struct zhanghu //一个名叫zhanghu的结构体
|
|
|
{
|
|
|
char name[10]; //存放姓名
|
|
|
char mima[10]; //存放密码
|
|
|
char dizhi[10]; //存放地址
|
|
|
char shouji[20]; //存放手机号
|
|
|
long int money; //存放账户余额
|
|
|
};
|
|
|
struct zhanghu m[20],caozuo; // 定义一个名叫m的结构体数组,定义一个名叫caozuo的结构体
|
|
|
FILE *fp;
|
|
|
if((fp=fopen("数据库.txt","r"))==NULL) //打开文件
|
|
|
{
|
|
|
printf("File open error!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
printf("请输入要修改信息的账户名字:");
|
|
|
scanf("%s",&(caozuo.name));
|
|
|
printf("请输入账户密码(6位数字):");
|
|
|
scanf("%s",&(caozuo.mima));
|
|
|
printf("请再次确认密码:");
|
|
|
scanf("%s",&c);
|
|
|
for(i=0;i<20;i++)
|
|
|
{ // 做个循环,把文件中的数据依次存放到结构体数组m中
|
|
|
fscanf(fp,"%s %s %s %s %ld",&(m[i].name),&(m[i].mima),&(m[i].dizhi),&(m[i].shouji),&(m[i].money));
|
|
|
if(strcmp(m[i].name,caozuo.name)==0)// 判断此次从文件输入的姓名数据是否符合要修改的数据姓名
|
|
|
{
|
|
|
while((strcmp(c,caozuo.mima)!=0)||(strcmp(c,m[i].mima)!=0))//做循环,直到保证输入的密码和文件中储存的密码一致才结束循环
|
|
|
{
|
|
|
printf("密码有误,请重新输入密码:\n");
|
|
|
printf("请输入密码(6位数字):");
|
|
|
scanf("%s",&(caozuo.mima));
|
|
|
printf("请再次确认密码:"); // 输入两次密码,以保证输入信息准确
|
|
|
scanf("%s",&c);
|
|
|
}
|
|
|
printf("请按照以下提示更改信息:\n");
|
|
|
printf("姓名请按'1'、密码请按'2';\n"); //提示性语句
|
|
|
printf("地址请按'3'、联系方式请按'4';\n");
|
|
|
printf("请输入数字:");
|
|
|
do // 做循环,目的是根据具体输入的数字(输入到变量num中)执行其所控制的更改信息的命令
|
|
|
{
|
|
|
scanf("%d",&num); // 输入数字(选择执行哪一种更改信息的命令)
|
|
|
switch(num) // 做循环
|
|
|
{
|
|
|
case 1: // 如果输入数字为1,则更改姓名
|
|
|
{
|
|
|
printf("请输入替换姓名:");
|
|
|
scanf("%s",&(caozuo.name));
|
|
|
strcpy(m[i].name,caozuo.name);
|
|
|
break;
|
|
|
}
|
|
|
case 2:
|
|
|
{
|
|
|
printf("请输入替换密码(6位数字):"); //输入为2,则更改密码
|
|
|
scanf("%s",&(caozuo.mima));
|
|
|
printf("请再次确认密码:");
|
|
|
scanf("%s",&c);
|
|
|
while(strcmp(c,caozuo.mima)!=0) // 做循环,保证输入密码准确
|
|
|
{
|
|
|
printf("两次密码不一致,请重新输入密码。\n");
|
|
|
printf("请设置密码(6位数字):");
|
|
|
scanf("%s",&(caozuo.mima));
|
|
|
printf("请再次确认密码:");
|
|
|
scanf("%s",&c);
|
|
|
}
|
|
|
strcpy(m[i].mima,caozuo.mima); //替换旧密码
|
|
|
break;
|
|
|
}
|
|
|
case 3:
|
|
|
{
|
|
|
printf("请输入替换地址:");
|
|
|
scanf("%s",&(caozuo.dizhi)); //输入为3,更改地址
|
|
|
strcpy(m[i].dizhi,caozuo.dizhi);
|
|
|
break;
|
|
|
}
|
|
|
case 4:
|
|
|
{
|
|
|
printf("请输入替换的联系方式:");
|
|
|
scanf("%s",&(caozuo.dizhi)); //输入为4,更改联系方式
|
|
|
strcpy(m[i].dizhi,caozuo.dizhi);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
printf("请问是否继续修改信息\n");
|
|
|
printf("如需继续请输入相关数字,否则请输入其余任意数字退出。\n");//提示性语句
|
|
|
scanf("%d",&num);
|
|
|
}while(num>=1&&num<5); // 如果输入数字在1到4之间,则继续执行以上循环(即更改信息),否则循环终止
|
|
|
}
|
|
|
}
|
|
|
if(fclose(fp))
|
|
|
{ // 关闭文件
|
|
|
printf(" File close error! \n");
|
|
|
exit(0);
|
|
|
}
|
|
|
if((fp=fopen("数据库.txt","w"))==NULL)
|
|
|
{ // 再次打开文件
|
|
|
printf("File open error!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
for(i=0;i<16;i++)
|
|
|
fprintf(fp,"%s %s %s %s %ld\n",(m[i].name),(m[i].mima),(m[i].dizhi),(m[i].shouji),(m[i].money));
|
|
|
if(fclose(fp)) // 把更改后的数据写入文件中
|
|
|
{
|
|
|
printf(" File close error! \n");
|
|
|
exit(0);
|
|
|
}
|
|
|
printf("信息已更改。\n"); //提示性语句
|
|
|
}
|
|
|
void shanchu()
|
|
|
{
|
|
|
int i,a,l=0,f; // 定义几个整型变量:i是循环变量、
|
|
|
char c[10];
|
|
|
struct zhanghu
|
|
|
{
|
|
|
char name[10];
|
|
|
char mima[10];
|
|
|
char dizhi[10];
|
|
|
char shouji[20];
|
|
|
long int money;
|
|
|
};
|
|
|
struct zhanghu m[20],shuru; // 定义一个结构体数组m、定义一个名叫shuru的结构体变量来存放输入数据
|
|
|
FILE *fp;
|
|
|
if((fp=fopen("数据库.txt","r"))==NULL)
|
|
|
{
|
|
|
printf("File open error!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
while((a=fgetc(fp))!=EOF) // 做循环,目的是把文件行数存到变量l中
|
|
|
if(a=='\n')
|
|
|
l++;
|
|
|
if(fclose(fp))
|
|
|
{
|
|
|
printf(" File close error! \n");
|
|
|
exit(0);
|
|
|
}
|
|
|
if((fp=fopen("数据库.txt","r"))==NULL)
|
|
|
{
|
|
|
printf("File open error!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
|
|
|
if((fp=fopen("数据库.txt","r"))==NULL)
|
|
|
{
|
|
|
printf("File open error!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
printf("请输入要删除的账户名字:");
|
|
|
scanf("%s",&(shuru.name));
|
|
|
printf("请输入账户密码(6位数字):");
|
|
|
scanf("%s",&(shuru.mima));
|
|
|
printf("请再次确认密码:"); // 提示性语句
|
|
|
scanf("%s",&c);
|
|
|
for(i=0;i<l;i++) // 做循环,
|
|
|
{ //依次从文件读取数据到结构体数组中
|
|
|
fscanf(fp,"%s %s %s %s %ld",&(m[i].name),&(m[i].mima),&(m[i].dizhi),&(m[i].shouji),&(m[i].money));
|
|
|
if(strcmp(m[i].name,shuru.name)==0) //判断此次输入的名字是否等同于结构体数组存入的名字
|
|
|
{
|
|
|
while((strcmp(c,shuru.mima)!=0)||(strcmp(shuru.mima,m[i].mima)!=0))//做循环,保证输入密码的准确性
|
|
|
{
|
|
|
printf("密码有误,请重新输入密码。\n");
|
|
|
printf("请输入账户密码(6位数字):");
|
|
|
scanf("%s",&(shuru.mima)); // 提示性语句
|
|
|
printf("请再次确认密码(6位数字):");
|
|
|
scanf("%s",&c);
|
|
|
}
|
|
|
f=i;// 用f存放名字符合是结构体数组的下标值
|
|
|
}
|
|
|
}
|
|
|
if(fclose(fp))
|
|
|
{
|
|
|
printf(" File close error! \n");
|
|
|
exit(0);
|
|
|
}
|
|
|
if((fp=fopen("数据库.txt","w"))==NULL)
|
|
|
{
|
|
|
printf("File open error!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
for(i=0;i<f;i++) // 把除了下标为f的其余结构体数组中的数据写入文件
|
|
|
fprintf(fp,"%s %s %s %s %ld\n",(m[i].name),(m[i].mima),(m[i].dizhi),(m[i].shouji),(m[i].money));
|
|
|
for(i=f+1;i<l-1;i++)
|
|
|
fprintf(fp,"%s %s %s %s %ld\n",(m[i].name),(m[i].mima),(m[i].dizhi),(m[i].shouji),(m[i].money));
|
|
|
if(fclose(fp))
|
|
|
{
|
|
|
printf(" File close error! \n");
|
|
|
exit(0);
|
|
|
}
|
|
|
printf("账户已删除。\n");//提示性语句
|
|
|
}
|
|
|
void cunkuan()
|
|
|
{
|
|
|
int i; // i是循环变量
|
|
|
char c[20]={0};
|
|
|
long int a; // a是用来存储金额的变量
|
|
|
struct zhanghu
|
|
|
{
|
|
|
char name[10];
|
|
|
char mima[10];
|
|
|
char dizhi[10];
|
|
|
char shouji[20];
|
|
|
long int money;
|
|
|
};
|
|
|
struct zhanghu m[20],shuru; //定义结构体数组m和结构体shuru(存放输入数据)
|
|
|
FILE *fp;
|
|
|
if((fp=fopen("数据库.txt","r"))==NULL)
|
|
|
{
|
|
|
printf("File open error!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
printf("请输入要进行存款的账户名字:");
|
|
|
scanf("%s",&(shuru.name));
|
|
|
for(i=0;i<16;i++)
|
|
|
{ // 做循环,目的是查询到目标账户的余额
|
|
|
fscanf(fp,"%s %s %s %s %ld",&(m[i].name),&(m[i].mima),&(m[i].dizhi),&(m[i].shouji),&(m[i].money));//把文件数据读入数组m中
|
|
|
if(strcmp(shuru.name,m[i].name)==0) //判断输入姓名和此时结构体数组中存入的姓名是否一致
|
|
|
{
|
|
|
printf("请输入账户密码:");
|
|
|
scanf("%s",&(shuru.mima));
|
|
|
while(strcmp(m[i].mima,shuru.mima)!=0)// 做循环,保证输入密码准确性
|
|
|
{
|
|
|
printf("密码错误,请重新输入:\n");
|
|
|
scanf("%s",&(shuru.mima));
|
|
|
}
|
|
|
printf("当前账户余额为:%ld元。\n",(m[i].money));
|
|
|
printf("请输入存款金额:");
|
|
|
scanf("%ld",&a); // 输入存入金额到a中
|
|
|
m[i].money=m[i].money+a; // 改变现在结构体数组中储存金额的变量的值(改成存款后金额)
|
|
|
printf("操作成功!当前账户余额为%ld元。\n",m[i].money);
|
|
|
}
|
|
|
}
|
|
|
if(fclose(fp))
|
|
|
{
|
|
|
printf(" File close error! \n");
|
|
|
exit(0);
|
|
|
}
|
|
|
if((fp=fopen("数据库.txt","w"))==NULL)
|
|
|
{
|
|
|
printf("File open error!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
for(i=0;i<16;i++)//做循环,把m中数据存入文件中
|
|
|
fprintf(fp,"%s %s %s %s %ld\n",(m[i].name),(m[i].mima),(m[i].dizhi),(m[i].shouji),(m[i].money));
|
|
|
if(fclose(fp))
|
|
|
{
|
|
|
printf(" File close error! \n");
|
|
|
exit(0);
|
|
|
}
|
|
|
}
|
|
|
void qukuan()
|
|
|
{
|
|
|
int i; // i是循环变量
|
|
|
long int a; // a存储取款金额
|
|
|
struct zhanghu
|
|
|
{
|
|
|
char name[10];
|
|
|
char mima[10];
|
|
|
char dizhi[10];
|
|
|
char shouji[20];
|
|
|
long int money;
|
|
|
};
|
|
|
struct zhanghu m[20],shuru; //定义结构体数组m和结构体变量shuru
|
|
|
FILE *fp;
|
|
|
if((fp=fopen("数据库.txt","r"))==NULL)
|
|
|
{
|
|
|
printf("File open error!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
printf("请输入要进行取款的账户名字:");
|
|
|
scanf("%s",&(shuru.name));
|
|
|
for(i=0;i<16;i++)
|
|
|
{ // 做循环,把文件数据读入m中
|
|
|
fscanf(fp,"%s %s %s %s %ld",&(m[i].name),&(m[i].mima),&(m[i].dizhi),&(m[i].shouji),&(m[i].money));
|
|
|
if(strcmp(shuru.name,m[i].name)==0) //判断此时m[i]中的姓名是否与输入姓名一致
|
|
|
{
|
|
|
printf("请输入账户密码:");
|
|
|
scanf("%s",&(shuru.mima));
|
|
|
while(strcmp(m[i].mima,shuru.mima)!=0)// 做循环,保证输入密码的准确性
|
|
|
{
|
|
|
printf("密码错误,请重新输入:\n");
|
|
|
scanf("%s",&(shuru.mima));
|
|
|
}
|
|
|
printf("当前账户余额为:%ld元。\n",(m[i].money));
|
|
|
printf("请输入取款金额:");
|
|
|
scanf("%ld",&a);
|
|
|
if(a>m[i].money) //判断取款金额是否超出账户余额
|
|
|
{
|
|
|
printf("余额不足!请支取余额范围内的金额。\n");
|
|
|
m[i].money=m[i].money-a; // 用存款后的账户金额替代原有金额
|
|
|
printf("操作成功!当前账户余额为%ld元。\n",m[i].money);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m[i].money=m[i].money-a;
|
|
|
printf("操作成功!当前账户余额为%ld元。\n",m[i].money);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if(fclose(fp))
|
|
|
{
|
|
|
printf(" File close error! \n");
|
|
|
exit(0);
|
|
|
}
|
|
|
if((fp=fopen("数据库.txt","w"))==NULL)
|
|
|
{
|
|
|
printf("File open error!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
for(i=0;i<16;i++)// 把m中数据写入文件中
|
|
|
fprintf(fp,"%s %s %s %s %ld\n",(m[i].name),(m[i].mima),(m[i].dizhi),(m[i].shouji),(m[i].money));
|
|
|
if(fclose(fp))
|
|
|
{
|
|
|
printf(" File close error! \n");
|
|
|
exit(0);
|
|
|
}
|
|
|
}
|
|
|
void charu()
|
|
|
{
|
|
|
int i; // i是循环变量
|
|
|
char c[10]; //c存储输入的密码
|
|
|
struct zhanghu
|
|
|
{
|
|
|
char name[10];
|
|
|
char mima[10];
|
|
|
char dizhi[10];
|
|
|
char shouji[20];
|
|
|
long int money;
|
|
|
};
|
|
|
struct zhanghu m[20];// 定义结构体数组m
|
|
|
FILE *fp;
|
|
|
if((fp=fopen("数据库.txt","r"))==NULL)
|
|
|
{
|
|
|
printf("File open error!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
for(i=0;i<16;i++) // 作循环,把文件数据读入m中
|
|
|
fscanf(fp,"%s %s %s %s %ld",&(m[i].name),&(m[i].mima),&(m[i].dizhi),&(m[i].shouji),&(m[i].money));
|
|
|
printf("请输入要插入的账户名字:");
|
|
|
scanf("%s",&(m[16].name));
|
|
|
printf("请输入现居地址:"); // 提示性语句
|
|
|
scanf("%s",&(m[16].dizhi));
|
|
|
printf("请输入联系方式(手机号):");
|
|
|
scanf("%s",&(m[16].shouji));
|
|
|
printf("请设置密码(6位数字):");
|
|
|
scanf("%s",&(m[16].mima));
|
|
|
printf("请再次确认密码:");
|
|
|
scanf("%s",&c);
|
|
|
while(strcmp(c,m[16].mima)!=0) // 作循环,保证输入密码的准确性
|
|
|
{
|
|
|
printf("两次密码不一致,请重新设置密码。\n");
|
|
|
printf("请设置密码(6位数字):");
|
|
|
scanf("%s",&(m[16].mima));
|
|
|
printf("请再次确认密码:");
|
|
|
scanf("%s",&c);
|
|
|
}
|
|
|
printf("请输入首存金额:\n");
|
|
|
scanf("%ld",&(m[16].money));
|
|
|
if(fclose(fp))
|
|
|
{
|
|
|
printf(" File close error! \n");
|
|
|
exit(0);
|
|
|
}
|
|
|
if((fp=fopen("数据库.txt","w"))==NULL)
|
|
|
{
|
|
|
printf("File open error!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
for(i=0;i<17;i++) // 把m中数据写入文件中
|
|
|
fprintf(fp,"%s %s %s %s %ld\n",(m[i].name),(m[i].mima),(m[i].dizhi),(m[i].shouji),(m[i].money));
|
|
|
if(fclose(fp))
|
|
|
{
|
|
|
printf(" File close error! \n");
|
|
|
exit(0);
|
|
|
}
|
|
|
printf("账户已建立。\n");
|
|
|
}
|
|
|
void chaxun()
|
|
|
{
|
|
|
struct zhanghu
|
|
|
{
|
|
|
char name[10];
|
|
|
char mima[10];
|
|
|
char dizhi[10];
|
|
|
char shouji[20];
|
|
|
char money[20];
|
|
|
};
|
|
|
struct zhanghu m,shuru; // 定义两个结构体变量,m存文件中的数据,shuru存输入数据
|
|
|
FILE *fp;
|
|
|
if((fp=fopen("数据库.txt","r+"))==NULL)
|
|
|
{
|
|
|
printf("File open error!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
printf("请输入要查询的账户名字:");
|
|
|
scanf("%s",&(shuru.name));
|
|
|
while(!feof(fp)) // 当文件未读到结尾时
|
|
|
{
|
|
|
fscanf(fp,"%s %s %s %s %s",&(m.name),&(m.mima),&(m.dizhi),&(m.shouji),&(m.money)); //存取文件数据
|
|
|
if(strcmp(shuru.name,m.name)==0)//判断输入姓名是否与m中的姓名一致
|
|
|
{
|
|
|
printf("请输入查询密码(6位数字):");
|
|
|
scanf("%s",&(shuru.mima));
|
|
|
while(strcmp(m.mima,shuru.mima)!=0) // 作循环,保证输入密码的准确性
|
|
|
{
|
|
|
printf("密码有误,请重新输入密码(6位数字):\n");
|
|
|
scanf("%s",&(shuru.mima));
|
|
|
}
|
|
|
printf("当前账户余额为:%s元。\n",(m.money));
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if(fclose(fp))
|
|
|
{
|
|
|
printf(" File close error! \n");
|
|
|
exit(0);
|
|
|
}
|
|
|
}
|
|
|
int jianyan(int x)
|
|
|
{
|
|
|
int n;
|
|
|
n=x; // 定义变量n来接受传入x中的数据
|
|
|
if(n>=1&&n<=6) // 判断:如果传入数据在0~6之间,则返回当前n的值
|
|
|
return n;
|
|
|
else // 否则,则要求重新输入n,再返回n得志
|
|
|
{
|
|
|
printf("输入数字不在操作范围内,请检查后重新输入\n");
|
|
|
printf("请重新输入数字:\n");
|
|
|
n=0;
|
|
|
scanf("%d",&n);
|
|
|
jianyan(n);
|
|
|
}
|
|
|
}
|
|
|
void caidan(int x)
|
|
|
{
|
|
|
char c;
|
|
|
printf("请确认是否执行'%d'的操作\n",x); // 提示性语句
|
|
|
printf("确认执行请输入'Y',取消执行请输入'N'\n");
|
|
|
scanf("%c",&c);
|
|
|
printf("请输入字母:");
|
|
|
scanf("%c",&c);
|
|
|
if(c=='Y') // 如果输入为'Y',则执行下面的switch的循环
|
|
|
{
|
|
|
switch(x) // 判断x的值,根据x的值执行不同的case语句
|
|
|
{
|
|
|
case 1:
|
|
|
{
|
|
|
chaxun();
|
|
|
printf("请问是否进行其他操作\n");
|
|
|
break; // 执行完当前的case语句就直接跳出switch循环
|
|
|
}
|
|
|
case 2:
|
|
|
{
|
|
|
cunkuan();
|
|
|
printf("请问是否进行其他操作\n");
|
|
|
break;
|
|
|
}
|
|
|
case 3:
|
|
|
{
|
|
|
qukuan();
|
|
|
printf("请问是否进行其他操作\n");
|
|
|
break;
|
|
|
}
|
|
|
case 4:
|
|
|
{
|
|
|
charu();
|
|
|
printf("请问是否进行其他操作\n");
|
|
|
break;
|
|
|
}
|
|
|
case 5:
|
|
|
{
|
|
|
shanchu();
|
|
|
printf("请问是否进行其他操作\n");
|
|
|
break;
|
|
|
}
|
|
|
case 6:
|
|
|
{
|
|
|
xiugai();
|
|
|
printf("请问是否进行其他操作\n");
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if(c=='N') // 如果输入为'N',则取消当前操作
|
|
|
printf("'%d'操作已取消执行,是否进行其他操作\n",x);
|
|
|
printf("继续操作请输入相关数字,否则请输入其他任意数字退出操作\n"); //提示性语句
|
|
|
x=0;
|
|
|
printf("请输入数字:");
|
|
|
scanf("%d",&x);
|
|
|
if(x==9)
|
|
|
exit(0);
|
|
|
if(x>=1&&x<=6) //如果输入数字在1~6之间,执行caidan函数中的内容
|
|
|
caidan(x);
|
|
|
}
|
|
|
int main(void)
|
|
|
{
|
|
|
int n,k;
|
|
|
printf("以下是本系统的基础功能:\n"); //输出提示性语句
|
|
|
printf("1.查询账户余额\n");
|
|
|
printf("2.存款\n");
|
|
|
printf("3.取款\n");
|
|
|
printf("4.插入账户\n");
|
|
|
printf("5.删除账户\n");
|
|
|
printf("6.修改账户\n");
|
|
|
printf("请根据具体需要输入数字进行相关操作\n");
|
|
|
printf("请输入数字:");
|
|
|
scanf("%d",&n);
|
|
|
k=jianyan(n); //先调用jianyan函数检验输入数字n是否在可操作的范围内
|
|
|
caidan(k); // 再调用caidan函数
|
|
|
return 0;
|
|
|
}
|
|
|
|