列指针和行指针解决问题

img

img


这个是题目,要求用行指针或列指针解决问题,题目要求如图所示,看看该怎么思考动笔

你这个数据在上一个问题里的啊。
(1)
定义二维数组scores[5][5]用来保存5个学生的学号和4门课程成绩
int (* p)[5] = scores; 行指针访问

定义二维数组scores[5][5]用来保存5个学生的学号和4门课程成绩,每行代表1个学生,每行第一列代表学生的学号,后面4行代表4门课程的成绩,
int (* p)[5] = scores; //行指针,t = *(*(p + j) + i + 1);获取j行的第i门课程成绩

代码(数据没有输入,直接用你上一个题目里的数据固定了):


#include <stdio.h>
//课程平均分,因为把学号也放在数组中了,所以m是5
void average(int scores[][5], int n, int m, const char kc[][10])
{
    int i, j, t;
    float ave = 0;
    int(*p)[5] = scores; //行指针
    for (i = 0; i < m - 1; i++) //m-1门课程,第0列是学号
    {
        ave = 0; //重置平均值
        for (j = 0; j < n; j++) //n个学生累加
        {
            t = *(*(p + j) + i + 1); //相当于scores[j][i+1]
            printf("%d ", t);
            ave += t; //累加i列的成绩
        }
        ave /= n;
        printf("%s:%.2f\n", kc[i], ave);
    }
}
//找出两门课不及格的学生
void search(int scores[][5], int n, int m, const char name[][10])
{
    int i, j, cnt = 0;
    float ave = 0;
    int(*p)[5] = scores; //行指针
    int* q;
    int flag = 0;
    printf("两门课以上不及格的学生:\n");
    for (i = 0; i < n; i++)
    {
        q = *(p + i);//第i行的指针
        cnt = 0;
        ave = 0;
        for (j = 1; j < m; j++)
        {
            ave += q[j];
            if (q[j] < 60)
                cnt++;
        }
        ave /= (m - 1);
        if (cnt > 2) //多于2门不及格
        {
            flag = 1;
            //输出
            printf("%d %s ", q[0], name[i]);
            for (j = 1; j < m; j++)
                printf("%d ", q[j]);
            printf("%.2f\n", ave);
        }
    }
    if (flag == 0)
        printf("没有符合条件的学生\n");
}


//找出所有课程成绩大于85分的学生
void search2(int scores[][5], int n, int m, const char name[][10])
{
    int i, j, cnt = 0,flag = 0;
    float ave = 0;
    int(*p)[5] = scores; //行指针
    int* q;
    printf("所有课程成绩大于等于85分的学生:\n");
    for (i = 0; i < n; i++)
    {
        q = *(p + i);//第i行的指针
        cnt = 0;
        ave = 0;
        for (j = 1; j < m; j++)
        {
            ave += q[j];
            if (q[j] >= 85)
                cnt++;
        }
        ave /= 4;
        if (cnt == 4) //4门成绩都大于85
        {
            flag = 1;
            //输出
            printf("%d %s ", q[0], name[i]);
            for (j = 1; j < m; j++)
                printf("%d ", q[j]);
            printf("%.2f\n", ave);
        }
    }
    if (flag == 0)
        printf("没有满足条件的学生\n");
}

int main()
{
    const char kc[4][10] = { "math","eng","phys","chem" };
    const char name[5][10] = { "Zhang","Wang","Li","Sun","Zhao" };
    int scores[5][5] = { {3001,82,78,88,93},{3002,46,68,62,57},{3003,92,86,85,87},{3004,52,77,55,47},{3005,58,90,85,77} };
    average(scores, 5, 5, kc);
    search(scores, 5, 5, name);
    search2(scores, 5, 5, name);
    return 0;
}

不能翻译一下么......
没看到什么列指针和行指针要求啊,只是要求统计每门课成绩啊

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632