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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод фамилий в алфавитном порядке 
V
    Опции темы
ioManip
Дата 16.2.2014, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Привет! smile Вообщем не выводит D Не пойму, что не так!

Алгоритм:
Код

void PatientInfo::DisplayHosPatient(string _surnam, int _count)
{
    int i, j;
    char temp;
   
    if (infoHos == "Да" || infoHos == "да")
    {
       for (i = 0; i < _count; i++)
       {
         for (j = i + 1; j < _count; j++);
         {
             int a = int(_surnam[j]);
             int b = int(_surnam[j+1]);
             
             if (a > b)
             {
                 temp = _surnam[j];
                 _surnam[j] = _surnam[j+1];                    
                 _surnam[j+1] = temp;
             } 
         }
       }
    }  
    
    for (i = 0; i < _count; i++)
    {
        cout << _surnam[i];
    }
}


Применение:
Код

 for (int i = 0; i < count; i++)
            {
               cout << endl;
               patients[i]->DisplayHosPatient(surname, count);
            }

--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
rudolfninja
Дата 16.2.2014, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А почему бы не использовать strcmp для сравнения, а не приводить все к int?
PM MAIL Skype   Вверх
feodorv
Дата 17.2.2014, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(ioManip @  16.2.2014,  08:22 Найти цитируемый пост)
Не пойму, что не так!

Алгоритм не так.
Цитата(ioManip @  16.2.2014,  08:22 Найти цитируемый пост)
       for (i = 0; i < _count; i++)
       {
         for (j = i + 1; j < _count; j++);

Посмотрите, пожалуйста, внимательно диапазон изменения переменных этих двух циклов. И не допускайте малейшей возможности выхода за пределы массива.



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ioManip
Дата 17.2.2014, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



feodorv
rudolfninja, Попробыл! Исправил! Но все равно не получается. Даже, елс ивот так делать
Код


    std::set<std::string> set;

    set.insert(_surnam);

    std::copy(set.begin(), set.end(), std::ostream_iterator<std::string>(std::cout, "\n"));



Дело в том, что мне кажется я не правильно данные передаю, потому что при выводе всегда последняя введенная фамилия выводится. Вообщем вот:(если кратко, то)

Заполнение фамилий
Код

 PatientInfo **patients = new PatientInfo *[count];
    
    for(int i = 0; i < count; i++)
    {
        cout << "#" << i << endl;
        
        cout << "Фамилия: ";
        cin >> surname;
        
        patients[i] = new PatientInfo(surname);


Сортировка
Код

void PatientInfo::DisplayHosPatient(string _surnam)
{
    std::set<std::string> set;

    set.insert(_surnam);

    std::copy(set.begin(), set.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}





Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  PatientInfo.zip 120,44 Kb
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
xvr
Дата 17.2.2014, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Вы вместо того, что бы сортировать пациентов в массиве patients (по их полю _surnam), сортуруете само поле _surnam (строку в нем), причем неправильно, т.к. для определения размера используется не строка (которую вы пытаетесь сортировать), а количество пациентов, которое никакого отношения к строке не имеет.

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


Бывалый
*


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

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



Ага, т.е. Мне нужно массив патиентс передавать. Так,а как это сделать, ведь там получается массив объектов, как передать именно поле с фамилией?
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
ioManip
Дата 18.2.2014, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вообщем думал, думал...и пришел к этому.

Сортировка:
Код

void PatientInfo::DisplayHosPatient(string **_patients, int _count)
{
    int i, j;
    char temp;
   
    if (infoHos == "Да" || infoHos == "да")
    {
       for (i = 0; i < _count - 1; i++)
       {
         for (j = 0; j < _count - i; j++);
         {
             if (_patients[j] > _patients[j+1])
             {
                 temp = _patients[j];
                 _patients[j] = _patients[j+1];                    
                 _patients[j+1] = temp;
             } 
         }
       }
    }  
    
    for (i = 0; i < _count; i++)
    {
        cout << _patients[i];
    }
}


Передача в метод:
Код

for (int i = 0; i < count; i++)
{
       cout << endl;
       patients[i]->DisplayHosPatient(patients[i]->getSurname(), count);
}


Но в сортировке, есть ошибка, компилятор ругается на переменную temp типа char. Я думаю она должна быть типа PatientInfo, но не представляю как это сделать.

Вот мои мысли smile


Это сообщение отредактировал(а) ioManip - 18.2.2014, 02:11

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  PatientInfo.zip 120,13 Kb
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
feodorv
Дата 18.2.2014, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(ioManip @  18.2.2014,  03:11 Найти цитируемый пост)
             if (_patients[j] > _patients[j+1])

Как-то Вы хитро хотите строки сравнивать. Ведь тип у _patients - аж string **!!!


Цитата(ioManip @  18.2.2014,  03:11 Найти цитируемый пост)
Вот мои мысли

Вот Ваши мысли: 
Цитата(ioManip @  17.2.2014,  16:09 Найти цитируемый пост)
Мне нужно массив патиентс передавать.

Так чего же Вы делаете-то?
Цитата(ioManip @  18.2.2014,  03:11 Найти цитируемый пост)
       patients[i]->DisplayHosPatient(patients[i]->getSurname(), count);

Что Вы здесь сортируете? Ну разве так трудно написать 
Код

void PatientSort( PatientInfo **patients, int count)
{
  ...
    if( patients[j]->getSurname() > patients[j+1]->getSurname() ) 
      /* swap */;
}

Только при этом getSurname() должен возвращать ссылку на string, а не неизвестно что...

Это сообщение отредактировал(а) feodorv - 18.2.2014, 05:56


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ioManip
Дата 18.2.2014, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Не получается! Ничего не происходит!  smile 

Вот get - метод:
Код

string PatientInfo::getSurname()
{
    return surname;
}


Вот переписал сортировку:
Код

for (i = 0; i < _count - 1; i++)
         for (j = 0; j < _count - i; j++);
             if (_patients[j]->getSurname() > _patients[j+1]->getSurname())
             {
                 temp = _patients[j]->getSurname();
                 _patients[j]->getSurname() = _patients[j+1]->getSurname();                    
                 _patients[j+1]->getSurname() = temp;
             } 

--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
xvr
Дата 18.2.2014, 13:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(ioManip @  18.2.2014,  10:10 Найти цитируемый пост)
Вот переписал сортировку:

Вы пытаетесь менять имена у пациентов, а надо самих пациентов (строки 5-7)


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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(ioManip @  18.2.2014,  11:10 Найти цитируемый пост)
string PatientInfo::getSurname()

Как минимум:
Код

string& ....

А то Вы каждый раз создаёте по новому экземпляру класса string.


Цитата(xvr @  18.2.2014,  14:34 Найти цитируемый пост)
Вы пытаетесь менять имена у пациентов, а надо самих пациентов (строки 5-7)

Да, swap нужен для указателей на пациентов, а не для их имён...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ioManip
Дата 22.2.2014, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Оно?
Код

void PatientInfo::DisplayHosPatient(PatientInfo **_patients, int _count)
{
    int i, j;
    PatientInfo *temp;
   
    if (infoHos == "Да" || infoHos == "да")
    {
       for (i = 0; i < _count - 1; i++)
         for (j = 0; j < _count - i; j++);
             if (_patients[j]->getSurname() > _patients[j+1]->getSurname())
             {
                 temp = _patients[j];
                 _patients[j] = _patients[j+1];
                 _patients[j+1] = temp;
             }
    }  
    
    for (i = 0; i < _count; i++)
    {
        cout << _patients[i] << endl;
    }
}


Только так, тоже не выходит 
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
xvr
Дата 22.2.2014, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(ioManip @  22.2.2014,  06:53 Найти цитируемый пост)
Только так, тоже не выходит  

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

PM MAIL   Вверх
feodorv
Дата 22.2.2014, 16:01 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(ioManip @  22.2.2014,  07:53 Найти цитируемый пост)
       for (j = 0; j < _count - i; j++);

Точка с запятой здесь зачем???

Цитата(xvr @  22.2.2014,  12:52 Найти цитируемый пост)
Покажите код целиком

Присоединяюсь)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
xvr
Дата 22.2.2014, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(feodorv @  22.2.2014,  16:01 Найти цитируемый пост)
Точка с запятой здесь зачем???

О! Точно! А слона то я и не заметил. Так явно работать не будет  smile 

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

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

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

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

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


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

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


 




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


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

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