《C语言》结构体和联合体练习题--2
《C语言》结构体和联合体练习题–2
11. 嵌套联合体和结构体
题目描述:
编写一个C程序,定义一个结构体Employee
,包含成员id
(整数)、name
(字符串)和一个联合体Contact
,该联合体包含phone
(字符串)和email
(字符串)。输入一个员工的信息,包括联系方式(电话或邮箱),并输出。
解题思路:
定义结构体Employee
,其中嵌套了一个联合体Contact
。在主函数中,声明一个Employee
变量,读取员工的ID、姓名和联系方式。由于联合体只能存储一个联系信息,用户需要选择是输入电话还是邮箱。最后,输出员工的信息。
详细代码:
#include <stdio.h>
#include <string.h>// 定义联合体Contact
union Contact {char phone[15];char email[50];
};// 定义结构体Employee,包含联合体Contact
struct Employee {int id;char name[50];union Contact contact;char contactType; // 'p'表示电话,'e'表示邮箱
};int main() {struct Employee emp;// 输入员工IDprintf("请输入员工ID: ");scanf("%d", &emp.id);getchar(); // 清除输入缓冲区的换行符// 输入员工姓名printf("请输入员工姓名: ");fgets(emp.name, sizeof(emp.name), stdin);// 去除换行符int i = 0;while(emp.name[i] != '\0') {if(emp.name[i] == '\n') {emp.name[i] = '\0';break;}i++;}// 输入联系方式类型printf("请输入联系方式类型(p-电话, e-邮箱): ");scanf(" %c", &emp.contactType);getchar(); // 清除输入缓冲区的换行符// 根据类型输入联系方式if(emp.contactType == 'p') {printf("请输入电话号码: ");fgets(emp.contact.phone, sizeof(emp.contact.phone), stdin);// 去除换行符int j = 0;while(emp.contact.phone[j] != '\0') {if(emp.contact.phone[j] == '\n') {emp.contact.phone[j] = '\0';break;}j++;}}else if(emp.contactType == 'e') {printf("请输入邮箱地址: ");fgets(emp.contact.email, sizeof(emp.contact.email), stdin);// 去除换行符int j = 0;while(emp.contact.email[j] != '\0') {if(emp.contact.email[j] == '\n') {emp.contact.email[j] = '\0';break;}j++;}}else {printf("无效的联系方式类型。\n");return 1;}// 输出员工信息printf("\n--- 员工信息 ---\n");printf("ID: %d\n", emp.id);printf("姓名: %s\n", emp.name);if(emp.contactType == 'p') {printf("电话号码: %s\n", emp.contact.phone);}else {printf("邮箱地址: %s\n", emp.contact.email);}return 0;
}
代码注释:
union Contact
:定义一个联合体Contact
,包含phone
和email
两个字符串成员。struct Employee
:定义一个结构体Employee
,包含id
、name
、contact
(联合体)和contactType
(字符,表示联系方式类型)。getchar();
:在读取字符或字符串后,清除输入缓冲区的换行符,避免影响后续的fgets
读取。- 根据
contactType
,选择输入电话或邮箱,并存储到联合体的相应成员中。 - 最后,输出员工的所有信息,包括根据类型选择输出的联系方式。
12. 联合体数组
题目描述:
编写一个C程序,定义一个联合体Data
,包含成员i
(整数)、f
(浮点数)和str
(字符串)。创建一个包含5个Data
类型的数组,输入每个元素的类型和相应的值,最后输出所有数组元素的值。
解题思路:
定义联合体Data
,包含i
、f
和str
三个成员。在主函数中声明一个包含5个Data
的数组。对于每个数组元素,读取其类型标识(i
、f
或str
),然后根据类型输入相应的值。最后,遍历数组并根据类型标识输出存储的值。
详细代码:
#include <stdio.h>
#include <string.h>// 定义联合体Data
union Data {int i;float f;char str[20];
};// 定义结构体用于存储Data和类型标识
struct DataWithType {union Data data;char type; // 'i', 'f', 's'分别表示整数、浮点数和字符串
};int main() {struct DataWithType array[5];// 输入数组元素for(int idx = 0; idx < 5; idx++) {printf("请输入第 %d 个元素的类型(i-整数, f-浮点数, s-字符串): ", idx + 1);scanf(" %c", &array[idx].type);getchar(); // 清除输入缓冲区的换行符if(array[idx].type == 'i') {printf("请输入整数值: ");scanf("%d"