结构体里面包含共用体,能很好的解决输出的时候有两种情况的难题,有详细注释,不过多赘述。
题目:打印如图所示的表格:
当某人为的职业为学生‘s’时,score/course项要为score;当某人为的职业为教师‘t’时,score/course项要为course。
代码:
//<<<<<<<<结构体里包含共用体实例--输入输出数据>>>>>>>>> //wsg //时间:2017年8月15日 //运用联合体中只能有一个成员有效 #include <stdio.h> #define TOTEL 4 //定义了输入多少个人的数据,这里为4个人 struct //定义结构体 { char name[20]; //姓名 int num; //编号 char sex; //性别 char profession; //职业 union //定义联合体 { float score; //学生的成绩 char course[20]; //教室所教课程 }sc; }body[TOTEL]; //结构体数组 int main(void) { int i; for(i=0; i<TOTEL; i++) //使用for循环,一个一个输入,循环输入四个人的数据 { printf("Please input Name Num Sex(f or m) Profession(s or t):\n"); //对应输入的是:某一个人的姓名,编号,性别,职业(以空格隔开) scanf("%s %d %c %c", body[i].name, &body[i].num, &body[i].sex, &body[i].profession); //当输入的职业(profession)为's'的时候, 就输入学生的成绩,而不是教师所教的课程 if(body[i].profession == 's') { scanf("%f", &body[i].sc.score); } //相反,当输入的职业为't'的时候,就输入教师所教的课程,而不是学生的成绩 else if(body[i].profession == 't') { scanf("%s", body[i].sc.course); } //如果职业既不是's'也不是't',那就是输入错误 else { printf("EROOR!\n"); break; } } //同样,根据职业的不同,分别判断打印 printf("\n输出结果为:\n"); printf("Name\t Num\t Sex\t Profession\t Score/Course\n"); for(i=0; i<TOTEL; i++) { printf("%s\t %d\t %c\t %c\t\t ", body[i].name, body[i].num, body[i].sex, body[i].profession); if(body[i].profession == 's') { printf("%.1f\n", body[i].sc.score); } else if(body[i].profession == 't') { printf("%s\n", body[i].sc.course); } else { break; } } return 0; }
示意图: