5.从键盘上输入若干学生的一门课成绩,统计并输出最高成绩和最低成绩及相应的序号,当输入负数时结束输入。
请问哪位兄台能解决一下,提供一下代码哦。再加一问,如果有多个最高分和最低分该怎么办?
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;
}
#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; }
测试结果如下:
先保存最高成绩g和最低成绩l的值,可以预先定义两个存放下标的数组(最高成绩一个,最低成绩一个),数组长度自己预估;然后拿l 和 g回到成绩数组里面循环比较,匹配到和最高成绩g相同,就将此时成绩的数组下标值i保存到你预先定义的目标数组里,最低成绩同样操作,遍历一次成绩数组就行。
我给你说思路吧,最高分最低分分别声明成变量,然后循环遍历数组,每循环一次就把当前学生成绩跟最高分最低分比较,如果当前学生成绩比最高分高,那么就把当前学生的成绩赋给最高分,最低分同上,多个最高分最低分不用怕,因为只有学生分数比最高分高的时候才进行赋值操作;换行的话,for循环,每到3的倍数时换行比如:3,6,9,12,15:
– 于波连 5年前//这是我java的例子,C学过,忘得差不多了,你照葫芦画瓢吧
for(int i=0;i<=成绩数组.length;i++){
if((i+1)%3==0){
//换行,我是java,跟你换行语句不一样,你自己找你的C换行
}
}
@于波连: 那怎样将最高成绩最低成绩的序号保存并输出呢,而且多个最高成绩时,会有多个序号。
– shmily涂 5年前@shmily涂: 你是输出某一个最高成绩的序号,还是输出所有最高成绩的学生的序号???
– 于波连 5年前