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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка по алфавиту, сортировка по алфавиту 
:(
    Опции темы
X
Дата 19.10.2005, 23:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Имеются поля некого массива структур poezd[i].name, и эти поля надо отсортировать по алфавиту. Как это сделать? Желательно привести код 8-) smile
  Вверх
Pogreb
Дата 20.10.2005, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 69
Регистрация: 17.10.2005

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



Для сортировки тебе может пригодится функция
strcmp(), она сравнивает две строки.
PM MAIL   Вверх
np9mi7
Дата 20.10.2005, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



Unregistered, товарищ! Какие строки? Тип?


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
X
Дата 21.10.2005, 00:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Отсортировать надо не строки а массивы символов, это в С по-моему разные вещи 8-) Тип Char. Вот сегодня порылся в MSDN, нашел функцию qsort, она вроде тоже сортирует по алфивиту. Но там используется еще какая-то функция и используются указатели, а с ними у меня плохие отношения smile точнее сказать вооюще никаких отношений нет. Можно ли отсортировать без использования указателей и вообще динамической памяти? smile
  Вверх
BreakPointMAN
Дата 21.10.2005, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



если тип твоей структуры - POEZD, например...
если у тебя не встречается русских букв в полях name, то можешь определить где-нибудь функцию:
Код
int comp(const void *arg1, const void *arg2)
   {
    return strcmp((*(POEZD*)arg1).name,(*(POEZD*)arg2).name);
   }

и сортировать так:
Код
qsort((void*)poezd, n, sizeof(POEZD), comp);

где n - размерность твоего массива...


ps: вот ведь что значит - не искать простых решений... мдя... все, кажется, пора мне спать...

Это сообщение отредактировал(а) BreakPointMAN - 21.10.2005, 01:30


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Pogreb
Дата 21.10.2005, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 69
Регистрация: 17.10.2005

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



Уважаемый Unregistered.
Символы можно сравнивать как цифры.
PM MAIL   Вверх
pablo
Дата 21.10.2005, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

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



X А не проще ли просто описать свою ф-цию сравнения, а потом использовать std::sort ?


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
Guest
Дата 21.10.2005, 21:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











BreakPointMAN чего-то у меня не работает, говорил же что не дружу с указателями smile
Вот код программы, может поможешь отсортировать smile
Код

#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <stdlib.h>



int main()
{
  const int kol = 3;
  int i,j;
  char choose;
  double hour, minute;

  struct TRAIN
  {
    char name[10];
    int number;
    double time;
  };

TRAIN poezd[kol];

//-----------------Enter-data-------------------------------------
  for (i=0; i<kol; i++)
     {
     cout <<         "Enter name: ";          cin >> poezd[i].name;
     cout << endl << "Enter number: ";        cin >> poezd[i].number;
//-----------------Enter-time-------------------------------------
     do
     {
     cout << endl << "Enter time (HH.MM): ";  cin >> poezd[i].time;
     minute = modf(poezd[i].time, &hour);
     if ((hour > 23) || (minute > 0.59)) cout << "\n0 < HH < 23   0 < MM < 59\n";
     }
     while ((hour > 23) || (minute > 0.59));
     cout << endl << endl;
     }

//-----------------Sort-number------------------------------------
  for (i=0; i<kol-1; i++)
     {
     int imin = i;
        for (j=i+1; j<kol; j++ )

           if (poezd[j].number < poezd[imin].number)
           imin = j;
           TRAIN a = poezd[i];
           poezd[i] = poezd[imin];
           poezd[imin] = a;
     }
  for (i=0; i<kol; i++)
    {
    printf ("%10s \t |\t %5d \t|\t %5.2f\n",poezd[i].name,poezd[i].number,poezd[i].time);
    }
    cout << "\n\n";

//-----------------------Sort-name--------------------------------
//???????????????????????????????????????????????????????????????
//-----------------------Show information-------------------------
    do
    {
    cout << "\nEnter number for show information: ";
    int tempnum;
    cin >> tempnum;
      for (i=0; i<kol; i++)
        {
        if (tempnum == poezd[i].number)
          {
          printf ("\n%10s \t |\t %5d \t|\t %5.2f\n",poezd[i].name,poezd[i].number,poezd[i].time);
          break;
          }
        }
      if (tempnum != poezd[i].number)
         cout << "\nThis number is absent";
    cout << "\nElse? y/n...";
    cin >> choose;
    }
    while (choose == 'y');
//----------------------------------------------------------------
    int end;
    cin >> end;

  }



Код кривой, все по-детски. Просто с С++ общаюсь недавно.
  Вверх
X
Дата 21.10.2005, 21:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











pablo, может быть и легче, но не мне smile
  Вверх
BreakPointMAN
Дата 21.10.2005, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



думается мне, что при сортировке по алфавиту все будет примерно так же, как по номеру, кроме условия сравнения:
Код

if (strcmp(poezd[j].name,poezd[imin].name)<0)

PS: может не сработать для русских букв.


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
X
Дата 22.10.2005, 00:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











BreakPointMAN кажется работает!!! Большой тебе респект smile
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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