![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Застопорился с qsort |
|
C/C++ - Застопорился с qsort
|
Новый участник Сообщения: 15 |
Суть задачи в следующем:
Дан одномерный массив длиной N. Массив заполняется датчиком случайных чисел (лучше использовать любое распределение, кроме нормального). Необходимо отсортировать массив со случайными числами используя qsort. Я вроде разобрался с возможностями qsort, но серавно незнаю куда подстаавить и что нужно доделать. Если возможно поясните что не так делаю или что-то забыл Вот код: #include <iostream> #include<time.h> using namespace std; void qsort(int* a, long int left, long int right); int main () { srand (time(NULL)); int i, N, j, k; //Задаем количество элементов cout<<endl<<"Dlina massiva - N: "; //N - длина одномерного массива cin>>N; cout<<"\n"; if(N > 0) { //Резервируем место на диске под количество элементов int *a = new int[N]; cout << "Vremennii massiv: " << endl; for(i=0; i<N; i++) { a[i]=rand()%20; cout<<a[i]<<" "; } cout<<"\n"; qsort(a, 0, N); cout << "\n Konechnii massiv: " << endl; for (int i = 0; i < N; i++) cout << a[i] << " "; delete [] a; } else cout<<"\n Chislo elementov ne mozhet byt <=0"; system("pause"); return 0; } |
|
Отправлено: 09:35, 22-05-2011 |
Необычный Сообщения: 4466
|
Профиль | Сайт | Отправить PM | Цитировать Согласно данного описания, алгоритм не полный.
Как я понял qsort надо подсказать, как сравнивать элементы массива между собой. Остальной ввод/вывод с виду верен, там сложно ошибиться, въедливо не проверял. |
------- Отправлено: 16:17, 22-05-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать Я пот переделал слегка, но неидет. Может я что-то нетак сделалал или забыл, подскажите
Вот код: #include <iostream> #include <cstdlib> using namespace std; int compare_ints(const void* a, const void* b) { int* arg1 = (int*) a; int* arg2 = (int*) b; if( *arg1 < *arg2 ) return -1; else if( *arg1 == *arg2 ) return 0; else return 1; int main () { srand (time(NULL)); int i, N, j, k; //Задаем количество элементов cout<<endl<<"Dlina massiva - N: "; //N - длина одномерного массива cin>>N; cout<<"\n"; if(N > 0) { //Резервируем место на диске под количество элементов int *a = new int[N]; int size = N; qsort(a, size, sizeof(int), compare_ints); cout << "Vremennii massiv: " << endl; for(i=0; i<N; i++) { a[i]=rand()%20; cout<<a[i]<<" "; } cout<<"\n"; qsort(a, size, sizeof(int), compare_ints); cout << "\n Konechnii massiv: " << endl; for (int i = 0; i < N; i++) cout << a[i] << " "; delete [] a; } else cout<<"\n Chislo elementov ne mozhet byt <=0"; system("pause"); return 0; } } |
Отправлено: 10:45, 23-05-2011 | #3 |
Необычный Сообщения: 4466
|
Профиль | Сайт | Отправить PM | Цитировать feytan, в фигурных скобочках напутал.
\\ head code ... int compare_ints(const void* a, const void* b) { \\ compare_ints code ... } int main () { \\ main code ... return 0; } Пример работы : Dlina massiva - N: 25 Vremennii massiv: 17 11 12 10 17 17 8 12 4 18 1 11 9 2 18 14 15 2 17 12 11 19 0 12 15 Konechnii massiv: 0 1 2 2 4 8 9 10 11 11 11 12 12 12 12 14 15 15 17 17 17 17 18 18 19 RUN SUCCESSFUL (общее время: 5с) Функция main не должна быть составной функцией чего либо еще. Это основная функция, получающая управление после запуска приложения. |
------- Отправлено: 11:50, 23-05-2011 | #4 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать Цитата feytan:
Во-вторых, можно и проще код написать int compare_ints (const void* a, const void* b) { int res = *(const int*) b - *(const int*) a; return (res > 0) ? 1 : (res < 0) ? -1 : 0; } И стоит обратить внимание на оператор "?" . Он действует так: (Условие) ? Результат_Если_Истина : Иной_Результат Здесь мы в одной строке проверяем сразу три возможных варианта и полученный результат передаём на return |
||
------- Отправлено: 17:14, 23-05-2011 | #5 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать El Scorpio,
Спасибо за совет, у меня вот теперь другой вопрос. Я пытаюсь добавить еще один элемент массива, притом, чтобы массив оставлся отсортированным, но что-то идет не так, или я про что-то не так делаю Вот код: #include <iostream> #include <cstdlib> using namespace std; int compare_ints (const void* a, const void* b) { int res = *(const int*) a - *(const int*) b; return (res < 0) ? -1 : (res > 0) ? 1 : 0; } int main () { srand (time(NULL)); int i, N, j, k; //Задаем количество элементов cout<<endl<<"Dlina massiva - N: "; //N - длина одномерного массива cin>>N; cout<<"\n"; if(N > 0) { //Резервируем место на диске под количество элементов int *a = new int[N+1];// резервируем память под массив на 1 элемент больше int size = N; cout << "Vremennii massiv: " << endl; for(i=0; i<N; i++) { a[i]=rand()%100; cout<<a[i]<<" "; } cout<<"\n"; qsort(a, size, sizeof(int), compare_ints); cout << "\nKonechnii massiv1: " << endl; for (int i = 0; i < N; i++) cout << a[i] << " "; cout << "\n"; cout<<endl<<"k: "; //k - случайное число cin>>k; cout<<endl; i=0; while ((a[i]<k) && (i<N)) //ищем место, куда поставить случайное число i++; for (j=N; j>i; j--) //сдвигаем все элементы массива на 1 в конец, чтобы вставить случайный элемент a[j]=a[j-1]; a[i]=k; //вставляем на найденное место случайный элемент cout << "Konechnii massiv: " << endl; for (int i = 0; i < N+1; i++) cout << a[i] << " "; cout << endl; delete [] a; } else cout<<"\nChislo elementov ne mozhet byt <=0" << endl; system("pause"); return 0; } |
Отправлено: 10:49, 24-05-2011 | #6 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать Сама программа запускается, но выдает в строке компиляции:
|
Отправлено: 11:54, 24-05-2011 | #7 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать Нашел решение:
Вот код: #include <iostream> #include <cstdlib> using namespace std; int compare_ints (const void* a, const void* b) { int res = *(const int*) a - *(const int*) b; return (res < 0) ? -1 : (res > 0) ? 1 : 0; } int main () { srand (time(NULL)); int i, N, j, k; //Задаем количество элементов cout<<endl<<"Dlina massiva - N: "; //N - длина одномерного массива cin>>N; cout<<"\n"; if(N > 0) { //Резервируем место на диске под количество элементов int *a = new int[N+1];// резервируем память под массив на 1 элемент больше int size = N; cout << "Vremennii massiv: " << endl; for(i=0; i<N; i++) { a[i]=rand()%100; cout<<a[i]<<" "; } cout<<"\n"; qsort(a, size, sizeof(int), compare_ints); cout << "\nOtsortirovannii massiv: " << endl; for (i = 0; i < N; i++) cout << a[i] << " "; cout << "\n"; cout<<endl<<"k: "; //k - случайное число cin>>k; cout<<endl; i=0; while ((a[i]<k) && (i<N)) //ищем место, куда поставить случайное число i++; for (j=N; j>i; j--) //сдвигаем все элементы массива на 1 в конец, чтобы вставить случайный элемент a[j]=a[j-1]; a[i]=k; //вставляем на найденное место случайный элемент cout << "Konechnii massiv: " << endl; for (i = 0; i < N+1; i++) cout << a[i] << " "; cout << endl; delete [] a; } else cout<<"\nChislo elementov ne mozhet byt <=0" << endl; system("pause"); return 0; } |
Отправлено: 14:06, 24-05-2011 | #8 |
Необычный Сообщения: 4466
|
Профиль | Сайт | Отправить PM | Цитировать ну из методов "костылей" - добавь работу с глобальной переменной типа счетчик.
Увеличивай его в случае "больше" или в случае "меньше". "Поиграйся" в общем. |
------- Отправлено: 14:43, 24-05-2011 | #9 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать Я сделал саму задачу, и выкладываю ее код, может кому пригодится.
Задание: Дан одномерный массив длиной N. Массив заполняется датчиком случайных чисел (лучше использовать любое распределение, кроме нормального). Требуется: 1) отсортировать массив со случайными числами; 2) в отсортированный массив, вставить случайное число, чтобы он оставался отсортированным; 3) также на экране после выполнения программы должно появляться сообщение, о том, сколько сравнений элементов сделано программой; 4) также программа должна выдавать сколько времени потребовалось ПК на выполнение программы Вот мои три разных способа решения задачи: Первый: #include <iostream> #include <cstdlib> #include<windows.h> using namespace std; int compare_count = 0; int compare(const void* a, const void *b) { ++compare_count; return (*(int*)a - *(int*)b); } int main () { DWORD t1, t2, d_time; srand (time(NULL)); int i, N, j, k; t1 = GetTickCount(); //Задаем количество элементов N=rand()%100; cout<<endl<<"Dlina massiva - N: " <<N <<endl; //N - длина одномерного массива cout<<"\n"; //Резервируем место на диске под количество элементов int *a = new int[N+1];// резервируем память под массив на 1 элемент больше int size = N; cout << "Vremennii massiv: " << endl; for(i=0; i<N; i++) { a[i]=rand()%100; cout<<a[i]<<" "; } cout<<"\n"; t1 = GetTickCount(); qsort(a, size, sizeof(int), compare); cout << "\nOtsortirovannii massiv: " << endl; for (i = 0; i < N; i++) cout << a[i] << " "; cout << "\n"; cout << "\nKolichestvo sravnenii: " << compare_count <<endl; k=rand()%100; cout<< endl << "Sluchainoe chislo - k: " << k <<endl; //k - случайное число cout<< endl; i=0; while ((a[i]<k) && (i<N)) //ищем место, куда поставить случайное число i++; for (j=N; j>i; j--) //сдвигаем все элементы массива на 1 в конец, чтобы вставить случайный элемент a[j]=a[j-1]; a[i]=k; //вставляем на найденное место случайный элемент cout << "Konechnii massiv: " << endl; for (i = 0; i < N+1; i++) cout << a[i] << " "; cout << endl; t2 = GetTickCount(); d_time = t2 - t1; cout<<"\nVremia raboti: "<<d_time<<" milisek\n"; delete [] a; system("pause"); return 0; } #include <iostream> #include <cstdlib> #include<windows.h> using namespace std; int compare_count = 0; int compare(const void* a, const void *b) { ++compare_count; return (*(int*)a - *(int*)b); } int main () { DWORD t1, t2, d_time; srand (time(NULL)); int i, N, j, k; //Задаем количество элементов cout<<endl<<"Dlina massiva - N: "; //N - длина одномерного массива cin>>N; cout<<"\n"; if(N > 0) { //Резервируем место на диске под количество элементов int *a = new int[N+1];// резервируем память под массив на 1 элемент больше int size = N; cout << "Vremennii massiv: " << endl; for(i=0; i<N; i++) { a[i]=rand()%100; cout<<a[i]<<" "; } cout<<"\n"; t1 = GetTickCount(); qsort(a, size, sizeof(int), compare); cout << "\nOtsortirovannii massiv: " << endl; for (i = 0; i < N; i++) cout << a[i] << " "; cout << "\n"; cout << "\nKolichestvo sravnenii: " << compare_count <<endl; k=rand()%100; cout<< endl << "Sluchainoe chislo - k: " << k <<endl; //k - случайное число cout<< endl; i=0; while ((a[i]<k) && (i<N)) //ищем место, куда поставить случайное число i++; for (j=N; j>i; j--) //сдвигаем все элементы массива на 1 в конец, чтобы вставить случайный элемент a[j]=a[j-1]; a[i]=k; //вставляем на найденное место случайный элемент cout << "Konechnii massiv: " << endl; for (i = 0; i < N+1; i++) cout << a[i] << " "; cout << endl; t2 = GetTickCount(); d_time = t2 - t1; cout<<"\nVremia raboti: "<<d_time<<" milisek\n"; delete [] a; } else cout<<"Chislo elementov ne mozhet byt <=0" << endl; system("pause"); return 0; } #include <iostream> #include<time.h> #include<windows.h> using namespace std; int main () { DWORD t1, t2, d_time; srand (time(NULL)); int i, N, j, k; //Задаем количество элементов cout<<endl<<"Dlina massiva - N: "; //N - длина одномерного массива cin>>N; cout<<"\n"; if(N > 0) { //Резервируем место на диске под количество элементов int *a = new int[N+1];// резервируем память под массив на 1 элемент больше cout << "Vremennii massiv: " << endl; for(i=0; i<N; i++) { a[i]=rand()%100; cout<<a[i]<<" "; } cout<<"\n"; cout<< endl; t1 = GetTickCount(); int count=0; for (i = 0; i < N - 1; i++) { for(j = N-1; j>i; j--) if (a[j-1] > a[j]) { swap(a[j], a[j-1]); count++; } } cout << "Otsortirovannii massiv: " << endl; for (i = 0; i < N; i++) cout << a[i] << " "; cout<< endl; cout<<"\nKolichestvo perestanovok: "<<count; cout<< endl; k=rand()%100; cout<< endl << "Sluchainoe chislo - k: " << k <<endl; //k - случайное число cout<< endl; i=0; while ((a[i]<k) && (i<N)) //ищем место, куда поставить случайное число i++; for (j=N; j>i; j--) //сдвигаем все элементы массива на 1 в конец, чтобы вставить случайный элемент a[j]=a[j-1]; a[i]=k; //вставляем на найденное место случайный элемент cout << "Konechnii massiv: " << endl; for (i = 0; i < N+1; i++) cout << a[i] << " "; cout <<"\n"; t2 = GetTickCount(); d_time = t2 - t1; cout<<"\nVremia raboti: "<<d_time<<" milisek\n"; delete [] a; } else cout<<"Chislo elementov ne mozhet byt <=0" << endl; system("pause"); return 0; } P.S. Если у кого есть еще какие варианты решения данной задачи пишите. Всем спасибо за помощь в решении задачи. |
Отправлено: 12:21, 25-05-2011 | #10 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
|