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


Автор: Ripper 30.9.2007, 17:23
Только что начал изучать С++ в институте, и пробую написать 1 программу. Задание вообще-то другое, но я хоть какую то часть пробую сделать. Незнаю, пишу ли я "коряво" или совсем не верно. Вообщем...
Нужно ввести массив (неболее 100 чисел), отсортировать пузырьком и вывести на экран:
Код

#include <iostream>
using namespace std;


int input(int*,int);
void output(int*, int);
void swap (int&,int&);
void sort(int*, int);

const int SIZE = 100;

int main () {
    int array[SIZE],num;    
    num=input(array, SIZE);
    sort(array,num);
    output(array,num);
    system("PAUSE");
    return 0;
}

void sort(int a[], int num) {
    for (int i=0; i<num; i++)
     for (int j=0; j<num-i; j++) 
       if (a[j]>a[j+1]) swap(a[j],a[j+1]);
}

void swap(int& a, int& b) {
     a=a^b;
     b=a^b;
     a=a^b;
}

int input(int a[],int num) {
 int i=0;
 for (; (i<num)&&(cin>>a[i]); i++);
 return i;
}

void output(int a[], int num) {
     for (int i=0; i<num; i++)
     cout << a[i] << " ";
}



Если сорт отключить то вводится выводится вроде нормально. Просто я ещё не привык к циклу for и остальным примудростям.
Где ошибка?smile

И ещё, если кому не лень, вот полное задание, но я чето так и не смог эту простую чтуку сообразить, там нужно ещё один цикл добавить... мм:
Из входного потока вводится последовательность целых чисел. Количество чисел последовательности произвольно, но не превышает 100. Сформировать новую последовательность,состоящую из чисел исходной последовательности, в которой числа внутри каждой группы, заданной длины, упорядочены по возрастанию. Например для исходной: 12,101,2,7,178,30,141 21 при длине группы равной 3 получаем: 2,12,101,7,30,178,21,141

Тока не используя дополнительных возможностей С++, всяких готовых ф-ий)


Автор: zkv 30.9.2007, 17:48
Цитата(Ripper @  30.9.2007,  17:23 Найти цитируемый пост)
void sort(int a[], int num) {
    for (int i=0; i<num; i++)
     for (int j=0; j<num-i; j++) 
       if (a[j]>a[j+1]) swap(a[j],a[j+1]);
}

техническая ошибка тут j<num-i, получаешь выход за пределы массива тут: a[j+1] при i==0.
так вроде работает:  int j=0; j<num-i-1; j++
сам проверь под отладчиком smile

Цитата(Ripper @  30.9.2007,  17:23 Найти цитируемый пост)
using namespace std;

так делать опасно, ты например, открыл таким образом функцию std::swap() из стандартной библиотеки.

Автор: JackYF 30.9.2007, 17:53
Цитата(Ripper @  30.9.2007,  17:23 Найти цитируемый пост)
Из входного потока вводится последовательность целых чисел. Количество чисел последовательности произвольно, но не превышает 100. Сформировать новую последовательность,состоящую из чисел исходной последовательности, в которой числа внутри каждой группы, заданной длины, упорядочены по возрастанию. Например для исходной: 12,101,2,7,178,30,141 21 при длине группы равной 3 получаем: 2,12,101,7,30,178,21,141

тоже самое, только вызываешь функцию sort на каждом k-ом элементе, выводим полученное, очищаем, и так до конца ввода smile


Цитата(Ripper @  30.9.2007,  17:23 Найти цитируемый пост)
  if (a[j]>a[j+1]) swap(a[j],a[j+1]);

здесь будет выход за границы массива при j=num-1.

Цитата(Ripper @  30.9.2007,  17:23 Найти цитируемый пост)
 for (int i=0; i<num; i++)

замени на i=1

Автор: comcon1 30.9.2007, 17:58
вот сделал с использованием всех твоих функций. 
у меня на маленьких выборках (до 40 элементов) все работало. 
Ты тока за массив вылезал при сортировке, так и программу завалить можно, если за сотню вылезти.
Код

#include <iostream>
using namespace std;


int input(int*,int);
void output(int*, int);
void swap (int&,int&);
void sort(int*, int);

const int SIZE = 100;

int main () {
    int array[SIZE],num, grsize;   
    cout << "Enter group size: " << flush;
    cin >> grsize;
    cout << "Enter array elements: " << flush;
    num = input(array);
    for (int i = 0; i < num; i += grsize) {
      output (array +i, (i+grsize >= num) ? num-i : grsize);
      cout << endl;
      sort( (array + i), (i+grsize >= num) ? num-i : grsize);
    }
    output(array,num);
    system("PAUSE");
    return 0;
}

void sort(int a[], int num) {
    for (int i=0; i<num-1; i++)      // тут поправил - ты за массив вылезал
     for (int j=0; j<num-i-1; j++)  // и тут
       if (a[j]>a[j+1]) swap(a[j],a[j+1]);
}

void swap(int& a, int& b) {
     a=a^b; // мне стыдно, но первый раз увидел, что так можно))
     b=a^b;
     a=a^b;
}

int input(int a[]) { // еще отсюда параметр выкинул
 int i=0;
 for (; (i<SIZE)&&(cin>>a[i]); i++);
 return i;
}

void output(int a[], int num) {
     for (int i=0; i<num; i++)
     cout << a[i] << " ";

}

Автор: Ripper 30.9.2007, 18:30
о, спасибо всем smile

Автор: MAKCim 30.9.2007, 19:56
Ripper, 

M
MAKCim
Если вы получили ответ на вопрос, пометьте его как решенный

Автор: apook 1.10.2007, 01:35
Цитата(zkv @  30.9.2007,  17:48 Найти цитируемый пост)
ты например, открыл таким образом функцию std::swap()
, to zkv Чем чревато, включил же не вызвал?? или возникнит ситюейнен когда она вызовется автоматически?

Автор: zkv 1.10.2007, 03:08
Цитата(apook @  1.10.2007,  01:35 Найти цитируемый пост)
Чем чревато, включил же не вызвал?? или возникнит ситюейнен когда она вызовется автоматически?

в этом случае нечем, но помню на форуме пару раз возникали проблемы, и виновато было как раз такое незаметное подключение std::swap() smile

PS себя я уже давно отучил от слова using smile 
Исключение - старые проекты, которые нужно заставить заработать.

Автор: comcon1 2.10.2007, 12:11
Странно, я из-за сообщений папок этого форума, как раз наоборот, приучил себя к слову using и некогда не пишу using namespace.

Автор: zkv 2.10.2007, 13:09
Цитата(comcon1 @  2.10.2007,  12:11 Найти цитируемый пост)
приучил себя к слову using и некогда не пишу using namespace. 

в словосочетании: using namespace слово using содержится, 
я же сказал что отучил  себя от слова using, те ни using, ни using namespace smile

Автор: akizelokro 2.10.2007, 13:53
Зачтите главу 9 великолепного талмуда достопочтенного и многопрославленного мистера Стэнли Б. Липпмана "С++ для начинающих", в коей досконально и доверительно описываются последствия использования директивы using для перегрузки функций (что я сам и сделал, прежде чем поделиться сим неплохим советом). После продолжительных бессонных размышлений об этом предмете я пришел к выводу, что применение директивы using безусловно можно не рекомендовать для начинающих, которые не читали вышеупомянутый достославный труд вышеупомянутого мастера.
Если std::swap оказалась более предпочтительной для компилятора чем native-но той программы, значит, программер что-то напутал или не щепетился при написании кода. 

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