有n名学生,每个学生的信息包括姓名、学号、5门课程的成绩,平均成绩与总成绩。已知学生的姓名、学号与5门课程的成绩,你的任务是计算每个学生的平均成绩与总成绩,并将它们输出。学生的姓名中只能包含大小写字母与空格字符,不会超过20个字符;学生的学号是个长度不会超过20的字符串,只包含数字字符;课程成绩均为0—100的整数。
要求:在本题中,你要设计一个结构来存储一个学生的信息。在此结构中,需要有一个字符数组来存储姓名;一个字符数组来存储学号;一个长度为5的整型数组来存储5门课程的成绩;一个双精度浮点型变量存储平均成绩,一个整型变量存储总成绩。然后,你要设计一个结构数组来存储n名学生的信息。
输入与输出要求:输入首先是一个正整数n,代表学生的数量,1<=n<=100;每名学生的信息按照姓名、学号、5门课程成绩的顺序输入,共占三行。 输出n名学生的信息:姓名占一行;学号占一行;5门课程成绩中间用空格分开,最后一个成绩后是换行符,占一行;平均与总成绩用空格分隔,占一行,平均成绩保留两位小数;每名同学的信息后都再输出一个空行。输入具体格式见样例。
程序运行效果:
4↙
小王同学↙
0821131699999↙
87 98 79 90 68↙
Liu Mengmeng↙
0821131666666↙
88 90 93 91 85↙
Albert Einstein↙
0821131477777↙
75 87 100 66 64↙
Bill Gates↙
0821131588888↙
65 58 77 60 61↙
Name:小王同学
ID:0821131699999
Score:87 98 79 90 68
average:84.40 total:422
Name:Liu Mengmeng
ID:0821131666666
Score:88 90 93 91 85
average:89.40 total:447
Name:Albert Einstein
ID:0821131477777
Score:75 87 100 66 64
average:78.40 total:392
Name:Bill Gates
ID:0821131588888
Score:65 58 77 60 61
average:64.20 total:321
Mysterious’s way
#include<stdio.h>
struct student{
char name[22];
char number[22];
int grade[5];
double ave;
int sum;
};
void getline(char a[]);
int main()
{
int n;
scanf("%d",&n);
getchar();
struct student stu[n];
for(int j=0;j<n;j++)
{
int i=0;
stu[j].sum=0;
getline(stu[j].name);
getline(stu[j].number);
for(i=0;i<5;i++)
{
scanf("%d",&stu[j].grade[i]);
getchar();//极其容易错的地方
stu[j].sum+=stu[j].grade[i];
}
stu[j].ave=stu[j].sum/5.00;
}
for(int j=0;j<n;j++)
{
printf("Name:");
printf("%s\n",stu[j].name);
printf("ID:");
//puts(stu[j].number);
printf("%s\n",stu[j].number);
printf("Score:");
for(int i=0;i<5;i++)
{
printf("%d ",stu[j].grade[i]);
}
printf("\n");
printf("average:%.2lf total:%d\n",stu[j].ave,stu[j].sum);
}
return 0;
}
void getline(char a[])
{
char c;
int i=0;
while(i<21&&(c=getchar())!='\n')
{
a[i]=c;
i++;
}
a[i]='\0';
}
不知道为何这样改也不对
这样的是多了一个check函数,检查字符串中的回车,将其去掉
#include<stdio.h>
struct student{
char name[22];
char number[22];
int grade[5];
double ave;
int sum;
};
void getline(char a[]);
void check(char a[]);
int main()
{
int n;
scanf("%d",&n);
getchar();
struct student stu[n];
for(int j=0;j<n;j++)
{
int i=0;
stu[j].sum=0;
getline(stu[j].name);
getline(stu[j].number);
for(i=0;i<5;i++)
{
scanf("%d",&stu[j].grade[i]);
//getchar();
stu[j].sum+=stu[j].grade[i];
}
stu[j].ave=stu[j].sum/5.00;
}
for(int j=0;j<n;j++)
{
check(stu[j].name);
check(stu[j].number);
printf("Name:");
printf("%s\n",stu[j].name);
printf("ID:");
//puts(stu[j].number);
printf("%s\n",stu[j].number);
printf("Score:");
for(int i=0;i<5;i++)
{
printf("%d ",stu[j].grade[i]);
}
printf("\n");
printf("average:%.2lf total:%d\n",stu[j].ave,stu[j].sum);
}
return 0;
}
void getline(char a[])
{
char c;
int i=0;
while(i<21&&(c=getchar())!='\n')
{
a[i]=c;
i++;
}
a[i]='\0';
}
void check(char a[])
{
int i=0;
while(a[i]!='\0')
{
if(a[i]=='\n'&&a[i+1]!='\0')
{
for(int j=i+1;a[j]!='\0';j++)
{
a[j-1]=a[j];
}
}
i++;
}
}
最终的简化版
#include<stdio.h>
typedef struct _stu{
char name[32];
char ID[32];
int grade[5];
double ave;
int sum;
}stu;
void getline(char a[],int len);
int main()
{
int n;
scanf("%d",&n);
stu stu1[n];
for(int i=0;i<n;i++)
stu1[i].sum=0;
for(int i=0;i<n;i++)
{
getchar(); //很关键
//scanf("%s",stu1[i].name);不能用scanf来输入
//scanf("%s",stu1[i].ID);
//fgets(stu1[i].name,32,stdin);如果用fgets来读入的话,下面的\n可以不需要加,fgets自动读入\n
//fgets(stu1[i].ID,32,stdin);
getline(stu1[i].name,32);
getline(stu1[i].ID,32);
for(int j=0;j<5;j++){
scanf("%d",&stu1[i].grade[j]);
stu1[i].sum+=stu1[i].grade[j];
}
}
for(int i=0;i<n;i++)
{
printf("\n");
printf("Name:%s\n",stu1[i].name);
printf("ID:%s\nScore:",stu1[i].ID);
for(int j=0;j<5;j++)
{
printf("%d ",stu1[i].grade[j]);
}
printf("\n");
printf("Average:%.2lf",stu1[i].sum/5.0);
printf(" Total:%d\n",stu1[i].sum);
}
return 0;
}
void getline(char a[],int len)
{
int i=0;
char c;
while(i<len&&(c=getchar())!='\n')
{
a[i]=c;
i++;
}
a[i]='\0';
}