Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2010, 00:22   #1
FILLIPO
 
Регистрация: 03.09.2010
Сообщений: 3
По умолчанию qsort - Segmentation fault и другие непонятки

Здравствуйте, прошу помощи. Темы по quicksort на форуме не просветили.
Мой компилятор GNU cpp-4.4
Мой главный вопрос: как в функцию передается массив?
Страуструп не помог:
Код:
(Если в качестве параметра функции указан массив, то передается указатель на его первый элемент.
Например:
int strlen(const char*);
void f()
{
char v[] = "массив";
strlen(v);
strlen("Николай");
}
Это означает, что фактический параметр типа T[] преобразуется к типу T*, и затем передается)
Моя реализация quicksort выдает ошибку "Segmentation fault":
Код:
#include <iostream>
using namespace std;

int qsort(long line[], long left, long right){
	if (left >= right){return 0;}
	long left_const = left;
	long right_const = right;
	long sample = line[(left + right) / 2];
	while (left <= right){
		while (line[left] < sample){left++;}
		while (line[right] > sample){right--;}
		if (left <= right){
			long temp = line[left];
			line[left] = line[right];
			line[right] = temp;
		}
	qsort(line, left_const, right);
	qsort(line, left, right_const);
	}
}

int main(){
	long N = 0; cin >> N; long i = 0;
	long array[N];
	while (i < N){cin >> array[i]; i++;}
	qsort(array, 0, N - 1);
	i = 0;
	while (i < N){cout << array[i];}
	cout << endl;
	return 0;
}
Параллельный вопрос: в какой библиотеке искать функцию типа random.randint(start, stop), а то всегда делить пополам плачевно (мне показалось, что в Страуструпе нет)

Факультативные вопросы:
1)какой смысл несет строка
using namespace std;
и почему без нее ничего не работает?
2) почему в некоторых учебниках в примерах подключается библиотека <iostream.h>, а в остальных <iostream>, причем первый вариант у меня не работает?

надеюсь, что выразился внятно, заранее спасибо.
FILLIPO вне форума Ответить с цитированием
Старый 04.09.2010, 12:29   #2
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

Код:
long N = 0; cin >> N; long i = 0;
long array[N];
А тут ошибки не возникает ?

Мой вариант
Код:
#include <iostream>
using namespace std;

void swap(long v[], int i, int j)
{
    long tmp=v[i];  v[i]=v[j]; v[j]=tmp;
}
/* qsort: сортирует v[left]...v[right] по возрастанию */
void qsort(long v[], int left, int right)
{
    int i, last;
    if (left >= right)     /* ничего не делается, если */
        return;            /* в массиве менее двух элементов */
    swap(v, left, (left + right)/2);   /* делящий элемент */
    last = left;                       /* переносится в v[0] */
    for(i = left+1; i <= right; i++)   /* деление на части */
        if (v[i] < v[left])
            swap(v, ++last, i);
    swap(v, left, last);   /* перезапоминаем делящий элемент */
    qsort(v, left, last-1);
    qsort(v, last+1, right);
}

int main(){
	long N = 0; cin >> N; int i = 0;
	long* array=new long[N];
	while (i < N) 
		cin >> array[i++];
	qsort(array, 0, 9);
	i = 0;
	while (i < N)
		cout << array[i++] << " ";
	cout << endl;
	delete[] array;
	return 0;
}

Последний раз редактировалось blob; 04.09.2010 в 12:31. Причина: кодировка коментария
blob вне форума Ответить с цитированием
Старый 04.09.2010, 18:24   #3
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Код:
using namespace std;
Директива using - подключает пространство имен std, без этой строки вы не можете напрямую использовать члены этого пространства имен. Считается плохим стилем так как возрастает возможность конфликта имен с библиотечными - лучше подключать по одному члену объявлениями using using std::cout; using std::cin, и т. д. Без таких подключений члены надо квалифицировать:
Код:
#include <iostream>
 
int main()
{
      std::cout<<std::endl;
      // ...
}
#include <iostream> или #include <iostream.h> зависит от компилятора - iostream.h - более старая версия. Аналогично cstring, string, string.h и т. д.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 04.09.2010, 23:49   #4
FILLIPO
 
Регистрация: 03.09.2010
Сообщений: 3
По умолчанию

Syuf, спасибо.

blob, Ваш код работает. Растолкуйте пожалуйста конструкцию

Код:
long* array=new long[N];
это и есть "создание указателя на первый элемент массива"?

все остальное, благодаря комментариям, отлично понятно, спасибо.

По-прежнему интересно, где взять функцию random.

P.S.
Код:
qsort(array, 0, 9);
стоит заменить на
Код:
qsort(array, 0, N);
FILLIPO вне форума Ответить с цитированием
Старый 04.09.2010, 23:57   #5
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

Цитата:
blob, Ваш код работает. Растолкуйте пожалуйста конструкцию
Код:
long* array=new long[N];
это динамический массив с неопределённым размером. Конструкции типа long array[N] недопустимы, если N - переменная
Выше указанная конструкция выделяет кусок памяти для размещения в кучи N элементов. Array, как вы справедливо заметили, указывает на первый элемент.
Цитата:
P.S.
Код:
qsort(array, 0, 9);
стоит заменить на
Код:
qsort(array, 0, N);
Пардон... это я Ваш код для 10 объектов пробовал... пропустил одну сроку при замене на N
blob вне форума Ответить с цитированием
Старый 05.09.2010, 00:02   #6
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

msdn
Код:
// crt_rand.c
/* This program seeds the random-number generator
 * with the time, then displays 10 random integers.
 */

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main( void )
{
   int i;

   /* Seed the random-number generator with current time so that
    * the numbers will be different every time we run.
    */
   srand( (unsigned)time( NULL ) );

   /* Display 10 numbers. */
   for( i = 0;   i < 10;i++ )
      printf( "  %6d\n", rand() );
}
blob вне форума Ответить с цитированием
Старый 05.09.2010, 10:57   #7
FILLIPO
 
Регистрация: 03.09.2010
Сообщений: 3
По умолчанию

blob, большое спасибо. последний код даже почти понял. дочитаю Страуструпа - пойму совсем
FILLIPO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
qsort Jauhen Общие вопросы C/C++ 5 26.05.2010 01:15
Vector, Pair и segmentation fault certman Общие вопросы C/C++ 3 25.03.2010 00:24
QT4 segmentation fault jojahti Qt и кроссплатформенное программирование С/С++ 6 06.01.2010 09:57
GCL и segmentation fault. jojahti Свободное общение 0 14.09.2009 19:20
Program received signal SIGSEGV, Segmentation fault. ciaonataha Общие вопросы C/C++ 53 24.04.2009 14:06