假设有n位同学m门功课的成绩如下,编一程序计算每位同学的总分以及各门功课的平均分。
第一行2个正整数,学生人数n和课程门数m。1 \leq n \leq 100 , 1 \leq m \leq 101≤n≤100,1≤m≤10,接下来有n行,每行一个学生的数据,依次是姓名和m门课程的成绩,姓名长度不超过8,课程成绩在0到150之间。
按照样例要求输出数据。姓名按照%-8s的格式输出,每门课程成绩按照%6d的格式输出,平均分按照%6.1f的格式控制输出。
样例:
5 4
张大明 120 142 120 256
李小红 110 107 106 280
王志强 108 100 127 290
王慧颖 115 138 119 270
李丹丹 134 129 115 284
为什么我最终输出的名字会这样呢?
//输入名字
for(i=0,j=4;i"%s",a[i]); //a[i][j]是储存名字的
for(j=0;j"%d",&b[i][j]);
a[i][j]='\0';
}
//输出名字
for(i=0;i"%-8s",a[i]);
printf("%6d",c[i]);
for(j=0;j"%6d",b[i][j]);
}
printf("\n");
因为第7行代码 a[i][j]='\0'; 这里把获取的每个学生名字字符串里的第j个下标位置添加了一个空字符,把姓名截断了,因为第4行已经获取了学生姓名,因此去掉此行即可,测试代码如下:
#include <stdio.h>
#define N 100
#define M 20
int main(void){
int n,m;
scanf("%d%d",&n,&m);
char a[N][20];
int c[M];
int b[N][M];
int i,j;
//输入名字
for(i=0;i<n;i++)
{
scanf("%s",a[i]); //a[i][j]是储存名字的
c[i]= 0;
for(j=0;j<m;j++){
scanf("%d",&b[i][j]);
c[i]+=b[i][j]; //求每个学生的总分
}
}
double avg[M];
// 求每门功课的平均分
for(j=0;j<m;j++){
avg[j]=0;
for(i=0;i<n;i++){
avg[j]+=b[i][j];
}
avg[j]/=n*1.0;
}
//输出名字
for(i=0;i<n;i++)
{
printf("%-8s",a[i]);
printf("%6d",c[i]);
for(j=0;j<m;j++)
{
printf("%6d",b[i][j]);
}
printf("\n");
}
// 打印每门功课的平均分
printf("%-8s%6s","平均分"," ");
for(i=0;i<m;i++){
printf("%6.1f",avg[i]);
}
return 0;
}
a数组长度是多少啊?
printf("%-8s",a[i]); 改为
printf("%-12s",a[i]); 看看
供参考:
#include <stdio.h>
#define N 50
#define M 10
int main()
{
int score[N][M] = { 0 }, i, j, n, m;
char name[N][9] = { 0 };
float ave[M] = { 0 };
scanf("%d%d", &n, &m);
for (i = 0; i < n; i++)
{
scanf("%s", name[i]);
for (j = 0; j < m; j++)
{
scanf("%d", &score[i][j]);
ave[j] += score[i][j];
}
}
for (i = 0; i < n; i++)
{
if (i) printf("\n");
printf("%-8s", name[i]);
for (j = 0; j < m ; j++)
printf("%6d", score[i][j]);
}
printf("\naverage:");
for (j = 0; j < m; j++)
{
ave[j] /= n;
printf("%6.1f", ave[j]);
}
return 0;
}