You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
        }
    }
}

关键改动点

  1. 全局变量设置:在结构体定义后声明全局actual_account_balance并初始化,替代原无用的actual_account_number,确保所有函数共享同一变量。
  2. 移除局部变量:删除main、addRecord、viewRecord内的局部actual_account_balance定义/声明,避免变量遮蔽。
  3. 中文本地化:将所有控制台交互文本替换为中文,提升使用体验。

内容的提问来源于stack exchange,提问作者beka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:57:00