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

C++ 使用if循环排序时出现意外结果-错误算法,c++,algorithm,C++,Algorithm,我的程序的目标是从文本文件中读取跑步者及其速度的随机数据,并将其组织成第一、第二和第三组。它有他们的名字,围嘴,年龄,性别和m:s。然而,在这个程序中,我不能使用STL/数组等,并且仅限于int、double和string 代码比较跑步者的速度。这是我使用过的算法之一 int pace_f = 100000; int pace_s = 100000; int pace_t = 100000; if ((pace < pace_t) && (pace > pace_s

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

代码比较跑步者的速度。这是我使用过的算法之一

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;
        }
int-pace\u f=100000;
int pace_s=100000;
int pace_t=100000;
如果((步速<步速>步速)和&(步速>步速))
{
name_t=name;
min_t=min;
秒t=秒;
步速=步速;
}
如果((配速<配速)和&(配速>配速)
{
name_s=name;
min_s=min;
秒=秒;
速度=速度;
}
如果(速度<速度f)
{
name_f=name;
步速f=步速;
}
错误出现在正确显示第一和第二位置的输出中。然而,它有时要么打印不出第三个位置,要么提供错误的位置。我理解它是这样做的,因为它比较了传递给循环的第一次时间的值,并且因为它总是小于10000,所以它将它设置为第三个最佳时间。现在,当一个更好的时机到来时,它将取代第三位的那个,因为它满足所有其他条件。当前三个速度值按升序传递时,程序将正确运行


因此,我的问题是-我如何更正错误,使其在不需要您的数字按升序排列的情况下工作,因为否则这是毫无意义的。

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

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

就是这样。

这只是通过这样的方式完成的。
因此,当一个数字比第一个好时,我们应该保留新的第一个,旧的第一个,旧的第二个

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;
         }
    }
}
const int MAX=(int)1e9//还应考虑来自的INT_最大值
整数num1,num2,num3,当前;
字符串name1、name2、name3、currName;
int main(){
//要输入的数据数
cin>>Runnersum;
num1=num2=num3=最大值;
name1=name2=name3=“还没有名字”;
而(runnersum--){
cin>>货币>>货币名称;
如果(当前>=num1){
如果(num3!=MAX&&num2!=MAX){
互换(num2,num3);互换(名称2,名称3);
互换(num1,num2);互换(名称1,名称2);
num1=货币;名称1=货币名称;
}
}
如果(当前>=num2){
互换(num2,num3);互换(名称2,名称3);
num2=货币;名称2=货币名称;
}
如果(当前>=num3){
num3=当前;名称3=当前名称;
}
}
}

对于初学者,您的标题是“if循环”。
if
语句不是循环。没有if循环这样的东西。哦,我不知道。一些创造性的
goto
s,你可以循环任何东西!调试它,也许不会,但它会循环!这不是问题,但是
if((pacepace\u s))
应该写
if(pacepace\u s)
。多余的括号充其量只能分散注意力。@PeteBecker,这似乎更像是文体建议,而不是其他建议。有些人发现括号会分散注意力,有些人发现它们使复杂条件更容易解析。
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;
         }
    }
}