Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка массива 
V
    Опции темы
Ripper
Дата 30.9.2007, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 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

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




--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
zkv
Дата 30.9.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(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() из стандартной библиотеки.

PM MAIL   Вверх
JackYF
Дата 30.9.2007, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(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



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
comcon1
Дата 30.9.2007, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



вот сделал с использованием всех твоих функций. 
у меня на маленьких выборках (до 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] << " ";

}



--------------------
PM MAIL   Вверх
Ripper
Дата 30.9.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



о, спасибо всем smile



--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
MAKCim
Дата 30.9.2007, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Ripper, 

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



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
apook
Дата 1.10.2007, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



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



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
zkv
Дата 1.10.2007, 03:08 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



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

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

PS себя я уже давно отучил от слова using smile 
Исключение - старые проекты, которые нужно заставить заработать.
PM MAIL   Вверх
comcon1
Дата 2.10.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



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


--------------------
PM MAIL   Вверх
zkv
Дата 2.10.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



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

в словосочетании: using namespace слово using содержится, 
я же сказал что отучил  себя от слова using, те ни using, ни using namespace smile
PM MAIL   Вверх
akizelokro
Дата 2.10.2007, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



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



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.