妖娆乌龙茶 发表于 2023-11-24 15:41:52

课后作业结构体函数参数及返回值疑问

#include <stdio.h>
   
struct Date
{
      int year;
      int month;
      int day;
};
   
struct Record
{
      char name;
      int age;
      struct Date first;
      struct Date second;
};
   
struct Record getInput(struct Record record)
{
      printf("请问姓名是:");
      scanf("%s", record.name);
      printf("请问年龄是:");
      scanf("%d", &record.age);
      printf("请问是否接种过疫苗(Y/N):");
   
      getchar();
      if (getchar() != 'Y')
      {
                record.first.year = 0;
                printf("请尽快接种疫苗!\n");
      }
      else
      {
                printf("请输入第一针疫苗接种的日期(yyyy-mm-dd):");
                scanf("%d-%d-%d", &record.first.year, &record.first.month, &record.first.day);

                printf("请问是否接种第二针疫苗(Y/N):");
                getchar();
                if (getchar() != 'Y')
                {
                        record.second.year = 0;
                        printf("请尽快接种第二针疫苗!\n");
                }
                else
                {
                        printf("请输入第二针疫苗接种的日期(yyyy-mm-dd):");
                        scanf("%d-%d-%d", &record.second.year, &record.second.month, &record.second.day);
                }
      }
      putchar('\n');
   
      return record;
}

void printRecord(struct Record record)
{
      printf("姓名:%s,年龄:%d\n", record.name, record.age);
   
      if (record.first.year == 0)
      {
                printf("未接种疫苗!\n\n");
      }
      else
      {
                printf("第一针疫苗接种日期:%d-%d-%d,", record.first.year, record.first.month, record.first.day);
      }
   
      if (record.first.year != 0 && record.second.year == 0)
      {
                printf("未接种第二针疫苗!\n\n");
      }
      else if(record.first.year != 0)
      {
                printf("第二针疫苗接种日期:%d-%d-%d\n\n", record.second.year, record.second.month, record.second.day);
      }
}

int main(void)
{
      struct Record r1, r2, r3;
   
      r1 = getInput(r1);
      r2 = getInput(r2);
      r3 = getInput(r3);
   
      printRecord(r1);
      printRecord(r2);
      printRecord(r3);
   
      return 0;
}

问题1 struct Record getInput(struct Record record) 这条函数语句括号里 struct是类型名 形参是Record record吗??还是在形参里对结构体Record定义为recor变量了?

问题2 函数getInput中 return的是record,但函数语句里的返回值是Record 为什么?为什么不能 struct record getinput(struct Record record),
结构体函数的参数,返回值,何时定义结构体变量,结构体变量能定义多次不同的名字吗?

FishC_GPT 发表于 2023-11-24 15:42:23

问题1:在函数声明和定义中,`struct Record` 是结构体类型名,`record` 是参数名。 `struct Record getInput(struct Record record)` 这条函数语句中,`(struct Record record)` 是定义函数的参数,并且可以使用`record` 来引用这个参数。

问题2:在函数定义中,返回值的类型是 `struct Record`,而不是 `Record`,是因为在 C 语言中,结构体类型的声明需要以 `struct` 关键字开头。所以在函数声明和定义中,返回类型需要写成 `struct Record`。同时,也可以将函数声明改写成 `struct Record getInput(struct Record record)`。

结构体函数的参数可以定义为结构体类型的变量,也可以是结构体类型的指针。而结构体函数的返回值也可以是结构体类型或者指向结构体的指针。

至于结构体变量,可以多次定义不同的名字。比如可以定义一个`struct Record r1` 和 `struct Record r2`,它们是两个不同的结构体变量,但是它们有相同的结构体类型。每个结构体变量都会占用内存,并且具有自己的属性值。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

Mike_python小 发表于 2023-11-24 15:42:47

问题1:在这个函数声明中,"struct Record" 是返回类型,而 "record" 是函数的参数名。在函数参数列表中使用结构体类型名是一种常见的写法,表示参数是一个结构体类型的变量。

问题2:在函数定义中,返回类型为 "struct Record",这里的 "struct" 是可以省略的,因此可以写成 "Record getInput(struct Record record)"。实际上,返回类型和参数类型都可以省略 "struct" 关键字。

结构体函数的参数和返回值都可以是结构体类型,也可以是结构体类型的指针。在函数内部对结构体变量进行操作时,可以直接引用结构体成员,无需重新定义结构体变量。结构体变量可以定义多次,每次定义的变量可以有不同的名字,用来存储不同的数据。

回复来自于CHAT-GPT。回复仅供参考,如有人工回答,最佳答案请优先选择人工

tommyyu 发表于 2023-11-24 15:51:38

这里面,struct Record 均可以被替换为 Record。其含义一样。(除了结构体定义处不能替换)
1. 类型是 struct Record,变量是 record。
2. Record 是返回值的类型。struct Record 的含义与 Record 一样,都是 Record 本身这个类型,但 record 不一样 ,是 Record 类型的一个变量,作为一个参数输入到了函数中。在函数中,该实参被进行了一些操作步骤,最后返回该 record 变量。

六翻了 发表于 2023-11-24 19:00:20

6

白色浪花 发表于 2023-11-25 14:39:39

3

白色浪花 发表于 2023-11-25 14:46:51

4
页: [1]
查看完整版本: 课后作业结构体函数参数及返回值疑问