Модераторы: 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   Вверх
akizelokro
Дата 23.2.2014, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



А кто вообще такие переменные в функцию передаёт?
И кто вообще такие комментарии пишет?

Плюнь на этих кадров,
cсделай эту перестановку жёстче, и всё пройдёт


Это сообщение отредактировал(а) akizelokro - 23.2.2014, 00:18


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ioManip
Дата 23.2.2014, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Убрал точку с запятой, но все равно нет....  smile 

main.cpp

Код

#include <string>
#include <iostream>
#include "PatientInfo.h"

using namespace std;

int Menu()
{
    int choise = 0;
    
    cout << "(1) Список госпитализированных пациентов" << endl;
    cout << "(2) Список негоспитализированных пациентов" << endl;
    cout << "(3) Список госпитализированных детей" << endl;
    cout << "(4) Выход" << endl;
    cout << endl;
    cout << "-> ";
    
    cin >> choise;
    
    return choise;
}

int askCount()
{
    int count;
    
    for(;;)
    {
        cout << "Введите количество пациентов: ";
        cin >> count;
        
        if(cin.fail())
        {
            cout << "Это должно быть число" << endl;
            cin.clear();
            string invalid;
            cin >> invalid;
            continue;
        }
        
        if(count <= 0)
        {
            cout << "Пациентов должно быть > 0" << endl;
            continue;
        }
        
        return count;
    }
}

int main()
{
    string surname;
    string gender;
    string homeAdress;
    string diagnosis;
    string infoHos;
    string question;
    unsigned int yearBirth;
    //int i = 0;
    
    int fQuit = false;
    int count = askCount();
    
    cout << "\033c";
        
    PatientInfo **patients = new PatientInfo *[count];
    
    for(int i = 0; i < count; i++)
    {
        cout << "#" << i << endl;
        
        cout << "Фамилия: ";
        cin >> surname;
        
        cout << "Пациент является ребенком?[Да/Нет]: ";
        cin >> question;
        
        cout << "Пол: ";
        cin >> gender;
        
        cout << "Домашний адрес: ";
        cin >> homeAdress;
        
        cout << "Диагноз: ";
        cin >> diagnosis;
        
        cout << "Год рождения: ";
        cin >> yearBirth;
        
        cout << "Пациент Госпитализирован?[Да/Нет]: ";
        cin >> infoHos;

        cout << endl;
        
        patients[i] = new PatientInfo(surname);
        
        patients[i]->setQuestion(question);
        patients[i]->setGender(gender);
        patients[i]->setHomeAdress(homeAdress);
        patients[i]->setDiagnosis(diagnosis);
        patients[i]->setInfoHos(infoHos);
    }
    
    int choise = Menu();
    
    if (choise < 1 || choise > 4)
    {
        cout << "Выбран не верный пункт меню, поробуйте заново";
        cout << endl << endl;
        cout << "\033c";
       // continue;
    }
    
    switch (choise)
    {
        case 1:
        {
            cout << "Список госпитализированных пациентов: " << endl;
            cout << "======================================";
            for(int i = 0; i < count; i++)
            patients[i]->DisplayHosPatient(patients, count);
            cout << "======================================" << endl;   
        }
        break;
        
        case 2:
        {
            cout << "Список негоспитализированных пациентов: " << endl;
            cout << "======================================";
            for (int i = 0; i < count; i++)
            {
                patients[i]->DispalyNotHosPatient();
            }
            cout << "======================================" << endl; 
        }
        break;
        
        case 3:
        {
            cout << "Список госпитализированных детей: " << endl;
            cout << "======================================";
            for (int i = 0; i < count; i++)
            {
                patients[i]->DisplayHosChildren();
            }
            cout << "======================================" << endl;
        }
        break;
        
        case 4:
        {
            fQuit = true;
            cout << "Выход из программы, пожалуйста подождите..." << endl << endl;
            break;
        }
    }
    
    for(int i = 0; i < count; i++)
    {
        delete patients[i];
    }
    delete [] patients;
    
    return 0;
}

PatientInfo.cpp
Код

#include <iostream>
#include <cstring>
#include <stdlib.h>  
#include "PatientInfo.h"

using namespace std;

PatientInfo::PatientInfo(string _surname)
{
    surname = _surname;
}

void PatientInfo::setGender(string _gender)
{
    gender = _gender;
}

void PatientInfo::setYearBirth(unsigned int _yearBirth)
{
    yearBirth = _yearBirth;
}

void PatientInfo::setHomeAdress(string _homeAdress)
{
    homeAdress = _homeAdress;
}

void PatientInfo::setDiagnosis(string _diagnosis)
{
    diagnosis = _diagnosis;
}

void PatientInfo::setInfoHos(string _infoHos)
{
    infoHos = _infoHos;
}

void PatientInfo::setQuestion(string _question)
{
    question = _question;
}

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

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;
    }
}

void PatientInfo::DispalyNotHosPatient()
{
    if (infoHos == "Нет" || infoHos == "нет")
    {
        cout << endl;
        cout << "Пациент: " << surname << endl;
        cout << "Домашний адрес: " << homeAdress << endl;
    }
}

void PatientInfo::DisplayHosChildren()
{
    if (question == "Да" || question == "да")
    {
        cout << endl;
        cout << "Фамилия: " << surname << endl;
        cout << "Диагноз: " << diagnosis << endl;
    }
}


PatientInfo.h
Код

#ifndef PATIENTINFO_H
#define    PATIENTINFO_H

#include <cstring>

using std::string;

class PatientInfo
{
public:
    PatientInfo(string _surname);
    ~PatientInfo() {};
    
    void setGender(string _gender);
    void setYearBirth(unsigned int _yearBirth);
    void setHomeAdress(string _homeAdress);
    void setDiagnosis(string _diagnosis);
    void setInfoHos(string _infoHos);
    void setQuestion(string _question);
    
    string &getSurname();
       
    void DisplayHosPatient(PatientInfo **_patients, int _count);
    void DisplayHosChildren();
    void DispalyNotHosPatient();
    
private:
    string surname;
    string gender;
    string homeAdress;
    string diagnosis;
    string infoHos;
    string question;
    unsigned int yearBirth;
};

#endif    /* PATIENTINFO_H */


Это сообщение отредактировал(а) ioManip - 23.2.2014, 05:37
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
feodorv
Дата 23.2.2014, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ioManip @  23.2.2014,  06:35 Найти цитируемый пост)
            for(int i = 0; i < count; i++)
            patients[i]->DisplayHosPatient(patients, count);

Зачем в DisplayHosPatient вставлена сортировка клиентов? А ведь в DispalyNotHosPatient() этой сортировки нет. 
Зачем сортировать весь список при печати одного клиента? Зачем для сортировки там проверка на 
Цитата(ioManip @  23.2.2014,  06:35 Найти цитируемый пост)
    if (infoHos == "Да" || infoHos == "да")

У Вас ведь задача какая:
  • ввести список клиентов
  • отсортировать список клиентов
  • вывести список клиентов по условию infoHos


Цитата(ioManip @  23.2.2014,  06:35 Найти цитируемый пост)
но все равно нет

Ну вот и подскажите, пожалуйста, почему в DispalyNotHosPatient() такой вывод:
Цитата(ioManip @  23.2.2014,  06:35 Найти цитируемый пост)
        cout << "Пациент: " << surname << endl;
        cout << "Домашний адрес: " << homeAdress << endl;
а в DisplayHosPatient() такой:
Цитата(ioManip @  23.2.2014,  06:35 Найти цитируемый пост)
        cout << _patients[i] << endl;
???



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


Бывалый
*


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

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



Цитата(feodorv @  23.2.2014,  09:45 Найти цитируемый пост)
Ну вот и подскажите, пожалуйста


Изначально задача такая была:

По требованию пользователя организовать
1. Вывод на экран списка госпитализированных пациентов в алфавитном порядке (DisplayHosPatient)
2. Список негоспитализированных пациентов с указанием домашнего адреса (DisplayNotHosPatient)
3. Список детей с указанием диагноза. (DisplayHosChildren)


Цитата(feodorv @  23.2.2014,  09:45 Найти цитируемый пост)
У Вас ведь задача какая:

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


Бывалый
*


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

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



Победа!  smile 
Вообщем сидел, сидел, дай думаю индексы поменяю( j на i ) и ооо чудо!! Все получилось! smile
Код

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[i]->getSurname() > _patients[i+1]->getSurname())
             {
                 temp = _patients[i];
                 _patients[i] = _patients[i+1];
                 _patients[i+1] = temp;
             }
         }
       }
    }  
    
    for (i = 0; i < _count; i++)
    {
        cout << "Пациент: " << _patients[i]->getSurname() << endl;
        cout << "Диагноз: " << _patients[i]->getDiagnosis() << endl;
    }
}


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


Эксперт
****


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

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



Не получится у вас чуда - введите штук 5 пациентов, с фамилиями строго в обратном алфавитном порядке  smile 

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


Бывалый
*


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

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



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


Бывалый
*


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

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



Оххх....уже столько вожусь с этой сортировкой!!! smile  smile 

Ну вообщем, поробовал я запустить эту программу при помощи отладчика, на этапе вывода отсортированных фамилий, отладчик мне выдает: "Сигнал перехвачен - SIGSEGV" , погуглив, узнал, что SIGSEGV - это в POSIX-системах  сигнал, посылаемый процессу при попытке обращения к несуществующей памяти или обращения с нарушением прав доступа.

При этом у меня открывается файл basig_string.h и открывается на строчкке с таким содержанием 
Код

return __lhs.compare(__rhs) > 0;


У меня 3 вопроса: у меня не работает, потому что linux ? Или я действительно обращаюсь к несуществующей памяти?
Или я уже не в те дебри полез?
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
xvr
Дата 27.2.2014, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ioManip @  27.2.2014,  09:14 Найти цитируемый пост)
У меня 3 вопроса: у меня не работает, потому что linux ? Или я действительно обращаюсь к несуществующей памяти?

Linux тут не при чем, а памяти действительно нет. Судя по всему у вас сломалось на сравнении строк (стр 12), из за выхода за пределы массива.
Вам feodorv совершенно правильно заметил, что сортировка не должна быть внутри PatientInfo, она должна быть снаружи и вызываться 1 раз, а не на каждого пациента

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


Бывалый
*


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

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



Ну вот смотрите! Теперь сортировка в main.
main.cpp
Код

//Заполнение
...........................

PatientInfo *temp;
            
                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++)
                {
                     patients[i]->DisplayHosPatient(patients, count);
                }


DisplayHosPatient()
Код

if (infoHos == "Да" || infoHos == "да")
    {
        cout << endl;
        for (int i = 0; i < _count; i++)
        {
            cout << "Фамилия: " << _patients[i]->getSurname() << endl;
            cout << "Диагноз: " << _patients[i]->getDiagnosis() << endl;
        }
    }


Т.е. идет заполнение массива клиентами, затем сортировка, затем уже отсортированный массив передается в DisplayHosPatient, а там уже по условию infoHos производится вывод результата....ну разве не так??!!

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


Эксперт
****


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

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



Цитата(ioManip @  27.2.2014,  13:55 Найти цитируемый пост)
Но только все равно крашится!

Гм. По ссылке, что я Вам дал, опечатка:
Цитата(ioManip @  27.2.2014,  13:55 Найти цитируемый пост)
                   for (j = 0; j < count - 1; j++)


Хотя, быть может, имелось в виду:
Код

for (j = 0; j < count - i - 1; j++)


В любом случае правильный вариант здесь smile 

Это сообщение отредактировал(а) feodorv - 28.2.2014, 17:36


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


Эксперт
****


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

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



Цитата(ioManip @  27.2.2014,  12:55 Найти цитируемый пост)
ну разве не так??!!

Цикл внутри DisplayHosPatient не нужен - у вас уже есть цикл снаружи. Но крашится не должно. Видимо еще где то бага. Что отладчик показывает? Где ломается?

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


Эксперт
****


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

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



Цитата(xvr @  28.2.2014,  18:39 Найти цитируемый пост)
Но крашится не должно

Должно))) Выход за пределы массива)))


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


Бывалый
*


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

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



Цитата(feodorv @  28.2.2014,  17:13 Найти цитируемый пост)

Хотя, быть может, имелось в виду


Слушайте! Скорей всего именно это и имелось в виду! Все заработало!  smile 

Уххх, спасибо, всем!  smile 

Хороший форум!
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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