首页 新闻 会员 周边 捐助

C语言问题。

0
悬赏园豆:30 [已解决问题] 解决于 2019-10-27 22:12

5.从键盘上输入若干学生的一门课成绩,统计并输出最高成绩和最低成绩及相应的序号,当输入负数时结束输入。

请问哪位兄台能解决一下,提供一下代码哦。再加一问,如果有多个最高分和最低分该怎么办?

include<stdio.h>

define M 3

define N 3

int is_prime(int q,int i);

int main(void)
{
int a[M][N],p,i;

p = &a[0][0];

printf("请输入%d行,%d列个数字\a\n",M,N);
for(p;p <= &a[M][N];p++)
{
    printf("请输入数字:\a");
    scanf("%d",p);

}
p = &a[M][N];
i = &a[0][0];
is_prime(p,i);


return 0;

}

int is_prime(int q,int i)
{

for (q;q>=i;q--)
{
    
    printf("%-4d",*q); // 请问怎样使输出的多维数组能够自动换行。

}


return 0;

}

shmily涂的主页 shmily涂 | 初学一级 | 园豆:4
提问于:2019-10-19 16:34

我给你说思路吧,最高分最低分分别声明成变量,然后循环遍历数组,每循环一次就把当前学生成绩跟最高分最低分比较,如果当前学生成绩比最高分高,那么就把当前学生的成绩赋给最高分,最低分同上,多个最高分最低分不用怕,因为只有学生分数比最高分高的时候才进行赋值操作;换行的话,for循环,每到3的倍数时换行比如:3,6,9,12,15:
//这是我java的例子,C学过,忘得差不多了,你照葫芦画瓢吧
for(int i=0;i<=成绩数组.length;i++){
if((i+1)%3==0){
//换行,我是java,跟你换行语句不一样,你自己找你的C换行
}
}

于波连 5年前

@于波连: 那怎样将最高成绩最低成绩的序号保存并输出呢,而且多个最高成绩时,会有多个序号。

shmily涂 5年前

@shmily涂: 你是输出某一个最高成绩的序号,还是输出所有最高成绩的学生的序号???

于波连 5年前
< >
分享
最佳答案
0
#define _CRT_SECURE_NO_WARNINGS //编译器问题,scanf,一般不用加上,我用vs2019
#include <stdio.h>
#define M 10
//思路上就是,假设第一个最大、最小,设置下储存最大最小的数组
//然后扫描数组
//大于最大,1.改下最大值 2.重置下最大序号数组(也就是把数组长度改为0而已) 3.将新的序号放入数组 4.从新计数
//等于最大,1.将新的序号放入数组 2.计数加一
//小于最大就不需要管了
//小于同理

int main()
{
    int grade[M] = {};
    printf("请输入成绩序列(用-1结尾):");
    int n = 0;
    //本来想封装成函数,算了就这样吧,还有这些int应该换成double,不过也算了

    //依次输入到数组,-1结尾
    do {
        scanf("%d", &grade[n]);
        n++;
    } while (grade[n-1] != -1);

    if (n == 1) {
        printf("没有成绩录入");
        return 0;
    }

    int max = grade[0];//最大值,假设为第一个
    int min = grade[0];//最小值,假设为第一个
    int grade_max[M] = { 1 };//最大值序列数组
    int grade_min[M] = { 1 };//最小值序列数组
    int grade_max_count = 1;//记录最大值个数用
    int grade_min_count = 1;//记录最小值个数用
    //遍历数组,选择最大最小值
    // 12 32 45 -1
    for (int i = 1; i < n - 1; i++) {
        //判断最大值
        //如果当前值超过了最大值
        if (grade[i] > max) {
            max = grade[i];//max为当前值
            grade_max_count = 0;//长度设置为0
            //因为有一个了,赋值加一
            grade_max[grade_max_count++] = i + 1;
        }
        //如果当前值等于最大值
        else if (grade[i] == max) {
            grade_max[grade_max_count++] = i + 1;//赋值加一
        }
        //-------------------//

        //判断最小值
        //如果当前值小于了最小值
        if (grade[i] < min) {
            min = grade[i];//max为当前值
            grade_min_count = 0;//长度设置为0
            //因为有一个了,赋值加一
            grade_min[grade_min_count++] = i + 1;
        }
        //如果当前值等于最小值
        else if (grade[i] == min) {
            grade_min[grade_min_count++] = i + 1;//赋值加一
        }
        //如果当前值大于最小值
        else {
            
        }
    }
    //选择完成,最大、最小分别在两个数组中
    //输入两个数组内容

    //输出max
    printf("最大值为:max = %d", max);
    printf("\n");
    printf("最大值序号列表:");
    for (int i = 0; i < grade_max_count; i++)
    {
        printf("%d,", grade_max[i]);
    }
    printf("\n");
    //输出min
    printf("最大值为:min = %d", min);
    printf("\n");
    printf("最大值序号列表:");
    for (int i = 0; i < grade_min_count; i++)
    {
        printf("%d,", grade_min[i]);
    }

    return 0;
}

测试结果如下:

收获园豆:30
Yuzero | 菜鸟二级 |园豆:218 | 2019-10-25 18:42
其他回答(1)
0

先保存最高成绩g和最低成绩l的值,可以预先定义两个存放下标的数组(最高成绩一个,最低成绩一个),数组长度自己预估;然后拿l 和 g回到成绩数组里面循环比较,匹配到和最高成绩g相同,就将此时成绩的数组下标值i保存到你预先定义的目标数组里,最低成绩同样操作,遍历一次成绩数组就行。

矿灯夜行 | 园豆:204 (菜鸟二级) | 2019-10-21 07:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册