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

Поиск:

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


Шустрый
*


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

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



Известная задача, в интернете есть много вариантов, но я не могу нормально реализовать сортировку по алфавиту. 
Вот условие: 

1.    Описать структуру с именем ТRAIN, содержащую следующие поля:
•    NAZN - название пункта назначения;
•    NUMR - номер поезда;
•    ТIМЕ - время отправления.
2.    Написать программу, выполняющую следующие действия:
•    ввод с клавиатуры данных в массив RASР, состоящий из восьми элемен¬тов типа ТRAIN; записи должны быть размещены в алфавитном порядке по названиям пунктов назначения;
•    вывод на экран информации о поездах, отправляющихся после введенного с клавиатуры времени;
•    если таких поездов нет, выдать на дисплей соответствующее сообщение.



Вот задача:

Код

#include <stdio.h>
#include <string.h>
struct TRAIN{
       char NAZN[20];
       unsigned NUMR;
       char TIME[6];
       } RASP[8],T;
       
main()
{
  int i, j, k=0; 
  unsigned Num; 
  char Name[20];

/*Ввод и считывание информации*/
   for(i=0; i<8; i++)
   {
    printf("\nName of the place? "); 
    scanf("%s", &RASP[i].NAZN); 
     
     if(strlen(RASP [i].NAZN)==0)
          break;
   
    printf("Train number? ");
    scanf("%u",&RASP[i].NUMR);
    
    printf("Departure time? "); 
    scanf("%s",&RASP[i].TIME);
    
     k++;
     };
     
     /*Тут должна быть сортировка. Тут и нужна помощь:)*/
   
       /*Вывод результатов*/
        printf("\nTrains:\n"); 
         for(i=0; i<k; i++)
         printf("%-19s - #%3u - %7s\n",RASP[i].NAZN,RASP[i].NUMR,RASP[i].TIME);
        while(1)
        {
           printf("\nTrain number for seach (0 for exit)? "); 
           scanf("%u",&Num); 
           j=0; 
           
            if(!Num)
           break;
           
             for(i=0;i<k;i++)
           if(Num==RASP[i].NUMR)
             {
             printf("\nName of the place: %s \nTrain number: %u \nDeparture time: %s\n\n", 
                     RASP[i].NAZN,RASP[i].NUMR,RASP[i].TIME);
             j=1;
             }; 
             
            
     if(!j)
       printf("No such train!\n"); 
 getchar();}
}




Каким образом создать сортировку? Допустим будут строки:

London
Astana
Moscow
Kiev

Надо раскидать их по алфавиту, от а к z. 

Если рассматривать как двумерный массив, то мне необходимо сравнивать первый элемент 1ой строки с первым элементов 2ой , если он больше, то поднять вверх всю строку и т.д. Но у меня массив NAZN(название города) объявлен как одномерный. У меня вообще нет тут двумерного массива, что бы попробовать пузырьковою конструкцию типа: 
 
Код

for(i=0; i<k; i++)
   for(j=0; j<k; j++)
if (matrix[0][j] < matrix [0] [j+1])
 t=matrix[0][j]
matrix[0][j+1]=matrix [0][j]
matrix [0][j+1]=t


Или в этом случае я зафиксировал вообще нулевой элемент и надо вот так? Но всё равно у меня нет двухмерного массива и я не могу сравнивать именно нулевой элемент каждой строки ((
Код

for(i=0; i<k; i++)
   for(j=0; j<k; j++)
if (matrix[0][j] < matrix [0] [j+1])
 t=matrix[j]
matrix[j+1]=matrix [j]
matrix [j+1]=t



 

Это сообщение отредактировал(а) Kruger2 - 14.7.2011, 16:53
PM MAIL   Вверх
boostcoder
Дата 14.7.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



юзай std::vector и std::sort smile 
PM WWW   Вверх
Kruger2
Дата 14.7.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



boostcoder
Находил такие примеры, но я как бы не должен их ещё знать на этой стадии, хотя в общих чертах понимаю как работают ониsmile

Добавлено через 1 минуту и 18 секунд
Хотя нет, вектор не знаю вообще)
PM MAIL   Вверх
boostcoder
Дата 14.7.2011, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



используй qsort(). это Си-функция для сортировки.
PM WWW   Вверх
Kruger2
Дата 14.7.2011, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да, только по программе эта задача идет перед функциями и тем более перед указателямиsmile Неужели нет вариантов? как отсортировать например по номеру поезда я знаю, а по алфавиту как?)

Это сообщение отредактировал(а) Kruger2 - 14.7.2011, 17:02
PM MAIL   Вверх
boostcoder
Дата 14.7.2011, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(Kruger2 @  14.7.2011,  17:01 Найти цитируемый пост)
Неужели нет вариантов?

вариантов куча. но это руками все писать придется...
PM WWW   Вверх
Kruger2
Дата 14.7.2011, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Тут сортировка происходит в зависимости от номера поезда:

Код

 for(i=0; i<k; i++)
      for(j=0; j<k-i-1; j++)
        if(RASP[i].NUMBER < RASP[j].NUMBER) 
        {
           T= RASP[j];
          RASP[j] = RASP[j+1];
          RASP[j+1]=T;
        }


33
22
44
11

Не совсем понимаю каким образом тут происходит сортировка. Получается, i=строки, j= столбцы? Тогда каким образом строка сравнивается со столбцом О_о

Добавлено через 27 секунд
boostcoder
Пичалька  smile 
PM MAIL   Вверх
borisbn
Дата 14.7.2011, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Kruger2, в твоём одномерном массиве нет ни столбцов ни строк. Есть просто индекс.
Для лучшего понимания распечатай каждый шаг алгоритма (все переменные):
Код

 for(i=0; i<k; i++)
 {
     for(j=0; j<k-i-1; j++)
     {
        printf( "Сравниваю %d и %d элементы\n", i, j );
        printf( "RASP[i].NUMBER = %d, RASP[j].NUMBER = %d\n", RASP[i].NUMBER, RASP[j].NUMBER );
        if(RASP[i].NUMBER < RASP[j].NUMBER) 
        {
           printf( "if(RASP[i].NUMBER < RASP[j].NUMBER). Меняем их местами\n" );
           T= RASP[j];
           RASP[j] = RASP[j+1];
           RASP[j+1]=T;
        }
        printf( "После очередного шага:\n" );
        for ( int tmp = 0; tmp < k; tmp++ )
        {
             printf( "%d ", RASP[ tmp ].NUMBER );
        }
        printf( "\n" );
     }
 }



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Kruger2
Дата 14.7.2011, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Наплевал на всё и сделал как вы и советовали, boostcoder, через strcmp. Никто ведь не запрещает мне наперед учиться? Буду так и говоритьsmile Тем более, что функция элементарна


Код

 if(strcmp(RASP[j].NAZN, RASP[j+1].NAZN)>0)
            {
              T=RASP[j];
              RASP[j]=RASP[j+1];
              RASP[j+1]=T    ;                  
            }

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


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Kruger2, малаца!
PM WWW   Вверх
borisbn
Дата 14.7.2011, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Kruger2, вот, посмотри алгоритмы сортировки. Только не бездумно копипасть, а внимательно разбери... Плюс можешь повставлять отладочный вывод, как я тебе показал выше...


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Kruger2
Дата 14.7.2011, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



borisbn
Спасибо, надо убегать, позже обязательно разберу.
boostcoder
Тоже спасибо за наводку.

Нафлужу ещё пару постов и расставлю плюсы всемsmile
PM MAIL   Вверх
fish9370
Дата 16.7.2011, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вобще, strcmp реализуется довольно легко, не обязательно использовать библиотечную:

Код

int my_strcmp(const char *s1, const char *s2) {
       if(!s1 && s2)
                return -1;

        if(s1 && !s2)
                return 1;

        if(!s1 && !s2)
                return 0;

        for(;*s1 && *s2; s1++, s2++) {
                if(*s1 != *s2) {
                        if(*s1 > *s2)
                                return 1;
                        else
                                return -1;
                }
        }

        if (*s1)
                return 1;

        if (*s2)
                return -1;

        /*  1 - s1 greater then s2   */
        /* -1 - s1 less then s2      */
        /*  0 - s1 and s2 equal      */
        return 0;
}




Это сообщение отредактировал(а) fish9370 - 16.7.2011, 15:53


--------------------
undefined
PM MAIL WWW ICQ   Вверх
volatile
Дата 16.7.2011, 11:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(fish9370 @  16.7.2011,  10:16 Найти цитируемый пост)
        while(*s1) {
                if(*s1++ != *s2++) {
                        if(*s1 > *s2)
                                return 1;
                        else
                                return -1;
                        break;
                }

smile Это не просто кривой велосипед, это очень кривой велосипед!
1.
Цитата(fish9370 @  16.7.2011,  10:16 Найти цитируемый пост)
                if(*s1++ != *s2++) {
                        if(*s1 > *s2)
                }


Сначала мы проверили на не равенство *s1 != *s2, а потом сравниваем следующие за ними байты
Автор нужно срочно читать что такое постинкрементация.


Если даже исправим ошибку 1, это еще не все
2.
Цитата(fish9370 @  16.7.2011,  10:16 Найти цитируемый пост)
        while(*s1) {

Если s2 длиннее s1, но совпадает по начальным символам, этот код выдаст равенство.
напр: 
s1 = "ABC";
s2 = "ABCDEFG";
Эти строки будут равны.


Уважаемые велосипедисты, когда изобретаете очередной велосипед, будьте осторожны!
Не пишите всякой фигни, где в среднем на 2 строчки кода по 3 ошибки!!!


PM MAIL   Вверх
fish9370
Дата 16.7.2011, 15:57 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



volatile,  не нравишься ты мне  smile 


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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