请大家运行一下我的程序,我有个错误不知道在哪里
#include<stdio.h>#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define file "temp.txt" //数据存储的文件名
struct user //用户类型定义(账号,姓名,身份证号,余额)
{
int id;
char name[20];
char person_num[19];
double money;
};
void add() //添加用户资料
{
printf("***添加用户***\n");
printf("---------------------------------------------\n");
struct user getuser();
int count(); //函数目的:计算文件中的记录数目 以生成自动账号
FILE *fp;
int number;
struct user temp;
if((fp=fopen(file,"ab"))==NULL)
{
printf("cannot open file!\n");
exit(1);
}
temp=getuser(); //读取用户名
number=count();
temp.id=number+1; //生成自动账号
fwrite(&temp,sizeof(struct user),1,fp);
printf("添加用户成功!\n");
fclose(fp);
}
int count() //函数目的:计算文件中的记录总数
{
FILE *fp;
int num;
struct user temp;
num=0;
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannot open file!\n");
exit(1);
}
while(fread(&temp,sizeof(struct user),1,fp))
{
num++;
}
fclose(fp);
return num;
}
struct user getuser()
{
void getname(char *name);
void getperson_num(char *person_num);
struct user temp;
printf("请输入用户姓名(字符数<20):\n"); //读取相关开户信息
getname(temp.name);
printf("请输入用户身份证号码:\n");
getperson_num(temp.person_num);
printf("输入开户金额:\n");
do{ //判断开户金额(>=100)
scanf("%f",&temp.money);
fflush(stdin);
if((temp.money)<100.0)
printf("开户金额不能小于100\n");
else
break;
printf("重新输入开户金额:\n");
}while(1);
return temp;
}
void getname(char *name) //函数功能:读取用户姓名(字符数<20)
{
do{
scanf("%s",name);
fflush(stdin);
if(strlen(name)==0)
printf("姓名不能为空!\n");
else
if(strlen(name)>=20)
printf("姓名不能超过20个字符!\n");
else
break;
printf("重新输入姓名:\n");
}while(1); //循环以保证读入数据有效
}
void getperson_num(char *person_num) //函数功能:读取用户身份证号码(15位 或者 18位 )
{
do{
int i,mark;
char ch;
for(i=0,mark=0;;i++) //输入有效性判断(只能是数字)
if((ch=getchar())!='\n')
{
if(ch<='9'&&ch>='0')
person_num[i]=ch;
else
{
printf("身份证号码只能是数字!\n");
mark=1;
break;
}
}
else
break;
person_num[i]='\0';
if(mark==1)
continue;
if(strlen(person_num)!=15&&strlen(person_num)!=18)
printf("身份证号码只能是15位,或者18位!\n");
else
break;
printf("重新输入身份证号码:\n");
}while(1); //循环以保证读入数据有效
}
void select_name() //按照姓名查询账户余额
{
void getname(char *name);
printf("***按照姓名查询账户余额***\n");
printf("账号 用户姓名 身份证号码 存款余额\n");
printf("---------------------------------------------\n");
FILE * fp;
struct user temp;
char name[20];
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannot open file!\n");
exit(1);
}
printf("输入要查询的姓名:\n"); //调用读取用户名函数
getname(name);
while(fread(&temp,sizeof(struct user),1,fp)) //循环读取每一条记录 判断是否为要查看的记录
if(strcmp(temp.name,name)==0)
{
printf("%d%c%c%f\n",temp.id,temp.name,temp.person_num,temp.money);
}
fclose(fp);
}
void select_id() //按照账号查询账户余额
{
int count();
printf("***按照编号查询账户余额***\n");
printf("编号 用户姓名 身份证号码 存款余额\n");
printf("---------------------------------------------\n");
FILE * fp;
struct user temp;
int i,maxnum;
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannot open file!\n");
exit(1);
}
maxnum=count();
printf("输入要查询账号:\n"); //判断账号是否在记录中
scanf("%d",&i);
if(i<1||i>maxnum)
{
printf("你要查询的账号不存在!\n");
return;
}
while(fread(&temp,sizeof(struct user),1,fp))//循环读取每一条记录 判断是否为要查看的记录
if(temp.id==i)
{
printf("%d%c%c%f\n",temp.id,temp.name,temp.person_num,temp.money);
}
fclose(fp);
}
void display() //显示用户资料
{
printf("***用户资料显示***\n");
printf("---------------------------------------------\n");
FILE * fp;
struct user temp;
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannot open file!\n");
exit(1);
}
while(fread(&temp,sizeof(struct user),1,fp))
{
printf("账号:%d\n用户姓名%c\n身份证号码%c\n存款余额%f\n",temp.id,temp.name,temp.person_num,temp.money);
}
fclose(fp);
}
void save_money() //函数功能:按账号存款
{
printf("***用户存款业务***\n");
printf("---------------------------------------------\n");
int count();
FILE *fp;
int i,num,mark;
struct user *temp;
num=count(); //根据记录数申请空间
temp=(struct user *)malloc(num*sizeof(struct user));
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannot open file!\n");
exit(1);
}
for(i=0;i<num;i++) //将文件内容存入数组
fread(&temp[i],sizeof(struct user),1,fp);
fclose(fp);
printf("输入要存款账号:\n"); //读取存款账号
scanf("%d",&mark);
if(mark<1||mark>num)
{
printf("你要存款账号不存在!\n");
return;
}
if((fp=fopen(file,"wb"))==NULL) //写方式打开文件,覆盖原文件中的内容
{
printf("cannot open file!\n");
exit(1);
}
for(i=0;i<num;i++)
{
if(temp[i].id==mark)
{
double money=0;
printf("输入要存入的金额:\n");
scanf("%f",&money);
if(money<=0)
{
printf("只能为正数!\n");
money=0;
}
temp[i].money +=money; //修改该用户的信息
}
fwrite(&temp[i],sizeof(struct user),1,fp);
}
fclose(fp);
free(temp);
printf("业务受理成功!\n");
}
void get_money() //函数功能:用户取款
{
printf("***用户取款业务***\n");
printf("---------------------------------------------\n");
int count();
FILE *fp;
int i,num,mark;
struct user *temp;
num=count(); //根据记录数申请空间
temp=(struct user *)malloc(num*sizeof(struct user));
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannot open file!\n");
exit(1);
}
for(i=0;i<num;i++) //读取文件内容
fread(&temp[i],sizeof(struct user),1,fp);
fclose(fp);
printf("输入要取款账号:\n");
scanf("%d",&mark);
if(mark<1||mark>num)
{
printf("你要取款账号不存在!\n");
return;
}
if((fp=fopen(file,"wb"))==NULL)
{
printf("cannot open file!\n");
exit(1);
}
for(i=0;i<num;i++) //写方式打开文件,覆盖原文件中的内容
{
if(temp[i].id==mark)
{
double money=0;
printf("输入要取出的金额:\n");
scanf("%d",&money);
if(money<=0) //判断用户余额是否足够
{
printf("只能为正数!\n");
money=0;
}
else
if(money>temp[i].money)
{
printf("你的余额不足!\n");
money=0;
}
temp[i].money -=money;
}
fwrite(&temp[i],sizeof(struct user),1,fp);
}
fclose(fp);
free(temp);
printf("业务受理成功!\n");
}
void del() //销户
{
int count();
printf("***注销账户***\n");
printf("账号 用户姓名 身份证号码 存款余额\n");
printf("---------------------------------------------\n");
FILE * fp;
struct user temp;
int i,maxnum;
if((fp=fopen(file,"rb"))==NULL)
{
printf("cannot open file!\n");
exit(1);
}
maxnum=count();
printf("输入要销户账号:\n"); //判断编号是否在记录中
scanf("%d",&i);
if(i<1||i>maxnum)
{
printf("你要查询的账号不存在!\n");
return;
}
while(fread(&temp,sizeof(struct user),1,fp))//循环读取每一条记录 判断是否为要查看的记录
if(temp.id==i&&temp.money==0.00)//余额为0
{temp.id=-1;//算无效帐户
printf("%d%c%c%f",temp.id,temp.name,temp.person_num,temp.money);
fwrite(&temp,sizeof(struct user),1,fp);//保存修改
}
fclose(fp);
}
void print() //函数功能:输出界面
{
printf("***活期储蓄帐目管理系统***\n");
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("请选择功能(1~8):\n");
}
int main()
{
char choose;
do{
print();
scanf("%c",&choose); //读取功能标号,根据标号选择不同的函数
fflush(stdin);
system("cls");
switch(choose)
{
case '1':
add();
break;
case '2':
select_name();
break;
case '3':
select_id();
break;
case '4':
display();
break;
case '5':
save_money();
break;
case '6':
get_money();
break;
case '7':
del();
break;
case '8':
exit(1);
default:
printf("对不起,你所选择的功能不存在!\n");
}
getch(); //暂停功能(读取任意键继续)(conio.h)
system("cls"); //清除屏幕显示(stdlib.h)
}while(1);
return 0;
}
问题就是选1储蓄开户时,当输入金额时不管输出多少都提示金额不能小于100。问题在哪里啊?其它函数我还没来得及测试,我想先解决这个问题!