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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C]Сочетания в строке 
:(
    Опции темы
igrulya
Дата 11.7.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Народ, помогите плиз составить программу, которая будет выводить различные комбинации символов из введенной строки.
PM MAIL   Вверх
igrulya
Дата 12.7.2007, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Желательно только C
PM MAIL   Вверх
JackYF
Дата 12.7.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



ты потом код объяснять кому-нибудь будешь или тебе сдавать готовую программу, и все?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Dov
Дата 12.7.2007, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(igrulya @  11.7.2007,  20:22 Найти цитируемый пост)
различные комбинации символов из введенной строки.

Допустим, я ввёл строку:
 
Код
123456

И что должна сделать программа?  Что она должна вывести?



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
igrulya
Дата 12.7.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Объяснять мот и придется.(Разберусь)
Прога должна выводить сочетания символов. Допустим для твоей строки 
12
13
123 
456 и т.д.
PM MAIL   Вверх
Dov
Дата 12.7.2007, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(igrulya @  12.7.2007,  20:30 Найти цитируемый пост)
Допустим для твоей строки...


igrulya, ты конкретно можешь сказать? Сколько таких сочетаний должна выводить программа?
5, 10, 1000, сколько? В каком порядке она их должна выводить? Вперемешку или отсортированными? 
Если ты хочешь что бы тебе помогли, то конкретизируй своё задание. И не заставляй  людей вытягивать из тебя каждое слово, а чётко и ясно объясни, что должна делать твоя программа. 
Желательно, на конкретных примерах.


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
igrulya
Дата 12.7.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подходил к приподу. Он сказал выводить все возможные сочетания символов из строки.
Код

void main()
{
    char str[255];
    gets(str);
    for(int i=0;i<(strlen(str)-1);i++)
    {
            if(str[i]==' ')
            {
                i++;
            }

        for(int j=(i+1);j<(strlen(str));j++)
        {
            if(str[j]==' ')
            {
                j++;
            }
            printf("%c%c\n",str[i],str[j]);
        }
    }
        getch();
}

Вот эта прога выводить по два символа по порядку.
Можно ли добиться такого же результата как-то по другому??Как быть с сочетаниями из трех-четырех  символов??Можно ли обойтись без множества Вложенных циклов??   
PM MAIL   Вверх
JackYF
Дата 12.7.2007, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



igrulya, к чему я это все ввел.

В STL, стандартной библиотеке шаблонов C++, есть алгоритм, называется std::next_permutation.

Так вот.
С ним программа на С++ выглядела бы где-то так:
Код

std::string s;
std::cin >> s;

std::sort(s.begin(), s.end());
while ( std::next_permutation(s.begin(), s.end()) )
{
  std::cout << s << '\n';
}

Я так когда-то схитрил на олимпиаде, там точно же такое задание было...

Но вот чтобы превратить это в С-код, придется потрудиться...
Приведу код next_permutation, авось тебе поможет  smile :
Код

template<typename _BidirectionalIterator>
    bool
    next_permutation(_BidirectionalIterator __first,
                     _BidirectionalIterator __last)
    {
      if (__first == __last)
        return false;
      _BidirectionalIterator __i = __first;
      ++__i;
      if (__i == __last)
        return false;
      __i = __last;
      --__i;

      for(;;)
        {
          _BidirectionalIterator __ii = __i;
          --__i;
          if (*__i < *__ii)
            {
              _BidirectionalIterator __j = __last;
              while (!(*__i < *--__j))
                {}
              std::iter_swap(__i, __j);
              std::reverse(__ii, __last);
              return true;
            }
          if (__i == __first)
            {
              std::reverse(__first, __last);
              return false;
            }
        }
    }




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Dov
Дата 13.7.2007, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Мой вариант:
Код

int main()
{
    char str[80];
    int i, j, a, b, d, n;

    puts("Enter a string: ");
    gets(str);

    puts("\nResult: ");
    n = strlen(str);
    for(i = 1; i < n; i++)
    {
        for(b = 1, d = i; b < n - 1; d++, b++)
        {
            for(a = d; a < n; a++)
            {
                for(j = i - 1; j < d; j++)
                    putchar(str[j]);

                printf("%c\n",str[a]);
            }
        } 
    }

    return 0;
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
sentry
Дата 24.7.2007, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Code Monkey
*


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

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



Можно и без вложенных циклов, но с рекурсией:
Код

int n, k;
char a[80], b[80];

int print(int k)
{
    for (int i = 0; i < k; i++)
        printf("%c", a[i]);
    printf("\n");

    return 0;
}


int gen(int m, int l)
{
    int i;
    if (m == 0)
        print(k);
    else
        for (i = l; i <=  n - m + 1; i++)
        {
            a[k-m] = b[i-1];
            gen(m-1, i+1);
        };

    return 0;
};

int Cnk()
{
    for (k = 1; k <= n; k++)
        gen(k, 1);

    return 0;
};

int main()
{
    puts("Enter a string: ");
    gets(b);

    n = strlen(b);
    Cnk();
    
    return 0;
}

PM MAIL   Вверх
Dov
Дата 25.7.2007, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(sentry @  24.7.2007,  20:23 Найти цитируемый пост)
Можно и без вложенных циклов, но с рекурсией:

На мой взгляд, это самое верное решение. sentry, молодец.  smile 


з.ы. И всё-таки влияние какого-то 'паскалеидного языка' видно невооружённым глазом.  smile 
Сишник написал бы немного иначе.   smile   Впрочем, могу ошибаться.  smile
В любом случае по репе заслужил.  smile 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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