使用if循环排序时出现意外结果 - 错误算法

时间:2016-10-06 23:27:01

标签: c++ algorithm

我的程序的目标是从文本文件中读取跑步者的随机数据及其速度,并将其组织成第一,第二和第三。它有他们的名字,围兜,年龄,性别和m:s。但是,在这个程序中我不能使用STL / Arrays等,并且仅限于整数,双精度和字符串。

该代码比较了跑步者的节奏。这是我使用过的算法之一

int pace_f = 100000;
int pace_s = 100000;
int pace_t = 100000;

if ((pace < pace_t) && (pace > pace_s))
        {
            name_t = name;
            min_t = min;
            sec_t = sec;

            pace_t = pace;
        }

if ((pace < pace_s) && (pace > pace_f))
        {
            name_s = name;
            min_s = min;
            sec_s = sec;

            pace_s = pace;
        }

if (pace < pace_f)
        {
            name_f = name;    
            pace_f = pace;
        }

错误位于输出中,正确显示第一和第二位置。但是,它有时要么打印出第三个位置,要么提供错误的位置。我知道它这样做是因为它比较了第一次传递给循环的值,因为它总是低于10,000,所以它将它设置为第三个最佳时间。现在,当一个更好的时间到来时,它取代了第三个位置,因为它符合所有其他条件。当前三个步速值按升序排列时,程序可以正常运行。

所以我的问题是这样 - 我如何纠正错误,以便它可以正常工作,而不需要你的数字按升序排列,否则这只是毫无意义。

2 个答案:

答案 0 :(得分:0)

我将指出现有代码的这一部分的逻辑问题:

    if (pace < pace_f)
    {
        name_f = name;    
        pace_f = pace;
    }

您的其他if语句存在同样的问题,但在此处更容易解释问题,然后您可以将相同的修补程序应用于所有其他语句。

在这里,您已经确定您的下一步速度优于目前的第一名。现在,pace(当前记录)现在是第一位的,您需要更新name_fpace_f,这是相应的第一个记录。

但是你错过的细节是你现在的第一名速度现在是你的第二个最佳速度,你现在的第二名速度现在是你的第三个最佳速度。

你刚刚找到了一个比你的前三个步伐更好的速度的唱片,所以这必然意味着你现有的最佳音乐现在是第二好的,你现有的第二好现在是你的第三好。

因此,在您更新第一个最佳音频和名称之前,您需要将现有的第二名称和节奏移至第三名和节奏;你现有的第一名和第二名的节奏和步伐;只有在完成后,您才能更新您的名字和节奏。

此外,您可以通过重新排列彼此的相对顺序来进行比较。

如果您可以先比较第一个位置,那么else部分可用于测试剩余的可能性。一旦你排除了你拥有最佳第一步的可能性,那么测试剩余的可能性就更简单了。

你的整体逻辑应该是:

if (pace < pace_f)
{
     // Move the second place name+pace to third place
     // Move the first place name+pace to the second place
     // Set the new first place pace.
}
else if (pace < pace_s)
{
     // Move the second place name+pace to third place
     // Set the new second place pace.
}
else if (pace < pace_t)
{
     // Set the new third place pace.
}

那就是它。

答案 1 :(得分:0)

这只是通过这样的事情完成的 所以我的想法是,当一个数字比第一个更好时,我们应该保留新的第一个和旧的第一个和第二个来自旧数据。

const int MAX = (int) 1e9; //INT_MAX from <climits> also to be considered
int num1,num2,num3,curr;
string name1,name2,name3,currName;
int main (){
    //the number of data to be entered
    cin>>runnersNum;
    num1=num2=num3=MAX;
    name1=name2=name3="No Name Yet";
    while (runnersNum--){
         cin>>curr>>currName;
         if (curr>=num1){
             if (num3!=MAX&&num2!=MAX) {
             swap(num2,num3); swap(name2,name3);
             swap(num1,num2); swap(name1,name2);
             num1=curr; name1=currName;
             }
         }
         if (curr>=num2){
             swap(num2,num3); swap(name2,name3);
             num2=curr; name2=currName;
         }
         if (curr>=num3){
             num3=curr; name3=currName;
         }
    }
}