一、问题遇到的现象和发生背景
代码没有报错,但密码输入成功后没有继续运行,只是一直重复上一步
二、相关代码
#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;
}
三、运行结果
四、我的解答思路和尝试过的方法
把上面的main{}代换成
int main()
{
readData();///读取文件数据
menu();///显示主菜单
}
但是运行窗口没有任何显示
五、希望
通过正确输入密码,进入menu界面