2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 
Сообщение17.07.2006, 10:03 


21/03/06
1545
Москва
Питон, Паскаль... давайте еще на форте напишем чтоли?
Девушка ясно просила - помочь написать на 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! итераций.

Не могли бы вы поподробнее, на пальцах, пояснить этот алгоритм. Или хотя бы пояснить, что означает "переставляем по кругу".

 Профиль  
                  
 
 
Сообщение17.07.2006, 13:01 


13/07/06
68
Цитата:
требуют использовать C++ в проектах


Рабовладение запрещено на территории РФ AFIAIK. У всех есть право послать "требующего" обратно. Или как минимум объяснить, что если он будет настаивать на применении несоответствующих задаче инструментов, ему же будет хуже.

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


В принципе, согласен. Беда в том, что этот язык - отрицательный пример, пример того, как не надо делать языки. Поэтому для слабо разбирающихся в программировании касаться его нежелательно.

 Профиль  
                  
 
 
Сообщение17.07.2006, 21:59 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
e2e4 писал(а):
Не могли бы вы поподробнее, на пальцах, пояснить этот алгоритм. Или хотя бы пояснить, что означает "переставляем по кругу".

Я не поленился поместить даже код, его реализующий. Причем намеренно на Python, чтобы его нельзя было просто сдать, нужно было прочитать, разобраться и переписать на C++. Я придерживаюсь точки зрения, что от решений, прочитанных на форуме толку мало -- надо что-либо сделать ручками, чтобы научиться.

Под перестановкой по кругу я разумею перестановку 0 -> 1, 1 -> 2, 2 -> 3, ... n-1 -> n, n -> 0 (или обратную), в отличии от перестановки пары i -> j, j -> i. (В некотором смысле ее можно рассматривать как обобщение перестановки пары на произвольное число элементов.) Она, несомненно, сводится в группе перестановок пар, но часто реализуется более эффективно.

 Профиль  
                  
 
 
Сообщение18.07.2006, 01:45 


13/07/06
68
Цитата:
Я придерживаюсь точки зрения, что от решений, прочитанных на форуме толку мало -- надо что-либо сделать ручками, чтобы научиться.

По-любому ведь учиться не будут :evil: Пойдут по другим форумам, одногруппникам, родственникам и знакомым, в конце концов заплатят кому-нибудь, но разбираться не будут. Никаких шансов, если и за семестр ничему не научились. Потому что в вузах учат не программированию, а
Цитата:
совершенно реальному языку, применяемому огромным кол-вом людей

 Профиль  
                  
 
 
Сообщение18.07.2006, 01:58 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
bugmaker писал(а):
По-любому ведь учиться не будут :evil: Пойдут по другим форумам...

Вероятно, да. Но это еще не повод, чтобы в этом помогать....

 Профиль  
                  
 
 
Сообщение18.07.2006, 04:01 


13/07/06
68
Представь, что тебя учат иностранному языку, например cherokee. Рассказывают, какие бывают письменные знаки, как произносятся, итд, но... совершенно не говорят их перевода, их смысла на извесном тебе языке. Тебе остаётся только догадываться о смысле, сопоставляя услышанные фразы с ситуациями, в котороых они употребляются. Глядя на символ TLU ты конечно можеш легко догадаться о его значении :) А с символом QUA уже сложнее :( . Примерно такая ситуация сейчас в обучении компьютерной грамотности. ИМХО лучшая помощь в такой ситуации - попытаться растолковать "смысл" посредством более высокоуровневых конструкций, а заодно и научить составлять прототипы - "модели программ в натуральную величину". Это будет реальная помощь для тех, кто желает разобраться но не может из-за искуственно возведённых барьеров.

 Профиль  
                  
 
 
Сообщение06.09.2006, 20:49 


06/09/06
2
Пока не знаю
сколько лет живу - первый раз слышу чтобы о сишнике так отзывались....
bugmaker - вопрос можно?
если с++ такой отцтой то почему же столько людей на нём сидит ,и они считают его отличным языком?
почему с++ является одним из основопологающих языков?
наверное если бы он был таким паршивым то он бы умер давно а ?
да и еще - а какую альтернативу языку с++ вы бы предложили? с такими же, или даже большим количеством возможностей ?

 Профиль  
                  
 
 
Сообщение06.09.2006, 22:06 


13/07/06
68
Цитата:
если с++ такой отцтой то почему же столько людей на нём сидит ,и они считают его отличным языком?

Поинтересуйтесь у кого-нибудь из тех, кто на него "подсел", десять отличий реализации ООП в С++ и например Smalltalk. Осведомитесь, нормально ли, что STL не является thread safe. Попросите пример задачи, решение которой на C++ было бы проще или работало бы лучше.
Цитата:
почему с++ является одним из основопологающих языков?

Кто его произвёл в основоположники? :lol:
Цитата:
наверное если бы он был таким паршивым то он бы умер давно а ?

Жаль Вас разочаровывать, но есть ещё паршивее, и живёхоньки.
Цитата:
да и еще - а какую альтернативу языку с++ вы бы предложили? с такими же, или даже большим количеством возможностей ?

Для какой задачи? Для нахождения всех перестановок очевидно лисп намного лучше :P

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group