m0_73781259 2023-06-15 16:01 采纳率: 100%
浏览 31
已结题

数组指针怎么搞啊,怎么运行都不行问题好像是传输过程中char*和char有点乱,但不知道咋解决

数组指针怎么搞啊,怎么运行都不行

// 物业费管理系统
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100 // 最大住户数量

typedef struct // 住户信息结构体
{
    char name[20];    // 户主姓名
    char gender[4];   // 性别
    char id[19];      // 身份证号
    char phone[12];   // 联系电话
    int building;     // 楼号
    int unit;         // 单元号
    int room;         // 房号
    float area;       // 平米数
    float price;      // 每平米物业价格
    float fee;        // 应缴物业费
    char remark[30];  // 备注信息
} Resident;

Resident residents[MAX]; // 住户信息数组
int count = 0;           // 住户数量

int menumenu(char,char);                           //菜单逻辑
int mainmenu();                           // 主菜单
int menu1();                              // 显示物业管理员菜单
int menu2();                              // 显示业主菜单
int words(char,char);                              //输入管理员账户和密码
void add_resident();                      // 添加住户信息
void modify_resident();                   // 修改住户信息
void delete_resident();                   // 删除住户信息
void generate_fee();                      // 生成本月物业费
void pay_fee();                           // 住户缴费
void show_all_residents();                // 显示所有住户信息
void sort_residents_by_fee();             // 按拖欠款项排序
void show_unpaid_residents_by_building(); // 按楼号分类统计未交清物业费

int main()
{
    char a[10];
    char k[20];
    printf("请设置管理员的账户:\n");
    scanf("%s",a);
    printf("请输入管理员的密码:\n");
    scanf("%s",k);
    menumenu(a,k);
    return 0;
}

int menumenu(char a[],char k[])
{
    while (1)
    {
        
        switch (mainmenu())
        {
        case 1:
            if(words(a,k))
            {
            switch (menu1()) // 根据用户选择执行对应的操作
            {
            case 1:
                add_resident();
                break;
            case 2:
                modify_resident();
                break;
            case 3:
                delete_resident();
                break;
            case 4:
                generate_fee();
                break;
            case 5:
                show_all_residents();
                break;
            case 6:
                exit(0); // 退出程序
            default:
                printf("输入错误,请重新输入!\n");
            }
            break;
            }
        case 2:
            switch (menu2()) // 根据用户选择执行对应的操作
            {
            case 1:
                pay_fee();
                break;
            case 2:
                sort_residents_by_fee();
                break;
            case 3:
                show_unpaid_residents_by_building();
                break;
            case 4:
                exit(0); // 退出程序
            default:
                printf("输入错误,请重新输入!\n");
            }
            break;
        case 3:
            printf("成功退出系统");
            exit(0);
        default:
            printf("输入错误,请重新输入!\n");
        }
    }
}

int mainmenu()
{
    int a;
    printf("\n----------欢迎进入物业费管理系统----------\n");
    printf("请选择:(1-3)\n");
    printf("1.物业管理员操作系统\n");
    printf("2.业主操作系统\n");
    printf("3.退出系统\n");
    scanf("%d", &a);
    return a;
}

int menu1()
{
    int choice;
    printf("\n----------物业管理员系统----------\n");
    printf("1. 添加住户信息\n");
    printf("2. 修改住户信息\n");
    printf("3. 删除住户信息\n");
    printf("4. 生成本月物业费\n");
    printf("5. 显示所有住户信息\n");
    printf("6. 退出程序\n");
    printf("请输入要执行的操作(1-6):");
    scanf("%d", &choice);
    return choice;
}

int menu2()
{
    int choice;
    printf("1. 住户缴费\n");
    printf("2. 按拖欠款项排序\n");
    printf("3. 按楼号分类统计未交清物业费\n");
    printf("4. 退出程序\n");
    printf("请输入要执行的操作(1-4):");
    scanf("%d", &choice);
    return choice;
}

int words(char a[],char k[])
{
    char account[20]; // 管理员
    char key[20];     // 密码
    printf("请输入管理员的账户:\n");
    scanf("%s",account);
    printf("请输入管理员的密码:\n");
    scanf("%s",key);
    if(strcmp(account,a)==0&strcmp(key,k)==0)
    {
        printf("输入正确!\n");
        return 1;
    }
    else if(strcmp(account,a)!=0&strcmp(key,k)==0)
    {
        printf("管理员用户不存在!\n");
        return 0;
    }
    else  if(strcmp(account,a)==0&strcmp(key,k)!=0)
    {
        printf("密码错误!\n");
        return 0;
    }
    else
    {
        printf("输入错误!\n");
        return 0;
    }
    
}

void add_resident()
{
    if (count >= MAX)
    {
        printf("住户数量已达上限,无法添加新住户!\n");
        return;
    }
    printf("请输入户主姓名,性别,身份证号,联系电话,楼号,单元号,房号,平米数,每平米物业价格,备注信息(用空格隔开):\n");
    scanf("%s%s%s%s%d%d%d%f%f%s", residents[count].name, residents[count].gender, residents[count].id, residents[count].phone, &residents[count].building,
          &residents[count].unit, &residents[count].room, &residents[count].area, &residents[count].price, residents[count].remark);
    residents[count].fee = 0; // 新住户物业费为0
    printf("添加成功!\n");
    count++; // 住户数量加1
}

void modify_resident()
{
    char id[19];
    printf("请输入要修改住户的身份证号:\n");
    scanf("%s", id);
    for (int i = 0; i < count; i++)
    {
        if (strcmp(residents[i].id, id) == 0) // 找到要修改的住户
        {
            printf("请输入新的户主姓名,性别,身份证号,联系电话,楼号,单元号,房号,平米数,每平米物业价格,备注信息(用空格隔开):\n");
            scanf("%s%s%s%s%d%d%d%f%f%s", residents[i].name, residents[i].gender, residents[i].id, residents[i].phone, &residents[i].building,
                  &residents[i].unit, &residents[i].room, &residents[i].area, &residents[i].price, residents[i].remark);
            printf("修改成功!\n");
            return;
        }
    }
    printf("该身份证号对应的住户不存在!\n"); // 未找到要修改的住户
}

void delete_resident()
{
    char id[19];
    printf("请输入要删除住户的身份证号:\n");
    scanf("%s", id);
    for (int i = 0; i < count; i++)
    {
        if (strcmp(residents[i].id, id) == 0) // 找到要删除的住户
        {
            for (int j = i; j < count - 1; j++) // 将后面的住户信息前移
            {
                residents[j] = residents[j + 1];
            }
            count--; // 住户数量减1
            printf("删除成功!\n");
            return;
        }
    }
    printf("该身份证号对应的住户不存在!\n"); // 未找到要删除的住户
}

void generate_fee()
{
    for (int i = 0; i < count; i++)
    {
        residents[i].fee += residents[i].area * residents[i].price; // 本月物业费为住户面积乘以物业单价
    }
    printf("本月物业费已生成!\n");
}

void pay_fee()
{
    char id[19];
    float amount;
    printf("请输入要缴纳物业费的住户的身份证号和金额(用空格隔开):\n");
    scanf("%s%f", id, &amount);
    for (int i = 0; i < count; i++)
    {
        if (strcmp(residents[i].id, id) == 0) // 找到要缴纳物业费的住户
        {
            if (amount >= residents[i].fee) // 缴纳金额大于等于应缴物业费
            {
                amount -= residents[i].fee;
                residents[i].fee = 0;
            }
            else // 缴纳金额小于应缴物业费
            {
                residents[i].fee -= amount;
                amount = 0;
            }
            printf("缴费成功!\n");
            if (amount > 0) // 如果缴纳金额还有剩余,则提示并退出函数
            {
                printf("缴纳金额超过应缴物业费,多余金额为%.2f元,已退回!\n", amount);
            }
            return;
        }
    }
    printf("该身份证号对应的住户不存在!\n"); // 未找到要缴纳物业费的住户
}

void show_all_residents()
{
    printf("户主姓名\t性别\t身份证号\t联系电话\t楼号\t单元号\t房号\t平米数\t每平米物业价格\t应缴物业费\t备注信息\n");
    for (int i = 0; i < count; i++)
    {
        printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\t%.2f\t%.2f\t%.2f\t%s\n", residents[i].name, residents[i].gender, residents[i].id, residents[i].phone,
               residents[i].building, residents[i].unit, residents[i].room, residents[i].area, residents[i].price, residents[i].fee, residents[i].remark);
    }
}

void sort_residents_by_fee()
{
    Resident temp;
    for (int i = 0; i < count - 1; i++)
    {
        for (int j = i + 1; j < count; j++)
        {
            if (residents[i].fee < residents[j].fee) // 按拖欠款项多少从大到小排序
            {
                temp = residents[i];
                residents[i] = residents[j];
                residents[j] = temp;
            }
        }
    }
    printf("按拖欠款项多少从大到小排序如下:\n");
    show_all_residents();
}

void show_unpaid_residents_by_building()
{
    int building;
    printf("请输入要统计的楼号:\n");
    scanf("%d", &building);
    float sum = 0;
    printf("该楼所有未交清物业费的住户如下:\n");
    printf("户主姓名\t性别\t身份证号\t联系电话\t楼号\t单元号\t房号\t平米数\t每平米物业价格\t应缴物业费\t备注信息\n");
    for (int i = 0; i < count; i++)
    {
        if (residents[i].building == building && residents[i].fee > 0) // 按楼号分类统计未交清物业费
        {
            printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\t%.2f\t%.2f\t%.2f\t%s\n", residents[i].name, residents[i].gender, residents[i].id, residents[i].phone,
                   residents[i].building, residents[i].unit, residents[i].room, residents[i].area, residents[i].price, residents[i].fee, residents[i].remark);
            sum += residents[i].fee;
        }
    }
    printf("该楼所有未交清物业费的总额为%.2f元。\n", sum);
}
  • 写回答

2条回答 默认 最新

  • 快乐鹦鹉 2023-06-15 16:07
    关注

    函数申明和函数实现写的不一致
    25,29行的参数要改为char a[],char k[],或者改为 char * , char *,不能是char ,char

    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月26日
  • 专家已采纳回答 6月18日
  • 创建了问题 6月15日

悬赏问题

  • ¥15 征集Python提取PDF文字属性的代码
  • ¥15 有偿求苍穹外卖环境配置
  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?