慢慢敲 2022-06-15 16:18 采纳率: 100%
浏览 83
已结题

代码没有报错,但是运行不完全

一、问题遇到的现象和发生背景
代码没有报错,但密码输入成功后没有继续运行,只是一直重复上一步

二、相关代码

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <iostream>
#define MAX_NAME 11         
#define MAX_DETAIL 21      
#define M 155            
#define N 155           
using namespace std;

void add_income();                     
void search_income();                   
void changeTotalIncomeMoneyTOSelect(int usageJudge);
void selectIncomeByUsage();             
void incomePercent();                   
void printfSingleIncome(int i);         

void add_payout();                      
void search_payout();                    
void changeTotalPaymentMoneyTOSelect(int usageJudge);
void selectPaymentByUsage();            
void paymentPercent();                  
void printfSinglePayment(int p);         
void menu();
void allPayoutMoneyCount();
void allIncomeMoneyCount();
void readData();
void quit();
int numberJudge();
int usageJudge();

struct payment {
    int id;
    float money;
    int year;
    int month;
    int day;
    int usage;
    float percent;
}payment[M];
struct comement {
    int id;
    float money;
    int year;//年
    int month;
    int day;
    int usage;
    float percent;
}comement[N];


const char fileName[] = "d:\\test.txt";//文件存储路径
int currentMaxId;//当前文件中的最大id
int n;///当前文件中记录的数目
int m;

//收入数据
float totalIncomeMoney = 0;
float istudyMoney = 0;
float icateringMoney = 0;
float iclothesMoney = 0;
float irecreationMoney = 0;
int selectIncomeUsage = 0;

//支出数据
float totalPayoutMoney = 0;
float pstudyMoney = 0;
float pcateringMoney = 0;
float pclothesMoney = 0;
float precreationMoney = 0;


void readData()
{
    FILE* fp;///定义文件指针
    if ((fp = fopen(fileName, "r")) == NULL)
    {
        fp = fopen(fileName, "w");
    }
    else
    {
        for (n = 0; !feof(fp); n++)
        {
            fscanf_s(fp, "%d %f %d %d %d %d %d %f %d %d %d %d\n", &payment[n].id, &payment[n].money, &payment[n].year, &payment[n].month, &payment[n].day, &payment[n].usage, &comement[n].id, &comement[n].money, &comement[n].year, &comement[n].month, &comement[n].day, &comement[n].usage);///将结构体里的信息写入文本
        } ///保存文件数据到结构体
        if (n == 0)
            currentMaxId = 0;
        else
            currentMaxId = payment[n - 1].id;
    }
    fclose(fp);
}




//菜单选项
void menu()
{
    int flag = 0;//中断程序的标志
    while (flag)
    {
        readData();//重新加载文本数据
        allPayoutMoneyCount();//计算当前金额总数
        allIncomeMoneyCount();
        system("cls");//清屏操作
        int selectOPS;
        cout << " |-------------------------------------------------|\n" << endl;
        cout << " |----------- 欢迎进入个人财务管理系统 ----------- |\n" << endl;
        cout << " |-------------------------------------------------|\n" << endl;
        cout << " |\t\tIncome                                       |\n" << endl;
        cout << " |\t\t1.添加收入                                   |\n" << endl;
        cout << " |\t\t2.查询收入明细                               |\n" << endl;
        cout << " |\t\t3.按类别查看收入                             |\n" << endl;
        cout << " |\t\t4.统计收入比例                               |\n" << endl;
        cout << " |-------------------------------------------------|\n" << endl;
        cout << " |\t\tPayout                                       |\n" << endl;
        cout << " |\t\t5.添加支出                                   |\n" << endl;
        cout << " |\t\t6.查询支出明细                               |\n" << endl;
        cout << " |\t\t7.按类别查看支出                             |\n" << endl;
        cout << " |\t\t8.统计支出比例                               |\n" << endl;
        cout << " |-------------------------------------------------|\n" << endl;
        cout << " |\t\t0.退出系统                                   |\n" << endl;
        cout << " |-------------------------------------------------|\n" << endl;

        printf("请选择(0-8):[ ]\b\b");
        selectOPS = numberJudge();
        if (selectOPS < 0 || selectOPS>8)///错误输入,重新获取输入
        {
            printf("请确定好您要选择的服务,重新输入!!!\n");
            system("pause");
            menu();
        }
        else///正确输入
            switch (selectOPS)///根据输入实现相应函数调用
            {
            case 1: add_income();
                break;

            case 2:search_income();
                break;

            case 3:selectIncomeByUsage();
                break;

            case 4:incomePercent();
                break;

            case 5:add_payout();
                break;

            case 6:search_payout();
                break;

            case 7:selectPaymentByUsage();
                break;

            case 8:paymentPercent();
                break;

            case 0:flag=0;
                break;
            }
    }
}


void search_income()
{

    printf("\t\t 当前所有的收入记录:\n");
    printf("记录编号   收入金额\t具体日期\t类别\t百分比\n");
    for (int i = 0; i < n; i++)
    {
        printfSingleIncome(i);
    }
    system("pause");
}


void printfSingleIncome(int i) {
    printf("%d\t%8.2f\t", comement[i].id, comement[i].money);
    printf("%d-%d-%d\t", comement[i].year, comement[i].month, comement[i].day);
    const char* usage = "学习";
    switch (comement[i].usage)
    {
    case 1:
        usage = "学习";
        break;
    case 2:
        usage = "餐饮";
        break;
    case 3:
        usage = "服装";
        break;
    case 4:
        usage = "娱乐";
        break;
    default:
        break;
    }
    printf("%s\t", usage);
    printf("%5.2f\n", (comement[i].money / totalIncomeMoney) * 100);
}
void printfSinglePayment(int p) {
    printf("%d\t%8.2f\t", payment[p].id, payment[p].money);
    printf("%d-%d-%d\t", payment[p].year, payment[p].month, payment[p].day);
    const char* usage = "学习";
    switch (payment[p].usage)
    {
    case 1:
        usage = "学习";
        break;
    case 2:
        usage = "餐饮";
        break;
    case 3:
        usage = "服装";
        break;
    case 4:
        usage = "娱乐";
        break;
    default:
        break;
    }
    printf("%s\t", usage);
    printf("%5.2f\n", (payment[p].money / totalPayoutMoney) * 100);
}


void printfSinglePayment(int p) {
    printf("%d\t%8.2f\t", payment[p].id, payment[p].money);
    printf("%d-%d-%d\t", payment[p].year, payment[p].month, payment[p].day);
    const char* usage = "学习";
    switch (payment[p].usage)
    {
    case 1:
        usage = "学习";
        break;
    case 2:
        usage = "餐饮";
        break;
    case 3:
        usage = "服装";
        break;
    case 4:
        usage = "娱乐";
        break;
    default:
        break;
    }
    printf("%s\t", usage);
    printf("%5.2f\n", (payment[p].money / totalPayoutMoney) * 100);
}


void selectIncomeByUsage() {
    int selectIncomeUsage = usageJudge();
    changeTotalIncomeMoneyTOSelect(selectIncomeUsage);
    printf("记录编号   收入金额\t具体日期\t类别\t比例\n");
    for (int i = 0; i < n; i++)
    {
        if (payment[i].usage == selectIncomeUsage)
        {

            printfSingleIncome(i);
        }
    }
    system("pause");

}

void selectPaymentByUsage() {
    int selectPayoutUsage = usageJudge();
    changeTotalPaymentMoneyTOSelect(selectPayoutUsage);
    printf("记录编号   支出金额\t具体日期\t类别\t比例\n");
    for (int p = 0; p < n; p++)
    {
        if (payment[p].usage == selectPayoutUsage)
        {

            printfSinglePayment(p);
        }
    }
    system("pause");

}


void add_income()
{
    printf("请填写您要录入的收入的信息:金额 年份 月份 日期 用途(请以空格隔开每个数据)\n");

    printf(" 请输入金额: ");
    scanf_s(" %f", &comement[n].money);
    printf(" 请输入年份: ");
    comement[n].year = numberJudge();
    printf(" 请输入月份(1-12):[] \b\b");
    comement[n].month = numberJudge();
    if (comement[n].month < 1 || comement[n].month >12)
    {
        printf("\n\t月份输入有误,请重新输入1-12范围内的数字!");
        comement[n].month = numberJudge();
    }

    printf("请输入日期(1-31):[] \b\b");
    comement[n].day = numberJudge();
    if (comement[n].day < 1 || comement[n].day >31)
    {
        printf("\n\t日期输入有误,请重新输入1-31范围内的数字!");
        comement[n].day = numberJudge();
    }

    comement[n].usage = usageJudge();


    currentMaxId = comement[n - 1].id;
    comement[n].id = currentMaxId + 1;
    FILE* fp;///定义文件指针
    printf("该条记录正在写入文件 list.txt...\n");
    fp = fopen(fileName, "a");//参数"a"意思是说将新添加的数据接着文本里的数据写,不会覆盖文本里的内容
    if (currentMaxId == 0)//第一条记录之前不用加换行
        fprintf(fp, "%d\t%8.2f\t%d\t%d\t%d\t%d", comement[n].id, comement[n].money, comement[n].year, comement[n].month, comement[n].day, comement[n].usage);///将结构体里的信息写入文本
    else
        fprintf(fp, "\n%d\t%8.2f\t%d\t%d\t%d\t%d", comement[n].id, comement[n].money, comement[n].year, comement[n].month, comement[n].day, comement[n].usage);///将结构体里的信息写入文本

    fclose(fp);//关闭文件
    printf("\n该条记录已经写入文件 list.txt,请前往查看!\n");
    n++;
    system("pause");
}
void add_payout()
{
    printf("请填写您要录入的支出的信息:金额 年份 月份 日期 用途(请以空格隔开每个数据)\n");

    printf(" 请输入金额: ");
    scanf_s(" %f", &payment[m].money);
    printf(" 请输入年份: ");
    payment[m].year = numberJudge();
    printf(" 请输入月份(1-12):[] \b\b");
    payment[m].month = numberJudge();
    if (payment[m].month < 1 || payment[m].month >12)
    {
        printf("\n\t月份输入有误,请重新输入1-12范围内的数字!");
        payment[m].month = numberJudge();
    }

    printf("请输入日期(1-31):[] \b\b");
    payment[m].day = numberJudge();
    if (payment[m].day < 1 || payment[m].day >31)
    {
        printf("\n\t日期输入有误,请重新输入1-31范围内的数字!");
        payment[m].day = numberJudge();
    }

    payment[m].usage = usageJudge();


    currentMaxId = payment[n - 1].id;
    payment[m].id = currentMaxId + 1;
    FILE* fp;///定义文件指针
    printf("该条记录正在写入文件 list.txt...\n");
    fp = fopen(fileName, "a");
    if (currentMaxId == 0)//第一条记录之前不用加换行
        fprintf(fp, "%d\t%8.2f\t%d\t%d\t%d\t%d", payment[m].id, payment[m].money, payment[m].year, payment[m].month, payment[m].day, payment[m].usage);
    else
        fprintf(fp, "\n%d\t%8.2f\t%d\t%d\t%d\t%d", payment[m].id, payment[m].money, payment[m].year, payment[m].month, payment[m].day, payment[m].usage);

    fclose(fp);//关闭文件
    printf("\n该条记录已经写入文件 list.txt\n");
    m++;
    system("pause");
}

void search_payout()
{
  printf("\t\t 当前所有的支出记录:\n");
    printf("记录编号   支出金额\t具体日期\t类别\t百分比\n");
    for (int p = 0; p < n; p++)
    {
        printfSinglePayment(p);
    }
    system("pause");
}


/*由于过长,省略中间代码*/

int usageJudge() {
    int usage = 0;
    printf("请输入支出的类别(1代表学习,2代表餐饮,3代表服装,4代表娱乐):\n");
    printf("请选择(1-4):[ ]\b\b");
    usage = numberJudge();
    if (usage < 1 || usage >4)
    {
        printf("\n\t类别输入有误,请重新输入1-4范围内的数字!");
        usage = numberJudge();
    }
    return usage;
}

int numberJudge() {
    int num;
    int sign = 0;
    int retur;
    do {
        sign = 0;
        retur = scanf(" %d", &num);//如果输入的n是十进制数字,则返回1(符合条件的参数)
        if (retur == 0) {
            printf("\n非法输入,请重新输入十进制数字!\n");
            for (; getchar() != '\n';);
            sign = -1;
        }
    } while (sign == -1);
    return num;
}


int main()
{
    readData();///读取文件数据
    char passw[] = "314";
    char test[20] = "0";
    int count = 0;//用来记录登录次数
    
    while (count < 3)
        {
        printf("请输入密码->");
        scanf_s("%s", &test,4);
        if (strcmp(passw, test) == 0)
        {
            void menu();///显示主菜单
        }
        else
        {
            printf("密码错误\n");
            count++;
        }
    
    }
    if (3 == count)
    {
        printf("退出程序\n");
    }
    return 0;
}

三、运行结果

img

四、我的解答思路和尝试过的方法
把上面的main{}代换成

int main()
{
    readData();///读取文件数据
    menu();///显示主菜单
}

但是运行窗口没有任何显示
五、希望
通过正确输入密码,进入menu界面

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-06-15 16:23
    关注

    代码里几个问题,分别是主函数的注释语句,菜单函数的注释语句,以及void printfSinglePayment(int p) 函数重复定义了。

    //菜单选项
    void menu()
    {
        int flag = 1;//中断程序的标志  int flag = 0; 修改
        while (flag)
        {
            readData();//重新加载文本数据
            allPayoutMoneyCount();//计算当前金额总数
            allIncomeMoneyCount();
            system("cls");//清屏操作
            int selectOPS;
            cout << " |-------------------------------------------------|\n" << endl;
            cout << " |----------- 欢迎进入个人财务管理系统 ----------- |\n" << endl;
            cout << " |-------------------------------------------------|\n" << endl;
            cout << " |\t\tIncome                                       |\n" << endl;
            cout << " |\t\t1.添加收入                                   |\n" << endl;
            cout << " |\t\t2.查询收入明细                               |\n" << endl;
            cout << " |\t\t3.按类别查看收入                             |\n" << endl;
            cout << " |\t\t4.统计收入比例                               |\n" << endl;
            cout << " |-------------------------------------------------|\n" << endl;
            cout << " |\t\tPayout                                       |\n" << endl;
            cout << " |\t\t5.添加支出                                   |\n" << endl;
            cout << " |\t\t6.查询支出明细                               |\n" << endl;
            cout << " |\t\t7.按类别查看支出                             |\n" << endl;
            cout << " |\t\t8.统计支出比例                               |\n" << endl;
            cout << " |-------------------------------------------------|\n" << endl;
            cout << " |\t\t0.退出系统                                   |\n" << endl;
            cout << " |-------------------------------------------------|\n" << endl;
    
            printf("请选择(0-8):[ ]\b\b");
            selectOPS = numberJudge();
            if (selectOPS < 0 || selectOPS>8)///错误输入,重新获取输入
            {
                printf("请确定好您要选择的服务,重新输入!!!\n");
                system("pause");
                menu();
            }
            else///正确输入
                switch (selectOPS)///根据输入实现相应函数调用
                {
                case 1: add_income();
                    break;
    
                case 2:search_income();
                    break;
    
                case 3:selectIncomeByUsage();
                    break;
    
                case 4:incomePercent();
                    break;
    
                case 5:add_payout();
                    break;
    
                case 6:search_payout();
                    break;
    
                case 7:selectPaymentByUsage();
                    break;
    
                case 8:paymentPercent();
                    break;
    
                case 0:flag = 0;
                    break;
                }
        }
    }
    
    int main()
    {
        readData();///读取文件数据
        char passw[] = "314";
        char test[20] = "0";
        int count = 0;//用来记录登录次数
    
        while (count < 3)
        {
            printf("请输入密码->");
            scanf_s("%s", test, 4);  //scanf_s("%s", &test, 4); 修改
            if (strcmp(passw, test) == 0)
            {
                menu();//显示主菜单 void menu(); 修改 
                break;
            }
            else
            {
                printf("密码错误\n");
                count++;
            }
    
        }
        if (3 == count)
        {
            printf("退出程序\n");
        }
        return 0;
    }
    
    //下面这个函数重复定义了
    /*
    void printfSinglePayment(int p) {
        printf("%d\t%8.2f\t", payment[p].id, payment[p].money);
        printf("%d-%d-%d\t", payment[p].year, payment[p].month, payment[p].day);
        const char* usage = "学习";
        switch (payment[p].usage)
        {
        case 1:
            usage = "学习";
            break;
        case 2:
            usage = "餐饮";
            break;
        case 3:
            usage = "服装";
            break;
        case 4:
            usage = "娱乐";
            break;
        default:
            break;
        }
        printf("%s\t", usage);
        printf("%5.2f\n", (payment[p].money / totalPayoutMoney) * 100);
    }
    */
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月24日
  • 已采纳回答 6月16日
  • 修改了问题 6月15日
  • 创建了问题 6月15日

悬赏问题

  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了