C语言在线求大佬帮助
有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),其中学号和姓名都是以字符串方式存储,计算出每名学生的平均成绩,
输入格式:
分别在5行中输入5名学生的信息。按照学号、姓名、3门课的成绩顺序输入,学号和姓名是均不超过4个字符的字符串,字符串中不包含空格、换行符和制表符,一名学生的各个数据之间用一个空格间隔。
输出格式:
分别在5行中输出5名学生的信息。按照学号、姓名、3门课的平均成绩顺序输出,其中学号和姓名输出占5列列宽,平均成绩保留1位小数,输出占5列列宽。
输入样例:
1 aa 78 45 12
2 bb 95 85 95
3 cc 75 45 65
4 dd 74 84 95
5 ee 48 49 56
输出样例:
1 aa 45.0
2 bb 91.7
3 cc 61.7
4 dd 84.3
5 ee 51.0 展开
题目关键要求学号和姓名必须有长度验证(4个字符,也就是说字符串大小5)。
由于C语言库中的scanf函数是不验证长度的,所以不能直接用。
这里方法很多,方法一:如你用Microsoft Visual Studio写代码,可使用scanf_s()来限制长度。方法二:使用getchar或getch函数循环一个一个接收字符并判断字符ASCII。方法三:
预先定义一个比较大的字符串来接收输入,然后判断输入的长度。
由于scanf_s不是C语言内置函数,所以我用第三种方法来做。
#include <stdio.h>
#include <string.h>
#define MS 5//最学生人数
#define MC 3//最大学科数
#define MN 4//姓名可输入的最大字符串长度
#define MI 4//学号可输入的最大字符串长度
typedef struct students
{
char sID[MI+1];
char sNa[MN+1];
int ss[MC];
}STUS;
void inputSInfo(STUS stus[]);
void prfStus(STUS stus[]);
int main()
{
STUS stus[MS];
inputSInfo(stus);
prfStus(stus);
return 0;
}
void prfStus(STUS stus[])
{
int i,j,sum;
for(i=0;i<MS;i++)
{
printf("%5s %5s",stus[i].sID,stus[i].sNa);
sum=0;
for(j=0;j<MC;j++)
sum+=stus[i].ss[j];
printf(" %5.1f\n",sum*1.0/MC);
}
}
void inputSInfo(STUS stus[])
{
char str[100];
int i,j;
printf("请分别输入%d名学生的信息:(学号及姓名不得超过4个字符)\n",MS);
for(i=0;i<MS;i++)
{
memset(str,0,100);
scanf("%s",str);
if(str[MI]!=0)
{
printf("错误!学号超过4个字符!请重新输入该行信息!\n");
i--;
continue;
}else strcpy(stus[i].sID,str);
scanf("%s",str);
if(str[MI]!=0)
{
printf("错误!姓名超过4个字符!请重新输入该行信息!\n");
i--;
continue;
}else strcpy(stus[i].sNa,str);
for(j=0;j<MC;j++)
scanf("%d",&stus[i].ss[j]);
}
}
int id;
char name[40];
float score[3];
} scoreInfoData[5];
printf("input score info:\n");
for(int i = 0; i < 5; ++i){
scanf("%d %s %f %f %f",
&scoreInfoData[i].id, scoreInfoData[i].name,
&scoreInfoData[i].score[0], &scoreInfoData[i].score[1], &scoreInfoData[i].score[2]);
}
printf("result:\n");
for(int i = 0; i < 5; ++i){
printf("%d %s %.1f\n",
scoreInfoData[i].id, scoreInfoData[i].name,
(scoreInfoData[i].score[0] + scoreInfoData[i].score[1] + scoreInfoData[i].score[2]) / 3.0f);
}