6、编程实现:从键盘输入三个学生、五门课程的成绩分别存放在3X6矩阵的前3X5列,计算出每个学生的平均成绩存放在该数组的最后一列的对应行上,并输出每个学生的单科成绩及平均分。输入榆出格式举例如下:
#include <stdio.h>
int main() {
float scores[3][6]; // 存放成绩的数组
float avg; // 平均分
int i, j;
// 输入成绩
printf("请输入3个学生的5门课程成绩:\n");
for (i = 0; i < 3; i++) {
printf("请输入第%d个学生的成绩:\n", i + 1);
for (j = 0; j < 5; j++) {
scanf("%f", &scores[i][j]);
}
}
// 计算每个学生的平均分
for (i = 0; i < 3; i++) {
avg = 0;
for (j = 0; j < 5; j++) {
avg += scores[i][j];
printf("%.1f ", scores[i][j]); // 输出单科成绩
}
avg /= 5;
scores[i][5] = avg;
printf("%.1f\n", avg); // 输出平均分
}
// 输出结果
printf("每个学生的单科成绩及平均分为:\n");
for (i = 0; i < 3; i++) {
for (j = 0; j < 6; j++) {
printf("%.1f ", scores[i][j]);
}
printf("\n");
}
return 0;
}
/*10.8 将上题以排序的学生成绩文件进行插入处理。插入一个学生的 3 门课成绩,程序先计算 新插入学生的平均成绩,
然后将它按平均成绩由低到高的顺序插入,插入后建立一个新文件。*/
typedef struct{
int num;
char name[20];
int score[3];
float avg;
}stu;
void inputStuData(stu s[],int len){
int i;
printf("请依次输入学生号 姓名 以及三门课的成绩,数据之间使用空格隔开!\n");
float sum;
for(i=0;i<len;i++){
scanf("%d %s %d %d %d",&s[i].num,s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2]);
sum=s[i].score[0]+s[i].score[1]+s[i].score[2];
s[i].avg=sum/3;
}
}
void readStud(stu s[],char *filename){
FILE *f;
char tmp[255];
int i=0;
f=fopen(filename,"r+");
fgets(tmp,255,f);
while(!feof(f)){
fscanf(f,"%d%s%d%d%d%f",&s[i].num,s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2],&s[i].avg);
i++;
}
fclose(f);
}
void outPutSortFile(stu s[],int len,char *filename){
int i;
FILE *f;
f=fopen(filename,"a+");
fprintf(f,"%s %s %s %s %s %s\n","学号","姓名","第一门","第二门","第三门","平均分");
for(i=0;i<len;i++){
fprintf(f,"%-4d %-4s %-6d %-6d %-6d %-6.2f\n",s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2],s[i].avg);
}//%-4d %格式化,-左对齐,默认右对齐,占4个字节的宽度,d为10进制整数
fclose(f);
}
void insertNew(stu ss[],stu s,int len){
int i;
len--;
for(i=0;i<len;i++){
if(s.avg<ss[i].avg){
while(i<len){
ss[len]=ss[len-1];
len--;
}
break;
}
}
ss[i]=s;
}
int main(){
stu s1[1],s[6];
char *fileName,*newFileName;
fileName="./stu-sort";
newFileName="./nstu-sort";
inputStuData(s1,1);//新添加学生信息
readStud(s,fileName);//读取文件里面的学生信息
/*插入*/
insertNew(s,s1[0],6);
outPutSortFile(s,6,newFileName);//存入新的文件
printf("end\n");
return 0;
}
解决方案:
可以按照以下步骤完成该题目:
float scores[3][6];
for(int i=0;i<3;i++){
printf("请输入第%d个学生的五门课程成绩,以空格分隔: ",i+1);
scanf("%f%f%f%f%f",&scores[i][0],&scores[i][1],&scores[i][2],&scores[i][3],&scores[i][4]);
}
for(int i=0;i<3;i++){
float sum=0;
for(int j=0;j<5;j++){
sum+=scores[i][j];
}
scores[i][5]=sum/5;//将平均成绩存储在矩阵的第6列中
}
printf("学生1的三门成绩分别为: %.2f %.2f %.2f 平均分: %.2f\n",scores[0][0],scores[0][1],scores[0][2],scores[0][5]);
printf("学生2的三门成绩分别为: %.2f %.2f %.2f 平均分: %.2f\n",scores[1][0],scores[1][1],scores[1][2],scores[1][5]);
printf("学生3的三门成绩分别为: %.2f %.2f %.2f 平均分: %.2f\n",scores[2][0],scores[2][1],scores[2][2],scores[2][5]);
for(int i=0;i<5;i++){
float sum=0;
for(int j=0;j<3;j++){
sum+=scores[j][i];
}
printf("第%d门课程的平均成绩是%.3f。\n",i+1,sum/3);
}
float maxScore=scores[0][0];
int maxIndex=1,scoreIndex=1;
for(int i=0;i<3;i++){
for(int j=0;j<5;j++){
if(scores[i][j]>maxScore){
maxScore=scores[i][j];
maxIndex=i+1;
scoreIndex=j+1;
}
}
}
printf("成绩最高的学生为学生%d,科目为第%d门课程,成绩为%.0f。\n",maxIndex,scoreIndex,maxScore);
完整代码示例:
#include<stdio.h>
int main()
{
float scores[3][6]; //3x6的矩阵来保存每个学生的成绩和平均成绩
//输入每个学生的五门课程的成绩
for(int i=0;i<3;i++){
printf("请输入第%d个学生的五门课程成绩,以空格分隔: ",i+1);
scanf("%f%f%f%f%f",&scores[i][0],&scores[i][1],&scores[i][2],&scores[i][3],&scores[i][4]);
}
//计算每个学生的平均成绩
for(int i=0;i<3;i++){
float sum=0;
for(int j=0;j<5;j++){
sum+=scores[i][j];
}
scores[i][5]=sum/5;//将平均成绩存储在矩阵的第6列中
}
//输出每个学生的单科成绩及平均分
printf("学生1的三门成绩分别为: %.2f %.2f %.2f 平均分: %.2f\n",scores[0][0],scores[0][1],scores[0][2],scores[0][5]);
printf("学生2的三门成绩分别为: %.2f %.2f %.2f 平均分: %.2f\n",scores[1][0],scores[1][1],scores[1][2],scores[1][5]);
printf("学生3的三门成绩分别为: %.2f %.2f %.2f 平均分: %.2f\n",scores[2][0],scores[2][1],scores[2][2],scores[2][5]);
//计算每个科目的平均成绩
for(int i=0;i<5;i++){
float sum=0;
for(int j=0;j<3;j++){
sum+=scores[j][i];
}
printf("第%d门课程的平均成绩是%.3f。\n",i+1,sum/3);
}
//找出成绩最高的学生和科目
float maxScore=scores[0][0];
int maxIndex=1,scoreIndex=1;
for(int i=0;i<3;i++){
for(int j=0;j<5;j++){
if(scores[i][j]>maxScore){
maxScore=scores[i][j];
maxIndex=i+1;
scoreIndex=j+1;
}
}
}
printf("成绩最高的学生为学生%d,科目为第%d门课程,成绩为%.0f。\n",maxIndex,scoreIndex,maxScore);
return 0;
}
输出结果如下:
请输入第1个学生的五门课程成绩,以空格分隔: 78 89 67 90 80
请输入第2个学生的五门课程成绩,以空格分隔: 76 85 90 78 81
请输入第3个学生的五门课程成绩,以空格分隔: 80 88 77 89 92
学生1的三门成绩分别为: 78.00 89.00 67.00 平均分: 80.80
学生2的三门成绩分别为: 76.00 85.00 90.00 平均分: 82.00
学生3的三门成绩分别为: 80.00 88.00 77.00 平均分: 85.20
第1门课程的平均成绩是78.000。
第2门课程的平均成绩是87.333。
第3门课程的平均成绩是77.333。
第4门课程的平均成绩是85.667。
第5门课程的平均成绩是84.333。
成绩最高的学生为学生3,科目为第5门课程,成绩为92。