Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2013, 14:37   #1
NeLIN
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 25
По умолчанию Сортировка букв

Код:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
void bubble(char *i, int n)
{
  int a, b;
  char t;
 
  for(a=0; a < n; a++)
    for(b=n-1; b >= a; b--) 
    {
      if(i[b-1] > i[b]) 
      {
        t = i[b-1];
        i[b-1] = i[b];
        i[b] = t;
      }
    }
    
}
 
int main(void)
{
  char s[80];
 
  printf("Vvedite stroku:");
  gets(s);
  bubble(s, strlen(s));
  printf("Otsortirovannaya stroka: %s\n", s);
  getch();
 
}
Дан произвольный текст. Напечатать в алфавитном порядке все буквы, которые входят в этот текст по одному раз.

Сделал через метод "Пузырька", но преподавателю не понравилось. Сказал слишком трудно, что можно легче. Подскажите как можно сделать легче.
NeLIN вне форума Ответить с цитированием
Старый 03.07.2013, 15:39   #2
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Цитата:
Сообщение от NeLIN Посмотреть сообщение
Код:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
void bubble(char *i, int n)
{
  int a, b;
  char t;
 
  for(a=0; a < n; a++)
    for(b=n-1; b >= a; b--) 
    {
      if(i[b-1] > i[b]) 
      {
        t = i[b-1];
        i[b-1] = i[b];
        i[b] = t;
      }
    }
    
}
 
int main(void)
{
  char s[80];
 
  printf("Vvedite stroku:");
  gets(s);
  bubble(s, strlen(s));
  printf("Otsortirovannaya stroka: %s\n", s);
  getch();
 
}
Дан произвольный текст. Напечатать в алфавитном порядке все буквы, которые входят в этот текст по одному раз.

Сделал через метод "Пузырька", но преподавателю не понравилось. Сказал слишком трудно, что можно легче. Подскажите как можно сделать легче.
Начну с того, что вы просто пересортируете вашу строку, что не выполняет условие, Вам ведь нужно единожды вывести букву, а у вас при строке afrtssag выведет aafgrsst
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 03.07.2013, 15:43   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

во-первых, если бы задача решалась в Паскале, то я бы рекомендовал использовать для решения множества (set of char). Но я не знаю, есть ли такие структуры в C.

во-вторых, для решения подобных задач очень подходит такой алгоритм:
определяем массив, индексами которых являются символы (опять же в Паскаль это можно записать что MyArr : array[#0..#255] of byte; или MyArr : array[#0..#255] of boolean
В начале этот массив заполняете нулями. Потом ОДИН раз проходите по строке, проставляя при этом признак наличия данной буквы (MyArr[ s[j]] = 1 )
потом надо вывести те символы, для которых признак не ноль (не false)
вот и всё. Сортировать ничего не нужно.



p.s. прошу извинения, что я со своим Паскалем лезу в С-шную тему, но, вдруг, мой пост будет кому-то полезен...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.07.2013, 15:54   #4
NeLIN
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 25
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
во-первых, если бы задача решалась в Паскале, то я бы рекомендовал использовать для решения множества (set of char). Но я не знаю, есть ли такие структуры в C.

во-вторых, для решения подобных задач очень подходит такой алгоритм:
определяем массив, индексами которых являются символы (опять же в Паскаль это можно записать что MyArr : array[#0..#255] of byte; или MyArr : array[#0..#255] of boolean
В начале этот массив заполняете нулями. Потом ОДИН раз проходите по строке, проставляя при этом признак наличия данной буквы (MyArr[ s[j]] = 1 )
потом надо вывести те символы, для которых признак не ноль (не false)
вот и всё. Сортировать ничего не нужно.



p.s. прошу извинения, что я со своим Паскалем лезу в С-шную тему, но, вдруг, мой пост будет кому-то полезен...
Вот это вы мне хорошо подсказали, но если можно поподробней пожалуйста
NeLIN вне форума Ответить с цитированием
Старый 03.07.2013, 16:10   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>
 
int
main()
{
    char s[80];
    int a[256], i;
    for (i = 0; i < 256; ++i) a[i] = 0;
    printf("Input string: ");
    gets(s);
    i = 0;
    while (s[i]) ++a[(unsigned char) s[i++]];
    for (i = 'a'; i <= 'z'; ++i)
        if (a[i] == 1)
            printf("%c", i);
    for (i = 'A'; i <= 'Z'; ++i)
        if (a[i] == 1)
            printf("%c", i);       
    getchar();
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 03.07.2013, 16:28   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

BDA, круть! респект.

хотел уточнить, а что означает запись
Цитата:
Код:
while (s[i]) ...
не, ну я понимаю, что это цикл по всем элемента строки, просто интересно, как C трактует s[ i ] при i > length(s)

и чем такая запись лучше банального цикла?:
Код:
 for(i=0; i < strlen(s); i++)  ++a[(unsigned char) s[i]];
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.07.2013, 16:53   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

1) Цикл выполняется, пока условие истинно, то есть не равно 0.
Поскольку все строки в си заканчиваются нультерминантом, то этот цикл остановится на конце строки.
2) Мне просто не захотелось применять strlen (по идее, эта функция пройдется по строке до нультерминанта и вернет полученную длину, то есть никакого выигрыша не получится, кроме некой простоты для понимания).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 03.07.2013, 18:11   #8
NeLIN
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 25
По умолчанию

Большое спасибо всем, вы очень мне помогли!!
NeLIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка массива из латинских букв ReMicroN Помощь студентам 3 07.05.2012 09:55
сортировка букв dimapain Помощь студентам 2 02.05.2012 22:52
Определите сколько слов заданного текста составлено из букв русского алфавита, а сколько из букв латинского алфавита. Слова, в кот potemos Паскаль, Turbo Pascal, PascalABC.NET 2 18.04.2012 13:14
Сортировка заглавных и строчных букв Ronk Общие вопросы C/C++ 6 03.03.2010 19:44