372986406 2013-12-16 00:35 采纳率: 0%
浏览 922

求一个纯手工的[家庭支出管理系统],不要网上下载的,有会的么?

【问题描述】该系统要求对一个家庭某月的支出情况进行统计和分析。通过此课题,熟练掌握数组、指针的各种操作,以及一些算法思想的应用。
【功能要求】
(1)支出信息包括:支出类型(主要可以分为饮食,服饰装扮,礼金,教育培训,电器,健身,通讯,子女培养,旅游,文化娱乐,医疗,交通,聚会,居住等小项),金额,消费地点,消费时间等。
(2)需要实现的功能
1) 用户根据口令进入系统
2) 输入某一月份,完成该月份的支出管理
3) 输入并统计该月的支出情况
4) 显示该月支出信息表,内容应包括日期,金额等
5) 按支出类型进行分类统计和排序
6) 进行本月消费分析,即分析每项支出所占总支出的百分比,并显示分析结果
7) 显示按支出类型排序后的支出信息
8) 将排序后的内容存为文件。

(3)界面友好,输入信息符合逻辑如存款金额不为负数、不可能有非数字的字符等。

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-03-05 13:45
    关注

    该回答引用ChatGPT

    为实现该家庭支出管理系统,可以采用以下步骤:

    • 定义结构体类型,用于表示支出信息,并定义数组类型用于存储多个支出信息。
      typedef struct {
        char type[20];      //支出类型
        double amount;      //支出金额
        char place[50];     //消费地点
        char date[20];      //消费日期
      } Expense;
      typedef Expense ExpenseArray[MAX_EXPENSE_NUM];    //定义支出信息数组类型
      
      其中,MAX_EXPENSE_NUM为支出信息数组最大长度的宏定义。
    • 实现用户登录功能,可以通过简单的密码验证实现,例如,将密码保存在代码中,用户输入密码后与代码中的密码进行比较。若匹配,则允许用户进入系统。

      char password[10] = "123456";       //定义密码
      char input_password[10];            //用户输入的密码
      printf("请输入密码:");
      scanf("%s", input_password);
      if (strcmp(password, input_password) != 0) {
        printf("密码错误,无法进入系统。\n");
        return 0;
      }
      
    • 用户输入某一月份,可以使用scanf函数获取用户输入的月份值,然后通过遍历支出信息数组,筛选出该月份的支出信息进行统计。

      int month;
      printf("请输入月份:");
      scanf("%d", &month);
      int count = 0;      //该月支出信息的数量
      double total_amount = 0;    //该月总支出金额
      ExpenseArray month_expenses;     //存储该月支出信息的数组
      for (int i = 0; i < expense_count; i++) {
        if (/* 判断该支出信息的月份是否与用户输入的月份相同 */) {
            month_expenses[count] = expenses[i];
            total_amount += expenses[i].amount;
            count++;
        }
      }
      
    • 统计完该月的支出信息后,可以遍历month_expenses数组,输出该月的支出信息表格。

      printf("日期\t\t金额\t\t类型\t\t地点\n");
      for (int i = 0; i < count; i++) {
        printf("%s\t%.2lf\t\t%s\t\t%s\n", month_expenses[i].date, month_expenses[i].amount,
            month_expenses[i].type, month_expenses[i].place);
      }
      
    • 按支出类型进行分类统计和排序,可以使用快速排序算法对支出信息数组进行排序,然后遍历排序后的数组,统计每种支出类型的支出总金额,最后输出统计结果。

      void quick_sort(ExpenseArray arr, int left, int right) {
        if (left >= right) return;
        int i = left, j = right;
        Expense pivot = arr[left];
        while (i < j) {
            while (i < j && strcmp(arr[j].type, pivot.type) >= 0) j--;
            arr[i] = arr[j];
            while (i < j && strcmp(arr[i].type, pivot.type) <= 0) i++;
            arr[j] = arr[i];
        }
        arr[i] = pivot;
        quick_sort(arr, left, i - 1);
        quick_sort(arr, i + 1, right);
      }
      //按支出类型进行分类统计
      void classify_and_summarize(ExpenseArray arr, int count) {
        quick_sort(arr, 0, count - 1);
        char current_type[20] = "";
        double current_sum = 0;
        printf("类型\t\t总金额\t\t占比\n");
        for (int i = 0; i < count; i++) {
            if (strcmp(arr[i].type, current_type) == 0) {
                current_sum += arr[i].amount;
            } else {
                if (strlen(current_type) > 0) {
                    double percentage = current_sum / total_amount * 100;
                    printf("%s\t\t%.2lf\t\t%.2lf%%\n", current_type, current_sum, percentage);
                }
                strcpy(current_type, arr[i].type);
                current_sum = arr[i].amount;
            }
        }
        if (strlen(current_type) > 0) {
            double percentage = current_sum / total_amount * 100;
            printf("%s\t\t%.2lf\t\t%.2lf%%\n", current_type, current_sum, percentage);
        }
      }
      
    • 进行本月消费分析,可以在按支出类型进行分类统计的基础上,输出每种支出类型所占总支出金额的百分比。这里需要先统计该月总支出金额total_amount,然后遍历分类统计结果,计算每种支出类型的支出金额占总支出金额的百分比即可。

      double total_amount = 0;    //该月总支出金额
      for (int i = 0; i < count; i++) {
        total_amount += month_expenses[i].amount;
      }
      classify_and_summarize(month_expenses, count);
      printf("本月总支出金额:%.2lf\n", total_amount);
      
    • 显示按支出类型排序后的支出信息,可以在快速排序的实现中,将排序后的支出信息数组直接输出即可。

      // 按支出类型排序后的支出信息表格输出
      void output_sorted_expenses(ExpenseArray arr, int count) {
        quick_sort(arr, 0, count - 1);
        printf("日期\t\t金额\t\t类型\t\t消费地点\n");
        for (int i = 0; i < count; i++) {
            printf("%04d-%02d-%02d\t%.2lf\t\t%-10s\t%s\n",
                arr[i].date.year, arr[i].date.month, arr[i].date.day,
                arr[i].amount, arr[i].type, arr[i].location);
        }
      }
      

      这里的输出格式比较简单,只是用了制表符来对齐各个字段。如果需要更加美观的输出,可以使用第三方库或自己实现一些输出格式控制函数。

    • 最后我们需要将排序后的支出信息保存到文件中。为此,可以先让用户输入保存文件的路径和文件名,然后将支出信息依次写入文件中。具体的实现可以参考下面的代码:

      // 将排序后的支出信息保存到文件中
      void save_sorted_expenses(ExpenseArray arr, int count) {
        char filename[MAX_FILENAME_LEN];
        printf("请输入保存文件的路径和文件名(例如 C:\\expenses.txt):");
        scanf("%s", filename);
      
        FILE* fp = fopen(filename, "w");
        if (fp == NULL) {
            printf("无法打开文件 %s 保存支出信息!\n", filename);
            return;
        }
      
        for (int i = 0; i < count; i++) {
            fprintf(fp, "%04d-%02d-%02d %.2lf %s %s\n",
                arr[i].date.year, arr[i].date.month, arr[i].date.day,
                arr[i].amount, arr[i].type, arr[i].location);
        }
      
        fclose(fp);
        printf("排序后的支出信息已保存到文件 %s 中!\n", filename);
      }
      

      这里使用了标准C库中的文件操作函数fopen、fprintf和fclose。在打开文件时,我们使用了"w"参数,表示以写入模式打开文件。如果文件不存在,则会自动创建一个新文件;如果文件已经存在,则会清空文件内容并从头开始写入。注意,如果无法打开文件,则应该及时提示用户,并返回上一级菜单。在写入文件时,我们使用了fprintf函数,将支出信息格式化为字符串并写入文件中。最后,一定要记得关闭文件句柄,以便保存文件内容并释放系统资源。

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!