鱼C论坛

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

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

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

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

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

x
#include <stdio.h>
    
struct Date
{
        int year;
        int month;
        int day;
};
    
struct Record
{
        char name[16];
        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),
结构体函数的参数,返回值,何时定义结构体变量,结构体变量能定义多次不同的名字吗?
最佳答案
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-11-23 12:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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