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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка указателей в ДМУ, Что не так в сортировке? 
V
    Опции темы
bgalexs
Дата 14.6.2010, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток!Есть некоторый массив который передаем в функцию.Основная суть функции динамически построить массив указателей на переменные в этом массиве,и отсортировать указатели без перемещения указуемых переменных.
Функцию по созданию ДМУ я сделал,заполнил указатели адресами переменных,а вот как отсортировать неясно,потому что при сравнении значений адреса указателей остаются теже, а значения сортируются
Код

double **function(int count,double arr[]){
  double **pp, *p;
  int n,k,i;
  pp = new double *[count]; //Создаем массив указателей.
  for (i=0;i<count;i++){
    p = new double; //Создаем указатель на переменную.
    p = &arr[i]; //Записываем в указатель адрес i-го элемента массива вещественных чисел.
    pp[i] = p; //Добавляем в массив указателей указатель на переменую.
  }
  pp[i] = NULL;//Вводим пустой указатель.
  do{
    for (k=0,n=0;pp[n+1]!=NULL;n++)
      if (*pp[n] > *pp[n+1]){
        double *c; 
        c = pp[n];pp[n] = pp[n+1];pp[n+1] = c; k = 1;
      }
  } 
  while (k);
  return pp;
}


Помогите разобраться, что не так, и зачем реализовывать сортировку если память выделена определенного размера,и указатели там идут по порядку?
PM MAIL WWW ICQ   Вверх
mes
Дата 14.6.2010, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(bgalexs @  14.6.2010,  15:14 Найти цитируемый пост)
   p = new double; //Создаем указатель на переменную.
    p = &arr[i]; //Записываем в указатель адрес i-го элемента массива вещественных чисел.
    pp[i] = p; //Добавляем в массив указателей указатель на переменую.


Код

  pp[i] = &arr[i]; 


Цитата(bgalexs @  14.6.2010,  15:14 Найти цитируемый пост)
  pp[i] = NULL;

тогда
Код

 new ..[count+1]; // +1 для NULL

и лучше вместо i использовать count
Код

pp[count] = NULL;


Цитата(bgalexs @  14.6.2010,  15:14 Найти цитируемый пост)
    for (k=0,n=0;pp[n+1]!=NULL;n++)

лучше начинать с первого элемента, и сравнивать с предыдущим..
и вначале сделать проверку, что массив не пустой..
и если есть count , то зачем NULL ?!

Цитата(bgalexs @  14.6.2010,  15:14 Найти цитируемый пост)
  c = pp[n];pp[n] = pp[n+1];pp[n+1] = c;

добавьте функцию swap для наглядности, по обмену значениями...



Цитата(bgalexs @  14.6.2010,  15:14 Найти цитируемый пост)
k = 1;
      }
  } 
  while (k);

это не сортировка.. для нее нужна двухмерный цикл, у вас же верхний цикл работает в качестве "if"..
в гугле полно исходников разных алгоритмов сортировки..





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


Новичок



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

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



Спасибо, за рассмотрение, часть кода где использовал NULL подправил,в голову почему то не пришло использовать тот же count. 
А вот по поводу сортировки не совсем понял,как можно отсортировать указатели так чтобы не перемещались переменные? если каждый указатель в массиве содержит адрес определенной переменной...
не понимаю smile  

PM MAIL WWW ICQ   Вверх
mes
Дата 14.6.2010, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(bgalexs @  14.6.2010,  19:09 Найти цитируемый пост)
если каждый указатель в массиве содержит адрес определенной переменной...

ну так сравниваете по значению, а местами меняете хранимые адреса ..
smile



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


Новичок



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

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



вроде написал получилось нечто
Код

void swap(double **p, double **q){// поменять местами
  double **t = p;
  p = q;
  q = t;
}

double **function(int count,double arr[]){
  double **pp, *p;
  int i;
  pp = new double *[count]; //Создаем массив указателей.
  for (i=0;i<count;i++){
    p = new double; //Создаем указатель на переменную.
    p = &arr[i]; //Записываем в указатель адрес i-го элемента массива вещественных чисел.
    pp[i] = p; //Добавляем в массив указателей указатель на переменую.
  }
   for(int k=0; k < count-1;k++){
     for (int s = k; s != 0 && *pp[s] < *pp[s+1]; s++){
       swap(&pp[s],&pp[s+1]);
     }
   }
  return pp;
}

правда нет уверенности что все работает правильно, потому как результат до сортировки такой же как и после  smile 
если вставить между циклами создания массива и сортировки 
Код

printf("%d - %d - %.3f - %d\n",i,pp[i],*pp[i],&pp[i]);

PM MAIL WWW ICQ   Вверх
mes
Дата 15.6.2010, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(bgalexs @  15.6.2010,  17:53 Найти цитируемый пост)
правда нет уверенности что все работает правильно, п

перечитайте замечания к предыдущему коду.. Вы их не все исправили..



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


Новичок



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

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



перечитал,честно не вижу....тыкните на что имено обратить внимание?

Добавлено через 2 минуты и 17 секунд
и еще немного не понял  
Цитата

лучше начинать с первого элемента, и сравнивать с предыдущим..
и вначале сделать проверку, что массив не пустой..

почему с первого?
PM MAIL WWW ICQ   Вверх
mes
Дата 16.6.2010, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(bgalexs @  15.6.2010,  18:19 Найти цитируемый пост)
перечитал,честно не вижу....тыкните на что имено обратить внимание?


Цитата(bgalexs @  15.6.2010,  17:53 Найти цитируемый пост)
  p = new double; //Создаем указатель на переменную.
    p = &arr[i]; //Записываем в указатель адрес i-го элемента массива вещественных чисел.
    pp[i] = p; //Добавляем в массив указателей указатель на переменую.


new лишнее..

Цитата(bgalexs @  15.6.2010,  17:53 Найти цитируемый пост)
for (int s = k; s != 0 && *pp[s] < *pp[s+1]; s++){

если s!=0 может тогда --s ?  smile 
но условие в любом случае неверное, так как нулевой элемент сравниваться не будет.
(напрягаться сейчас неохота, так как в гугле и без этого полно примеров просты сортировок)

Цитата(bgalexs @  15.6.2010,  18:19 Найти цитируемый пост)
почему с первого? 

потому что при проверке_на_конец не нужно будет прибавлять единичку..


Цитата(bgalexs @  15.6.2010,  17:53 Найти цитируемый пост)
void swap(double **p, double **q){// поменять местами
double **t = p;

подумайте тут о том, что Вы должны поменять на самом деле..

и еще разбейте свою функцию на две, одна для заполнения массива указателей, другая для сортировки..



Это сообщение отредактировал(а) mes - 16.6.2010, 00:08


--------------------
PM MAIL WWW   Вверх
bgalexs
Дата 29.6.2010, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Получилось вот так, в итоге понял что менять...
Код

/* */
#include <stdio.h>
#include <conio.h>

void swap(double **p, double **q){// поменять местами указатели
  double *t = *p;
  *p = *q;
  *q = t;
}

double **function(int count,double arr[]){
  double **pp, *p;
  int i;
  pp = new double *[count]; //Создаем массив указателей.
  for (i=0;i<count;i++){
    p = &arr[i]; //Записываем в указатель адрес i-го элемента массива вещественных чисел.
    pp[i] = p; //Добавляем в массив указателей указатель на переменую.
  }
   for(int k=0; k < count;k++){
     for (int s = k; s !=0 && *pp[s] < *pp[s-1]; s--){ 
       swap(&pp[s],&pp[s-1]);
     }
   }
  return pp;
}

void main(){
    int count = 20;
    double A[20] = {1.12,12.52,0.3,10.44,3.42,2.21,5.23,4.41,8.09,6.4,7.7,9.12,45.32,12.89,14.3,34.09,17.2,15.6,19.4,14.65};
    double **F;
    F = function(count,A);
    for(int i=0;i<count;i++) printf("%d - %0.3f - %d - %0.3f - %d\n",i,*F[i],F[i],A[i],&A[i]);
    getch();
}


PM MAIL WWW ICQ   Вверх
mes
Дата 29.6.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(bgalexs @  29.6.2010,  07:26 Найти цитируемый пост)
Получилось вот так, в итоге понял что менять...


не плохо было бы еще избавиться от абсолютно лишней переменной p и отделить сортировку от создания..
smile


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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