第十六周 职工信息结构体

题目描述


编写程序,定义一个存放职工信息的结构体类型,职工信息包括职工姓名、工作年限、工资总额。初始化5名职工的信息,对工作年限超过30年的职工每人加100元工资,要求分别输出工资变化之前和之后的所有职工的信息。


输入


输入5个员工的职工姓名、工作年限、工资总额

输出


输出两部分,第一部分输出工资变化之前所有职工的信息,第二部分输出工资变化之后的所有职工的信息





样例输入
zhang1 5 1000
zhang2 10 2000
zhang3 20 3000
zhang4 40 4000
zhang5 50 5000

样例输出
原始工资
姓名    年限    工资
zhang1    5    1000
zhang2    10    2000
zhang3    20    3000
zhang4    40    4000
zhang5    50    5000
加薪后工资
姓名    年限    工资
zhang1    5    1000
zhang2    10    2000
zhang3    20    3000
zhang4    40    4100
zhang5    50    5100

提示
空4格
解答:
#include <stdio.h>
#include <stdlib.h>
struct Worker
{
    char name[10];
    int year;
    int money;
};

int main()


{
    int i;
    struct Worker date[5];
    for (i=0; i<5; i++)
    {
        scanf("%s %d %d",date[i].name,&date[i].year,&date[i].money);
    }
    printf("原始工资\n姓名    年限    工资\n");
    for(i=0; i<5; i++)
        printf("%s    %d    %d\n",date[i].name,date[i].year,date[i].money);
    printf("加薪后工资\n姓名    年限    工资\n");
    for(i=0; i<5; i++)
        if(date[i].year>=30)
        {
            printf("%s    %d    %d\n",date[i].name,date[i].year,date[i].money+100);
        }
        else
            printf("%s    %d    %d\n",date[i].name,date[i].year,date[i].money);
    return 0;


}


<think>我们正在讨论C语言中结构体的嵌套定义与使用方法。根据引用内容,结构体嵌套是指在一个结构体中定义另一个结构体作为其成员。这种方式可以实现更复杂的数据结构设计,便于对数据进行分层管理和组织。引用[1]提到结构体嵌套广泛应用于实际开发中,例如操作系统内核、嵌入式系统、网络协议解析等。引用[3]详细介绍了结构体嵌套的初始化、访问成员、指针操作、动态内存分配以及应用场景等。下面我将按照以下步骤进行讲解:1.结构体嵌套的定义2.结构体嵌套的初始化3.访问嵌套结构体的成员4.结构体嵌套的指针操作5.动态内存分配与嵌套结构体6.应用场景注意:引用[4]中展示了一些结构体嵌套的代码示例,但其中存在一些问题(如重复定义等),我们将使用正确的示例。首先,我们来看结构体嵌套的定义。1.结构体嵌套的定义结构体嵌套有两种常见方式:a)先定义子结构体,再在父结构体中使用子结构体作为成员类型。b)在父结构体内部定义子结构体(但这种方式在C语言中并不常用,因为内部定义的结构体类型作用域仅限于父结构体,且可能引发编译器问题,如引用[4]中的例子所示)。我们推荐第一种方式,即先定义子结构体。示例:```c//先定义子结构体structDate{intyear;intmonth;intday;};//定义父结构体,其中包含一个Date类型的成员structStudent{charname[50];intage;structDatebirthday;//嵌套结构体};```注意:在父结构体中,我们使用`structDate`作为成员的类型。2.结构体嵌套的初始化初始化嵌套结构体有两种方法:直接初始化和分步初始化。a)直接初始化:在定义结构体变量时,使用嵌套的大括号进行初始化。```cstructStudentstudent1={"张三",20,{2000,10,1}//嵌套结构体的初始化};```b)分步初始化:先定义结构体变量,然后逐个成员赋值。```cstructStudentstudent2;strcpy(student2.name,"李四");student2.age=21;student2.birthday.year=1999;student2.birthday.month=11;student2.birthday.day=5;```3.访问嵌套结构体的成员使用点操作符(.)逐级访问。如上面的分步初始化所示,访问生日年份:`student2.birthday.year`。4.结构体嵌套的指针操作如果有一个指向父结构体的指针,访问嵌套结构体的成员需要先解引用父结构体指针,然后再使用点操作符。也可以使用箭头操作符(->)简化。```cstructStudent*p=&student2;//使用箭头操作符访问父结构体成员,然后再用点操作符访问嵌套结构体成员p->birthday.year=2000;//或者使用解引用和点操作符(*p).birthday.month=12;```5.动态内存分配与嵌套结构体当使用动态内存分配时,需要注意为整个结构体分配内存,然后逐级初始化。```cstructStudent*p_stu=(structStudent*)malloc(sizeof(structStudent));if(p_stu!=NULL){strcpy(p_stu->name,"王五");p_stu->age=22;p_stu->birthday.year=2001;p_stu->birthday.month=9;p_stu->birthday.day=8;}```释放内存时,直接释放父结构体指针即可(因为嵌套的结构体成员是内联的,不需要单独释放)。6.应用场景结构体嵌套常用于表示复杂的数据关系,例如:-在二叉树中,每个结点包含数据和指向左右子结点的指针(引用[2]中的例子)。-在员工信息中包含出生日期(如上面的例子)。-在图形编程中,点坐标嵌套在矩形结构体中(表示矩形的左上角和右下角)。注意事项:-内存对齐:结构体嵌套可能会影响内存对齐,从而影响结构体的大小。编译器会在成员之间插入填充字节以保证对齐。可以使用`sizeof`运算符查看结构体大小。-深拷贝与浅拷贝:当结构体嵌套且包含指针成员时,如果进行结构体的赋值操作,默认是浅拷贝(即指针复制,指向同一块内存)。如果需要深拷贝,必须手动复制指针指向的内容。下面是一个完整的示例程序:```c#include<stdio.h>#include<stdlib.h>#include<string.h>//定义子结构体structDate{intyear;intmonth;intday;};//定义父结构体structStudent{charname[50];intage;structDatebirthday;};intmain(){//直接初始化structStudentstudent1={"张三",20,{2000,10,1}};//分步初始化structStudentstudent2;strcpy(student2.name,"李四");student2.age=21;student2.birthday.year=1999;student2.birthday.month=11;student2.birthday.day=5;//指针操作structStudent*p=&student1;printf("姓名:%s,年龄:%d,生日:%d-%d-%d\n",p->name,p->age,p->birthday.year,p->birthday.month,p->birthday.day);//动态分配structStudent*p_stu=(structStudent*)malloc(sizeof(structStudent));if(p_stu!=NULL){strcpy(p_stu->name,"王五");p_stu->age=22;p_stu->birthday.year=2001;p_stu->birthday.month=9;p_stu->birthday.day=8;printf("动态分配的学生:%s,%d岁,生日:%d-%d-%d\n",p_stu->name,p_stu->age,p_stu->birthday.year,p_stu->birthday.month,p_stu->birthday.day);free(p_stu);}return0;}```总结:结构体嵌套是C语言中组织复杂数据的有效手段。通过合理使用嵌套结构体,可以构建出层次化的数据结构,提高代码的可读性和可维护性。如果结构体嵌套层次很深,访问成员时需要写很长的链式访问,此时可以考虑使用中间变量来简化代码。同时,注意避免循环嵌套(如结构体A包含结构体B,结构体B又包含结构体A),这需要使用指针来解决。希望以上内容能够帮助你理解结构体嵌套的定义与使用方法。§§相关问题§§1.结构体嵌套中如何处理循环引用的问题?2.结构体嵌套时如何计算整个结构体的大小?内存对齐的规则是什么?3.在结构体嵌套中,如果子结构体包含指针成员,如何进行深拷贝?4.结构体嵌套与联合体(union)嵌套有什么区别?5.在C语言中,如何实现结构体的自引用(如链表结点)?</think>### C语言结构体嵌套:定义与使用教程 结构体嵌套是指在一个结构体中包含另一个结构体作为其成员,用于构建更复杂的数据结构。下面从定义、初始化、访问成员和内存布局等方面详细说明: #### 1. 结构体嵌套的定义 **方法1:先定义子结构体** ```c // 定义子结构体 struct Address { char city[50]; int zip_code; }; // 定义父结构体 struct Employee { int id; char name[50]; struct Address addr; // 嵌套结构体 }; ``` **方法2:嵌套定义(较少用)** ```c struct Employee { int id; char name[50]; struct { // 直接在父结构体内定义 char city[50]; int zip_code; } addr; }; ``` #### 2. 结构体变量的初始化 **直接初始化** ```c struct Employee emp1 = { 101, "张三", {"北京", 100000} // 嵌套结构体初始化 }; ``` **分步初始化** ```c struct Employee emp2; emp2.id = 102; strcpy(emp2.name, "李四"); strcpy(emp2.addr.city, "上海"); emp2.addr.zip_code = 200000; ``` #### 3. 访问嵌套成员 使用`.`运算符逐级访问: ```c printf("员工ID: %d\n", emp1.id); printf("城市: %s\n", emp1.addr.city); // 访问嵌套成员 printf("邮编: %d\n", emp1.addr.zip_code); ``` #### 4. 指针操作 ```c struct Employee *p = &emp1; printf("城市: %s\n", p->addr.city); // 通过指针访问 // 修改嵌套成员 strcpy(p->addr.city, "广州"); p->addr.zip_code = 510000; ``` #### 5. 内存布局与对齐 结构体嵌套需注意内存对齐: ```c struct A { char c; // 1字节 int i; // 4字节 (对齐到4字节边界) }; // 总大小通常为8字节(含填充) struct B { struct A a; // 8字节 double d; // 8字节 }; // 总大小通常为16字节 ``` 可使用`sizeof(struct B)`和`offsetof(struct B, d)`查看大小和偏移量。 #### 6. 动态内存分配 ```c struct Employee *pEmp = malloc(sizeof(struct Employee)); strcpy(pEmp->name, "王五"); strcpy(pEmp->addr.city, "深圳"); // 释放内存 free(pEmp); ``` #### 7. 实际应用场景 1. **层级数据建模**(如员工-地址信息) 2. **数据结构实现**(如二叉树节点): ```c struct TreeNode { int data; struct TreeNode *left; // 嵌套自引用 struct TreeNode *right; }; ``` 3. **协议解析**(网络数据包头部嵌套) 4. **硬件寄存器映射**(嵌入式开发) #### 注意事项 1. **避免循环嵌套**: ```c // 错误示例 struct A { struct B b; }; struct B { struct A a; }; // 循环嵌套会导致编译错误 // 正确做法:使用指针 struct B { struct A *a_ptr; }; ``` 2. **初始化顺序**:嵌套结构体需按定义顺序初始化 3. **内存对齐**:使用`#pragma pack(n)`可调整对齐方式 4. **深浅拷贝**:结构体赋值默认是浅拷贝,包含指针时需手动深拷贝 > 完整示例代码:[GitHub链接]() > 引用说明:结构体嵌套可实现数据分层管理,广泛应用于操作系统、嵌入式系统等领域[^1][^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值