Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 3 [4] 5   Вниз
  Печать  
Автор Тема: ЭВМ 1 курс.Алгоритмические языки. С++  (Прочитано 132252 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #90 : 14-10-2006 10:47 » 

Цитата: Джон
dimka, предлагает сразу взять быка за рога. Я думаю, что это рановато, хотя можешь попробовать. Есть ещё один простой принцип, если хочешь что-то понять - объясни это другому. В данном случае показателем "правильности" твоего алгоритма будет точное выполнение, указанных тобой действий, кем-нибудь другим. Самое главное - ты не должен упустить ни одной мелочи.
Не думаю, что рановато.

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

Соответственно, всякий алгоритм подвергается проверке на:
1) нарушение порядка действий, обусловленного причинно-следственными связями между элементарными действиями алгоритма (синтаксис),
2) понятность отдельных инструкций (элементарных действий) для исполнителя алгоритма (семантика),
3) возможность получить при помощи алгоритма желаемый результат (прагматика)

Поэтому (опуская вопросы эффективности алгоритмов, о которых пока рано говорить) критика всякого алгоритма сводится к первым двум пунктам. Пока FallenSoul демонстрирует непонимание второго пункта. То, что ему кажется будто бы понятным, на самом деле непонятно исполнителям алгоритма, и в том числе недостаточно понятно ему самому. Когда он научится "рефлексировать" - научится видеть свои алгоритмы глазами посторонних исполнителей, соотносить свои алгоритмы с возможностями исполнителей, описывать алгоритмы на языке исполнителей - самому думать на чужих языках, вот тогда дело пойдёт на лад.

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

Но алгоритм - дело вторичное, также как и программирование вообще. Главное, что составляет половину (а то и больше) всего дела, - это чёткая постановка задачи. Чтобы описывать алгоритм на общем русском языке нужно на общем русском языке сформулировать задачу, решаемую будущим алгоритмом. Если задача внятно не сформулирована, то и бесполезно разрабатывать алгоритмы, поскольку непонятно, что же от нас требуется. Сначала отвечают на вопрос "что делать?" (определяют содержание задачи), и только после этого - на вопрос "как делать?" (определяют метод решения задачи).

Если задача для студента сформулирована в терминах "массивов", "переменных", то и решение он придумывает в тех же терминах. Если же нужно отойти от программистского языка и решать задачу на языке общего назначения, то первым делом нужно переформулировать задачу на новом языке. Ты это сделал, Джон?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #91 : 14-10-2006 11:03 » 

FallenSoul, Примерно так. Но программисты - придирчивые к словам люди Улыбаюсь Поскольку неточно выраженные в программе мысли программиста приводят к невнятным программам, которые делают в том числе и неожиданные действия.

Цитата: FallenSoul
начинаем искать в стопке карточек ту, на которой написана эта буква
если нашли тогда смотрим на карточку и ищем на ней русскую букву которая соответсвует английской
если нашли тогда запоминаем её и записываем на листок бумаги
как только записали, раскладываем карточки опять в начальном порядке и смотрим на вторую букву слова
Правило первое: на каждое "если - то" всегда существует "иначе" Улыбаюсь А если не нашли, то что?

Далее, к чему фраза "раскладываем в начальном порядке", когда в условии задачи ни о каком порядке карточек никто не говорил? Т.е. твой "начальный порядок" - непонятное исполнителю и, следовательно, лишнее для алгоритма выражение.

Цитата: FallenSoul
как только нашли и записали русскую букву, соответствующую последней букве английского слова смотрим
есть ли еще буквы в английском слове?
если есть-тогда продолжаем искать по буквенно
если больше нет, тогда заканчиваем поиск букв и их запись и смотрим на лист бумаги на котором написано слово русскими буквами
другими словами- выводим результат.
Ты говоришь: "Как только ... соответствующую последней букве английского слова". Потом зачем-то пишешь: "Есть ли ещё буквы?". Если буква была последней, то, очевидно, что букв больше нет. Тогда либо всё, написанное после "есть ли ещё буквы?" не имеет никакого смысла и никогда исполнителем не будет использовано, либо словосочетание "последняя буква" явно вставлено не к месту. Если ты хочешь описать, что же такое "последняя буква", то все свои проверки "Есть ли ещё буквы?" нужно поместить выше - у тебя нарушен порядок действий в алгоритме, если же ты не хочешь описывать смысл "последней буквы", то все проверки избыточны и должны быть удалены.

Кроме того принято описывать повторы в алгоритмах фразами вида "повторить, начиная с..." или описать пару раз одно и то же действие, далее поставив: "и т.д., пока не...".

Исправь свой алгоритм.
« Последнее редактирование: 14-10-2006 11:05 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #92 : 14-10-2006 11:15 » 


1.Смотрим на слово
2.Выделяем первую букву слова
3.начинаем искать в стопке карточек ту, на которой написана эта буква
4.  если нашли тогда смотрим на карточку и ищем на ней русскую букву которая соответсвует английской, иначе-завершение работы.
5.   если нашли тогда запоминаем её и записываем на листок бумаги, иначе -завершаем работу
6.  как только записали,- смотрим на слово:
7. если есть следующая буква, тогда выделяем её и начинаем повтор действия с 3его пункта, иначе- переход на 8ой пункт
8. смотрим на листок бумаги, на котором написано слово-результат работы всего нашего алгоритма и завершаем работу.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #93 : 14-10-2006 13:27 » 

Цитата: FallenSoul
1.Смотрим на слово
Имеет ли смысл вводить такую операцию? Выделение буквы слова, очевидно, не может происходить без доступа к самому слову (не обязательно целиком, возможно по частям). Т.е. мы на слово (или его части) смотрим  в пунктах 2 и 7 (в положительной ветви условия). И в пунктах 2 и 7 "посмотреть на слово" - необходимое для человека действие. А вот результат действия операции 1 непонятен. Ну посмотрели, и что? Обоснуй введение пункта 1. Аналогично в пункте 8. Зачем смотреть на результат?

Цитата: FallenSoul
4.  если нашли тогда смотрим на карточку и ищем на ней русскую букву которая соответсвует английской, иначе-завершение работы.
По условию на карточках записаны правила перевода. Т.е. искать на карточке букву не нужно, а уж тем паче не может быть случая, чтобы буквы там не оказалось - таких карточек нет по условию. Как переформулировать пункты 4 и 5? Кроме того в русском языке фразы "если нашли, тогда...", в которых пропущено дополнение, интерпретируются в соответствии с контекстом. В данном случае разобраться можно, но два раза подряд "если нашли", если бы ты не добавил отступа в пункте 5, привели бы к ошибке. Для улучшения читабельности рекомендуется указывать предмет "если нашли <указать то, что искали>, тогда...", и никакие отступы не понадобятся. На общем русском языке ты же не пишешь предложения в столбик с отступами. Правило второе: не оставляй недоговорённостей, всё указывай явно - кто что делает по отношению к чему и каким образом.

Цитата: FallenSoul
7. если есть следующая буква, тогда выделяем её и начинаем повтор действия с 3его пункта, иначе- переход на 8ой пункт
Правильно, но если "иначе" - просто следующее действие в алгоритме, в таком случе "иначе" обычно не пишется - и так понятно. Вот в пункте 4, если мы не нашли карточку, следующее действие мы выполнять не можем - там "иначе" требуется обязательно.
« Последнее редактирование: 14-10-2006 13:28 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #94 : 14-10-2006 17:23 » 

Ок. С этим разобрались ... что еще может помочь мне ?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #95 : 14-10-2006 17:47 » 

Цитата: FallenSoul
что еще может помочь мне ?
Структуризация алгоритма.

Допустим, ты умеешь переводить букву одного алфавита в букву другого алфавита. Как это делается - не важно, прими в качестве постулата то, что ты умеешь это делать. Запиши алгоритм, использующий операцию "Перевести букву". В твоём алгоритме не должно быть никаких лишних действий, алгоритм должен получиться коротким и простым. На входе тебе даётся бумажка со словом, на выходе ты получаешь другую бумажку с переводом слова, ты умеешь переводить одну букву - это условия для твоего алгоритма, положим, больше тебе ничего не известно (например, ты не знаешь о карточках-правилах).
« Последнее редактирование: 14-10-2006 17:52 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #96 : 14-10-2006 19:01 » 

млин. Не понял, извини. Как уже говорилось выше-не четко сформулированная задача, имеет не определенные последствия. =\
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #97 : 14-10-2006 19:54 » 

Цитата: FallenSoul
не четко сформулированная задача, имеет не определенные последствия.
Что же не определено? Есть бумажка со словом, записанным буквами одного алфавита, ты умеешь переводить букву одного алфавита в букву другого алфавита. Нужно записать буквами другого алфавита, в который ты умеешь переводить, на другой бумажке это же слово, воспользовавшись известной тебе операцией "перевести букву". Что ещё по-твоему нужно знать для разработки алгоритма?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #98 : 14-10-2006 22:28 » 

Сорри за опоздание, в субботу отдаю долг семье... 

Не думаю, что рановато.

Я имел ввиду - рановато начинать с алгоритма транслятора (основной задачи), пока FallenSoul не уяснил, чего же мы от него добиваемся и как это всё работает. ПОэтому предложил простые задачи. Кстати вторая - произносить слова по буквам, был след. шаг на пути к реализации транслятора. Те он должен был бы описывать простой парсер.
Алгортим траслятора состоит из примитивов, которые лучше освоить сначала, а уж потом приступать к их комбинации. Поэтому и возникают проблемы типа структуризации алгоритма. Понимаешь, он хочет сразу добиться результата. Отсюда все беды.

Цитата
Ты это сделал, Джон?

Не совсем понял вопрос... "ЭТО" - ?

Ну, а про остальное... Собственно говоря - "верной дорогой идёте, товарищи" и я рад, что у FallenSoul уже такие продвижения. Хотя по прежнему придерживаюсь мнения, что начинать надо с примитивов (см. выше).
Конечно, для нас это наипростейший алгоритм, гораздо проще записать его сразу в коде "на одном дыхании".
Но для начинающего не должно быть мелочей. ИМХО, если эти мелочи отточить, потом будет гораздо легче.

Моё предложение - отточить алгоритмы присваивания, проверки условия, повторяющихся действий. Чтобы поддержать дух и интерес - перевести эти алгоритмы в код, показать, что он и в компьютере работает. Потом составить из этих примитивов более сложный алгоритм, перевести в код - удостовериться, что работает. И тд
Те показать принцип и направление, тогда FallenSoul сможет самостоятельно прдолжать, а мы будем уже помогать ему в трудных ситуациях. Причём, начиная именно с алгоритма на человеческом языке.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #99 : 15-10-2006 06:28 » 

Цитата: Джон
Понимаешь, он хочет сразу добиться результата. Отсюда все беды.
Понимаю. А также понимаю, что его "не понимаю" относится не к тому, что его просят сделать, а к тому зачем ему это делать. Но поскольку отвечать на вопрос зачем - это будет длинно и непонятно, ему остаётся лишь терпеливо выполнять предписания. Понимание придёт в конце, когда будет получен результат - нужная ему программа. Нетерпение у студентов младших курсов - дело обычное, поскольку они не знают, что они не знают Улыбаюсь, и поэтому не могут дать себе адекватную с точки зрения профессионального программиста самооценку.

Цитата: Джон
Не совсем понял вопрос... "ЭТО" - ?
"ЭТО" - это "свет в конце туннеля" Улыбаюсь. Когда даёшь вспомогательное задание, связанное с другим заданием, позаботься, чтобы взаимосвязь между заданиями была понятна учащемуся. В противном случае возникают вопросы вида "зачем?" и потеря мотивации к учёбе. С другой стороны, давая задание, позаботься, чтобы у студента не возникало ощущение запредельной сложности заданного - если студент не видит "света в конце туннеля", он тоже плохо мотивирован на учёбу. Лучше большие и запредельно сложные для студента (хотя и простые для подготовленного программиста) этапы заданий разбивать на более мелкие и менее сложные частые, при взгляде на которые у студентов не опускаются руки Улыбаюсь.

Цитата: Джон
Моё предложение - отточить алгоритмы присваивания, проверки условия, повторяющихся действий. Чтобы поддержать дух и интерес - перевести эти алгоритмы в код, показать, что он и в компьютере работает. Потом составить из этих примитивов более сложный алгоритм, перевести в код - удостовериться, что работает. И тд
Обязательно. Как только он структурирует свой алгоритм на человеческом языке, сразу перейдём к коду. Причём код он будет писать сам с минимумом подсказок. Почему структуризация до кода? Потому что выше уже был дан пример https://forum.shelek.ru/index.php/topic,9824.msg140723.html#msg140723 того, к чему приводит отсутствие структуризации в коде Улыбаюсь. Повторять это сейчас ещё раз, имхо, не лучший путь. Хотя, работать оно, возможно, будет. Уж лучше сразу метод "сверху-вниз" разобрать на человеческом языке.

P.S. Я, правда, со своей колокольни ООП смотрю - меня очень утомляют студенты, записывающие сразу код и потом не понимающие, как этот код перевести из одной парадигмы в другую. А всё потому, что их не научили думать на обычном русском (английском, испанском) языке, зато обучили писать код (кнопки топтать).
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #100 : 15-10-2006 08:19 » 

1.Смотрим на бумажку
2.  Выделяем первую букву
3.  Переводим букву и записываем её перевод на другом листе бумаги
4.  Если есть еще буква в слове, тогда выделяем её и переходим на пункт 3
5.завершение работы программы.
« Последнее редактирование: 15-10-2006 09:54 от FallenSoul » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #101 : 15-10-2006 09:38 » 

Цитата: FallenSoul
4.  Вспоминаем правило, как переводится данная буква на русский язык
5.  Как только вспомнили
В условии не сказано, что исполнитель "помнит" правило. В условии сказано, что исполнитель "умеет" выполнять такую операцию. Поэтому про воспоминания - это выдумки. Действия 4-5 (аналогично 11-12) - это одно действие перевода буквы. Если же писать "как только вспомнил", сразу возникает вопрос о ситуации, когда исполнитель "напрочь забыл" - что тогда делать? Это совершенно не относящиеся к сути решения задачи подробности. Запиши одной строчкой "Переводим букву".

Далее, пункты 8-13 - это уже "усовершенствование", которое от тебя совсем не требуется. Правило третье: не занимайся самодеятельностью относительно определения условий решаемой задачи. Если в условии сказано: "перевод с одного алфавита на другой" - именно это и нужно сделать. Про обратный перевод в условии ничего не сказано. В реальном программировании это означает выполнение неоплачиваемой работы, кроме того, возможно, с вредными последствиями для заказчика. Попросили тебя, например, реализовать проверку пароля, а ты "для удобства" добавил функцию подсказки пароля - врядли заказчик будет доволен такой "самодеятельностью".

Итак, ты записал алгоритм перевода слова с одного алфавита на другой с использованием операции "перевести букву" - это будет "внешний каркас" алгоритма.

Далее, предположим, что ты не знаешь, как переводить буквы, и тебе нужно написать алгоритм перевода буквы с одного алфавита на другой алфавит. Условия: тебе сообщают букву; у тебя есть колода карточек-правил перевода букв одного алфавита в буквы другого алфавита; на каждой карточке записано правило вида "<буква одного алфавита> <=> <буква другого алфавита>"; тебе нужно, воспользовавшись карточками, перевести данную тебе букву и сообщить результат - букву другого алфавита, соответствующую исходной букве. Предположим, ты умеешь пользоваться отдельной карточкой - это будет известная тебе операция "применить правило". Не расписывай то, как ты читаешь карточку - это на данном этапе не важно. Предположим, ты умеешь искать карточку в колоде - операция "найти карточку". Эта операция может быть успешной (карточка найдена) или неудачной (карточка не найдена); опять же, не расписывай того, как ты будешь искать карточку в колоде - на данном этапе это не важно, ограничься тем, что ты умеешь это делать.

Запиши алгоритм перевода буквы и не приписывай "внешний" алгоритм перевода всего слова. "Внешний" алгоритм уже разработан, и его можно пока что отложить. Сконцентрируй внимание только на алгоритме перевода буквы с одного алфавита в другой. С другой стороны, не углубляйся в несущественные детали - не расписывай операции "применить правило" и "найти карточку"; просто воспользуйся этими операциями.
« Последнее редактирование: 15-10-2006 09:41 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #102 : 15-10-2006 09:49 » 

Откуда я знал с какого алфавита на какой переводить?! -это не было обговорено в условии задачи-поэтому дописал ... сейчас поправлю
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #103 : 15-10-2006 10:00 » 

так.

получить букву которую надо переводить
"найти карточку"
если карточка найдена тогда
  "применить правило"
иначе
завершение программы
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #104 : 15-10-2006 12:56 » 

Вот ты получил 2 алгоритма, из которых один основной (перевод слова) использует один вспомогательный (перевод буквы). На этом этапе уже можно отметить одно свойство алгоритма - универсальность алгоритма для решения целого класса задач, а не только одной конкретной задачи. Каждый алгоритм имеет некие смысловые границы, в которых заключена основная идея того или иного алгоритма. Всё, что не относится к этой идее, должно отбрасываться. При написании алгоритма не нужно делать предположений о том, в каких ситуациях этот алгоритм будет использоваться, также не нужно делать предположений о том, как работают вспомогательные алгоритмы. Основная идея первого алгоритма - разбиение исходного слова на буквы и собирание из букв результата работы. Основная идея второго алгоритма - перевод отдельной буквы. Каждый алгоритм решает только одну проблему, но не все проблемы сразу. Если проблема сложная, лучше её разделить на более простые составные части.

Теперь сосредоточимся на разработке алгоритма "Применить правило". Тебе нужно подумать о том, что такое "карточка-правило", как эта карточка устроена. Подумай, возможно ли использование одной карточки для перевода в обе стороны или нельзя. Если при помощи одной карточки возможен перевод в обоих направлениях, то будет один алгоритм, если возможет перевод только в одном направлении, придётся заводить 2 карточки - по одной для каждого направления перевода - и будет другой алгоритм.

Итак: тебе сообщили букву; тебе дали карточку-правило, на которой записана сообщённая тебе буква (т.е. не надо проверять, соответствует ли карточка букве); от тебя требуется написать алгоритм применения правила перевода; в результате работы твоего алгоритма получится буква другого алфавита, которую ты сообщишь в качестве результата; от тебя требуется придумать форму карточки, чтобы с ней было удобно работать. Возможно, тебе придётся указать точное положение букв на карточке (например, буква слева или буква справа).
« Последнее редактирование: 15-10-2006 12:59 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #105 : 15-10-2006 13:34 » 

Заголовок карточки < ф/f >
На карточке написана буква которая нам дана:
Буква "ф"
Ниже написано:
Перевод "f"

дана карточка
дана буква
данная карточка соответствует нужной нам букве

Правило перевода:
находим на карточке слово перевод
ищем после слова перевод значение этой буквы, обозначенное в ковычки ""
если это значение найдено  тогда
берём это значение и записываем на лист бумаги

Обратный перевод:

Находим на карточке букву после слова перевод в ковычках
если это значение найдено тогда
Находим на карточке букву, которая стоит выше слова перевод в ковычках ,после слова Буква
если такое найдено -тогда записываем это найденное значение на листе бумаги
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #106 : 15-10-2006 13:43 » 

Кажется, ты не понял мысли. Нет двух разных действий: "Прямой перевод" и "Обратный перевод". Есть одно (возможно, сложное) действие "Перевод". И результат должен получаться один - перевод исходной буквы, записанной одним алфавитом, в букву, записанную другим алфавитом. У тебя же получилось 2 алгоритма, а не единый общий универсальный алгоритм.

Допустим, у тебя есть карточка, на которой в верхней части написано "Ф", а в нижней части написано "F". Тестовый пример для твоего алгоритма: 1) тебе сообщили букву "Ф" - твой алгоритм должен вернуть "F"; 2) тебе сообщили букву "F" - твой алгоритм должен вернуть "Ф". Напиши такой алгоритм, чтобы он  мог обрабатывать оба тестовых случая.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #107 : 15-10-2006 14:38 » 

Если буква является буквой английского алфавита тогда {
  начинаем поиск русской буквы в верхней части карточки
  если нашли, тогда выводим её на лист бумаги
  завершаем работу}
Если буква является буквой русского алфавита тогда{
  начинаем поиск английской буквы в нижней части карточки
  если нашли ,тогда выводим её на лист бумаги
  завершаем работу}
« Последнее редактирование: 15-10-2006 15:18 от FallenSoul » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #108 : 15-10-2006 14:59 » 

Ещё раз к вопросу об универсальности алгоритма. Почему непременно в верхней части русская буква, а в нижней части английская буква? Что-нибудь изменится в алгоритме, если буквы будут расположены наоборот? Если что-то изменится, будет ли это изменение существенным для основной идеи алгоритма? А если изменить алфавит с английского на немецкий, нужно ли, по-твоему, писать новый алгоритм, разрабатывать новую карточку? Имеет ли значение для алгоритма то, что алфавиты непременно русский и английский, или достаточно знать, что это разные алфавиты? А можно ли использовать карточку для перевода букв одного и того же алфавита только строчных в прописные и обратно? Ответь на эти вопросы.

Цитата: FallenSoul
Ждем пока сообщат букву
Чего ждём? По условию буква уже сообщена. Зачем это действие?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #109 : 15-10-2006 15:26 » 

1. Сверху или снизу-разницы быть не должно. Хоть правом верхнем, и левом нижнем углу- лишь бы это было заранее обговорено и понятно человеку который будет выполнять действие этого алгоритма. (мы ведь пока про программу не говорим ... )
2. Изменится, т.к. если дана английская буква и сверху будет английская буква , а мы ищем соответсвующую ей русскую вверху-то мы не получим результата.
3. Изменится. Пункт 2
4. Да, т.к. мы не получим результат
5. Алгоритм новый писать не нужно будет-т.к. у нас основа уже есть. Нужно будет подкорректировать. А с карточками -да. Разумеется, ведь немецкие буквы тоже ни откуда не возьмутся
6. Достаточно знать что языки разные
7. Можно, однако надо корректировать алгоритм и задавать ему новые параметры перевода: параметр перевода не на другой язык, а на другой шрифт.

Всё это для конкретного алгоритма выше.
Как я понимаю-речь идёт о том, чтобы задать все параметры непосредственно до самого кода алгоритма, а не в нём-для удобства и простоты корректировки под любого пользователя. Достаточно будет указать нужные нам языки в переменных , их расположение и откорректировать карточки.
« Последнее редактирование: 15-10-2006 15:31 от FallenSoul » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #110 : 15-10-2006 17:35 » 

Так, понятно.

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

У каждой вещи с точки зрения логики есть два смысла: внешний и внутренний. Внешний смысл вещи - это возможность её применения, ответ на вопрос "зачем нам эта вещь нужна"? Внутренний смысл - это свойства вещи, ответ на вопрос "что эта вещь собой представляет?"; вещь обладает этими свойствами в силу своего существования и вне зависимости от того, как и для чего мы этими свойствами можем воспользоваться. Внешний и внутренний смыслы почти всегда различаются, и их соотношение определяется прагматикой. Например, ты видишь дерево. Дерево само по себе имеет определённые свойства: высоту, твёрдость и цвет древесины, ширину ствола, ветвистость и размер кроны, запах и т.д. - все эти свойства являются составными частями внутреннего смысла дерева. Внешних смыслы дерева определяются способами его использования человеком: если человек ищет тень, его интересует высота, размер кроны и густота листвы - эти свойства являются важными, а всё прочее несущественно; если человек хочет из дерева сделать скамью, его будут интересовать длина и ширина ствола, количество сучков, твёрдость и лёгкость обработки древесины, возможно цвет и запах древисины, а всё прочее не является несущественным; если человек хочет изобразить дерево на картине, его будут интересовать ветвистость, форма кроны и ствола, цвет листвы и коры, наклон ствола и т.д. Почти всегда всякая вещь имеет более широкий внутренний смысл, нежели наше прагматичное отношение к ней, выражаемое во внешнем смысле.

То же самое относится и к твоей будущей программе. У неё есть внешний смысл, определяемый тем, что хочет увидеть твой преподаватель. Преподаватель хочет увидеть, что твоя программа переводит слово, записанное латиницей, в слово, записанное кириллицей и обратно. Кроме того, твоя программа имеет ещё один внешний смысл - это твоё желание изучить технику программирования, и желание твоего преподавателя обучить тебя этой технике. Но чтобы изучить эту технику, нужно понять, что программа строится на основе алгоритма и некоторых данных. Про данные мы пока говорить не будем, ограничимся лишь алгоритмом. Алгоритм для твоей программы обладает некоторым внутренним смыслом, далеко выходящим за рамки твоей учебной задачи.

Хороший алгоритм - это алгоритм, позволяющий за минимально возможное количество шагов решать многие задачи некоторого определённого класса. Чем более широк решаемый алгоритмом класс задач, тем более универсален такой алгоритм, его можно использовать для решения бОльшего количества задач без всяких модификаций. Так же, как дерево пригодно и для создания тени, и для украшения города, и для изготовления мебели, так и твои алгоритмы, если хорошо составлены, будут пригодны для решения разных задач. Две задачи тебе уже известны: перевод букв с одного алфавита в другой и перевод букв с одного регистра в другой. А ещё есть масса других задач, которые может решать твой алгоритм, например, незатейливая шифровка/расшифровка слов, если в качестве одного алфавита взять буквы известных алфавитов, а в качестве второго - тайнопись (например, пляшущих человечков из рассказов про Шерлока Холмса). Каждая из этих задач определяет внешний смысл твоего алгоритма, но все они решаются одним и тем же алгоритмом в силу того, что он обладает определёнными свойствами - неким внутренним смыслом, отличным от всех его внешних смыслов. И для решения всех этих задач нет никакой нужды вносить какие-либо изменения в твой алгоритм, если это хороший алгоритм. Разница в работе программы для решения каждой задачи будет определяться не запрограммированным алгоритмом, а набором данных. В нашем случае - набором карточек-правил. Для каждой задачи будет свой набор карточек-правил. При этом сами карточки будут одинаковыми по форме - содержать две буквы, обозначающие одно и то же, но пишущиеся различно, либо относящиеся к разным алфавитам.


Цитата: FallenSoul
2. Изменится, т.к. если дана английская буква и сверху будет английская буква , а мы ищем соответсвующую ей русскую вверху-то мы не получим результата.
Как записать алгоритм таким образом, чтобы алгоритму было безразлично, в каком месте карточки какого алфавита буква находится? Фактически, ты такой алгоритм почти написал, просто в твоём алгоритме нужно убрать несущественные и поэтому лишние уточнения.

Цитата: FallenSoul
7. Можно, однако надо корректировать алгоритм и задавать ему новые параметры перевода: параметр перевода не на другой язык, а на другой шрифт.
Какой ещё параметр алгоритма? Откуда взялся этот параметр? Когда я перечислял условия, я где-нибудь указывал такое условие, как значение некоторого "параметра перевода"? Входы и выходы алгоритма:
Цитата: dimka
тебе сообщили букву; тебе дали карточку-правило, на которой записана сообщённая тебе буква (т.е. не надо проверять, соответствует ли карточка букве); ... в результате работы твоего алгоритма получится буква другого алфавита, которую ты сообщишь в качестве результата;
Где здесь упомянут "параметра перевода"? Говорилось о направлении перевода, но, поскольку ты включил в свой алгоритм прямой и обратный перевод, это направление теперь не имеет значения для твоего алгоритма и не является ограничивающим твой алгоритм условием.

Цитата: FallenSoul
6. Достаточно знать что языки разные
Достаточно знать, что на карточке разные буквы. Вот из этого и исходи при построении алгоритма, не делая никаких неоговоренных допущений (вроде принадлежности одной буквы русскому, а другой буквы английскому алфавитам). См. правило третье. Содержательный смысл твоего алгоритма не зависит не только от конкретных алфавитов букв, но даже от того факта, что на карточке всегда указываются буквы разных алфавитов. Для твоего алгоритма, для его основной идеи все эти сведения являются лишними, затемняющими суть дела. В твоём алгоритме не должно быть упоминания о лишних сведениях. У юристов есть формулировка: отказать в приобщении к делу доказательств, не относящихся к существу дела. У программистов есть нечто похожее. Набор условий, в рамках которых разрабатывается алгоритм, должен быть необходимым и достаточным: в нём не должно быть пропущено ничего важного, в нём не должно содержаться ничего несущественного. Уметь отличать важное от неважного - суть искусства программирования (и не только программирования), это навык абстрактного мышления.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #111 : 15-10-2006 18:21 » 

Если мы пишем универсальный алгоритм-который будет содержать большое кол-во функций для различных задач- тогда убрать лишнее весьма затруднительно, т.к. судить по тому-что лишнее а что нет, надо из условия задачи которую поставил себе программист.
Что же мы пишем?! Четко по плану и максимально сжато: перевод рус.англ.-обратный англ.рус-завершение задачи. Я правильно понял? Тогда думаю самым необходимым для нашего алгоритма является:

слово
2 языка
карточки с правилами перевода
лист бумаги

Из всего написанного выше, я так понимаю- мне надо составить окончательный и неимеющий ничего лишнего алгоритм перевода русских и английских слов без сочитаний?!
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #112 : 15-10-2006 19:46 » 

Цитата: FallenSoul
Если мы пишем универсальный алгоритм-который будет содержать большое кол-во функций для различных задач- тогда убрать лишнее весьма затруднительно, т.к. судить по тому-что лишнее а что нет, надо из условия задачи которую поставил себе программист.
Так вот в том-то и дело, что хороший универсальный алгоритм не содержит большого количества функций - по функции для каждой задачи. Одна функция применима для решения всех задач. Просто эта функция более абстрактна, нежели решаемые с её помощью конкретные задачи. Именно потому, что тебе это по какой-то причине не уяснить, у тебя получился тот код, который ты выложил на предыдущей странице.

Цитата: FallenSoul
Что же мы пишем?! Четко по плану и максимально сжато: перевод рус.англ.-обратный англ.рус-завершение задачи. Я правильно понял?
Правильно, но эта цель достигается не столь прямолинейно, как ты это делаешь. Возьмём примеры из математики, где всё построено на различных абстракциях. Например, операция сложения двух чисел. Если мы пишем "2+2" и пишем "2+3" - это разные операции сложения, между которыми нет ничего общего? Если это так, то тебе придётся запоминать результаты операций сложения всех возможных сочетаний двух чисел. Полагаю, ты это не делаешь. Ты воспринимаешь операцию сложения в абстрактной алгебраической форме "x+y", подставляя в качестве x и y произвольные числа - главное в ней знак операции "+", отличающий её от других операций, например, умножения, и тот факт, что x и y являются, например, числами (хотя могут быть и матрицами, и многочленами и другими математическими объектами). И ты держишь в памяти результаты операций сложения однозначных (максимум, двухзначных чисел), а числа большего размера ты складываешь, пользуясь общим для всех чисел алгоритмом сложения в столбик, известным тебе со школы, который основан на очень малом количестве результатов сложении однозначных чисел. Так или не так?

Если так, то и в отношении операции перевода слов поступать нужно аналогично. Нет разных операций для перевода с кириллицы на латиницу и для перевода латиницы в арабскую вязь. Это одна абстрактная операция, которую выполняет один и тот же алгоритм перевода символов из одного множества в символы другого множества. В данном случае это полностью эквивалентно математическому понятию функции - отображению элементов одного множества в элементы другого множества или того же самого множества, например, f : R -> R - функция отображения чисел из множества действительных чисел в числа из того же самого множества. Полагаю, что за истекших 1,5 месяца в каком-либо из твоих курсов по математике (например, в курсе математического анализа) уже дошли до понятия функции. Твоя функция задана в табличном виде - в виде набора карточек отдельных операций преобразования.

Зачем вводятся абстракции? Для того, чтобы сделать решение проще (часто короче) и универсальней. Например, тобою записанный на предыдущей странице код можно сократить в несколько десятков раз - он будет лучше читаем тобой и посторонними людьми, он будет занимать меньше памяти в компьютере, в него легче будет вносить изменения, если это понадобится (например, преподаватель на защите попросит тебя добавить какое-нибудь дополнительное действие).
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #113 : 16-10-2006 02:10 » 

Собственно, начинать склеивать алгоритм для перевода букв?!
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #114 : 16-10-2006 05:27 » 

Цитата: FallenSoul
Собственно, начинать склеивать алгоритм для перевода букв?!
Ты ещё не написал удовлетворительного алгоритма "Применить правило". Потом будет алгоритм "Найти карточку", но не раньше, чем ты сумеешь записать "Применить правило" в удовлетворительном виде, потому что "Найти карточку" будет в значительной степени зависеть от твоего подхода к содержимому карточки.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #115 : 16-10-2006 12:16 » 

Сегодня на практике узнал, что с помощью какой-то команды не обязательно будет постоянно жать Enter при вводе новой переменной. Это возможно поможет моей программе ...

Так. Применить правило...
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #116 : 17-10-2006 13:52 » 

Применить правило. =\
Нужен алгоритм который выполняет дествия между найти картчоку и записать букву на лист.
Этот алгоритм должен включать в себя перевод буквы с одного языка на другой. Только перевод- остальное будут делать другие алгоритмы. Хм. Допустим картчоку нашли.

хм. предположим:
Ищем перевод буквы "ф".
ф = f

смотрим на карточку
начинаем сравнение содержимого карточки с буквой которую нам надо перевести
если содержимое карточки содержит то что на надо перевести тогда
  нам надо,исходя из конструкции картчоки, найти значение, которое стоит на карточке после нашей буквы и знака равно
  если таковое значение имеется тогда мы извлекаем это значение( запоминаем )
  заканчиваем работу с карточкой,-откладываем её в сторону
  вспоминаем значение переведённой буквы, и записываем его на листе бумаги. Все переведённые буквы записываем слева на право
 
Вот собственно правило перевода отдельной буквы Здесь была моя ладья...
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #117 : 17-10-2006 15:03 » 

Цитата: FallenSoul
смотрим на карточку
начинаем сравнение содержимого карточки с буквой которую нам надо перевести
если содержимое карточки содержит то что на надо перевести тогда
  нам надо,исходя из конструкции картчоки, найти значение, которое стоит на карточке после нашей буквы и знака равно
  если таковое значение имеется тогда мы извлекаем это значение( запоминаем )
  заканчиваем работу с карточкой,-откладываем её в сторону
  вспоминаем значение переведённой буквы, и записываем его на листе бумаги. Все переведённые буквы записываем слева на право
Вот, уже прогресс. Почему именно так, станет понятно, когда доберёмся до кода.

Есть два уточнения:
1) "после нашей буквы и знака равно" - лишняя фраза. Достаточная фраза "другой знак".
2) "Другой знак" может быть как буквой, так и отсутствием буквы, но для простоты будем считать, что он всегда является буквой.

Т.е. суть алгоритма "Применить правило" очень короткая: сообщить другой знак.

Самый алгоритм состоит из одного условия:
Если первый попавшийся знак равен данной нам букве, сообщить другой знак, иначе сообщить первый знак.

Вот и всё. Сравни с тем, что ты писал выше про русские буквы, про верхи/низы, про слова "Буква" и "Перевод". Это всё совершенно не относится к делу.

Алгоритм верен, поскольку по условию на карточке всегда есть данная нам буква, и знака всегда два. Задача алгоритма, если он умеет переводить в обе стороны, определить, какой из двух знаков сооветствует букве и выбрать другой знак. Если один знак соответствует букве, то сообщаем другой знак. Если один знак не соответствует букве, значит другой знак обязательно соответствует букве (по условиию задачи), а для него другим является первый знак, поэтому мы смело можем сообщить в качестве ответа первый знак.

Итак, разобравшись с тем, что представляет собой карточка, и выяснив, что на карточке для тебя действительно важно, а что несущественно, ты можешь переходить к составлению алгоритма "Найти карточку". Этот алгоритм также будет использовать структуру карточки и должен учитывать то, что на карточке нет первой и второй буквы, нет "буквы" и "перевода", а есть лишь обязательно две буквы. Условия: тебе сообщается буква, тебе даётся колода карточек, структура каждой карточки тебе известна (см. выше); тебе требуется найти и выдать ту карточку, которая соответствует сообщённой тебе букве. Предположим, что карточки в колоде перетасованы и имеют случайный порядок.
« Последнее редактирование: 17-10-2006 15:06 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #118 : 17-10-2006 18:09 » 

структура каждой карточки тебе известна (см. выше); тебе требуется найти и выдать ту карточку, которая соответствует сообщённой тебе букве. Предположим, что карточки в колоде перетасованы и имеют случайный порядок.

получена буква
на столе карточки
3. начинаем перебирать карточки сравнивая равна ли данная нам буква той, которая написана на карточке
  перебираем до тех пор, пока буква не будет равна той что на карточке
  как только нашли такую карточку
  берём значение после знака и записываем его на листе
  сразу после того как запишем букву, берём след. букву и переходим на пункт 3
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #119 : 18-10-2006 06:01 » new

Цитата: FallenSoul
на столе карточки
Почему "на столе"? Может "в руке". Ты во всякий свой алгоритм добавляешь совершенно несущественные детали. Одно дело, как ты себе представил процесс, другое дело, где в этом процессе суть, а где излишние подробности. Записывать надо первое, старательно удаляя второе.

Цитата
сравнивая равна ли данная нам буква той, которая написана на карточке
Вот это требует подробностей. Известно, что на карточке две буквы, поэтому из такой формулировки нельзя точно понять, с какой буквой на карточке происходит сравнение.

Цитата: FallenSoul
  как только нашли такую карточку
  берём значение после знака и записываем его на листе
  сразу после того как запишем букву, берём след. букву и переходим на пункт 3
Что это? В условии ясно написано:
Цитата: dimka
тебе требуется найти и выдать ту карточку, которая соответствует сообщённой тебе букве
А ты что написал?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: 1 2 3 [4] 5   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines