int main() { struct Stu { char num; char name[20]; char sex; char job; union { float score; char position; }category; }per[3]; int i; printf("请输入人员信息:\n"); for(i=0;i<3;i++) { scanf("%s %s %c %c",per[i].num,per[i].name,&per[i].sex,&per[i].job); if(per[i].job=='s') scanf("%f",&per[i].category.score); else if(per[i].job=='t') scanf("%s",per[i].category.position); else printf("输入有误!"); } printf("\n"); printf("编号\t姓名\t性别\t职业\t成绩或职务\n"); for(i=0;i<3;i++) { if(per[i].job=='s') printf("%s %s %s %s %f\n",per[i].num,per[i].name,per[i].sex,per[i].job,per[i].category.score); if(per[i].job=='t') printf("%s %s %s %s %s\n",per[i].num,per[i].name,per[i].sex,per[i].job,per[i].category.position); } return 0; }优化代码
时间: 2024-03-11 22:51:12 浏览: 22
以下是代码优化后的版本:
```c
#include <stdio.h>
typedef struct {
char num[10];
char name[20];
char sex;
char job;
union {
float score;
char position[20];
} category;
} Student;
int main() {
Student per[3];
int i;
printf("请输入人员信息:\n");
for (i = 0; i < 3; i++) {
scanf("%s %s %c %c", per[i].num, per[i].name, &per[i].sex, &per[i].job);
if (per[i].job == 's') {
scanf("%f", &per[i].category.score);
} else if (per[i].job == 't') {
scanf("%s", per[i].category.position);
} else {
printf("输入有误!\n");
i--;
}
}
printf("\n");
printf("编号\t姓名\t性别\t职业\t成绩或职务\n");
for (i = 0; i < 3; i++) {
if (per[i].job == 's') {
printf("%s\t%s\t%c\t%c\t%.2f\n", per[i].num, per[i].name, per[i].sex, per[i].job, per[i].category.score);
} else if (per[i].job == 't') {
printf("%s\t%s\t%c\t%c\t%s\n", per[i].num, per[i].name, per[i].sex, per[i].job, per[i].category.position);
}
}
return 0;
}
```
优化内容:
1. 将结构体成员变量num的类型从char改为char数组,以便存储多位数字编号;
2. 将union中的成员变量position的类型从char改为char数组,以便存储多个字符的职务名称;
3. 在输入职业信息时,增加对输入内容的合法性检查,如果输入的职业不是's'或't',则输出错误信息,并让循环变量i减1,以便重新输入;
4. 在输出表格时,将输出格式调整为对齐的表格形式,以便查看。