标题:请大家运行一下我的程序,我有个错误不知道在哪里
只看楼主
南信大
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2012-12-8
结帖率:44.44%
 问题点数:0 回复次数:2 
请大家运行一下我的程序,我有个错误不知道在哪里
#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。问题在哪里啊?其它函数我还没来得及测试,我想先解决这个问题!
搜索更多相关主题的帖子: include money double 身份证号 
2013-12-31 13:03
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
得分:0 
scanf("%f",&temp.money);  -->  scanf("%lf",&temp.money);

总有那身价贱的人给作业贴回复完整的代码
2013-12-31 13:09
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
得分:0 
  too long   
不会调试吗?

三十年河东,三十年河西,莫欺少年穷!
2013-12-31 15:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-425945-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.308845 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved