网易云课堂_C语言程序设计进阶_第三周:结构:结构、类型定义、联合_1学生成绩简单统计

1

(10分)

学生成绩简单统计。

写一个程序,读入10名学生的成绩。每个学生的数据,包含一个不带空格的名字(不超过19个字符),以及三门课的成绩,每门课的成绩是1到5的整数。程序要输出如下的一个列表,对每个学生输出他的录入时的序号、名字、三门课的成绩和平均成绩(浮点表示),最后输出每门课的平均成绩(浮点表示)和最低最高成绩。

 
 1 no      name    score1  score2  score3  average
 2 1       K.Weng  5       5       5       5
 3 2       T.Dixon 4       3       2       3
 4 3       V.Chu   3       4       5       4
 5 4       L.Tson  4       3       4       3.66667
 6 5       L.Lee   3       4       3       3.33333
 7 6       I.Young 4       2       5       3.66667
 8 7       K.Hiro  4       2       1       2.33333
 9 8       G.Ping  4       4       4       4
10 9       H.Gu    2       3       4       3
11 10      J.Jon   5       4       3       4
12         average 3.8     3.4     3.6
13         min     2       2       1
14         max     5       5       5

因为排版的缘故,你看到的表格也许不够整齐,输出时在所有的输出项之间加 就可以了。输出格式不是评判的内容。

程序本身并不复杂,只是要求采用结构来表达每个学生的数据,并具有以下代码片段(你的代码中必须含有并使用以下部分):

 1 typedef struct {
 2     char name[20];
 3     int score[3];
 4 } Student;
 5 
 6 //    输入一个学生的数据
 7 Student* student_input(Student *pStudent);
 8 //    输出一个学生的数据,包括平均成绩
 9 void student_print(const Student *pStudent);
10 //    计算一个学生的平均成绩
11 double student_average(const Student *pStudent);
12 //    获得学生的一个成绩
13 int student_get_score(const Student *pStudent, int index);

 

网易云课堂_C语言程序设计进阶_第三周:结构:结构、类型定义、联合_1学生成绩简单统计

  1 #define _CRT_SECURE_NO_WARNINGS
  2 
  3 #include <stdio.h>
  4 
  5 typedef struct {
  6     char name[20];
  7     int score[3];
  8 } Student;
  9 
 10 //    输入一个学生的数据
 11 Student* student_input(Student *pStudent);
 12 //    输出一个学生的数据,包括平均成绩
 13 void student_print(const Student *pStudent);
 14 //    计算一个学生的平均成绩
 15 double student_average(const Student *pStudent);
 16 //    获得学生的一个成绩
 17 int student_get_score(const Student *pStudent, int index);
 18 
 19 void count_avg(const Student *pStudent, double average[]);//每门课的平均成绩
 20 
 21 void searchmin(const Student *pStudent, int min[]);//每门课的最低成绩
 22 
 23 void searchmax(const Student *pStudent, int max[]);//每门课的最高成绩
 24 
 25 main()
 26 {
 27     Student student1[10];//创建结构数组
 28     Student *pStudent = &student1;//创建指针,指向结构数组
 29     Student *pStudent_bak = &student1;//创建指针副本,保存首地址
 30     int i;//循环下标
 31     double average[3] = { 0 };//每门课的平均成绩数组
 32     int min[3] = { 0 };//每门课的最低成绩数组
 33     int max[3] = { 0 };//每门课的最高成绩数组
 34 
 35     for (i = 0; i < 10; i++)
 36     {
 37         student_input(pStudent);//    输入一个学生的数据
 38         pStudent++;//指针移动
 39     }
 40     pStudent = pStudent_bak;//恢复指针
 41 
 42     printf("%s	%s	%s	%s	%s	%s
", "no", "name", "score1", "score2", "score3", "average");//格式
 43     for (i = 0; i < 10; i++)
 44     {
 45         printf("%d	", i + 1);//输出序号+1
 46         student_print(pStudent);//    输出一个学生的数据,包括平均成绩
 47         pStudent++;//指针移动
 48         printf("
");
 49     }
 50     pStudent = pStudent_bak;//恢复指针
 51 
 52     count_avg(pStudent, average);//每门课的平均成绩
 53     printf("	%s	", "average");//格式
 54     for (i = 0; i < 3; i++)//输出平均值
 55     {
 56         printf("%g	", average[i]);
 57     }
 58     printf("
");//换行
 59     pStudent = pStudent_bak;//恢复指针
 60 
 61     searchmin(pStudent, min);//每门课的最低成绩
 62     printf("	%s	", "min");//格式
 63     for (i = 0; i < 3; i++)//输出每门课的最低成绩
 64     {
 65         printf("%d	", min[i]);
 66     }
 67     printf("
");//换行
 68     pStudent = pStudent_bak;//恢复指针
 69 
 70     searchmax(pStudent, max);//每门课的最高成绩
 71     printf("	%s	", "max");//格式
 72     for (i = 0; i < 3; i++)//输出每门课的最高成绩
 73     {
 74         printf("%d	", max[i]);
 75     }
 76     printf("
");//换行
 77     pStudent = pStudent_bak;//恢复指针
 78 }
 79 
 80 //    输入一个学生的数据
 81 Student* student_input(Student *pStudent)
 82 {
 83     int i;//循环下标
 84 
 85     scanf("%s", pStudent->name);//输入名字
 86 
 87     for (i = 0; i < 3; i++)
 88     {
 89         scanf("%d", &pStudent->score[i]);//输入三门课的成绩
 90     }
 91 
 92     return pStudent;
 93 }
 94 
 95 //    输出一个学生的数据,包括平均成绩
 96 void student_print(const Student *pStudent)
 97 {
 98     int i;//循环下标
 99 
100     printf("%s	", pStudent->name);//输出名字
101 
102     for (i = 0; i < 3; i++)
103     {
104         printf("%d	", student_get_score(pStudent, i));//输出成绩
105     }
106 
107     printf("%g", student_average(pStudent));//输出平均成绩
108 }
109 
110 //    计算一个学生的平均成绩
111 double student_average(const Student *pStudent)
112 {
113     int i;//循环下标
114     double average = 0;//平均成绩
115 
116     for (i = 0; i < 3; i++)
117     {
118         average += 1.0*student_get_score(pStudent, i) / 3;
119     }
120 
121     return average;
122 }
123 
124 //    获得学生的一个成绩
125 int student_get_score(const Student *pStudent, int index)
126 {
127     return pStudent->score[index];
128 }
129 
130 void count_avg(const Student *pStudent, double average[])//每门课的平均成绩
131 {
132     int i, j;//循环下标
133     Student *pStudent_bak = pStudent;//创建指针副本,保存首地址
134 
135     for (i = 0; i < 3; i++)//外循环,三门课
136     {
137         for (j = 0; j < 10; j++)//内循环,10个人
138         {
139             average[i] += 1.0*student_get_score(pStudent, i) / 10;
140             pStudent++;//指针移动
141         }
142 
143         pStudent = pStudent_bak;//恢复指针,指向结构首地址,继续循环
144     }
145 }
146 
147 void searchmin(const Student *pStudent, int min[])//每门课的最低成绩
148 {
149     int i, j;//循环下标
150     Student *pStudent_bak = pStudent;//创建指针副本,保存首地址
151     
152     for (i = 0; i < 3; i++)//外循环,三门课
153     {
154         min[i] = student_get_score(pStudent, i);//假设第0个人的该门成绩为最小值
155 
156         for (j = 1; j < 10; j++)//内循环,10个人
157         {
158             if (student_get_score(pStudent, i) < min[i])//如果找到比最小值还小的值
159             {
160                 min[i] = student_get_score(pStudent, i);
161             }
162             pStudent++;//指针移动
163         }
164 
165         pStudent = pStudent_bak;//恢复指针,指向结构首地址,继续循环
166     }
167 }
168 
169 void searchmax(const Student *pStudent, int max[])//每门课的最高成绩
170 {
171     int i, j;//循环下标
172     Student *pStudent_bak = pStudent;//创建指针副本,保存首地址
173 
174     for (i = 0; i < 3; i++)//外循环,三门课
175     {
176         max[i] = student_get_score(pStudent, i);//假设第0个人的该门成绩为最大值
177 
178         for (j = 1; j < 10; j++)//内循环,10个人
179         {
180             if (student_get_score(pStudent, i) > max[i])//如果找到比最大值还大的值
181             {
182                 max[i] = student_get_score(pStudent, i);
183             }
184             pStudent++;//指针移动
185         }
186 
187         pStudent = pStudent_bak;//恢复指针,指向结构首地址,继续循环
188     }
189 }
原文地址:https://www.cnblogs.com/denggelin/p/5584187.html