【问题标题】:Lowest value not been displayed未显示最低值
【发布时间】:2019-08-01 15:15:24
【问题描述】:

我无法显示学生比较每个科目的最低分数,最高分数可以正常工作。循环执行是否有错误,或者我没有设置正确的参数来搜索最低值的元素,可能是什么原因?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct student
{
    int roll_no;
    int semester_no;
    char name[20];
    int marks[6];

}semester[100];

int main ()
{
    int i=0,n,j=0;
    int highest=0,lowest=0;

    printf("HOW MANY STUDENTS MARKS TO ENTER?\n");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        printf("ENTER DETAILS OF STUDENT %d",i+1);
        printf("\nROLL NO\n");
        scanf("%d",&semester[i].roll_no);
        printf("NAME\n");
        getchar();
        gets(semester[i].name);
        printf("SEMESTER\n");
        scanf("%d",&semester[i].semester_no);

    int maxmarks=semester[0].marks[0];

    for (i=0;i<n;i++)
    {
        for(j=0;j<6;j++)
        {
            if(semester[i].marks[j]>maxmarks)
            {
                 highest=i;

            }
        }

    }

    minmarks=semester[0].marks[0];
    for(i=0;i<n;i++)
    {
        for(j=0;j<6;j++)
        {
            if(semester[i].marks[j]<minmarks)
            {
                lowest=i;
            }
        }
    }
   // printf("\n%d\n",cl);
   // printf("%d\n",ch);

    printf("\nNAME OF STUDENT WITH HIGHEST MARKS\n");
    printf("%s",semester[highest].name);
    printf("\nNAME OF THE STUDENT WITH LOWEST MARKS\n");
    printf("%s",semester[lowest].name);

    return 0;

}

我尝试了不同的输入,但我得到了错误的输出

HOW MANY STUDENTS MARKS TO ENTER?
2
ENTER DETAILS OF STUDENT 1
ROLL NO
1
NAME
abc
SEMESTER
1
SUBJECT 1 MARKS
10
SUBJECT 2 MARKS
20
SUBJECT 3 MARKS
30
SUBJECT 4 MARKS
40
SUBJECT 5 MARKS
50
ENTER DETAILS OF STUDENT 2
ROLL NO
2
NAME
xyz
SEMESTER
1
SUBJECT 1 MARKS
50
SUBJECT 2 MARKS
60
SUBJECT 3 MARKS
70
SUBJECT 4 MARKS
80
SUBJECT 5 MARKS
90

NAME OF STUDENT WITH HIGHEST MARKS
xyz
NAME OF THE STUDENT WITH LOWEST MARKS
xyz

【问题讨论】:

  • 更具描述性的变量名称将对这个问题有很大帮助。这很令人困惑。
  • 为了提高代码的可读性,您应该根据变量的用途命名变量。很难猜出 rn、s 和 sn 是干什么用的。你也应该调整你的身份。
  • 更小的代码并不是更好的代码。可读性更为重要。
  • @Sujit Maiti 你说的“分数最低的人”是什么意思?是不是意味着这个人的所有分数都应该小于其他人的分数?
  • @Sujit Maiti 您应该提供输入数据和问题所在。和他们一起。

标签: c arrays for-loop struct max


【解决方案1】:

您必须在循环中更新maxmarksminmarks。像这样的:

maxmarks=semester[0].marks[0];
minmarks=semester[0].marks[0];

for (i = 0; i < n; i++) {
    for (j = 0; j < 6; j++) {
        if (semester[i].marks[j] > maxmarks) {
           highest = i;
           maxmarks = semester[i].marks[j];
        }
        if (semester[i].marks[j] < minmarks) {
           lowest = i;
           minmarks = semester[i].marks[j];
        }
    }
}

【讨论】:

    【解决方案2】:

    我没有看到“n”被设置,甚至没有从用户那里获取任何输入,但我认为你出于某种莫名其妙的原因删除了该部分。

    现在问题来了:“m”是一个由 6 个元素组成的数组,但您只是从 1 迭代到 5。这意味着您忽略了每个学生的第一门科目的分数,据我从您的猜测代码。

    【讨论】:

      【解决方案3】:

      这是一个独立的程序,您可以使用它来确定如何修复您的程序:

      #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
      
      struct student {
          int roll_no;
          int semester_no;
          char name[20];
          int marks[6];
      } semester[100];
      
      int main () {
          int i = 0, n, j = 0;
          int highest = 0, lowest = 0;
      
          printf("marks?\n");
          scanf("%d", &n);
          for (i = 0; i < n; i++) {
              printf("roll?\n");
              scanf("%d", &semester[i].roll_no);
              printf("name?\n");
              scanf("%s", semester[i].name);
              printf("semester?\n");
              scanf("%d", &semester[i].semester_no);
              for (j = 0; j < 6; j++) {
                  printf("%d marks\n", j + 1);
                  scanf("%d", &semester[i].marks[j]);
              }
          }
      
          int maxmarks = semester[0].marks[0];
          for (i = 0; i < n; i++) {
              for (j = 1; j < 6; j++) {
                  if (semester[i].marks[j] > maxmarks) {
                      highest = i;
                      maxmarks = semester[i].marks[j];
                  }
              }
          }
      
          int minmarks = semester[0].marks[0];
          for (i = 0; i < n; i++) {
              for (j = 0; j < 6; j++) {
                  if (semester[i].marks[j] < minmarks) {
                      lowest = i;
                      minmarks = semester[i].marks[j];
                  }
              }
          }
      
          printf("\n");
          printf("NAME OF STUDENT WITH HIGHEST MARKS\n");
          printf("%s\n", semester[highest].name);
          printf("NAME OF THE STUDENT WITH LOWEST MARKS\n");
          printf("%s\n", semester[lowest].name);
      
          return 0;
      }
      

      我用这个脚本测试了它:

      #!/bin/bash
      ./scratch << EOF
      2
      1
      abc
      1
      10
      20
      30
      40
      50
      60
      2
      xyz
      1
      50
      60
      70
      80
      90
      100
      EOF
      

      输出

      marks?
      roll?
      name?
      semester?
      1 marks
      2 marks
      3 marks
      4 marks
      5 marks
      6 marks
      roll?
      name?
      semester?
      1 marks
      2 marks
      3 marks
      4 marks
      5 marks
      6 marks
      
      NAME OF STUDENT WITH HIGHEST MARKS
      xyz
      NAME OF THE STUDENT WITH LOWEST MARKS
      abc
      

      【讨论】:

      • 你改变了两个循环吗?
      • 那么问题出在您没有向我们展示的代码中。
      • 现在可以了,你能解释一下我哪里出错了吗?
      • 看起来你还没有把你的完整程序放在你的问题中。如果没有完整的程序,我无法告诉你哪里出错了。
      【解决方案4】:

      在第 23 行:for (i=0;i&lt;n;i++) 如果n 具有预定义的值,您将有更多的确定性行为。如第 16 行所示:int i=0,n,j=0; n 的值未定义。

      【讨论】:

      • 我将 n 作为代码输入部分的学生人数
      • @SujitMaiti 但是您在设置之前使用的是n
      【解决方案5】:

      问题是你选择了错误的方法。

      在外部循环中,您必须为给定学生设置当前最大值或最小值。在内部循环中,您必须计算学生的最大值或最小值。然后你必须将这个最大值或最小值与在循环之外设置的值进行比较。

      例如

      int maxmarks=semester[0].marks[0];
      
      for ( i = 0; i < n; i++ )
      {
          int current_max = semester[i].marks[0];
      
          for ( j = 1; j < 6; j++ )
          {
              if( current_max < semester[i].marks[j] )
              {
                   current_max = semester[i].marks[j];
              }
          }
      
          if ( maxmarks < current_max ) highest = i; 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-01
        • 2021-01-19
        • 2021-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-04
        相关资源
        最近更新 更多