鱼C论坛

 找回密码
 立即注册
查看: 635|回复: 6

[已解决]课后作业结构体函数参数及返回值疑问

[复制链接]
发表于 2023-11-24 15:41:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2.    
  3. struct Date
  4. {
  5.         int year;
  6.         int month;
  7.         int day;
  8. };
  9.    
  10. struct Record
  11. {
  12.         char name[16];
  13.         int age;
  14.         struct Date first;
  15.         struct Date second;
  16. };
  17.    
  18. struct Record getInput(struct Record record)
  19. {
  20.         printf("请问姓名是:");
  21.         scanf("%s", record.name);
  22.         printf("请问年龄是:");
  23.         scanf("%d", &record.age);
  24.         printf("请问是否接种过疫苗(Y/N):");
  25.    
  26.         getchar();
  27.         if (getchar() != 'Y')
  28.         {
  29.                 record.first.year = 0;
  30.                 printf("请尽快接种疫苗!\n");
  31.         }
  32.         else
  33.         {
  34.                 printf("请输入第一针疫苗接种的日期(yyyy-mm-dd):");
  35.                 scanf("%d-%d-%d", &record.first.year, &record.first.month, &record.first.day);

  36.                 printf("请问是否接种第二针疫苗(Y/N):");
  37.                 getchar();
  38.                 if (getchar() != 'Y')
  39.                 {
  40.                         record.second.year = 0;
  41.                         printf("请尽快接种第二针疫苗!\n");
  42.                 }
  43.                 else
  44.                 {
  45.                         printf("请输入第二针疫苗接种的日期(yyyy-mm-dd):");
  46.                         scanf("%d-%d-%d", &record.second.year, &record.second.month, &record.second.day);
  47.                 }
  48.         }
  49.         putchar('\n');
  50.    
  51.         return record;
  52. }

  53. void printRecord(struct Record record)
  54. {
  55.         printf("姓名:%s,年龄:%d\n", record.name, record.age);
  56.    
  57.         if (record.first.year == 0)
  58.         {
  59.                 printf("未接种疫苗!\n\n");
  60.         }
  61.         else
  62.         {
  63.                 printf("第一针疫苗接种日期:%d-%d-%d,", record.first.year, record.first.month, record.first.day);
  64.         }
  65.    
  66.         if (record.first.year != 0 && record.second.year == 0)
  67.         {
  68.                 printf("未接种第二针疫苗!\n\n");
  69.         }
  70.         else if(record.first.year != 0)
  71.         {
  72.                 printf("第二针疫苗接种日期:%d-%d-%d\n\n", record.second.year, record.second.month, record.second.day);
  73.         }
  74. }

  75. int main(void)
  76. {
  77.         struct Record r1, r2, r3;
  78.    
  79.         r1 = getInput(r1);
  80.         r2 = getInput(r2);
  81.         r3 = getInput(r3);
  82.    
  83.         printRecord(r1);
  84.         printRecord(r2);
  85.         printRecord(r3);
  86.    
  87.         return 0;
  88. }
复制代码


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

问题2 函数getInput中 return的是record,但函数语句里的返回值是Record 为什么?为什么不能 struct record getinput(struct Record record),
结构体函数的参数,返回值,何时定义结构体变量,结构体变量能定义多次不同的名字吗?
最佳答案
2023-11-24 15:51:38
这里面,struct Record 均可以被替换为 Record。其含义一样。(除了结构体定义处不能替换)
1. 类型是 struct Record,变量是 record。
2. Record 是返回值的类型。struct Record 的含义与 Record 一样,都是 Record 本身这个类型,但 record 不一样 ,是 Record 类型的一个变量,作为一个参数输入到了函数中。在函数中,该实参被进行了一些操作步骤,最后返回该 record 变量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 15:42:47 | 显示全部楼层
问题1:在这个函数声明中,"struct Record" 是返回类型,而 "record" 是函数的参数名。在函数参数列表中使用结构体类型名是一种常见的写法,表示参数是一个结构体类型的变量。

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

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

回复来自于CHAT-GPT。回复仅供参考,如有人工回答,最佳答案请优先选择人工
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 15:51:38 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +2 鱼币

这里面,struct Record 均可以被替换为 Record。其含义一样。(除了结构体定义处不能替换)
1. 类型是 struct Record,变量是 record。
2. Record 是返回值的类型。struct Record 的含义与 Record 一样,都是 Record 本身这个类型,但 record 不一样 ,是 Record 类型的一个变量,作为一个参数输入到了函数中。在函数中,该实参被进行了一些操作步骤,最后返回该 record 变量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 19:00:20 | 显示全部楼层

回帖奖励 +2 鱼币

6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-25 14:39:39 | 显示全部楼层
3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-25 14:46:51 | 显示全部楼层

回帖奖励 +2 鱼币

4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-30 17:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表