Питон, Паскаль... давайте еще на форте напишем чтоли?
Девушка ясно просила - помочь написать на C++.
bugmaker писал(а):
ЗЗЫ На преподавателей, терзающих невинных дитёв таким уродством как с++, нужно жаловаться. В общество защиты жывотных.
А работодателей, которые требуют использовать C++ в проектах, надо наверное вообще в тюрьмы сажать??? Девушку учат совершенно реальному языку, применяемому огромным кол-вом людей. Если вдруг она решит связать скою карьеру с программированием, знание этого языка - огромнейший плюс, даже если проекты будут вестись на чем-то ином.
Теперь по теме:
Цитата:
не могу написать программу в С++, формулирующую все предложения, которые можно составить из словосочетаний "ваши прекрасные глаза ", "сулят"," мне", " сметрть", "прекрасная маркиза", "от любви". Все возможные перестановки.
Цитата:
например перестановки чисел 123,
for (i=0, i<3, i++)
for (j=i+1, j<3, j++)
for (k=j+1, k<3,k++)
if (a[i]!=a[j]&&a[i]!=a[k])
cout <<a[i],,a[j]<<a[k];
так?
Непонятно, что нахидится в массиве a. Если массив определен как
int a[] = {1,2,3};
то все почти верно, за исключением начальных значений счетчиков i,j,k. Начинайте каждый цикл с нулевого значения счетчика, а условие if (a[i]!=a[j]&&a[i]!=a[k]) измените на if(a[i] != a[j] && a[i] != a[k] && a[j] != a[k] ), исключив таким образом вывод одинкаовых элементов массива. Вывод на экран сделайте так: cout<<a[i]<<','<<a[j]<<','<<a[k];
Таким образом вы выведите все возможные перестановки чисел 1,2,3.
В случае вашей задачи, кол-во элементов массива, подлежащих перестановке, равно 6. Если применить тот же подход, получим 6 вложенных циклов. Как альтернативу, можно применить рекурсию. Подход с циклами, в большинстве случаев, будет быстрее рекурсивного, и будет требовать меньшее кол-во памяти данных для реализации. Но его действительно каждый раз будет необходимо переписывать заного в случае изменения числа элементов массива. Рекурсивный алгоритм - универсален, требует меньшего кол-во программной памяти в случае большого числа элементов массива, но проигрывает по производительности и памяти данных(стек). Задвайте вопросы, пишите, требуется ли составлять рекурсивный алгоритм, или удовлетворяют вложенные циклы?
Остался один вопрос - как перейти от номеров элементов массива к строкам?
Тут возможны два подхода - наиболее простой и понятный, свойственный императивным языкам - организовать массив строк, типа такого:
char *Slova[] = {"слово 1", "слово 2", "слово 3", "слово 4", "слово 5", "слово 6"};
работать с ним можно так:
cout << Slova[5];
Результат работы программы:слово 5
Второй, чисто ООП подход - организовать класс, содержащий набор слов и функции вывода каждого слова, при необходимости - функции для изменения порядка следования слов.
Второй подход, в данном случае, не имеет особого смысла изза простоты программы. В случае же написания более сложных вещей, его следует применять.
незваный гость писал(а):
Один из более эффективных алгоритмов основан на том, что существует ровно n!перестановок длины n. Заводим массив переставляемых элементов. На каждой итерации: переставляем по кругу a[0]...a[k], где k -- самое большой индекс, такой что k! делит номер итерации. Кончаем крутить цикл после n! итераций.
Не могли бы вы поподробнее, на пальцах, пояснить этот алгоритм. Или хотя бы пояснить, что означает "переставляем по кругу".