joker52486 发表于 2023-5-30 17:24

c语言课程设计,

c语言课程设计,改了一周了,还是有问题,错误显示teacher没定义,是不是我对指针的理解有问题
来个大佬救救我吧,到底哪里出问题了:'(weeqw求详细解答

完整代码如下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_TEACHERS 100

typedef struct {
    char id; // 教师号
    char name; // 姓名
    char gender; // 性别
    char unit; // 单位名称
    char address; // 家庭住址
    char phone; // 联系电话
    double salary; // 基本工资
    double allowance; // 津贴
    double subsidy; // 生活补贴
    double pay; // 应发工资
    double phone_bill; // 电话费
    double utility_bill; // 水电费
    double rent; // 房租
    double tax; // 所得税
    double health_insurance; // 卫生费
    double fund; // 公积金
    double deduction; // 合计扣款
    double net_pay; // 实发工资
} Teacher;

int num_teachers = 0; // 已经输入的教师数量
Teacher teachers; // 教师数组

// 根据教师号查找教师在数组中的位置,找不到返回-1
int find_teacher(char *id) {
    int i;
    for (i = 0; i < num_teachers; i++) {
      if (strcmp(teachers.id, id) == 0) {
            return i;
      }
    }
    return -1;
}

// 输入一个教师的信息
void input_teacher(Teacher *t) {
    printf("请输入教师编号:");
    scanf("%s", t->id);
    printf("请输入姓名:");
    scanf("%s", t->name);
    printf("请输入性别:");
    scanf("%s", t->gender);
    printf("请输入单位名称:");
    scanf("%s", t->unit);
    printf("请输入家庭住址:");
    scanf("%s", t->address);
    printf("请输入联系电话:");
    scanf("%s", t->phone);
    printf("请输入基本工资:");
    scanf("%lf", &t->salary);
    printf("请输入津贴:");
    scanf("%lf", &t->allowance);
    printf("请输入生活补贴:");
    scanf("%lf", &t->subsidy);
}

// 插入(修改)教师信息
void modify_teacher() {
    char id;
    int pos = -1;

    printf("请输入要修改的教师编号:");
    scanf("%s", id);
    pos = find_teacher(id);

    if (pos == -1) {
      printf("没有找到教师编号为%s的信息。\n", id);
    } else {
      Teacher *t = &teachers;
      printf("当前信息如下:\n");
      printf("教师编号:%s", t->id);
      printf("姓名:%s", t->name);
      printf("性别:%s", t->gender);
      printf("单位名称:%s", t->unit);
      printf("家庭住址:%s", t->address);
      printf("联系电话:%s", t->phone);
      printf("基本工资:%.2lf", t->salary);
      printf("津贴:%.2lf", t->allowance);
      printf("生活补贴:%.2lf", t->subsidy);

      input_teacher(t);

      // 计算应发工资、合计扣款、实发工资
      t->pay = t->salary + t->allowance + t->subsidy;
      printf("请输入电话费:");
      scanf("%lf", &t->phone_bill);
      printf("请输入水电费:");
      scanf("%lf", &t->utility_bill);
      printf("请输入房租:");
      scanf("%lf", &t->rent);
      printf("请输入所得税:");
      scanf("%lf", &t->tax);
      printf("请输入卫生费:");
      scanf("%lf", &t->health_insurance);
      printf("请输入公积金:");
      scanf("%lf", &t->fund);
      t->deduction = t->phone_bill + t->utility_bill + t->rent + t->tax + t->health_insurance + t->fund;
      t->net_pay = t->pay - t->deduction;

      printf("修改成功!\n");
    }
}

// 删除教师信息
void delete_teacher() {
    char id;
    int i, pos = -1;

    printf("请输入要删除的教师编号:");
    scanf("%s", id);

    pos = find_teacher(id);

    if (pos == -1) {
      printf("没有找到教师编号为%s的信息。\n", id);
    } else {
      Teacher *t = &teachers;
      printf("确认要删除以下信息吗?\n");
      printf("教师编号:%s", t->id);
      printf("姓名:%s", t->name);
      printf("性别:%s", t->gender);
      printf("单位名称:%s", t->unit);
      printf("家庭住址:%s", t->address);
      printf("联系电话:%s", t->phone);
      printf("基本工资:%.2lf", t->salary);
      printf("津贴:%.2lf", t->allowance);
      printf("生活补贴:%.2lf", t->subsidy);
      printf("应发工资:%.2lf", t->pay);
      printf("电话费:%.2lf", t->phone_bill);
      printf("水电费:%.2lf", t->utility_bill);
      printf("房租:%.2lf", t->rent);
      printf("所得税:%.2lf", t->tax);
      printf("卫生费:%.2lf", t->health_insurance);
      printf("公积金:%.2lf", t->fund);
      printf("合计扣款:%.2lf", t->deduction);
      printf("实发工资:%.2lf", t->net_pay);
      printf("确认删除请按1,取消请按0:");
      scanf("%d", &i);
      if (i == 1) {
            printf("已删除教师编号为%s的信息。\n", id);
            for (i = pos; i < num_teachers - 1; i++) {
                teachers = teachers;
            }
            num_teachers--;
      } else {
            printf("已取消删除。\n");
      }
    }
}// 浏览教师信息
void browse_teachers() {
    int i;
    if (num_teachers == 0) {
      printf("没有输入任何教师信息。\n");
    } else {
      printf("教师编号\t姓名\t性别\t单位名称\t家庭住址\t联系电话\t应发工资\t实发工资");
      for (i = 0; i < num_teachers; i++) {
            printf("%s\t%s\t%s\t%s\t%s\t%s\t%.2lf\t%.2lf",
                teachers.id, teachers.name, teachers.gender, teachers.unit,
                teachers.address, teachers.phone, teachers.pay, teachers.net_pay);
      }
    }
}

// 按教师号录入教师基本数据
void input_teacher_data() {
    char id;
    int pos = -1;

    printf("请输入要输入基本数据的教师编号:");
    scanf("%s", id);

    pos = find_teacher(id);

    if (pos == -1) {
      printf("没有找到教师编号为%s的信息。\n", id);
    } else {
      Teacher *t = &teachers;
      printf("请输入电话费:");
      printf("(如无,则输入0)");
      scanf("%lf", &t->phone_bill);
      printf("请输入水电费:");
      printf("(如无,则输入0)");
      scanf("%lf", &t->utility_bill);
      printf("请输入房租:");
      printf("(如无,则输入0)");
      scanf("%lf", &t->rent);
      printf("请输入所得税:");
      printf("(如无,则输入0)");
      scanf("%lf", &t->tax);
      printf("请输入卫生费:");
      printf("(如无,则输入0)");
      scanf("%lf", &t->health_insurance);
      printf("请输入公积金:");
      printf("(如无,则输入0)");
      scanf("%lf", &t->fund);
      t->deduction = t->phone_bill + t->utility_bill + t->rent + t->tax + t->health_insurance + t->fund; // 合计扣款
      t->net_pay = t->pay - t->deduction; // 实发工资

      printf("已成功输入教师编号为%s的基本数据。\n", id);
    }
}

// 主函数
int main() {
    int choice;
    Teacher t;
    input_teacher(&t);
    while (1) {
      printf("请选择功能:\n");
      printf("1.输入一个教师的信息");
      printf("2. 插入(修改)教师信息");
      printf("3. 删除教师信息");
      printf("4. 浏览教师信息");
      printf("5. 输入教师基本数据");
      printf("0. 退出");
      printf("请选择:");
      scanf("%d", &choice);

      switch (choice) {
            case 1:
                input_teacher(&teachers);
                break;
            case 2:
                modify_teacher();
                break;
            case 3:
                delete_teacher();
                break;
            case 4:
                browse_teachers();
                break;
            case 5:
                input_teacher_data();
                break;
            case 0:
                printf("欢迎再次使用教师工资管理系统,再见!\n");
                exit(0);
                break;
            default:
                printf("输入有误,请重新选择功能。\n");
                break;
      }
    }

    return 0;
}

joker52486 发表于 2023-5-30 17:26

/ workspace / CProject / c . c :232:31: error : unexpected type name ' Teacher ': expected expression
input _ teacher ( Teacher * t );
1 error generated .
错误代码是这个,我真的改不明白了{:1_937:}求助各位大佬

PEKING1 发表于 2023-5-30 18:32

类型不一致传入和接收的类型不一致

PEKING1 发表于 2023-5-30 18:46

本帖最后由 PEKING1 于 2023-5-30 18:51 编辑

建议把函数都抽出去分文件

qfxldhw 发表于 2023-5-30 18:54

joker52486 发表于 2023-5-30 17:26
/ workspace / CProject / c . c :232:31: error : unexpected type name ' Teacher ': expected expressio ...

这是因为在你调用 input_teacher() 函数时,传递了一个错误的参数。它期望一个指向 Teacher 类型的指针作为参数,但你却传递了一个数组 teachers。所以导致编译器中断,并报出这个错误消息。

为了正确地调用 input_teacher() 函数,并向其中传递正确的参数,你应该将其更改为以下代码形式:

input_teacher(&t); // 传递指向 t 的地址作为参数
这将会解决你当前的编译错误。

gpt回答的试试

joker52486 发表于 2023-5-31 00:01

PEKING1 发表于 2023-5-30 18:46
建议把函数都抽出去分文件

还是不行,错误显示是说我teacher没定义:'(weeqw

joker52486 发表于 2023-5-31 00:02

qfxldhw 发表于 2023-5-30 18:54
这是因为在你调用 input_teacher() 函数时,传递了一个错误的参数。它期望一个指向 Teacher 类型的指针作 ...

这个方法可行,但是运行了以后不知道为啥数据不能临时存在终端{:1_923:}

qfxldhw 发表于 2023-5-31 08:00

joker52486 发表于 2023-5-31 00:02
这个方法可行,但是运行了以后不知道为啥数据不能临时存在终端

这个错误是因为在main函数中调用input_teacher函数时,传递的参数应该是一个Teacher类型的变量,而不是Teacher类型的数组。修改代码如下:

将input_teacher函数改为接收一个Teacher类型的变量:
void input_teacher(Teacher *t) {
// 数据输入的代码不变
}

在main函数中创建一个Teacher类型的变量,将其传递给input_teacher函数:
Teacher t;
input_teacher(&t);

这样就可以避免上述错误了。这样呢

joker52486 发表于 2023-5-31 08:06

qfxldhw 发表于 2023-5-31 08:00
这个错误是因为在main函数中调用input_teacher函数时,传递的参数应该是一个Teacher类型的变量,而不是Te ...

改好了,谢谢啦

joker52486 发表于 2023-5-31 08:07

case 1:
                input_teacher(&teachers);
                ++num_teachers;
                break;
这样改就可以完美运行了:lol:victory:
页: [1]
查看完整版本: c语言课程设计,