懒大王ツ 2022-06-22 21:58 采纳率: 71.4%
浏览 134
已结题

对一个简单程序(C语言,大一水平)的调试

希望大家帮我看看这个程序有什么问题。要先建一个account.txt文件。开户这些应该没问题,整个大结构也应该差不多。存款(取款也是)这里开始就存不进去了,可能我定义的judge函数(用来判断输入金额是否符合要求)出问题了,a的值返回不了1.不管输入什么总会反复执行while循环。(转账操作应该也输入不了金额,因为存款进不去所以没试)

昨天发的程序太乱,这次我还去网上找了个框架来(我用的编译器是Clion)
 开户:增加一个银行账户,输入账号、姓名、密码、金额、状态自动设置为0(正常)。
 存款:输入账号、金额,增加该账号的金额
 取款:输入账号、金额,减少取款的金额。要求取款额不能超过原余额
 查询:输入账号,显示账户信息。
转账:输入转出的账号及金额以及转入的账号,减少转出账号的金额,增加转入账号的金额。要求转出账户的金额不能超过该账号 的余额,转出减少的金额,与转入账户增加的金额相同。
 挂失:输入账号,将其状态变为1(挂失)。处于挂失状态的账户,不能进行除解挂以外的任何操作。
 解挂:输入账户,将其状态变为0。
 销户:输入账号,确认后,提示将余额全部取完,将余额置为0,并将状态state置为2(销户)。办理销户的账号,不能再执行除查询以外的功能。
 改密:用新密码代替旧密码。新密码要求输入两次,一致后才确认改密成功。
大家有什么好的建议也可以尽管提
#include <stdio.h>
#include <stdlib.h>
#include<ctype.h>//isdigit函数的头文件
#include <conio.h>//getch()的头文件
#define NumMax 1000
int N;
void OpenAccount();//开户
void SaveMoney();//存款
void DrawMoney();//取款
void Inquire();//查询
void TransferAccounts();//转账
void ReportTheLoss();//挂失
void SolutionToHang();//解挂
void ClosingAccount();//销户
void ChangeThePassword();//改密
int search();//判断账号的位置
int InputPassword();//输入密码
int judge();
typedef struct
{
    int num;//账号
    char name[20];//用户名
    int password;//密码
    double balance;//余额
    int status;//状态:0正常 1挂失 2销户
} Account;
Account user[NumMax];
int main()
{
    int i=0,a;
    FILE *fp;
    if ((fp=fopen("account.txt", "r"))==NULL)
    {
        printf("打不开文件!");
        exit(0);
    }
    while(fscanf(fp,"%d %s %d %lf %d",&user[i].num, user[i].name, &user[i].password, &user[i].balance,&user

    [i].status ) != EOF)
    {
        i++;
    }
    fclose(fp);
    N=i;
    printf("---------\n");
    printf("欢迎光临!\n");
    printf("---------\n");
    while(a!=10)
    {
        printf("*************************\n");
        printf("请选择您的操作:\n");
        printf("1.开户  2.存款  3.取款  4.查询  5.转账\n");
        printf("6.挂失  7.解挂  8.销户  9.改密  10.欢迎再次使用\n");
        printf("*************************\n");
        scanf("%d",&a);
        if(a>0&&a<=10)
        {
            switch(a)
            {
                case 1:
                    OpenAccount();
                    break;
                case 2:
                    SaveMoney();
                    break;
                case 3:
                    DrawMoney();
                    break;
                case 4:
                    Inquire();
                    break;
                case 5:
                    TransferAccounts();
                    break;
                case 6:
                    ReportTheLoss();
                    break;
                case 7:
                    SolutionToHang();
                    break;
                case 8:
                    ClosingAccount();
                    break;
                case 9:
                    ChangeThePassword();
                    break;
                case 10:
                    printf("欢迎再次使用!\n");
                    break;
            }
        }
        else
            printf("输入错误。请重新输入\n");
    }
    if ((fp=fopen("account.txt", "w"))==NULL)
    {
        printf("打不开文件!");
        exit(0);
    }
    for(i=0; i<N; i++)
        fprintf(fp,"%d %s %d %lf %d\n",user[i].num, user[i].name, user[i].password, user[i].balance,user[i].status

        );
    fclose(fp);
    return 0;
}
void OpenAccount()
{
    if(N==NumMax)
    {
        printf("银行用户数已达上限,不能开户");
        return;
    }
    printf("正在开户\n");
    user[N].num=10001+N;
    printf("账号:%d\n", user[N].num);
    printf("户主姓名:");
    scanf("%s", user[N].name);
    int mima1, mima2;
    printf("密码:");
    mima1=InputPassword();
    printf("确认密码:");
    mima2=InputPassword();
    if(mima1==mima2)
    {
        user[N].password=mima1;
        user[N].status=0;
        N++;
        printf("成功开户!\n");
    }
    else
    {
        printf("两次密码不一致,未成功开户!\n");
    }
}
void SaveMoney()
{
    int a;
    int num;//账号
    int who;//查找到该账号在数组中对应的下标
    int mima;
    double money;
    char str[100];
    printf("请输入您的账号:\n");
    scanf("%d",&num);
    who = search(num);
    if(who<0)
        printf("该用户不存在,存款失败!\n");
    else
    {
        if(user[who].status==0)
        {
            printf("请输入密码:");
            mima=InputPassword();
            if(mima!=user[who].password)
                printf("密码错误,请重新输入:");
            else
            {
                printf("户主姓名:%s\n", user[who].name);
                printf("输入存款额:");
                scanf("%s", str);
                a=judge(str);
                while(a!=1)
                {
                    printf("输入错误,请重新输入存款额\n");
                    scanf("%s", str);
                    a=judge(str);
                }
                if(a==1)
                {
                    money=atoi(str);
                    if(money<0||money>1000000)
                        printf("输入金额太大,自动退出\n");
                    else
                    {
                        user[who].balance+=money;
                        printf("您的当前余额为%.2f元. \n",user[who].balance);
                    }
                }
            }
        }
        else if(user[who].status==1)
            printf("该用户处于挂失状态,存款失败!\n");
        else  if(user[who].status==2)
            printf("该用户已经销户,存款失败!\n");
    }
}
void DrawMoney()
{
    char str[100];
    int a;
    int num, who,mima;
    double money;
    printf("账号:");
    scanf("%d", &num);
    who = search(num);
    if(who<0)
    {
        printf("该用户不存在,取款失败!\n");
    }
    else
    {
        if(user[who].status==0)
        {
            printf("户主姓名:%s\n", user[who].name);
            printf("密码:");
            mima=InputPassword();
            if(mima!=user[who].password)
            {
                printf("输入密码错误,取款失败!\n");
            }
            else
            {
                printf("输入取款额:");
                scanf("%s", str);
                a=judge(str);
                while(a!=1)
                {
                    printf("输入错误,请重新输入取款额\n");
                    scanf("%s", str);
                    a=judge(str);
                }
                if(a==1)
                {
                    money=atoi(str);
                    if(money>user[who].balance)
                        printf("余额不足,取款失败!\n");
                    else
                    {
                        user[who].balance-=money;
                        printf("取款成功,您的余额为%.2f元. \n",user[who].balance);
                    }
                }
            }
        }
        else if(user[who].status==1)
        {
            printf("该用户处于挂失状态,取款失败!\n");
        }
        else
        {
            printf("该用户已经销户,取款失败!\n");
        }
    }
    printf("欢迎下次光临\n");
}
void Inquire()
{
    int num, who;
    int mima;
    printf("账号:");
    scanf("%d", &num);
    who = search(num);
    if(who<0)
    {
        printf("该用户不存在,查询完毕!\n");
    }
    else
    {
        printf("户主姓名:%s\n", user[who].name);
        printf("密码:");
        mima=InputPassword();
        if(mima!=user[who].password)
        {
            printf("输入密码错误,不能继续查询其他信息!\n");
        }
        else
        {
            printf("余额:%.2f元. \n",user[who].balance);
            printf("状态:");
            if(user[who].status==0)
            {
                printf("正常\n");
            }
            else if(user[who].status==1)
            {
                printf("挂失\n");
            }
            else
            {
                printf("已经销户\n");
            }
        }
    }
    printf("欢迎下次光临\n");
}
void TransferAccounts()
{
    char str[100];
    int a;
    int num, whoout, whoin;
    int mima;
    double money;
    printf("输入转出账号:");
    scanf("%d", &num);
    whoout = search(num);
    if(whoout<0)
    {
        printf("该用户不存在,转账失败!\n");
    }
    else
    {
        if(user[whoout].status==0)
        {
            printf("户主姓名:%s\n", user[whoout].name);
            printf("密码:");
            mima=InputPassword();
            if(mima!=user[whoout].password)
            {
                printf("输入密码错误,转账失败!\n");
            }
            else
            {
                printf("输入转账金额:");
                scanf("%s", str);
                a=judge(str);
                while(a!=1)
                {
                    printf("输入错误,请重新输入转账金额\n");
                    scanf("%s", str);
                    a=judge(str);
                }
                if(a==1)
                {
                    money=atoi(str);
                    if(money>user[whoout].balance)
                    {
                        printf("余额不足,转账失败!\n");
                    }
                    else
                    {
                        printf("输入转入账号:");
                        scanf("%d", &num);
                        whoin = search(num);
                        if(whoin<0)
                        {
                            printf("转入账户不存在,转账失败!\n");
                        }
                        else
                        {
                            if(user[whoin].status>0)
                            {
                                printf("转入账户异常,转账失败!\n");
                            }
                            else
                            {


                                user[whoout].balance-=money;
                                user[whoin].balance+=money;
                                printf("转账后,您还有%.2f元. \n",user[whoout].balance);
                            }
                        }
                    }
                }
            }
        }
        else
            printf("该账户异常,转账失败!\n");
    }
    printf("欢迎下次光临\n");
}
void ReportTheLoss()
{
    int num, who;
    int mima;
    printf("账号:");
    scanf("%d", &num);
    who = search(num);
    if(who<0)
    {
        printf("该用户不存在,不能挂失!\n");
    }
    else
    {
        printf("户主姓名:%s\n", user[who].name);
        printf("密码:");
        mima=InputPassword();
        if(mima!=user[who].password)
        {
            printf("输入密码错误,不能继续操作!\n");
        }
        else
        {
            if(user[who].status==0)
            {
                user[who].status=1;
                printf("挂失成功\n");
            }
            else if(user[who].status==1)
            {
                printf("该账户已经处于挂失状态\n");
            }
            else
            {
                printf("该账户已销户,不能挂失\n");
            }
        }
    }
}
void SolutionToHang()
{
    int num, who;
    int mima;
    printf("账号:");
    scanf("%d", &num);
    who = search(num);
    if(who<0)
    {
        printf("该用户不存在,解除挂失失败!\n");
    }
    else
    {
        printf("户主姓名:%s\n", user[who].name);
        printf("密码:");
        mima=InputPassword();
        if(mima!=user[who].password)
        {
            printf("输入密码错误,不能继续操作!\n");
        }
        else
        {
            if(user[who].status==0)
            {
                printf("该账户处于正常状态,不需要解除挂失\n");
            }
            else if(user[who].status==1)
            {
                user[who].status=0;
                printf("解除挂失成功\n");
            }
            else
            {
                printf("该账户已销户,操作无效\n");
            }
        }
    }
}
void ClosingAccount()
{
    int num;
    int who;
    int mima;
    printf("待销户账号:");
    scanf("%d", &num);
    who = search(num);
    if(who<0)
    {
        printf("该用户不存在,销户失败!\n");
    }
    else
    {
        printf("户主姓名:%s\n", user[who].name);
        printf("密码:");
        mima=InputPassword();
        if(mima==user[who].password)
        {
            printf("余额:%.2f 元\n", user[who].balance);
            user[who].balance=0;
            user[who].status=2;
            printf("取款 %.2f 元,销户成功!\n", user[who].balance);
        }
        else
        {
            printf("输入的密码错误,销户失败!\n");
        }
    }
}
void ChangeThePassword()
{
    int num, who;
    int mima, mima1, mima2;
    printf("账号:");
    scanf("%d", &num);
    who = search(num);
    if(who<0)
    {
        printf("该用户不存在,修改密码失败!\n");
    }
    else
    {
        printf("户主姓名:%s\n", user[who].name);
        printf("密码:");
        mima=InputPassword();
        if(mima!=user[who].password)
        {
            printf("输入密码错误,不能继续操作!\n");
        }
        else
        {
            printf("新密码:");
            mima1=InputPassword();
            printf("确认密码:");
            mima2=InputPassword();
            if(mima1==mima2)
            {
                user[who].password=mima1;
                printf("修改成功!\n");
            }
            else
            {
                printf("两次输入不同,修改失败!\n");
            }
        }
    }
}
int search(int num)
{
    int index=-1;
    int low=0, high=N-1, mid;
    while(low<=high)
    {
        mid = (low+high)/2;
        if(user[mid].num==num)
        {
            index=mid;
            break;
        }
        else if (user[mid].num>num)
            high=mid-1;
        else
            low=mid+1;
    }
    return index;
}
int InputPassword()
{
    char c;  //接收字符形式密码
    int mima=0;   //要转换为数字
    int i;
    while(1)
    {
        for(i=0; i<6; i++)
        {
            c=getch();//输入但不显示
            putchar('*');
            if(isdigit(c))//isdight主要用于检查参数c是否为阿拉伯数字09 头文件为#include<ctype.h>
                mima=mima*10+(c-'0');
            else
            {
                mima=0;
                break;
            }
        }
        fflush(stdin); //清除键盘缓存区中已经有的输入
        printf("\n");
        if(mima==0)
        {
            printf("密码要求全为数字,且不能全0!\n");
            printf("请重新输入密码: ");
        }
        else
            break;
    }
    return mima;
}

int judge(char*s)//判断输入的金额是否符合要求
{
    int a,i=0;
    while(s[i]!='\0')
    {
        if(s[i]<'0'||s[i]>'9')
        {
            a=0;
            break;
        }
        i++;
    }
    if(a!=0)
    { a=1;
    }
    return a;
}
  • 写回答

3条回答 默认 最新

  • wwc2017 2022-06-23 16:52
    关注
    int InputPassword()
    {
        char c;  //接收字符形式密码
        int mima=0;   //要转换为数字
        int i;
        while(1)
        {
            for(i=0; i<6; i++)
            {
                c=getch();//输入但不显示
                putchar('*');
                if(isdigit(c))//isdight主要用于检查参数c是否为阿拉伯数字0到9 
                    mima=mima*10+(c-'0');
    

    这里c是char类型的,getch()获取的是数字对应的ASCII码值,例如键盘输入“0”,对应ASCII码为48,c=getch();,则c的值为48
    通过c-'0'即可将c从ASCII码转化为数字

    mima*10是因为每次只读取一位数,要将之前的结果乘10再加上本次读取的数字
    例如我输入987,第一次读取9,mima等于9;第二次读取8,mima就等于98;第三次读取7,mima最终等于987

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月1日
  • 已采纳回答 6月23日
  • 修改了问题 6月23日
  • 修改了问题 6月23日
  • 展开全部

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看