You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

517 lines
13 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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;
}