-1

このプログラムは、配列内の最大 3 つの数値を見つけるためのものです。

コードを実行すると、1 番目に高く、2 番目に高くなります。そして、2番目に高いものが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

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

あなたの問題の1つはラインにあります

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

この条件は、do...while ループの反復ごとに 1 回満たされ (最高のマークが 1 回だけ発生すると仮定)、次の行は、最高の数が最初の行ではない場合にのみ実行されます。

コードの問題はこれだけではありません。Nitin Tripathi のコメントでほのめかされているように、このコードが正しく機能しない状況はたくさんあります。

h 配列に最初の 3 つのマークをロードすることをお勧めします。次に、バブル ソート アルゴリズムを使用して、h[0] が最も高く、h[2] が最も低くなるように並べ替えます。次に、マークの残りの値を反復処理します。各値について、h[2] よりも大きい場合は、h[2] をその値に置き換え、同じバブル ソート アルゴリズムを使用して h 配列を再ソートします。それをググるだけで、たくさんの例を見つけることができます。

コードにコメントを付けることも、おそらく大いに役立つでしょう。

于 2015-09-28T05:30:48.727 に答える