3数组中没有排序的最大数字,我在哪里丢失逻辑?
该程序用于查找数组中的3个最高数字。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
我不知道,如果能够以更简单的方式完成这些工作,那么你的目的是什么? 这是另一种在一次迭代中查找前三位数字的方法; 希望你喜欢它,它可能会在未来帮助你。
来源:
#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;
}
OUTPUT:
./a.out
TOP 1st is<10>
TOP 2nd is<9>
TOP 3rd is<8>
'int a [10] = {5,4,3,9,6,8,2,7,1};' – user3386109
更正,在数组中添加一个更多元素使其成为10个元素的列表:) –
@NitinTripathi这不是问题。问题是如果最大的数字出现在第二和第三大数字之前,那么你的逻辑不起作用。 –
我看到以下问题:
-
线
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
它似乎为我工作。
你的一个问题是与线
if(m[i]>=h[k-1])
这种情况将被while循环(假设最高分出现只有一次),每次迭代一次遇见你做......的,下一个只有当最高数字不是第一个时才会执行。
这不是代码的唯一问题。Nitin Tripathi的评论暗示了这些代码不适用的许多条件。
我建议你用前三个标记加载h数组。然后,使用冒泡排序算法对其进行排序,以使h [0]最高,而h [2]最低。然后遍历标记的剩余值。对于每个值,如果它高于h [2],则用它替换h [2],并使用相同的冒泡排序算法对h数组重新排序。你可以谷歌,找到很多的例子。
评论你的代码可能会帮助你很多。
您需要梳理^ 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();
}
#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))
[现场演示](http://coliru.stacked-crooked.com/a/ef093881a09722fa) – sp2danny
有两种方法可以解决这样的问题:1)在调试器中运行你的代码,一次一行地观察变量值,直到找到在哪里没有做你想做的事情; 2)在代码中的关键点插入输出语句('printf')以查看发生了什么。 SO工作的方式不是:“这是我的代码,请为我调试”。你在调试之后,在解释你所做的事情之后,询问你是否仍然不明白。 –
它只是你想要的前3个数字,或者可以更多(将来)? –
和列表总是会成为一个唯一的数字集合? –