C语言中actual_account_balance全局变量共享更新问题求助
个人日记管理系统全局变量改造及中文本地化方案
改动说明(最小化代码修改)
- 将
actual_account_balance设置为全局变量,实现多函数共享更新 - 移除所有函数内重复定义的局部
actual_account_balance变量 - 替换控制台所有英文提示为中文
修改后的完整代码
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <unistd.h> #include <string.h> void addRecord(); void viewRecord(); void deleteRecord(); void clear(); void delay(int); void printTitle(bool clearContent, int titleType); void printError(int errorType); void printChoices(); void login(); struct diary { char date[15]; char time[10]; char place[25]; char msg[500]; char spent_today[15]; } d1; // 全局变量:账户余额,初始化1000000 int actual_account_balance = 1000000; int main() { login(); int choice; bool run = true; while(run){ printTitle(true, 2); printChoices(); printf("\n\t\t 请按下您的选择按键\n\t\t\n"); scanf("%d",&choice); getchar(); switch (choice) { case 1: addRecord(); break; case 2: viewRecord(); break; case 3: deleteRecord(); break; case 4: printf("\n\n正在关闭系统...\n"); delay(2); clear(); run = false; break; default: printTitle(true, 2); printf("\n\n\t\t\t\t [X]:无效输入 :(\n\n\t\t"); delay(1); printf("\n\t\t 请按下您的选择按键\n\t\t"); delay(1); printf("\n"); delay(7); break; } } } void delay(int a) { sleep(a); } void addRecord() { FILE *fp; fp = fopen("diary.txt", "a"); if (fp == NULL) { printError(1); exit(1); } char *spent_today; printTitle(true, 2); printf("\n\t # 输入日期(dd/mm/yyyy) : "); fgets(d1.date, 15, stdin); printf("\n\t # 输入时间(hh:mm 上午/下午) : "); fgets(d1.time, 10, stdin); printf("\n\t # 输入地点(场所名称) : "); fgets(d1.place, 25, stdin); printf("\n\t # 输入记录内容 : "); fgets(d1.msg, 500, stdin); printf("\n\t # 今日支出 : "); fgets(d1.spent_today, 15, stdin); int spent_today_int = atoi(d1.spent_today); actual_account_balance -= spent_today_int; printf("\n\t # 当前账户余额 :%d ", actual_account_balance); printf("\n\n正在保存...\n"); fwrite(&d1, sizeof(d1), 1, fp); delay(2); fclose(fp); } void viewRecord() { FILE *fp; int ch, j = 1; fp = fopen("diary.txt", "rb"); if (fp == NULL) { printError(1); exit(1); } clear(); printTitle(true, 2); for (int i = 1; fread(&d1, sizeof(d1), 1, fp) != 0; i++) { printf("\n\t # 记录 %d) : %s \t %s \t %s \t %s \t", i, d1.date, d1.time, d1.place, d1.spent_today); } fclose(fp); printf("\n\n\t 您想查看上述哪条记录?\n\t 输入记录编号 : "); scanf("%d", &ch); getchar(); fp = fopen("diary.txt", "rb"); if (fp == NULL) { printError(1); exit(1); } printTitle(true, 2); for (j; fread(&d1, sizeof(d1), 1, fp) != 0; j++) { if (j == ch) { printf("\n\t\t 日期 : %s", d1.date); printf("\n\t\t 时间 : %s", d1.time); printf("\n\t\t 地点 : %s", d1.place); printf("\n# 记录内容,\n %s", d1.msg); printf("\n\t\t 今日支出 : %s", d1.spent_today); printf("\n\t\t 账户余额 : %d", actual_account_balance); break; } } fclose(fp); if (j != ch) { printf("\n\t 未找到匹配记录,请检查后重试。"); } printf("\n\n\t\t\t\t按任意键继续..!"); getchar(); } void deleteRecord() { int flage = 0, ch; FILE *fp, *tptr; fp = fopen("diary.txt", "rb"); if (fp == NULL) { printError(1); exit(1); } printTitle(true,1); for (int i = 1; fread(&d1, sizeof(d1), 1, fp) != 0; i++) { printf("\n\t\t# 记录 %d) : %s %s %s", i, d1.date, d1.time, d1.place); } printf("\n\n\t 您想删除上述哪条记录?\n\t 输入记录编号 : "); scanf("%d", &ch); fclose(fp); fp = fopen("diary.txt", "rb"); if (fp == NULL) { printf("\n未找到文件"); exit(1); } tptr = fopen("temp.dat", "ab"); for (int i = 1; fread(&d1, sizeof(d1), 1, fp) != 0; i++) { if (ch != i) { fwrite(&d1, sizeof(d1), 1, tptr); } else { flage = 1; } } fclose(fp); fclose(tptr); remove("diary.txt"); rename("temp.dat", "diary.txt"); if (flage == 0) { printf("\n\n\t\t未找到记录..!"); } else { printf("\n\t *记录删除成功,按任意键继续..."); } getchar(); } void clear(){ system("clear"); } void printTitle(bool clearContent, int titleType){ if(clearContent){ clear(); } switch (titleType) { case 1: printf("\n\n\t\n\t 个人日记管理系统 :)\n"); break; case 2: printf("\n\n\n\t\t\n\t\t 个人日记管理系统\n\t\t"); break; } } void printError(int errorType){ switch (errorType) { case 1: printf("\n未找到文件"); break; } } void printChoices(){ printf("\n\t\t\t\t 按[1]:添加记录"); printf("\n\t\t\t\t 按[2]:查看记录"); printf("\n\t\t\t\t 按[3]:删除记录"); printf("\n\t\t\t\t 按[4]:退出\n\t\t"); } void login() { char username[20], *password; while (1) { clear(); printf("\n\t\t 个人日记管理系统\n\t\t"); for (int i = 0; i < 62; i++) { printf("%c", 22); } printf("\n\n\t\t\t用户名: "); scanf("%s", username); // 清空stdin缓冲区 int c; while ((c = getchar()) != '\n' && c != EOF); password = getpass("\n\t\t\t密码: "); if (strcmp(username, "user") == 0 && strcmp(password, "123") == 0){ printf("\n\n\t\t\t欢迎登录,登录成功!\n"); break; } else { printf("\n\n\t\t\t用户名或密码无效,请重试。\n"); sleep(3); } } }
关键改动点
- 全局变量设置:在结构体定义后声明全局
actual_account_balance并初始化,替代原无用的actual_account_number,确保所有函数共享同一变量。 - 移除局部变量:删除
main、addRecord、viewRecord内的局部actual_account_balance定义/声明,避免变量遮蔽。 - 中文本地化:将所有控制台交互文本替换为中文,提升使用体验。
内容的提问来源于stack exchange,提问作者beka
相关产品推荐
相关产品推荐

