-1

该程序用于查找数组中的 3 个最高数字。

当我运行代码时,我得到了第一高和第二高。第二高的是第三个数字重复

我在逻辑中缺少什么?

#include<stdio.h>
#include<conio.h>

int main()
{
   int i,k,n,m[20],h[3];
   printf("\n enter the total number of students");
   scanf("%d",&n);
   for(i=0;i<n;i++)
   {
      printf("enter the marks scored by student %d",i+1);
      scanf("%d",&m[i]);
   }//end for loop
   k=0;
   h[k]=m[0];
   for(i=0;i<n;i++)
   {
      if(m[i]>h[k])
      {
         h[k]=m[i];
      }
   }//end for loop
   do
   {
      //Probably messed my code here
      k++;
      h[k]=m[0];
      for(i=0;i<n;i++)
      {
         if(m[i]>=h[k-1])
         {
            if(m[i]>h[k])
            {
               h[k]=m[i];
            }//end if
            break;
         }//end if
      }//end for loop
   }//end do loop
   while(k<3);
   printf("the first 3 highest marks are:\n");
   for(i=0;i<k;i++)
      printf("%d:%d\n",i+1,h[i]);
   getch();
}//end of main
4

5 回答 5

3

我不知道,如果可以以更简单的方式完成,那么您编写如此庞大的代码行的目的是什么。这是在一次迭代中找到前 3 个数字的另一种方法;希望你会喜欢它,它可能会在未来对你有所帮助。

资源:

#include<stdio.h>
#include<limits.h>
int main()
{
    int a[10] = {5,4,3,6,7,8,9,10,1,2};
    int h1 = INT_MIN; //TOP 1st
    int h2 = INT_MIN; //TOP 2nd
    int h3 = INT_MIN; //TOP 3rd
    for(int i=0;i<10;i++)
    {
        if(a[i] > h1)
        {
            h3 = h2; h2 = h1; h1 = a[i];
        }
        else if (a[i] > h2)
        {
            h3 = h2; h2 = a[i];
        }
        else if  (a[i] > h3)
        {
            h3 = a[i];
        }
    }
    printf("TOP 1st is<%d>\n",h1);
    printf("TOP 2nd is<%d>\n",h2);
    printf("TOP 3rd is<%d>\n",h3);
    return 0;
}

输出:

./a.out 
TOP 1st is<10>
TOP 2nd is<9>
TOP 3rd is<8>
于 2015-09-28T05:23:40.067 回答
0
#include <algorithm>
#include <cstddef>

template<typename RanIt>
void make_N_highest( std::size_t N, RanIt b, RanIt e )
{
    std::make_heap(b,e);
    while(N--)
        std::pop_heap(b,e--);
}

这会将 N 个最高值放在序列的最后。
这是 O( N * log(size) )

于 2015-09-28T06:22:46.827 回答
0

我看到以下问题:

  1. 线

    h[k]=m[0];
    

    m[0]如果是最大或第二大值将导致问题。将其更改为:

    h[k]=INT_MIN;
    
  2. 线

     if(m[i]>=h[k-1])
    

    似乎错了。那应该是

     if(m[i] < h[k-1])
    
  3. 线

        break;
    

    是错误的来源。如果它们接近列表的末尾,它将无法正确检测第二个和第三个最大值。

这是do/while具有这些修复的块。

do
{
   k++;
   h[k]=INT_MIN;
   for(i=0;i<n;i++)
   {
      if(m[i] < h[k-1])
      {
         if(m[i]>h[k])
         {
            h[k]=m[i];
         }//end if
      }//end if
   }//end for loop
}//end do loop

它似乎对我有用。

于 2015-09-28T05:24:01.680 回答
0

您需要对 h 数组进行排序,以下代码工作正常

#include<stdio.h>
#include<conio.h>

void main()
{
   int i,a,j,k,n,m[20],h[3];
   int high, temp;
   printf("\n enter the total number of students");
   scanf("%d",&n);
   for(i=0;i<n;i++)
   {
      printf("enter the marks scored by student %d",i+1);
      scanf("%d",&m[i]);
   }//end for loop

   k=0;
   h[k]=m[0];

   for(i = 1; i < n; i++)
   {
      if(m[i] > h[0])
      {
     h[k] = m[i];
     k++;

     // make sure h[0] have max value out of all 3
     for (a = 0; a < k; a++)
     {
        for (j = a + 1; j < k; j++)
        {
            if (h[a] < h[j])
            {
                temp = h[j];
                h[j] = h[a];
                h[a] = temp;
            }
        }
     }
      }
   }//end for loop


   for (i = 0; i < k; i++)
   {
    printf("\n %d", h[i]);
   }

   getch();
}
于 2015-09-28T05:41:45.810 回答
0

你的问题之一是线路

if(m[i]>=h[k-1])

每次 do...while 循环的迭代都会满足此条件一次(假设最高标记仅出现一次),并且仅当最高数字不是第一个时才会执行下一行。

这不是代码的唯一问题。Nitin Tripathi 的评论提到,在很多情况下这段代码都不能正常工作。

我建议您使用前三个标记加载 h 数组。然后,使用冒泡排序算法对其进行排序,使 h[0] 最高,h[2] 最低。然后迭代标记的剩余值。对于每个值,如果它高于 h[2],则用它替换 h[2],并使用相同的冒泡排序算法对 h 数组重新排序。你可以用谷歌搜索并找到很多例子。

评论您的代码可能也会对您有很大帮助。

于 2015-09-28T05:30:48.727 回答