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

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

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2009, 19:00   #1
NiggasLife
 
Регистрация: 02.06.2009
Сообщений: 5
Вопрос Траблы с выводом в консоль

Имеется код, который сортирует массив слиянием. Беда заключается в том, что после вызова функции sort() не выводится ничего в консоль - ни puts, ни printf. К тому же внутри этих функций (sliv и sort) тоже не выводится ничего (только если printf/puts стоит в начале sort). IDE - Eclipse

Вот код:

Код:
#include <stdio.h> 
#include <stdlib.h> 

#define n 10 

int a[n],b[n]; 

void sliv(int p,int q); 

void sort(int p,int q); 

int main() { 
int i; 

for(i=0;i<n;i++) { a[i]=rand()%20; printf("%i ",a[i]); } 

sort(1,n); 

return 0; 

exit(0); 
} 

void sliv(int p,int q) { 
int k,r,i,j; 

r=(p+q)%2; 
i=p; 
j=r+1; 

for(k=p;k<q;k++) { 
if(i<=r && (j>q || a[i]<a[j]) ) { 
b[k]=a[i]; 
i++; 
} 
else { 
b[k]=a[j]; 
j++; 
} 
} 

for(k=p;k<q;k++) a[k]=b[k]; 

exit(0); 
} 

void sort(int p,int q) { 
if(p<q) { 
sort(p,(p+q)%2); 
sort((p+q)%2+1,q); 
sliv(p,q); 
} 

exit(0); 
}

Очень надеюсь на помощь!

Модератор: тег CODE

Последний раз редактировалось Sazary; 02.06.2009 в 19:08.
NiggasLife вне форума Ответить с цитированием
Старый 02.06.2009, 19:28   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Почему здесь:
Код:
r=(p+q)%2;
и здесь:
Код:
sort(p,(p+q)%2); 
sort((p+q)%2+1,q);
Берете остаток от деления? Должно быть '/'
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 02.06.2009, 20:28   #3
NiggasLife
 
Регистрация: 02.06.2009
Сообщений: 5
По умолчанию

Сложно сказать. Переводил с Паскаля, посчитал mod 2 как %2
NiggasLife вне форума Ответить с цитированием
Старый 02.06.2009, 20:35   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от NiggasLife
Переводил с Паскаля, посчитал mod 2 как %2
Да, mod - это %. Но я смотрел на сам алгоритм:
http://algolist.manual.ru/sort/merge_sort.php
Нужно передавать середину. То есть делить, а не брать остаток.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 02.06.2009, 21:03   #5
NiggasLife
 
Регистрация: 02.06.2009
Сообщений: 5
По умолчанию

Ага. Неувязочка

Теперь все работает, только неправильно как-то. Но с этим, думаю, разберусь

Последний раз редактировалось Sazary; 02.06.2009 в 21:07.
NiggasLife вне форума Ответить с цитированием
Старый 02.06.2009, 23:58   #6
NiggasLife
 
Регистрация: 02.06.2009
Сообщений: 5
По умолчанию

Взял другой исходник, подшаманил, теперь все как надо. Может, кому пригодится:

Код:
#include<stdio.h>
#include<stdlib.h>

#define n 20

int merge(int *, int , int , int);
int mergeSort (int *, int , int);

int main() {
	int *a;
	int i;

	a = ( int* ) malloc ( n*sizeof(int) );

	for ( i = 0; i < n; i++ )
	{
		*(a+i)=rand()%100;
			printf( "%i ", *(a+i) );
	}

	printf("\n");
	printf( "\nAfter sorting\n" );

	printf("\n");

	*a=mergeSort(a, 0, n-1);

	for ( i = 0; i < n; i++ )
	{
		printf( "%i ", *(a+i) );
	}

	free(a);

	return 0;
}


int merge (int *arr, int a, int split, int b)
{


  int pos1 = a;
  int pos2 = split + 1;
  int pos3 = 0;

  int *temp;
  temp = (int*) malloc ( ( b-a+1 ) *sizeof(int) );

  while (pos1 <= split && pos2 <= b)
 {
	 if ( *(arr + pos1) < *(arr + pos2) )
	 {
		  *( temp+pos3 ) = *( arr+pos1 );
		  pos3++;
		  pos1++;
	 }

	 else
	 {
		*( temp+pos3 ) = *( arr+pos2 );
		pos3++;
		pos2++;
	 }
 }

  while ( pos2 <= b )
  {
		*( temp+pos3 ) = *( arr+pos2 );
		pos3++;
		pos2++;

  }

  while ( pos1 <= split )
  {
		*( temp+pos3 ) = *( arr+pos1 );
		pos3++;
		pos1++;
  }

  for ( pos3 = 0; pos3 < b-a+1; pos3++ ) *( arr + a + pos3) = *( temp + pos3 );

free(temp);

return *arr;

}//////////////////////////////////////////// merge

int mergeSort(int *arr, int a, int b)
{
  int split;

  if (a < b)
  {

	 split = (a + b)/2;

	mergeSort (arr, a, split);
	mergeSort (arr, split+1, b);
	merge (arr, a, split, b);

  }

return *arr;

}
PS> for searchbots: сортировка слиянием в `Linux C`

Последний раз редактировалось Sazary; 03.06.2009 в 00:05.
NiggasLife вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Траблы с доступом к Cookies php_coder PHP 5 04.11.2009 12:02
Траблы с richedit Stanislav Общие вопросы Delphi 6 23.01.2009 00:25
Траблы с tRadioButton-ами Altera Компоненты Delphi 2 19.12.2008 08:50
Траблы с переносом сайта Diman2008 HTML и CSS 4 18.10.2008 21:36
Траблы с инетом Romanus Свободное общение 2 09.08.2007 11:25