[C]struct, union的结合
#include <stdio.h> typedef union { double math; double phys; double chem; } Score; typedef struct student { char name[10]; int age; Score grade; char whichSubject; } Student; void input(Student *s) { printf("input your name: "); scanf("%s", s->name); printf("input your age: "); scanf("%d", &s->age); printf("which subject m/p/c: "); scanf(" %c", &s->whichSubject); //<<这里注意" %c"前有个空格哦 switch (s->whichSubject) { case 'm': scanf("%lf", &s->grade.math); break; case 'p': scanf("%lf", &s->grade.phys); break; case 'c': scanf("%lf", &s->grade.chem); break; } } void print(Student *s) { switch (s->whichSubject) { case 'm': printf("My name is %s, and I'm %d. I got %f in Math\n", s->name, s->age, s->grade.math); break; case 'p': printf("My name is %s, and I'm %d. I got %f in Physics\n", s->name, s->age, s->grade.phys); break; case 'c': printf("My name is %s, and I'm %d. I got %f in Chemistry\n", s->name, s->age, s->grade.chem); break; } } int main( ) { Student s1; input(&s1); print(&s1); return 0; }
与数组结合
//struc, union,与array结合 #include <stdio.h> typedef union { double math; double phys; double chem; } Subject; typedef struct { char name[20]; int age; Subject scores; char whichSubject; } Student; void input(Student *s, int n) { for (int i = 0; i < n; ++i) { printf("input your name: "); scanf(" %19[^\n]", s[i].name); //" %19[^\n]"中要有空格 printf("input your age: "); scanf("%d", &s[i].age); printf("which subject m/p/c: "); scanf(" %c", &s[i].whichSubject); //" %c"中要有空格 switch ( s[i].whichSubject ) { case 'm': printf("input your math score: "); scanf("%lf", &s[i].scores.math); break; case 'p': printf("input your physics score: "); scanf("%lf", &s[i].scores.phys); break; case 'c': printf("input your chemistry score: "); scanf("%lf", &s[i].scores.chem); break; } } } double getAve(Student *s, int n) { double sum = 0; int i; for ( i = 0; i < n; ++i ) { switch (s[i].whichSubject) { case 'm': sum += s[i].scores.math; break; case 'p': sum += s[i].scores.phys; break; case 'c': sum += s[i].scores.chem; break; } } return sum / n; } void display(Student *s, int n) { for ( int i = 0; i < n; ++i ) { switch (s[i].whichSubject) { case 'm': printf("%s's math score is %f\n", s[i].name, s[i].scores.math); break; case 'p': printf("%s's physics score is %f\n", s[i].name, s[i].scores.phys); break; case 'c': printf("%s's chemistry score is %f\n", s[i].name, s[i].scores.chem); break; } } } int main() { const int size = 2; Student stu[size]; input(stu, size); printf("average = %f\n", getAve(stu, size)); display(stu, size); }