Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Сортировка массива


Автор: Lotles 6.4.2010, 06:23
Ошибок не выдает, но работает неправильно. Подскажите где ошибка

Код

#include "stdafx.h"
#include <conio.h>
#include <time.h>
#include <math.h>
using namespace std;
int main(){
    srand(time(0));
int a[10];
int i,temp;
for (i=0;i<10;i++)
    a[i]=rand() % 10;
    int k=0;
    while (k<10){
        for (i=k;i<10;i++){
            if (a[i]<a[k])
            {
                temp=a[k];
                a[k]=a[i];
                a[i]=temp;
            }
            cout << a[k];
            k++;
        }
    }
    return 0;
}

Автор: Atiskara 6.4.2010, 07:34
алгоритм смущает. на каждом шаге цикла for (i=k;i<10;i++){} k и i инкрементируются одинаково, и принимая во внимание, что на входе в оба цикла обе переменные равны нулю, происходит сравнение одного и того же значения массива. ну и после прогона внутриннего массива, внешний while заканчивается на первом круге, потому как k уже оказывается = 10. 

Автор: bsa 6.4.2010, 17:08
скажу другими словами. Тут есть типичная ошибка начинающего программиста (все это проходили) - использование одной и той же переменной счетчика цикла в двух вложенных циклах. Это раз. А два, это то, что ты инкрементируешь k внутри цикла for(), хотя по идее, нужно это делать скорее внутри while().

Автор: Atiskara 7.4.2010, 09:01
Цитата(bsa @ 6.4.2010,  17:08)
использование одной и той же переменной счетчика цикла в двух вложенных циклах. Это раз.

эти 2 цикла не вложены ;) обрати внимание на отсутствие многострочного блока в первом цикле)).

Автор: toxx 7.4.2010, 09:25
Цитата(Atiskara @ 7.4.2010,  09:01)
Цитата(bsa @ 6.4.2010,  17:08)
использование одной и той же переменной счетчика цикла в двух вложенных циклах. Это раз.

эти 2 цикла не вложены ;) обрати внимание на отсутствие многострочного блока в первом цикле)).

Ему нужно обратить внимание на то, что  k инкремируется не там=) 

думаю bsa критиковать не стоит=) 

Автор: xvr 7.4.2010, 10:35
Цитата(Atiskara @ 7.4.2010,  09:01)
Цитата(bsa @ 6.4.2010,  17:08)
использование одной и той же переменной счетчика цикла в двух вложенных циклах. Это раз.

эти 2 цикла не вложены ;) 

Вложенны
Цитата

обрати внимание на отсутствие многострочного блока в первом цикле)).
но не эти, а другие 2  smile (строки 13 и 14)

Автор: stat007 7.4.2010, 12:24
Lotles, Изучай STL!!!
Код

#include <iostream>
#include <algorithm>
#include <conio.h>
#include <time.h>
#include <math.h>
using namespace std;
int main(){
    srand(time(0));
int a[10];
int i,temp;
for (i=0;i<10;i++)
    a[i]=rand() % 10;
    int k=0;
    while (k<10){
        for (i=k;i<10;i++)
        {
            sort(a,a+10);
            cout << a[k]<<" ";
            k++;
        }
    }
    cout<<endl;
    system("pause");
    return 0;
}

Автор: Chiren 7.4.2010, 14:33
Так будет работать правильно:

Код

#include "stdafx.h"
#include <conio.h>
#include <time.h>
#include <math.h>
#include <iostream>
using namespace std;

int main()
{
    srand(time(0));
    int a[10];
    int i, temp;
    for (i = 0;i < 10; ++i)
        a[i] = rand() % 10;
    int k;
    for (k = 0; k < 10; ++k)
    {
        for (i=k; i < 10; ++i)
        {
            if (a[i] < a[k])
            {
                temp = a[k];
                a[k] = a[i];
                a[i] = temp;
            }
        }
        cout << a[k] << "  ";
    }
    return 0;
}


Автор: bsa 7.4.2010, 14:35
Цитата(Atiskara @  7.4.2010,  09:01 Найти цитируемый пост)
эти 2 цикла не вложены ;)
точно. ох уж эти новички, так отформатируют код...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)