C语言在线求大佬帮助

7-5学生的平均成绩(10分)有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),其中学号和姓名都是以字符串方式存储,计算出每名学生的... 7-5 学生的平均成绩 (10 分)
有五个学生,每个学生有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
展开
 我来答
自我编程
2020-01-02 · 科技优质答主
自我编程
采纳数:1481 获赞数:4282

向TA提问 私信TA
展开全部

题目关键要求学号和姓名必须有长度验证(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]);

    }

}

裔爱l
2020-01-02 · TA获得超过172个赞
知道小有建树答主
回答量:217
采纳率:87%
帮助的人:18万
展开全部
struct ScoreInfo{
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);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式