此程序用于查找数组中的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
答案 0 :(得分: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>
答案 1 :(得分:0)
我看到以下问题:
该行
h[k]=m[0];
如果m[0]
是最大值或第二大值,将导致问题。将其更改为:
h[k]=INT_MIN;
该行
if(m[i]>=h[k-1])
似乎错了。那应该是
if(m[i] < h[k-1])
该行
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
这似乎对我有用。
答案 2 :(得分:0)
你的一个问题是线
if(m[i]>=h[k-1])
这个条件将在你的do ... while循环中进行一次(假设最高标记仅出现一次),并且只有当最高数字不是第一行时才会执行下一行
这不是代码的唯一问题。 Nitin Tripathi的评论提到了很多条件,这些代码不能正常工作。
我建议您使用前三个标记加载h数组。然后,使用冒泡排序算法对其进行排序,使h [0]最高,h [2]最低。然后迭代标记的剩余值。对于每个值,如果它高于h [2],则用它替换h [2]并使用相同的气泡排序算法重新排序h数组。你可以谷歌那个并找到很多例子。
评论你的代码也可能对你有很大帮助。
答案 3 :(得分: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();
}
答案 4 :(得分: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))