Написать программу по которой компьютер приветствовал бы только своего хозяина
До сих пор Вы использовали линейные алгоритмы, т.е. алгоритмы, в которых все этапы решения задачи выполняются строго последовательно. Сегодня Вы познакомитесь с разветвляющимися алгоритмами.
Определение. Разветвляющимся называется такой алгоритм, в котором выбирается один из нескольких возможных вариантов вычислительного процесса. Каждый подобный путь называется ветвью алгоритма.
Признаком разветвляющегося алгоритма является наличие операций проверки условия. Различают два вида условий - простые и составные.
Простым условием (отношением) называется выражение, составленное из двух арифметических выражений или двух текстовых величин (иначе их еще называют операндами), связанных одним из знаков:
< - меньше, чем.
> - больше, чем.
<= - меньше, чем. или равно
>= - больше, чем. или равно
<> - не равно
= - равно
Например, простыми отношениями являются следующие:
В приведенных примерах первые два отношения включают в себя переменные, поэтому о верности этих отношений можно судить только при подстановке некоторых значений:
-
если х=25, у=3, то отношение x-y>10 будет верным, т.к. 25-3>10
Проверьте верность второго отношения при подстановке следующих значений:
Определение. Выражения, при подстановке в которые некоторых значений переменных, о нем можно сказать истинно (верно) оно или ложно (неверно) называются булевыми (логическими) выражениями.
Примечание. Название “булевые” произошло от имени математика Джорджа Буля, разработавшего в XIX веке булевую логику и алгебру логики.
Определение. Переменная, которая может принимать одно из двух значений: True (правда) или False (ложь), называется булевой (логической) переменной. Например,
Задача. Вычислить значение модуля и квадратного корня из выражения (х-у).
Для решения этой задачи нужны уже знакомые нам стандартные функции нахождения квадратного корня - Sqr и модуля - Abs. Поэтому Вы уже можете записать следующие операторы присваивания:
В этом случае программа будет иметь вид:
Казалось бы задача решена. Но мы не учли области допустимых значений для нахождения квадратного корня и модуля. Из курса математики Вы должны знать, что можно найти модуль любого числа, а вот значение подкоренного выражения должно быть неотрицательно (больше или равно нулю).
Поэтому наша программа имеет свою допустимую область исходных данных. Найдем эту область. Для этого запишем неравенство х-у>=0 и решив его получим х>=у. Значит, если пользователем нашей программы будут введены такие числа, что при подстановке значение этого неравенства будет равно True, то квадратный корень из выражения (х-у) извлечь можно. А если значение неравенства будет равно False, то выполнение программы закончится аварийно.
Задание. Наберите текст программы. Протестируйте программу со следующими значениями переменных и сделайте вывод.
Каждая программа, насколько это возможно, должна осуществлять контроль за допустимостью величин, участвующих в вычислениях. Здесь мы сталкиваемся с разветвлением нашего алгоритма в зависимости от условия. Для реализации таких условных переходов в языке Паскаль используют операторы If и Else, а также оператор безусловного перехода Goto.
Рассмотрим оператор If.
Для нашей задачи нужно выполить следующий алгоритм:
Запишем его с помощью оператора If. Это будет выглядеть так.
Теперь в зависимости от введенных значений переменных х и у, условия могут выполняться или не выполняться.
В общем случае полная форма конструкции условного оператора имеет вид:
Условный оператор работает по следующему алгоритму.
Сначала вычисляется значение логического выражения, расположенного за служебным словом IF. Если его результат истина, выполняется <оператор 1>, расположенный после слова THEN, а действия после ELSE пропускаются; если результат ложь, то, наоборот, действия после слова THEN пропускаются, а после ELSE выполняется <оператор 2>.
Управляющая структура if может показаться негибкой, так как выполняемые действия могут быть описаны только одним оператором. Иногда может потребоваться выполнение последовательности операторов. В этом случае хотелось бы заключить всю последовательность в воображаемые скобки. В Паскале предусмотрен этот случай.
Если в качестве оператора должна выполниться серия операторов, то они заключаются в операторные скобки begin-end. Конструкция Begin . End называется составным оператором.
Определение. Составной оператор - объединение нескольких операторов в одну группу. Группа операторов внутри составного оператора заключается в операторные скобки (begin-end).
С учетом полученных знаний преобразуем нашу программу.
Составным оператором является и такой оператор
Cимвол “;” в данном случае разделяет оператор присваивания S:=0 и пустой оператор.
Пустой оператор не влечет никаких действий и в записи программы никак не обозначается.
Например, составной оператор
включает лишь один пустой оператор.
Если Вы обратили внимание, программа на языке Паскаль всегда содержит один составной оператор - раздел операторов программы.
Внимание! Перед служебным словом Else разделитель (точка с запятой) не ставится.
Отметим, что большинство операторов в программах на языке Паскаль заканчиваются точкой с запятой, но после некоторых операторов точка с запятой не ставится. Сформулируем общие правила употребления точки с запятой:
-
Каждое описание переменной и определение константы заканчиваются точкой с запятой.
Рассмотрим еще один пример.
Задача. Вывести на экран большее из двух данных чисел.
Можно также использовать и сокращенную (неполную) форму записи условного оператора. Эта форма используется тогда, когда в случае невыполнения условия ничего делать не надо.
Неполная форма условного оператора имеет следующий вид.
Тогда если выражение, расположенное за служебным словом IF. в результате дает истину, выполняются действия после слова THEN, в противном случае эти действия пропускаются.
Задача. Составить программу, которая, если введенное число отрицательное меняет его на противоположное.
Всем привет и это очередной бесполезный трюк от блога Компьютер76, в котором я покажу, как научить свой компьютер приветствовать своего хозяина. Будучи в университете на первых курсах информатики, я был немного восхищён, когда компьютер электрическим голосом называл меня по имени. Позже оказалось, он умеет читать даже тексты. Сейчас в сети встречаются ролики, на коих вполне понятно излагается материал, воспроизводимый компьютером. Но мы начнём с малого.
Это прикол поможет вам поразить знакомых и близких, особенно малолетних, возможностями вашего электронного супер разума.
Как заставить компьютер приветствовать вас
Для начала создадим наш звуковой файл, в котором и пропишем те слова, которыми попросим компьютер приветствовать пользователя. Компьютер будет встречать меня в данном случае фразой на английском – звучит зловеще, к тому же можно подобрать любимую по голливудскому фильму фразу. Воспроизведение то ещё, так что меня компьютер иногда встречает фразой:
Приветствую тебя, мой повелитель! (…извините)
На языке великих Ньютона и Шекспира фраза будет написана как
I am greeting you, my master!
С фразой мы определились, теперь сформируем конкретный файл. Как всегда, это файл с расширением .vbs. Откроем утилиту Блокнот и вставим туда следующий код:
Dim speaks, speech
speech.Speak speaks
Сохраним документ под любым знакомым именем в любое доступное место с расширением .vbs. Прятать файл не от кого, это не вирус. Почти всё готово.
Если же вы захотите, чтобы скрежещущий голос постоянно приветствовал вас при загрузке системы, достаточно закинуть файл в папку автозагрузки. Как она выглядит, можно легко узнать, пройдя по пути Пуск – Все программы – Автозагрузка. Как расположить там необходимый вам файл, читайте в этой заметке.
Не моё, но фтему.
Теория ошибок является до смешного кратким введением в программирование. Все основные и второстепенные положения Теории проверены автором на практике и на коллегах, за что отдельное спасибо их вдовам и сиротам.
Эпиграф:
"Ошибки так же неисчерпаемы, как и атом"
Приписывается Карлу Марксу и его подельникам
Аксиома. В любой программе есть ошибки.
Следствие 1. В программе, состоящей из одного оператора, есть ошибки.
Следствие 2. В программе, состоящей из N операторов, есть по крайней мере N ошибок.
Следствие 3. В программе, состоящей из одного оператора, есть по крайней мере N ошибок.
Следствие 4. В любой программе содержится бесконечное число ошибок.
Следствие 5. Чтобы познать бесконечность, нужно быть не философом, а программистом.
Закон взаимосвязи программ и ошибок.
Для того, чтобы получить ошибки, надо написать программу.
Для того, чтобы получить программу, надо стараться избегать ошибок.
Следствие. Что бы вы ни делали - у вас будут получаться только ошибки.
Теорема обратимости программ и ошибок.
Всегда можно придумать программу, в которой будет не менее N ошибок.
И наоборот, всегда можно придумать ошибку, которая есть не менее, чем в N программах.
Закон пропорциональности.
Чем более программа необходима, тем больше в ней ошибок и наоборот.
Следствие 1. Совершенно ненужная программа ошибок не содержит.
Следствие 2. Ненужную программу невозможно создать ни за какие деньги.
Правило неоднозначности программ.
Даже две совершенно одинаковые программы содержат разные ошибки.
Народная примета. Сколько программистов - столько и программ.
Наблюдения системного администратора. Сколько программ - столько и неправильных результатов.
Фундаментальный закон Теории ошибок. На ошибках учатся.
Следствие 1. Программист, написавший программу, становится ученым.
Следствие 2. Чем больше программист делает ошибок, тем быстрее он становится ученым.
Следствие 3. По-настоящему ученый программист никогда не пишет правильных программ.
Замечание. На то он и ученый.
Указание начинающему программисту.
Если вы с первого раза сумели написать программу, в которой компилятор не обнаружил ни одной ошибки, сообщите об этом системному программисту. Он исправит ошибки в компиляторе.
Наблюдение системного программиста.
Если начинающий программист написал программу, которая сразу заработала, значит она состоит только из комментариев.
Закон находимости ошибок.
Программист может обнаружить ошибку только в чужой программе или не обнаружить нигде.
Следствие 1. Администратор не может обнаружить ошибку.
Следствие 2. Ошибке не все равно кто ее обнаружит.
Следствие 3. Индивидуальная программистская деятельность невозможна.
Закон общественной полезности программиста.
Каждый человек на Земле должен быть программистом.
Совет начинающему программисту.
Никогда не исправляйте найденных ошибок, ибо это повлечет за собой появление неизвестного числа ненайденных. Лучше опишите их в сопроводительной документации как особенность программы.
Памятка программисту.
1) Не следует делить очевидные ошибки на постоянные и исчезающие, а следует делить их на обнаруженные ранее, обнаруженные ранее и забытые, и на новые, которые обычно являются хорошо забытыми старыми.
2) Объектное программирование - надежное средство для написания необнаруживаемых ошибок.
Закон невозможности совершения ошибки.
Получить нужную ошибку искусственным путем невозможно.
Доказательство: Программируя нужную ошибку, вы допустите другую ошибку, в корне меняющую превоначальный замысел.
Следствие. Программирование с необходимыми ошибками - искусство.
Теорема о невозможности доказательства правильности программ.
Нельзя доказать, что программа не имеет ошибок.
Док-во: Не нужно доказывать, что в программе есть ошибки.
Определение.
Компьютерный вирус - маленькая живучая ошибка, у которой в результате мутации появились ноги и рот.
Закон Гиппократа.
Настоящий программист, давший клятву Гиппократа, не станет мучать компьютерный вирус. Он либо сделает вид, что не узнал его, либо незаметно для окружающих быстро пересадит его в свой компьютер.
На самом деле компьютеры могут программировать самостоятельно, просто не очень хорошо
Пользователь Quora Тихон Джелвис считает: для того, чтобы машины научились программировать, нужно больше данных, чем есть у учёных на сегодняшний момент, и, на самом деле, это лишь вопрос времени.
Джелвис видит две проблемы, которые мешают компьютерам программировать самостоятельно. Во-первых, не очень ясно, как рассказать машине, что именно нужно запрограммировать. Естественный язык тут не подходит, и учёные пока не могут прийти к единому мнению относительно решения этого вопроса.
Во-вторых, непонятно, как масштабировать полученные программы. Компьютеры могут писать код, решающий маленькие задачи, но написать программу, которая содержит в себе больше определенного количества инструкций, они не способны. Помимо того, что это число довольно маленькое (около сотни), на текст программы почти всегда должны быть наложены некие ограничения: например, не применять циклы.
Как объяснить компьютеру, что вам нужно
Основная сложность, по мнению Джелвиса, здесь в том, что пользователю должно быть проще рассказать компьютеру, что ему нужно, чем написать код самому — иначе в такой системе нет никакого смысла. Кроме того, у человека должна быть возможность убедиться, что машина занимается тем, чем ему нужно, и что код, который она выдаёт, написан правильно.
Есть очевидный способ объяснить компьютеру, что ему нужно сделать. Для этого нужно описать проблему на языке какой-нибудь формальной аксиоматической теории. Запрограммировать систему, считывающую вопрос и преобразующую его в текст, понятный машине, относительно просто. Однако далеко не все пользователи компьютера способны перевести задачу на язык математической логики. Поэтому такое решение не годится.
Другой подход — примерное описание алгоритма. Таким образом можно дать машине понять, чего от неё ждут. Компьютер сможет проанализировать полученные данные, «осознать», как должен работать алгоритм, и оптимизировать полученный код. Кроме того, текст, который пользователь отдаёт системе на обработку, совсем не обязательно должен быть правильный. Достаточно лишь приблизительно описать, что именно хочется получить человеку. Этот вариант гораздо сложнее реализовать, и пользователю всё равно будет нелегко сформулировать задачу — например, когда вообще неясно, как её решать.
Джелвис считает оптимальным следующий способ: пользователь передаёт в систему несколько пар вида (входные данные, выходные данные), а компьютер составляет алгоритм, который из входных данных получает выходные. Когда программа создана, она прогоняется на ещё нескольких парах, и так пока она каждый раз не будет выдавать нужные значения. К сожалению, пока реализовать такую схему невозможно.
В общем случае довольно сложно проверить написанный компьютером код на соответствие заданным условиям
На самом деле, слишком сложно, поясняет пользователь Quora Мариса Кирисаме. Задача разрешимости булевой функции NP-полна. Единственный на данный момент известный науке способ решить такую задачу — перебрать все возможные варианты.
Этот порог можно будет преодолеть — если математикам удастся доказать, что классы задач P и NP равны, однако наука занимается проблемой равенства классов уже много лет, и пока ответа на этот вопрос дать не удалось.
Кроме того, даже логика первого порядка является лишь полуразрешимой. Разрешимость — это свойство, позволяющее найти алгоритм, определяющий по аксиомам теории, принадлежит данная формула этой теории или нет. Полуразрешимость — более слабое свойство. Оно означает, что если формула не принадлежит теории, то работа подобного алгоритма никогда не завершится.
Конечно, существуют и разрешимые аксиоматические теории первого порядка — например, арифметика Пресбургера. Но сложность алгоритма, определяющего выводимость формулы в этой теории, экспоненциальная. Если точнее — O(2^(2^N)), где N — длина входных данных.
Кирасаме замечает: логика высказываний, которую нужно будет применять, чтобы распознать нужное решение, наверняка гораздо более высокого уровня, чем первого. И если даже она будет разрешимой, сложность нужного алгоритма, вероятно, окажется слишком большой.
Всё это значит, что компьютер может писать эффективные программы лишь для небольших задач. Для более глубоких вопросов это просто не имеет смысла — потому что проверить оптимальность, эффективность и правильность кода будет очень сложно.
Компьютеры не умеют программировать, потому что люди не хотят быть уничтоженными
Некоторые из пользователей Quora, высказавших своё мнение по этому вопросу, считают, что основная проблема — это неоднозначность самого существования искусственного интеллекта. Ведь, по сути, именно это и означает обучение машины программированию — таким образом в «мозг» компьютера будет заложена логика — то, что отличает робота от человека.
Если искусственный интеллект будет создан, совсем не факт, отмечает один из комментаторов по имени Сичу Лу, что люди продолжат своё существование на земле. Возможно, они будут уже не нужны компьютерам, которые смогут всем заниматься сами.
Читайте также: