Учебник Информатика 10 класс Углубленный уровень Поляков Еремин часть 2

На сайте Учебник-скачать-бесплатно.ком ученик найдет электронные учебники ФГОС и рабочие тетради в формате pdf (пдф). Данные книги можно бесплатно скачать для ознакомления, а также читать онлайн с компьютера или планшета (смартфона, телефона).
Учебник Информатика 10 класс Углубленный уровень Поляков Еремин часть 2 - 2014-2015-2016-2017 год:


Читать онлайн (cкачать в формате PDF) - Щелкни!
<Вернуться> | <Пояснение: Как скачать?>

Текст из книги:
ФГОС к. Ю. Поляков Е. А. Еремин углубленный уровень ФГОС к. Ю. Поляков, Е. А. Еремин ИНФОРМАТИКА УГЛУБЛЕННЫЙ УРОВЕНЬ Учебник ДЛЯ 10 класса в 2-х частях Часть 2 Рекомендовано Министерством образования и науки Российской Федерации к использованию в образовательном процессе в имеющих государственную аккредитацию и реализующих образовательные программы общего образования образовательных учреждениях Москва БИНОМ. Лаборатория знаний 2013 УДК 004.9 ББК 32.97 П54 Поляков К. Ю. П54 Информатика. Углублённый уровень : учебник для 10 класса : в 2 ч. Ч. 2 / К. Ю. Поляков, Е. А. Еремин.— М. : БИНОМ. Лаборатория знаний, 2013.— 304 с. : ил. ISBN 978-5-9963-1417-1 (Ч. 2) ISBN 978-5-9963-1152-1 Учебник предназначен для изучения курса информатики на углублённом уровне в 10 классах общеобразовательных учреждений. Содержание учебника опирается на изученный в 7-9 классах курс информатики для основной школы. Рассматриваются теоретические основы информатики, аппаратное и программное обеспечение компьютера, компьютерные сети, алгоритмизация и программирование, информационная безопасность. Учебник входит в учебно-методический комплект (УМК), включающий также учебник для 11 класса и компьютерный практикум. Предполагается широкое использование ресурсов портала Федерального центра электронных образовательных ресурсов (http://fcior.edu.ru/). Соответствует федеральному государственному образовательному стандарту среднего (полного) общего образования (2012 г.). УДК 004.9 ББК 32.97 Учебное издание Поляков Константин Юрьевич, Еремин Евгений Александрович ИНФОРМАТИКА. УГЛУБЛЁННЫЙ УРОВЕНЬ Учебник для 10 класса В двух частях Часть вторая Ведущий редактор О. Полежаева Ведущие методисты И. Сретенская, И. Хлобыстова Художественное оформление: И. Марев Художественный редактор Н. Новак Иллюстрации: Я. Соловцова, Ю. Белаш Технический редактор Е. Денюкова. Корректор Е. Клитина Компьютерная верстка: Л. Катуркина Подписано в печать 28.02.13. Формат 70x100/16. Уел. печ. л. 24,70. Тираж 10 000 экз. Заказ 49. Издательство «БИНОМ. Лаборатория знаний» 125167, Москва, проезд Аэропорта, д. 3 Телефон: (499)157-5272, e-mail: binom@Lbz.ru http://www.Lbz.ru, http://e-umk.Lbz.ru, http://metodist.Lbz.ru Отпечатано в ООО ПФ «Полиграфист», 160001, г. Вологда, ул. Челюскинцев, 3. ______________________Тел.: 8(817-2) 72-61-75; 8(817-2) 72-60-63.____ ISBN 978-5-9963-1417-1 (Ч. 2) ISBN 978-5-9963-1152-1 © БИНОМ. Лаборатория знаний, 2013 Оглавление Глава 6. Программное обеспечение........................5 § 38. Что такое программное обеспечение?.............5 §39. Прикладные программы...........................7 §40. Системное программное обеспечение.............21 §41. Системы программирования......................35 § 42. Инсталляция программ..........................43 §43. Правовая охрана программ и данных.............47 Глава 7. Компьютерные сети.............................54 §44. Основные понятия..............................54 §45. Структура (топология) сети....................59 § 46. Локальные сети................................63 § 47. Сеть Интернет.................................69 § 48. Адреса в Интернете............................74 § 49. Всемирная паутина.............................83 § 50. Электронная почта.............................90 §51. Другие службы Интернета.......................93 §52. Электронная коммерция.........................99 § 53. Право и этика в Интернете....................103 Глава 8. Алгоритмизация и программирование............109 § 54. Алгоритм и его свойства......................109 §55. Простейшие программы.........................111 §56. Вычисления...................................118 § 57. Ветвления....................................126 §58. Циклические алгоритмы........................134 § 59. Процедуры....................................144 I § 60. функции.....................................150 §61. Рекурсия....................................155 § 62. Массивы.....................................165 §63. Алгоритмы обработки массивов................170 §64. Сортировка..................................178 §65. Двоичный поиск..............................187 §66. Символьные строки...........................189 § 67. Матрицы.....................................206 §68. Работа с файлами............................211 Глава 9. Решение вычислительных задач на компьютере . . . 223 §69. Точность вычислений.........................223 § 70. Решение уравнений...........................227 § 71. Дискретизация...............................240 § 72. Оптимизация.................................246 §73. Статистические расчёты......................254 §74. Обработка результатов эксперимента..........261 Глава 10. Информационная безопасность................270 §75. Основные понятия............................270 § 76. Вредоносные программы.......................272 §77. Защита от вредоносных программ..............279 § 78. Шифрование..................................284 § 79. Хэширование и пароли........................288 § 80. Современные алгоритмы шифрования............290 §81. Стеганография...............................294 § 82. Безопасность в Интернете....................296 Навигационные значки.............................300 Глава 6 Программное обеспечение §38 Что такое программное обеспечение? Чтобы компьютер можно было использовать для решения каких-либо задач, на него нужно установить программное обеспечение (ПО, англ, software — «мягкое оборудование») — программы, выполняющие ввод, обработку и вывод данных. Основное отличие компьютера от простейшего калькулятора состоит именно в том, что компьютер может выполнять введённую в него программу автоматически, без участия человека. Обычно выделяют три вида программного обеспечения: прикладные программы, системные программы и системы программирования (рис. 6.1). Всех, кто работает с компьютерами, можно разделить на пользователей, системных администраторов и программистов (рис. 6.2). Рис. 6.1 Пользователи решают свои задачи с помощью прикладных программ (к ним относятся текстовые и графические редакторы, электронные таблицы, системы управления базами данных, программы для прослушивания музыки и просмотра видео, игры и т. п.). Системные программы обеспечивают согласованную работу всех узлов компьютера, а также удобный интерфейс (способ обмена данным) между пользователем и прикладными программами, с одной стороны, и аппаратными средствами компьютера — ■ Программное обеспечение с другой, к этой группе относятся операционные системы, драйверы (программы для управления внешними устройствами) и утилиты (служебные программы). Задача системных администраторов — настроить системное и прикладное ПО так, чтобы пользователи смогли нормально работать. Программисты создают новые программы с помощью систем программирования (инструментальных средств). До недавнего времени программное обеспечение было «привязано» к определённой операционной системе. Например, некоторые программы работают только под управлением Windows, а другие — только под управлением Linux. В последние годы разработано много кроссплатформенных программ, у которых есть версии для разных операционных систем. О Кроссплатформенная программа — это программа, у которой есть версии для различных операционных систем (например, Windows и Linux). Часто термин «программное обеспечение» понимают в широком смысле как целую отрасль, включающую все этапы разработки программ, в том числе тестирование (проверку программ, поиск ошибок) и разработку документации. прикладные программы §39 Контрольные вопросы 1. Назовите три типа программного обеспечения. Чем они различаются? 2. Какие задачи решают пользователи, программисты, системные администраторы? 3. Что означает слово «интерфейс»? 4. Что такое драйверы, утилиты? 5. Что обозначают английские термины hardware и software? 6. Какое ПО называется кроссплатформенным? е §39 Прикладные программы Текстовые редакторы Многие пользователи используют компьютер, прежде всего, для работы с текстами. Обычно различают редактирование текста {изменение содержания текста: замена, вставка и удаление символов и слов) и форматирование текста {юмвивние внешнего вида текста — выбор шрифта, изменение размера и цвета, разбивка на абзацы и т, п.), Простейшие программы этого класса — текстовые редакторы — умеют только редактировать текст. Они работают с файлами в формате «только текст» (англ, plain text), в которых хранятся коды символов без оформления. Современные редакторы умеют сохранять текст в разных кодировках, но чаще всего используются кодировки семейства UNICODE: UTF-16 (2 байта на символ для большинства символов) или UTF-8 (с переменным числом байтов на символ). Примеры текстовых редакторов: Блокнот м Notepad++ fnotepad-plus-plus.org) в рперацирнной системе Windows; • nano, gedit, KWrite и Kate в операционной системе Linux. На рисунке 6.3 показано окно текстового редактора KWrite. Е Программное обеспечение $айл Ормка £ид Закладки Сервис Ц^с^РОЙка £праака Щй Н0Й О ^^^i3CL0#e Вася пошел гулять.] Рис. 6.3 Основные возможности современных текстовых редакторов: ввод и редактирование текста; • создание, открытие, сохранение и печать документов типа «только текст»; работа с буфером обмена (копирование, вырезание, вставка); • отмена последних операций; • поиск и замена фрагментов текста; подсветка ключевых слов языков программирования (Си, Паскаль и др.) и языков разметки текста (XML, HTML, LaTeX); проверка орфографии. Текстовые редакторы часто используются системными администраторами для редактирования файлов с настройками программ (файлов конфигурации). Тексты программ тоже хранятся в формате «только текст», поэтому программисты набирают и редактируют их в текстовых редакторах. Офисные пакеты Для подготовки офисных документов возможностей текстовых редакторов недостаточно. Часто нужно применять в одном документе различные шрифты, выделять фрагменты (курсивом, подчёркиванием, маркером), добавлять таблицы, графики, рисунки и т. п. Кроме того, возникают и другие задачи: выполнение табличных расчётов, подготовка презентаций для выступлений и докладов, работа с базами данных и т. п. Набор программ для подготовки электронных документов называют «офисным пакетом». В офисный пакет обычно включаются: Щи Прикладные программы • текстовый процессор, который позволяет не только редактировать текст, но и оформлять его по стандартам современного делопроизводства; • табличный процессор — программа для выполнения расчётов с табличными данными; • программа для подготовки презентаций', • программа для работы с базами данных. Самые известные офисные пакеты — Microsoft Office (www.microsoft.com), Щ OpenOffice.org (openoffice.org) и WordPerfect Office (www.corel.com). Пакеты Microsoft Office и WordPerfect Office — коммерческие, a OpenOffice.org (a также его новую версию — LibreOffice) можно установить и использовать бесплатно. Кроме того, пакет OpenOffice.org — это кросс-платформенное ПО: существуют его версии для операционных систем Windows, Linux и Мэс OS. Текстовые процессоры — это следующий шаг в развитии текстовых редакторов. На рисунке 6.4 показано окно текстового процессора g OpenOffice.org Writer. В состав пакета Microsoft Office входит текстовый процессор Microsoft Word, который считается стандартным средством для оформления офисных документов. Все современные тексто- ^ OpenOffice.odt - OpenOffice.org Writer Файл Ораека Ёид В^таека Фоо^т Хаблица С@)вис ^но Спр^а Л |i2 J2| Ж а: н iB ' i#’ J 63 (б^ "Я Твт>е$ New Roman -1Д|х1 А X л<га I I "Ж d ш 12 13 Opendfl'ice.arg (ООо, ОО.о)|— это свободный пакет офисных приложен разработанный с целью предоставить альтернативу Microsoft Office как уровне форматов, так и на уровне интерфейса пользователя Одним из г стал поддерживать новый открытый Формат OpenDocument (Т50ЯЕС 2t Работает на платформах Microsoft Windows и UNIX-подобных платфор! 3NU/Linux. Mac OS X. FreeBSD. Solaris. Irix Writer Calc Текстовый процессор и редактор Web-страниц. Табличный процессор I Рис. 6.4 Программное обеспечение вые процессоры позволяют сохранять документы в форматах, совместимых с Word (DOC и DOCX). С помощью текстовых процессоров можно не только редактировать, но и форматировать текст (изменять его оформление). Кроме того, они позволяют: создавать составные документы, включающие списки, рисунки, таблицы, диаграммы; • использовать стили оформления (например, заголовки разного уровня); • использовать шаблоны (заранее оформленные заготовки) документов; • выполнять несложные вычисления в таблицах; сохранять документ в разных форматах, в том числе в HTML (как веб-страницу) и PDF (англ. Portable Document Format — переносимый формат документов). Табличные процессоры (электронные таблицы, англ. spreadsheet) — это программы для обработки табличных данных. В отличие от текстовых процессоров они не только хранят данные, но и позволяют выполнять с ними достаточно сложные вычисления, строить диаграммы, проводить анализ, делать прогнозы. Сейчас электронные таблицы — незаменимый рабочий инструмент экономистов, бухгалтеров, менеджеров. В состав пакета Microsoft Office включен табличный процессор Щ Microsoft Excel, а в пакете OpenOffice.org есть близкая по возможностям программа OpenOffice.org Calc. Компьютерная презентация (лат. praesentatio — представление) — это набор изображений {слайдов), который предназначен для иллюстрации доклада или выступления. Задача презентации — улучшить восприятие информации. В современных презентациях применяют технологии мультимедиа (от лат. multum — множество, medium — средство), т. е. в одном документе используют различные формы представления информации: текст, графику, звук, анимацию, видео. Для создания презентаций в пакете Microsoft Office применяется программа 'ja Microsoft PowerPoint, а в пакете OpenOffice.org — программа т OpenOffice.org Impress. Система управления базами данных (СУБД) — это ПО для поиска информации в базах данных, а также для создания и изменения баз данных. В пакет Microsoft Office входит СУБД Прикладные программы §39 Microsoft Access, а в пакет OpenOffice.org — СУБД tat OpenOffice.org Base. Онлайн-офис Бурное развитие Интернета привело к появлению онлайн-офисов (англ, online — «на линии») — специальных сайтов (интернет-сервисов), которые предоставляют основные возможности офисных пакетов: текстовый редактор, электронные таблицы, средства для создания презентаций. Для использования такой службы необходим компьютер с доступом в Интернет, причём не имеет значения, какая операционная система на нём установлена. Документы пользователей хранятся на сервере, для доступа к ним нужно зайти на сайт под своей учётной записью, которая защищена паролем. Самый известный онлайн-офис — Google Docs (docs.google.com). Одно из достоинств онлайн-офисов — возможность совместной работы над документами через Интернет. Другим пользователям можно также открыть доступ к отдельным документам для просмотра и/или изменения. Любой документ может быть экспортирован (сохранён) в файл на диске компьютера. Онлайн-офисы используют технологию, известную под названием «облачные вычисления» (англ, cloud computing). Ее суть в том, что пользователь размещает свои данные на серверах Интернета и не должен заботиться о способе их хранения, операционной системе и программном обеспечении. Слово «облако» — это метафора, образ достаточно сложной системы, детали работы которой знать не обязательно. Несмотря на удобства «облачных» сервисов, существуют опасения, что пользователь может потерять контроль над своими данными, и это чревато серьёзными проблемами. Например, иногда не удаётся полностью удалить данные, которые человек сам же разместил. Кроме того, возможна потеря данных и утечка информации. Поэтому документы ограниченного доступа не следует размещать на «облачных» сервисах. Графические редакторы Графические редакторы — это программы для создания и редактирования изображений. Изображения, хранящиеся в компьютере, делятся на растровые и векторные (см. § 16). С ними нужно работать по-разному, поэтому существуют отдельные программы для редактирования растровой и векторной графики, которые часто называют растровыми и векторными графические редакторами. Программное обеспечение Растровые редакторы предназначены для: обработки фотографий; • подготовки изображений к печати; • создания и редактирования изображений для веб-сайтов. Лучшим профессиональным растровым редактором считается программа Q Adobe Photoshop (www.adobe.com). Существуют её версии для операционных систем Windows и Мае 0S (для компьютеров фирмы Apple). Стандартным приложением Windows является растровый редактор ^ Paint, но для сложной обработки (например, для цветокоррекции фотографий) его возможности недостаточны. Бесплатная программа Gimp (gimp.org) — кроссплатфор-менная, она работает как в Windows, так и в Linux. На рисунке 6.5 показано окно программы Gimp. 'Л ч Ч ш в' ■ % / i А 4* 4? » IBP А е А й ш а /С л. & ж ^ Qp«M Bhaww* Иуабр*»**» Слое iB.y-....».Г:Г~/.иГ7ГГ7Т^г!^7^^ ....тГ. Рис. 6.5 Среди бесплатных растровых редакторов широкими возможностями обладает ^ Paint.NET (www.getpaint.net), но он пока устойчиво работает только в среде Windows. Прикладные программы t в последнее время были созданы бесплатные «онлайновые» редакторы (например, www.pixlr.com), которые позволяют обрабатывать изображения на специальной веб-странице в Интернете, без установки дополнительного ПО на компьютер пользователя. Векторные редакторы используются для подготовки: • художественных иллюстраций; • технических иллюстраций (схем, графиков); • логотипов, визиток, плакатов; • изображений для веб-сайтов (иконок, кнопок). Среди профессиональных векторных редакторов можно назвать двух лидеров — программы Adobe Illustrator (www.adobe.com) и ^ CorelDraw (www.coreLcom). В свободно распространяемый пакет OpenOffice.org входит векторный редактор t4 OpenOffice.org Draw. Бесплатный редактор Inkscape (www.inkscape.org) — еш;ё одна кроссплатформенная программа, работающая как в Windows, так и в Linux. На рисунке 6.6 показано окно редактора Inkscape. J02I2957.WMF - Inkscape £акп Оравка friA Слой (контур 1асст Фид&тры Васигрежя урав»са .JBLSi О й В fii I €1 О I ^ i oil ч; г ii ■ li ii; & «3 Ц il t? 17 - (о]ою“ jj v |c,o(e jj ^ |o,ooi jj !уд H:jJ .«^«яенныхс6ъо:т«,. м]* jj Рис. 6.6 юг оаммное обеспечение Во многих графических редакторах, например в Adobe Photoshop и Corel Draw, можно создавать документы, содержащие как растровую, так и векторную графику. Текстовые процессоры (Microsoft Word, OpenOffice.org Writer) позволяют вставлять в документ растровые и векторные рисунки. Во многих областях деятельности двумерных рисунков'недостаточно, и необходимо представить объект в трёхмерном пространстве. Такие задачи возникают, прежде всего, в архитектуре, кино, телевидении и компьютерных играх. С помощью трёхмерной графики (англ. 3D — 3 dimensions — «3 измерения») создаются многие современные мультфильмы. Для работы с трёхмерными объектами используют программы специального класса — программы ЗВ-моделирования (рис. 6.7), которые позволяют: определить форму (геометрию) объектов сцены; задать материалы для объектов; установить источники света; определить точки наблюдения (виртуальные камеры); • создать анимацию с трёхмерными объектами; Рис. 6.7 Прикладные программы • выполнить рендеринг, т. е. построить изображение трёхмерных объектов и сцены на плоскости или последовательность кадров анимации с учётом свойств объектов и источников света. Среди программ ЗВ-моделирования, работающих в системе Windows, наиболее популярна (i) 3D Studio MAX (usa.autodesk. com). В области кино и телевидения стандартом считается кросс-платформенная программа У Мауа (www.autodesk.com/maya), у которой существуют версии для операционных систем Windows, Linux и Mac OS. Среди свободно распространяемых программ наиболее известна кроссплатформенная программа Blender (www.blender.org). Алгоритмы работы с трёхмерной графикой достаточно сложны и требуют большого объёма вычислений. Поэтому для нормальной работы программ ЗВ-моделирования, особенно для выполнения рендеринга, требуется быстродействующий процессор и много оперативной памяти. Настольные издательские системы В любом современном издательстве для подготовки к печати книг и журналов используется специальное программное обеспечение — настольные издательские системы (англ. DTP — DeskTop Publishing — «настольное издательство»). Основное отличие этих программ от текстовых процессоров состоит в том, что в них можно выполнять вёрстку — точно задавать расположение текста, рисунков, таблиц и другого материала на странице в соответствии с типографскими правилами. В настольной издательской системе готовят оригинал-макет (изображение, точно совпадающее с будущим отпечатком) и отправляют его в типографию. Долгое время для подготовки оригинал-макетов использовались настольные издательские системы (§) QuarkXPress (www.quark, com), Corel Ventura и Adobe PageMaker; сейчас конкуренцию им составляют 13 Adobe InDesign (www.adobe.com) и бесплатная программа (21 Scribus (www.scribus.net), окно которой показано на рис. 6.8. В состав пакета Microsoft Office входит программа вёрстки (|| Microsoft Publisher с несколько меньшими возможностями. Вёрстку несложных изданий (например, визиток, буклетов) можно выполнить в программе ^ CorelDraw, но профессионалы не рекомендуют её использовать. Программное обеспечение Scribus 1.3.3.14 - [Brochure^l*] _______________________ I £ann Ораека Ступ» Объект Вставка Стракха Paoitvewe Сценарии Oi^ Ovawa ч И® «I ^д^ЯЙниУл /| Ш1 ••f — жт о--------- г Школьн/^ жизнь ч .J I ipfium dolor sit amot, con-Г adlplsclng oHt. Ut a apion. Allquam aliquot purus » dolor. Intogor qida oros t erat posuere dictum. CurabW-|ur dignisslm. Intogor orcl. Fusco ulputato lacus at Ipsum. uisquo In liboro noc ml laoroot at. Aliquam oros podo, squo quis, trlstlque , placorat convallis, volK. Nam condbnontum. NuHa ut I «• jj|uiUD4 31 2Г о w T«MMsa X-Pos: И3.933 twn Iy-Pos: -2.469 yd Рис. 6.8 Лучшая система подготовки математических текстов называется TgX (www.ctan.org). Её разработал известный американский математик и специалист по теоретической информатике Д. Кнут. Система TgX — бесплатная и кроссплатформенная, она принята в качестве стандарта во многих российских и зарубежных издательствах, выпускающих математическую литературу. Редакторы звука и видео Аудиоредакторы — это программы для редактирования звуковых файлов. С их помощью можно: загружать, редактировать и сохранять звуковые файлы разных форматов; записывать звук с микрофона или другого источника; вырезать фрагменты из файла; • соединять звуковые фрагменты в один файл; Прикладные программы • изменять громкость и темп звука; » удалять шумы. Самые известные аудиоредакторы — это Q Adobe Audition (www.adobe.com), Sound Forge (www.sonycreativesoftware.com), a Audacity (audacity.sourceforge.net). В отличие от первых двух программ Audacity — бесплатный продукт, существующий для многих операционных систем (Windows, Linux, Mac OS). На рисунке 6.9 показано окно программы Audacity. ■ iDlxl $айл Qpaw) 45 1:00 xlKareia ▼ 1.0 Стерео, 441 ООН; 32-ЫИ1оа( 0,5 ^ COJW 1 0.0 ■ 0 ' Л ^ п •0,5 и 1,0 1,0 0,5 0.0 -0,5 Частота проекта 44100 ' 'Курсор 000,000000 миксек [Привязка еьаслкмема] .л Рис. 6.9 Видеоредакторы предназначены для создания и редактирования цифрового видео. Их основные возможности: ввод данных с видеокамеры; коррекция цвета; добавление, перестановка, удаление фрагментов фильма; добавление звука и титров; сохранение фильма в различных цифровых видеоформатах; создание DVD-дисков. ■ программное обеспечение Среди коммерческих программ этого типа наиболее популярны Adobe Premier (www.adobe.com), 0k Pinnacle Studio (www.pinnaclesys.com), ^^VideoStudio Pro (www.corel.com), Vegas Pro (www.sonycreativesoftware.com). Ha компьютерах фирмы Apple используется видеоредактор iMovie (www.apple.com). Существуют и бесплатные видеоредакторы, например программа Kino для операционной системы Linux (kinodv.org), окно которой показано на рис. 6.10, программа VirtualDub (www.virtualdub.org) для Windows и кроссплатформенная программа ” Avidemux (www.avidemux.org). ЯШШШЕ £|1* yww Storyboard *, К « i iMHoe обеспечение 1 4 Входящие - MoztOa Thunderbird $айл О>я0кв вид Qeptxpj Соо^ёние |^71>уиенты Ораока rtony^fTb • Соэдвть Э Адрескав ю*г« ! ^х^Матка • 1^, Поно'во всех сообшеннял Q | 1 (? вкодячпе ] J Все папки Щ 7Т От 1#1 Ава *JJ^| Ответ на анкету *Вопрос адевеес. ^ Новое спецлредвожение в schlB39f>arodxu в news#rene -eduju • 16.06.2009 20:51 ^ • 19.0В.2009 6Ю4 school 1БЭфта11хи (/Dll) 1 Цудале»»** - Ш Помаиьныс папки 0Удалб»*м (^Исходяиие Ответ на анкету *Вопрос ад»ев<.. в schl63i#rtaro b«t«.-' prp;«ctl,Tp} £i»» £e« §#vch yww £roj«ci gun £,ftartco*»i<«>i:uN:^ 0»иСо«>гЫ| tbib f>Vt^|syned ln&p«CtOf^;S. H Пдьа! Ijll.lv M«m.1 TMainM«fiu TPopupMtnu TM*mo ^Acro-4t5fi TActomm ^rma^n* Tfa»«9t Л Ac c4 i£ inProp?*£*»t! ■ ТАеГ- zi^ PrCpWHt АСЪОП Ac4kV«CyM CJp6№ OjChUesema CNn*4*ie4 CMflCW.!»» Cotor EJConftreinb CUTMT 6otik.ru - FifeZiHa £еддгп1ров»*« ^ид Оередача Сервер ^ладги Оонощь gCSt ^ х| iSocr; Г jjNR пользомтеля Р Пароць; Г Оорт: ------3 <С**анда; RETR gcc-2.7.2*2.7.2.l.dff.gz Ответ: 150 Openng BINARY mode date connection for 9CC'2.7.2‘2.7.2.I.dff.92 (18029 bytes) Ответ: 226 Transfer complete. Статус: Файл передан успеиею, передан 18 029 байт е 1 секунда Статус: Отклонен от сервера * Удапегеа>и сайт; I /рсЬ/дгк4 Лр1салы«>»1 сайт: D:^OLAK\DOC\ ^MY li) Persons ^Инфорнатика ^Г^юфильное обуне»е« ^иЗксп» ii№l06_anpenb.doc Щ7.(к)с 42 496 154 624 Папка С фай; Папка с фай; Папка с фай; Пагкасфай; Пагкасфай; ДокунентМс Докунент Мх Э8 файлов и 5 каталогов. Общий размер: 2 5Э4 897 байт ТгоФаЙла ! Последнеемзм... I Права ^ 219 183 ApxmWinAAft Арх>« ViWtAP Арх»« WmRAR Архив WlrAAR Архив WirAAR Архив WirAAR Арх>« WYAAR 27.12.1994 21.10.1996 13.01.1996 29.02.1996 25.09.1996 03.01.1995 08.11.1994 -fW-r-r** -rw-r-r~ -rw-r--r— 9 файлов, обцрй размер: 9 502 588 байт _____________________________ радаийвГп^то • Рис. 7.20 ■ Го Содержагвге /bases/apu/ <- -> с л ☆ ftp;//ftp.kaspersky.comA)ases/a ► Q' Л- Содержание /bases/apu/ Имя Размер Последнее изменение Гродительский каталог! apu-0607g anl 1821 В 18.03.10 11:15:00 apu-0607g xml dif 621В 18.03.10 11:15:00 aDU-0607g xml kk 962 В 18.03.10 11:15:00 ap.4«t 39 В 25.01 10 7:28:00 apu stt 20 В 18.03.10 11:15:00 apviOWl.dat 65.6 кВ 18.03.10 11:15.00 w)QQQ2i4et 86 кВ 18 03.10 11:15:00 арцОООЗ dat 48.4 кВ 18.03.10 11:15:00 Рис. 7.21 Чтобы понять, какая информация содержится в файлах, можно поискать файлы с именами index, dirinfo, readme — обычно они содержат описание файлов текущего каталога. 011^ Другие службы Интернета §51 Если вы точно знаете имя файла, с помощью специальных поисковых систем (например, www.filesearch.ru), можно найти FTP-сервер, где он находится. Форумы Форумы (рис. 7.22) — это специальные веб-сайты (или разделы веб-сайтов), предназначенные для общения посетителей в форме обмена сообщениями. Сообщения хранятся на серверах в Интернете и поэтому доступны всем участникам в любой момент. Администратор форума создаёт несколько разделов форума, отличающихся по тематике. Пользователи создают в этих разделах темы для обсуждения (иногда тему называют «топик», от англ, topic, или «тред», от англ, thread — нить). Участники могут отвечать на любые сообщения в теме, комментировать их. Для изучения общественного мнения автор первого сообщения темы («топик-стартер», от англ, topic starter — тот, кто начал тему) может добавить к ней опрос (голосование). • 29^2007, \0.Ы Pasha Ст«рохнп Регистрация 20.102005 Адрес Мостеа СообшениА 260 »»,(»:2ai7.(iO:S6 '3 Light ^ Не согласен. Участник проекте А я не согласен Сначала нужно изучить ситуацию, а потом действовать Если браться за серьезный проект, требуется просчитать возможные доходы и расходы Блажен, кто верует) Регистрация 19 11 2005 Сообщений 65 Ну, Девеи, иеучеи Цитате:______________ Сообщение от Light Снзмм нужно изучить ситуацию, а петой daifcmeoaamb. Ну. даеай. изучай Теи врвУвнем другие будут делать, и, самое главное, у них получится! Двамщы два — четыре! Рис. 7.22 Большинство форумов могут просматривать все желающие. Для того чтобы отправить своё сообщение, обычно требуется регистрация. Могут быть и «закрытые» разделы, для доступа в которые кроме регистрации нужно специальное разрешение администратора. i Компьютерные сети О При регистрации пользователь выбирает ник (от англ. nickname — псевдоним); на сервере создаётся профиль участника форума — страница, где он может оставить информацию о себе, загрузить аватар — картинку, которая его может характеризовать, это может быть фотография. Иногда используют также слова «аватарка» или «юзерпик» (от англ, user picture — картинка пользователя), имеющие то же значение, что и аватар. На большинстве форумов работает система личных сообщений — внутренняя электронная почта форума. За порядком следят ответственные участники — администратор форума и назначенные им модераторы. Они могут изменять, перемещать и удалять любые сообщения, удалять профили пользователей и ограничивать им доступ — «банить», т. е. запрещать отправлять сообщения (от англ, ban — запрет). Обычно в форумах наказывается: • отклонение от темы — оффтопик (от англ, off-topic — «вне темы»); оскорбление участников, нецензурные выражения; • реклама. В некоторых форумах есть список часто задаваемых вопросов и ответов на них («ЧаВо»), в английском варианте FAQ — Frequently Asked Question. Перед тем как создать новую тему, нужно попытаться найти ответ на вопрос самостоятельно, прочитав этот документ (иначе вас могут «забанить»). Производители аппаратуры и программного обеспечения часто создают на своих сайтах форумы, где их представители помогают пользователям решать возникающие вопросы. Раньше роль форумов выполняли так называемые группы новостей (англ, newsgroup), для работы с которыми использовались специальные клиентские программы, работающие по протоколу NNTP (англ. Network News Transfer Protocol — сетевой протокол передачи новостей). Иногда такие клиенты встраивают в почтовые программы, например в Mozilla Thunderbird. Для участия в современных группах новостей достаточно использовать любой браузер (см., например, groups.google.com). Общение в реальном времени Выражение «в реальном времени», или онлайн (англ, on-line — на линии) означает, что все участники в момент обмена информацией находятся за компьютерами. Другие службы Интернета Простейший вариант общения в реальном времени — обмен текстовыми сообщениями. Чаты (англ, chat — болтовня) позволяют «разговаривать» группе людей, которые как бы находятся в одной комнате. Для личного общения используют программы для обмена мгновенными сообщениями (мессенджеры), например: ICQ (www.icq.com), Mail.ru Агент (www.mail.ru), ^ Kopete (для Linux), Ф iChat (для компьютеров фирмы Apple). Возможно, в недалеком будущем их заменит бесплатная система мгновенного обмена сообщениями р Jabber (www.jabber.org). С помощью мессенджеров можно передавать файлы напрямую с компьютера на компьютер или через сервер. Особой популярностью пользуется бесплатная программа 0 Skype (skype.com), которая позволяет: • организовывать личные и групповые чаты; • передавать сообщения и файлы с компьютера на компьютер; • устанавливать голосовую и видеосвязь (для этого необходимы наушники, микрофон и веб-камера); • звонить на стационарные и мобильные телефоны; • принимать звонки с телефонов на специальный номер; • отправлять SMS-сообщения; • организовывать конференции (совещания через Интернет). Часть из этих функций (например, звонки на телефоны и отправка SMS) платные. Skype использует технологию VoIP (англ. Voice over Internet Protocol — передача голоса через интернет-протокол), все передаваемые данные шифруются. Звонок через Skype в другой город или в другую страну обходится значительно дешевле, чем обычная телефонная связь. Skype — это кроссплатформенная программа, существуют её версии для операционных систем Windows, Linux, Mac OS, a также для смартфонов. Центральный сервер используется только для установки связи, а дальше компьютеры обмениваются данными напрямую. Протокол VoIP, по которому работает Skype, закрыт, так же как и исходный код программы. Все данные многократно шифруются, и их не могут анализировать антивирусы. Поэтому специалисты по компьютерной безопасности предупреждают о возможности использования Skype для распространения вредоносных программ и шпионажа. Л А—49 н Компьютерные сети Информационные системы Информационные системы в Интернете позволяют быстро находить нужную в данный момент информацию. Информационная система состоит из базы данных и программного обеспечения для поиска информации, размещённого на сайте. На многих сайтах доступны прогнозы погоды на разные сроки (pogoda.ru, gismeteo.ru, pogoda.yandex.ru). С помощью сервиса rasp.yandex.ru можно узнать расписание электричек, поездов дальнего следования и самолётов по всей России. На сайтах аэропортов постоянно обновляется табло фактического прибытия и отправления самолётов с учетом задержки рейсов. Заказывать билеты на поезда и самолёты удобно на специальных сайтах, которые связаны с системой продажи билетов железной дороги и авиакомпаний. Здесь же можно получить полную информацию о расписании, возможных вариантах проезда (перелёта), стоимости и наличии билетов. Оплатить билеты можно прямо на сайте с помощью банковской карты или платёжных систем, а также через терминалы приёма платежей. Часто используются электронные билеты (англ, e-ticket) на поезда и самолёты. Электронный билет — это информация о заказе, сделанном через веб-сайт, которая внесена в базу данных. По номеру заказа в кассе вокзала можно получить бумажный билет, а в аэропортах для регистрации по электронному билету достаточно просто предъявить паспорт. Сервисы веб-картографии Google Maps (maps.google.ru), Яндекс.Карты (maps.yandex.ru), Карты@Ма11.ги (maps.mail.ru) позволяют найти на карте любой адрес, проложить маршрут и оценить его длину. На этих сайтах доступны не только карты (хранящиеся в векторном формате), но также снимки многих районов из космоса. Вопросы и задания 1. Зачем используются FTP-серверы? 2. Как и в каком случае можно зайти на FTP-сервер, не имея своей учётной записи? 3. Что такое FTP-клиент? 4. Как работать с FTP-серверами с помощью браузера? 5. Как узнать, что находится в файлах, не скачивая их? Всегда ли это возможно? 6. Как найти сервер, откуда можно загрузить интересующий вас файл? 7. Что такое форумы? Электронная коммерция §52 8. Объясните значение слов «топик», «ник», «аватар», «модератор», «бан», «оффтопик». 9. Как поддерживается порядок в форуме? 10. Что такое ЧаВо (FAQ)? 11 • KdK ьы дуисц ц. 11[.ии^ьо;1И ели aiiiiapaiypbi и ii^oi рамгчнсю оСспеченич фор/пь на свсих сайтах? ----------------- W --‘Г'———• 12. Что такое общение в реальном времени? Относятся ли форумы к онлайн-общению? 13. Расскажите о достоинствах и недостатках программы Skype. 14. Какие информационные системы существуют в Интернете? 15. Что такое электронный билет? Чем он удобнее бумажного? Подготовьте сообщение а) «Служба FTP* б) «Онлайн-общение в Интернете» в) «Картографические сервисы Интернета» г) «Поиск и заказ билетов в Интернете» д) «Онлайн-переводчики» е) «Онлайн-словари» §52 Электронная коммерция Что такое электронная коммерция? В начале своего развития Интернет был полностью некоммерческим — в его развитии участвовали инженеры, программисты, учёные и военные. Однако к началу 1990-х гг. стало ясно, что глобальная сеть может быть источником огромной прибыли. Электронная коммерция (англ, е-соттегсе) — это покупка и продажа товаров и услуг с помощью электронных систем, например через Интернет. О Развитие электронной коммерции в Интернете началось в 1994 г., когда на сайте американской сети ресторанов Pizza Hut появилась возможность заказать пиццу с доставкой на дом. В том же году открылись сайты некоторых банков в Интернете, и пользователи получили возможность управления своими счетами через сеть. В 1995 г. был создан первый книжный интернет-магазин Amazon (www.amazon.com), который и сейчас остаётся самым крупным в мире. I Компьютерные сети Электронная коммерция включает в себя: исследование рынка; • обмен данными и документами в электронном виде; • денежные операции в электронной форме; • продажу товаров, услуг и информации; поддержку покупателей после продажи. Сейчас многие покупатели начинают поиски нужного товара в Интернете, а не в обычных магазинах. Чтобы привлечь внимание клиентов, фирмы размещают подробную информацию о товарах на своих сайтах, делают рассылки по электронной почте, создают сообщества в социальных сетях, организуют дискуссии на форумах. Посетителям сайтов предлагается оставить отзыв о товарах на специальной веб-странице, чтобы остальные смогли его прочитать. Через Интернет удобно приобретать книги и электронику, авиа- и железнодорожные билеты, оплачивать услуги операторов сотовой связи. Для пользователя всегда важно знать, что после покупки он не окажется один на один со своими проблемами и сможет получить консультацию. Поэтому поддержка покупателей — тоже важный элемент электронной коммерции. На сайтах производителей оборудования (например, жёстких дисков, принтеров, сканеров и т. п.) всегда можно найти всю документацию по настройке и обслуживанию устройств и бесплатно скачать самые новые драйверы. На форумах фирм-изготовителей пользователи получают консультацию службы технической поддержки и делятся друг с другом решениями возникших проблем. Бизнес в Интернете предоставляет дополнительные возможности для компаний: • расширение сферы влияния: фирмы любого размера могут принимать заказы со всего мира; увеличение конкурентоспособности: быстрая реакция на претензии клиентов и изменение ситуации на рынке; • индивидуальный подход (система собирает информацию о клиенте и пытается предложить именно те товары, которые он чаще покупает); • уменьшение затрат: не нужно арендовать помещение для магазина и нанимать много сотрудников. Электронная коммерция §52 Покупатели тоже получают серьезные преимущества: • выбор товаров и услуг из большого количества вариантов; • легко сравнить разные предложения; • можно узнать отзывы других пользователей; • можно заказывать и оплачивать товары в удобное время; • цены на товары и услуги обычно ниже, чем в обычных магазинах. Интернет-магазины Всё больше людей используют интернет-магазины — веб-сайты, которые рекламируют товары или услуги, принимают заказы на покупку, предлагают варианты оплаты и получения заказа. Выбрав товары в интернет-магазине, пользователь может «положить их в корзину», т. е. включить в список для приобретения. Когда состав покупки полностью определен, оформляется заказ: покупатель указывает свои данные, способ оплаты и доставки. На многих сайтах возможен заказ товара по телефону. Оплата выполняется разными способами: • через банковскую карту, пригодную для оплаты в Интернете (Visa, MasterCard); • банковским переводом (например, через Сбербанк); • почтовым переводом; • с помощью электронных платёжных систем (электронными деньгами); • наличными при получении товара; • через отправку платного SMS-сообщения (для небольших покупок). Для «вещественных» товаров существуют три способа доставки: • курьерская доставка по указанному адресу; • почтовая доставка; • «самовывоз» с пунктов выдачи товара (в некоторых городах). Товары в электронной форме (программы, коды доступа, тексты, статьи, фотографии и т. п.) обычно высылаются по электронной почте или покупателю предоставляется персональная ссылка на нужный файл на сервере фирмы-продавца. 1 Компьютерные сети Для управления интернет-магазином используют специальное программное обеспечение, например кроссплатформенные системы lC-Битрикс (www.lc-bitrix.ru) и ^ osCommerce (www.oscommerce.com). Ещё один вид электронной коммерции — интернет-аукционы («онлайновые аукционы»), в которых фирма-организатор — это просто посредник между продавцом и покупателем. Любой желающий может делать ставки, используя веб-сайт аукциона. Когда интернет-аукцион завершен, покупатель, сделавший наибольшую ставку, должен перевести деньги продавцу, а продавец обязан выслать товар покупателю по почте. Крупнейший интернет-аукцион — eBay (www.ebay.com). Электронные платежные системы Электронная торговля не была бы столь удобной, если бы не было возможности оплачивать покупку прямо в Интернете, не выходя из дома. Для этого должны были появиться электронные деньги, которые можно свободно купить и продать. Системы расчётов электронными деньгами называются электронными платёжными системами. Среди российских платёжных систем наиболее известны WebMoney (www.webmoney.ru) и ^ Яндекс Деньги (money.yandex.ru). В платёжной системе можно завести электронный кошелёк, который пополняется с помощью специальных карт оплаты или через терминалы. Из такого кошелька можно оплачивать коммунальные услуги, сотовую связь и Интернет, покупать авиа- и железнодорожные билеты, товары в интернет-магазинах. По условиям пользовательского соглашения кошелёк системы Яндекс. Деньги нельзя использовать для коммерческой деятельности (например, для получения оплаты за выполненную работу), иначе его может заблокировать служба безопасности. Пользователи могут переводить электронные деньги не только на счета интернет-магазинов, но и на кошельки других пользователей. Чтобы убедиться в том, что вы не ошиблись при вводе номера кошелька и переводите деньги именно тому, кому нужно, применяют перевод с кодом протекции. Код протекции — это некоторое число, которое должен ввести получатель для получения перевода на свой счет. Этот код можно сообщить по электронной почте или по телефону. Если получатель вводит неверный код несколько раз подряд или истекает срок действия перевода, средства возвращаются в кошелёк отправителя. Право и этика в Интернете §53 При необходимости можно вывести средства из электронного кошелька, т. е. получить их в виде наличных денег в банке (за вычетом небольшой комиссии). С электронными кошельками можно работать в браузере (через веб-интерфейс сайта) или с помощью специальной программы, которая устанавливается на компьютер пользователя. Вопросы и задания 1. Что такое электронная коммерция? 2. Какие направления включает электронная коммерция? 3. Какие преимущества предоставляет электронная торговля для продавцов и покупателей? 4. Что такое интернет-аукцион? 5. Зачем используется код протекции при переводе электронных денег? 6. Что такое интернет-магазин? Объясните на примере. 7. Как можно оплатить покупку в интернет-магазине? Как доставляются покупки? 8. Что такое электронные деньги? Чем они, на ваш взгляд, отличаются от «обычных* денег? Подготовьте сообщение а) «Интернет-магазины: за и против* б) «Интернет-аукционы» в) «Электронные платёжные системы» §53 Право и этика в Интернете Интернет и закон Как только в сети появилась купля-продажа товаров и услуг, возникла необходимость регулировать эти отношения с помощью закона, защищать интересы пользователей и предотвращать мошенничество. Интернет — это не организация, он не принадлежит ни одной стране, развивается во многом стихийно и не может быть юридическим лицом. В связи с этим возникает множество проблем, с которыми юристы раньше не сталкивались. Например, не вполне ясно: • несёт ли провайдер ответственность за действия пользователей, которым он предоставляет доступ в Интернет (в том числе за нарушения авторских прав); Е Компьютерные сети можно ли признавать доказательствами цифровые документы (сообщения электронной почты, рисунки, звукозаписи, видео); • как доказать условия заключённой сделки, если фирма может в любой момент изменить условия договора на сайте; • какую ответственность несут платёжные системы перед государством и пользователями. Соблюдение авторских прав, т. е. прав автора на результаты своего интеллектуального труда, — один из самых актуальных правовых вопросов Интернета. Практически вся информация на сайтах защищается авторским правом: программное обеспечение, тексты, рисунки и фотографии, музыка и видеофильмы. Часто на веб-страницах публикуются условия использования материала (англ, terms of use), где указывается, можно ли сохранять и копировать материал, вставлять его в другие документы, распечатывать. Если такой информации нет, следует получить разрешение на использование материала, отправив сообщение веб-мастеру (автору сайта) по электронной почте. На своём веб-сайте можно без разрешения: • размещать гиперссылки на другие сайты; « использовать бесплатную графику. Без разрешения нельзя: копировать содержание других сайтов; • объединять информацию из разных источников для создания «собственного» документа; изменять чужой текст или изображение; размещать любые изображения с других сайтов, о которых явно не написано, что они бесплатные. В Гражданском кодексе Российской Федерации (ГК РФ) определяется, что можно без согласия автора использовать его произведения в научных, учебных или культурных целях (статья 1274). При этом обязательно указать имя автора и источник (книгу, статью, сайт). Например, разрешается: • цитировать произведения (для того, чтобы подтвердить или опровергнуть какую-то мысль автора) в объёме, оправданном целью цитирования; использовать произведения и их отрывки в учебных материалах в объёме, оправданном поставленной целью; использовать произведения для создания пародии или карикатуры. Право и этика в Интернете Использование чужого произведения (например, текста, музыки или видеозаписи) как составной части в своих работах является нарушением авторского права независимо от объёмов (например, нельзя включить в свой фильм даже 1 секунду из другого фильма или звукозаписи). При этом не имеет значения, что вы не получили от этого коммерческой выгоды (это влияет только на размер штрафа). Переработка чужого материала (например, наложение текста, графики, звука, монтаж видео) — это серьёзное нарушение права автора на неприкосновенность произведения (статьи 1255 и 1266 ГК РФ), за это в законе предусмотрены значительные штрафы. Незаконный доступ к информации — это уголовное преступление, за которое в Уголовном кодексе Российской Федерации предусмотрен штраф или лишение свободы на срок до двух лет (статья 272). Если ваш сайт (или учётную запись на сайте) взломали или вы стали жертвой интернет-мошенничества, нужно обращаться в отдел по борьбе с компьютерными преступлениями (отдел «К») полиции. Нетикет На ранних этапах развития, когда к Интернету были подключены только научные центры и университеты, общение основывалось на взаимном уважении и доверии пользователей. В результате сложились неофициальные правила общения, которые называются сетевым этикетом или нетикетом (фр. netiquette). Несмотря на то что при общении в Интернете вы, как правило, не видите собеседника, нужно вести себя так, как будто вы говорите с человеком лично: не пишите то, что вы не смогли бы сказать ему в лицо; не оскорбляйте собеседника, не ругайтесь. Перед тем как послать сообщение, прочтите его внимательно ещё раз и поставьте себя на место получателя. Передавая информацию по открытым каналам, помните, что копии всех ваших сообщений могут храниться, например, у провайдера. Не посылайте информацию, доступ к которой ограничен. Уважайте авторские права, не используйте чужой материал без разрешения. Уважайте тайну переписки: если вы хотите опубликовать личное сообщение, нужно спросить разрешения у автора. В сообщениях электронной почты и форумов: • пишите кратко и точно, цените время других людей; • не пишите слова заглавными буквами (это воспринимается как крик или визг); I 1 Компьютерные сети • не используйте сленг, пишите грамотно, не пропускайте пробелы и знаки препинания; • для передачи тона письма используйте смайлики (англ. smiley) — значки для обозначения эмоций, например: :-) или :) — улыбка; :-( или :( — несчастное лицо, сожаление или разочарование; ;-) или ;) — подмигивающее лицо, слова не следует понимать слишком серьезно; • цитируйте те высказывания, на которые отвечаете (собеседник может забыть содержание предыдущего письма); • не распространяйте спам — нежелательную рекламу. Посылая сообщения по электронной почте: • обязательно пишите тему сообщения, отражающую содержание письма; • ставьте подпись (имя и фамилию) в конце письма; • не посылайте большие файлы без согласия получателя. Участвуя в форумах: • сначала прочитайте список часто задаваемых вопросов и прошлые сообщения, возможно, вы найдете там ответ на свой вопрос; • отправляя сообщение, осознайте, что многие увидят ваш текст; • не отклоняйтесь от темы обсуждения; • не участвуйте во флейме (от англ, flame — огонь, пламя) — так называется «спор ради спора», словесная война; обычно за флейм наказывают модераторы форума; • не разжигайте холивары (от англ, holy war — «священная война») — так называется спор о двух идеях, каждая из которых имеет своих сторонников (например, что лучше: Windows или Linux, Паскаль или Си и т. п.). Общаясь в чатах: • не перебивайте собеседника; • не обижайтесь, если незнакомые люди не хотят с вами разговаривать; • не пытайтесь выведывать личную информацию; • уважайте анонимность, не разглашайте реальное имя другого участника без разрешения, если вы его знаете; • будьте снисходительны к ошибкам других; • не обижайтесь, если собеседник неожиданно покинул чат. Право и этика в Интернете §53 Вопросы и задания 1. Какие юридические проблемы возникают в связи с куплей-продажей услуг в Интернете? 2. В каком случае можно размещать на своем веб-сайте чужой материал? 3. В каком случае можно бесплатно использовать произведения без согласия автора? Какие ограничения нужно при этом соблюдать? 4. Расскажите о наиболее распространённых нарушениях авторских прав в Интернете. 5. Является ли взлом персональной странички в социальной сети преступлением? Почему? 6. Что можно сделать, если вас обманули мошенники в Интернете? 7. Что такое нетикет? 8. Можно ли опубликовать на форуме личное сообщение? 9. Какие правила рекомендуется соблюдать в сообщениях электронной почты? 10. Как нужно вести себя в форумах и чатах? 11. Как в электронном письме можно передать свое настроение? 12. Почему при пересылке больших файлов нужно спросить согласие получателя? 13. Объясните значение слов «флейм* и «холивар*. Подготовьте сообщение а) «Интернет и право» б) «Авторские права в Интернете* в) «Сетевой этикет* Практические работы к главе 7 Работа № 23 «Тестирование сети» Работа № 24 «Сравнение поисковых систем* ЭОР к главе 7 на сайте ФЦИОР (http//fcior.edu.ru) • Глобальные компьютерные сети • Архитектура Интернета • Адресация в Интернете • Технология трансляции сетевых адресов • Технология WWW • Протоколы передачи данных в сети Интернет I Компьютерные сети • Контроль знаний: история Всемирной паутины • Службы Интернета Поиск информации Поиск информации в Интернете • Законодательство РФ «Об информации, информационных технологиях и о защите информации» Самое важное в главе 7 Компьютерная сеть — это группа компьютеров, соединенных линиями связи. Сети предназначены для ускорения обмена данными и совместного использования ресурсов. Вместе с тем объединение компьютеров в сеть снижает безопасность данных. • Сервер — это компьютер, предоставляющий свои ресурсы в общее использование. Клиент — это компьютер, использующий ресурсы сервера. Протокол — это набор правил и соглашений, определяющих способ и порядок обмена данными в сети. Компьютеры могут обмениваться данными только тогда, когда они поддерживают общий протокол. В современных сетях используется пакетная передача данных, при которых нагрузка на сеть становится более равномерной. Существуют три основные структуры (топологии) сетей: общая шина, звезда и кольцо. В современных локальных сетях, как правило, используется схема «звезда*. • Интернет — это глобальная компьютерная сеть, которая использует семейство протоколов TCP/IP. Любой компьютер, подключенный к сети Интернет, имеет собственный 1Р-адрес. Если у компьютера есть несколько интерфейсов (сетевых карт или адаптеров беспроводной связи), каждый из них может иметь свой IP-адрес. • Система доменных имён (DNS) позволяет сопоставить 1Р-ад-ресу символьное имя. Адрес ресурса (URL) содержит протокол, имя сервера, каталог и имя документа (файла). Глава 8 Алгоритмизация и программирование §54 Алгоритм и его свойства Что такое алгоритм? Происхождение слова «алгоритм» связывают с именем учёного Мухаммеда ал-Хорезми (перс. ^[al-Khwarazml]), который описал десятичную систему счисления (придуманную в Индии) и предложил правила выполнения арифметических действий с десятичными числами. Мухаммед ал-Хорезми (ок. 783—ок. 850 гг.) Алгоритм — это точное описание порядка действий, которые должен выполнить исполнитель для решения задачи за конечное время. О Здесь исполнитель — это устройство или одушёвленное существо (человек), способное понять и выполнить команды, составляющие алгоритм. Человек как исполнитель часто действует неформально, по-своему понимая команды. Несмотря на это, ему тоже часто приходится действовать по тому или иному алгоритму. Например, рецепт приготовления какого-либо блюда можно считать алгоритмом. На уроках русского языка, выполняя разбор слова или предложения, вы тоже действуете по определённому алгоритму. Много различных алгоритмов в математике (постарайтесь вспомнить известные вам). На производстве рабочий, вытачивая деталь в соответствии с чертежом, действует по алгоритму, который разработал технолог. И таких примеров может быть множество. В информатике рассматривают только формальных исполнителей, которые не понимают (и не могут понять) смысл команд. К этому типу относятся все технические устройства, в том числе и компьютер. Алгоритмизация и программирование Каждый формальный исполнитель обладает собственной системой команд. В алгоритмах для такого исполнителя нельзя использовать команды, которых нет в его системе команд. Свойства алгоритма ' Дискретность — алгоритм состоит из отдельных команд (шагов), каждая из которых выполняется за конечное время. • Детерминированность (определённость) — при каждом запуске алгоритма с одними и теми же исходными данными должен быть получен один и тот же результат. • Понятность — алгоритм содержит только команды, входящие в систему команд исполнителя, для которого он предназначен. • Конечность (результативность) — для корректного набора данных алгоритм должен завершаться через конечное время с вполне определённым результатом (результатом может быть и сообщение о том, что задача не имеет решений). • Корректность — для допустимых исходных данных алгоритм должен приводить к правильному результату. Эти свойства не равноправны. Дискретность, детерминированность и понятность — фундаментальные свойства алгоритма, т. е. ими обладают все алгоритмы для формальных исполнителей. Остальные свойства можно рассматривать как требования к «правильному» алгоритму. Иными словами, алгоритм получает на вход некоторый дискретный входной объект (например, набор чисел или слово) и обрабатывает входной объект по шагам (дискретно), строя промежуточные дискретные объекты. Этот процесс может закончиться или не закончиться. Если процесс выполнения алгоритма заканчивается, то объект, полученный на последнем шаге работы, является результатом работы алгоритма при данном входе. Если процесс выполнения не заканчивается, говорят, что алгоритм зациклился. В этом случае результат его работы не определён. Способы записи алгоритмов Алгоритмы можно записывать разными способами: • на естественном языке, обычно такой способ применяют, записывая основные идеи алгоритма на начальном этапе; • на псевдокоде, так называется смешанная запись, в которой используется естественный язык и операторы какого-либо Простейшие программы §55 языка программирования; в сравнении с предыдущим вариантом такая запись гораздо более строгая; • в виде блок-схемы (графическая запись); • в виде программы на каком-либо языке программирования. Мы будем записывать алгоритмы в виде программы на двух языках программирования: на языке Паскаль (версия FreePascal) и на алгоритмическом языке системы КуМир, который называют школьным а.тгоритмическим языком, а также в некоторых случаях — на псевдокоде. Вопросы и задания 1. Что такое алгоритм? 2. Что такое исполнитель? 3. Чем отличаются формальные и неформальные исполнители? 4. Что такое система команд исполнителя? Придумайте исполнителя с некоторой системой команд. 5. Перечислите и объясните свойства гшгоритма. 6. Какие существуют способы записи алгоритмов? Какие из них, по вашему мнению, чаще применяются на практике? Почему? Подготовьте сообщение а) «История слова алгоритм» б) «Свойства алгоритма» в) «Способы записи алгоритмов» §55 Простейшие программы е Пустая программа Пустая программа — это программа, которая ничего не делает, но удовлетворяет требованиям выбранного языка программирования. Она полезна, прежде всего, для того, чтобы понять общую структуру программы. Далее мы будем слева приводить программу на школьном алгоритмическом языке, а справа — эквивалентную программу на языке Паскаль. алг Куку нач I основная программа кон program qq; begin { основная программа } end. Алгоритмизация и программирование Программа на школьном алгоритмическом языке начинается ключевым словом алг (сокращение от слова «алгоритм»), за которым записывают название алгоритма. Название может содержать русские и латинские буквы, цифры, знак подчёркивания «_» и даже пробелы, но не может начинаться с цифры. Между ключевыми словами нач и кон размещают операторы (команды) программы (тело программы). После вертикальной черты записывают комментарии — пояснения, которые не обрабатываются транслятором. В языке Паскаль в имени программы нельзя использовать русские буквы и пробелы. Все ключевые слова записываются на английском языке. После имени программы ставится точка с запятой. Ключевые слова begin и end ограничивают тело программы, после слова end ставится точка. Комментарии заключают в фигурные скобки. Вывод текста на экран Напишем программу, которая выводит на экран такие строки: 2+2=? Ответ: 4 Вот как она выглядит: алг qq нач вывод '2+' вывод '2=?', нс вывод 'Ответ: 4' кон program qq; begin write('2+'); writeln('2=?'); write('Ответ: 4') end. Команда вывод в школьном алгоритмическом языке выводит на экран символы, заключённые в апострофы или в кавычки. Для перехода на новую строку в списке вывода нужно указать нс (новая строка). В языке Паскаль для вывода данных используют процедуру write (без перехода на новую строку) или writeln (после окончания вывода происходит переход на новую строку). Параметры этих процедур заключаются в круглые скобки, а символьные строки — в апострофы. Каждый оператор заканчивается точкой с запятой, перед словом end можно её не ставить. Простейшие программы §55 Переменные Напишем программу, которая выполняет сложение двух чисел: 1) запрашивает у пользователя два целых числа; 2) складывает их; 3) выводит результат сложения. Программу на псевдокоде (смеси русского и школьного алгоритмического языков) можно записать так; алг Сумма нач ввести два числа сложить их вывести результат кон Компьютер не может выполнить псевдокод, потому что команд «ввести два числа» и ей подобных нет в его системе команд. Поэтому нам нужно «расшифровать» все такие команды через операторы языка программирования. В отличие от предыдуш;их задач здесь требуется хранить данные в памяти. Для этого используют переменные. Переменная — это величина, которая имеет имя, тип и значение. Значение переменной может изменяться во время выполнения программы. О Переменная определяет область памяти, где хранится только одно значение. При записи в неё нового значения «старое» стирается, и его уже никак не восстановить. Переменные в программе необходимо объявлять^. При объявлении указывается тип переменной и её имя (идентификатор). Значение переменной сразу после объявления неопределённое: переменной выделяется некоторая область памяти, и там могло быть до этого записано любое число. Вот так объявляются целочисленные переменные (в которых могут храниться только целые значения) с именами а, Ь vi с: цел а, Ь, с var а, Ь, с: integer; В некоторых языках программирования, например в языке Python, переменные не объявляются. Но это может привести к ошибкам, которые трудно обнаружить. Алгоритмизация и программирование в языке Паскаль описание переменных начинается с ключевого слова var, после него записывают список переменных и в конце через двоеточие — их тип, в данном случае целочисленный (англ, integer). Имена переменных строятся по тем же правилам, что и имена программ. В языке Паскаль можно использовать в именах латинские буквы (строчные и заглавные буквы не различаются), цифры (но имя не может начинаться с цифры, иначе транслятору будет сложно различить, где начинается имя, а где — число) и знак подчёркивания «_». В школьном алгоритмическом языке в именах разрешены кроме перечисленных символов ещё пробелы и русские буквы, причём строчные и заглавные буквы различаются (поэтому х и X — это разные имена переменных). Желательно давать переменным «говорящие» имена, чтобы можно было сразу понять, какую роль выполняет та или иная переменная. Тип переменной нужен для того, чтобы: - определить область допустимых значений переменной; • определить допустимые операции с переменной; • определить, какой объём памяти нужно выделить переменной и в каком формате будут храниться данные (вспомните, что целые и вещественные числа хранятся в компьютере по-разному, см. главу 4); • предотвратить случайные ошибки; например, при попытке записать символ в целую переменную выдаётся сообщение об ошибке^. В алгоритмическом языке можно при объявлении задать начальные значения переменных: цел а, Ь=1, с=55 Значение переменной а осталось неопределённым. Большинство трансляторов Паскаля автоматически заполняют нулями все переменные основной программы, однако лучше не надеяться на это и явно задавать начальные значения всех переменных. Некоторые языки, например язык Си, позволяют записывать в переменную значение другого типа, но вся ответственность за результат ложится на программиста. Простейшие программы §55 Приведём полную программу сложения двух чисел: алг Сумма нач цел а, Ь, ввод а, Ь с:=а+Ь вывод с кон prograun Sum; var а, b, с: begin read(а, b) с:=a+b; write(c) end. integer; Оператор ввод (в Паскале — процедура read) предназначен для ввода данных (например, с клавиатуры). Оператор, содержащий символы «:=», — это оператор присваивания, с его помощью изменяют значение переменной. Он выполняется следующим образом: вычисляется выражение справа от символов «:=», а затем результат записывается в переменную, записанную слева от символов «:=». Поэтому, например, оператор i:=i+l i:=i+l; увеличивает значение переменной i на 1. У приведённой выше программы сложения чисел есть два недостатка: 1) перед вводом данных пользователь не знает, что от него требуется (сколько чисел нужно вводить и каких); 2) результат выдаётся в виде числа, которое означает неизвестно что. Хотелось бы, чтобы диалог программы с пользователем выглядел так: Введите два целых числа: 2 3 2+3=5 Подсказку для ввода вы можете сделать самостоятельно. При выводе результата ситуация несколько усложняется, потому что нужно вывести значения трёх переменных и два символа: «-Ь» и «=». Для этого строится список вывода, элементы в котором разделены запятыми: вывода, ' + ',Ь, ' = ',с write (а, ' + ',Ь, ' = ',с); Обратите внимание, что имена переменных записаны без апострофов. Алгоритмизация и программирование в принципе можно было бы обойтись и без переменной с, потому что элементом списка вывода может быть арифметическое выражение, которое сразу вычисляется и на экран выводится результат: вывод а, '+',Ь, ' = а+Ь write(а, '+',Ь, '=',а+Ь); В обоих языках (в среде КуМир — начиная с версии 2.0) можно использовать форматный вывод: после двоеточия указать общее количество знакомест, отводимое на число. Например, программа а := 123 а := 123; вывод а:5 write С а:5 ); выведет значение целой переменной а, заняв ровно 5 знакомест: __123 Поскольку само число занимает только 3 знакоместа, перед ним выводятся два пробела, которые здесь мы обозначили как «„». Вопросы и задания 1. Сравните структуру программ на языке Паскаль и школьном гшго-ритмическом языке. 2. Что такое идентификатор? 3. Чем различаются правила построения имён в школьном алгоритмическом языке и в Паскале? 4. Как записываются комментарии на этих языках? Подумайте, как комментирование можно использовать при поиске ошибок в алгоритме. 5. Сравните операторы вывода в КуМире и в Паскале. Как выполняется переход на новую строку? 6. Что такое переменная? Как вы думаете, зачем нужно объявлять переменные? 7. Зачем нужен тип переменной? Почему нельзя записывать в переменную значение другого типа? 8. Какое значение записано в переменной сразу после объявления? Можно ли его использовать? 9. Как задать начальные значения переменных? Сравните школьный алгоритмический язык и Паскаль. 10. Что такое оператор присваивания? 11. Почему следует выводить на экран подсказку перед вводом данных? Простейшие программы §55 12. Подумайте, когда можно вычислять результат прямо в операторе вывода, а когда нужно заводить отдельную переменную. 13. Что такое форматный вывод? Как вы думаете, где он может быть полезен? Подготовьте сообщение а) «Операторы вывода в языке Си» б) «Операторы вывода в языке Python* Задачи 1. Используя оператор вывода, постройте на экране следующие рисунки из символов (такие рисунки называются псевдографикой): Ж 41/ \1/ \1/ \1/ N1/’ N1/ /т\ Л\ ЛЧ ЛЧ жжж жж ж ж жж жж жж 41/ VI/ XI/ VI/ \шу VI/V1/V*/ VI/ VI/ V*/ VI/ VI/ Л\ /Гч ЛЧ ЛЧ/Тч. Лч>^Л\>Т\Л /!\/ТчЛЧ ЛлчЛчЛчЛч Жм/ "W W Чк' м/м/ м/м/ /ТЧ хТ\/1\ /Гч /Т\ /Тч /Тч/ТЧ/ТЧутЧ/ТЧ ^|Ч <^/?Ч ЖЖЖ ж жжжжж жжжжжж ж ж о 2. Выберите правильные имена переменных (для школьного алгоритмического языка и Паскаля): 1 Vasya СУ-27 0mail_ru mil Петя СУ_27 lenta.ru Im Митин брат _27 "Pes barbos" m 1 Quo vadis СУ(27) <Ладья> 3. Пусть а и b — целые переменные. Что будет выведено в результате работы фрагмента программы? а) цел а=5, Ь=3 а:=5; Ь:=3; вывод а, '=Z(', б) цел а=5, Ь=3 b, ’) ' write(a,'=Z(' ,b a:=5; b:=3; вывод 'Z(a)=', в) цел а=5, Ь=3 ' (b) ' write('Z(a)=',' a:=5; b:=3; (b) ') ; вывод 'Z (',а, ') = (',a+b, ') ' write('Z(',a, ') = C,a+b, 4. Запишите оператор для вывода значений целых переменных а = 5 и Ь = 3 в следующем формате: а) 3+5=? б) Z(5)=F(3) в) а=5; Ь=3; г) Ответ: (5;3) Алгоритмизация и программирование §56 Вычисления Типы данных Любая переменная имеет какой-либо тип, т. е. может хранить данные только того типа, который был указан при её объявлении. В школьном алгоритмическим языке используются такие типы: • цел — целые значения; • вещ — вещественные значения; лог — логические значения (да или нет); • сим — символ; лит — литерная переменная (символьная строка, т. е. цепочка символов). В языке Паскаль типов немного больше. Например, кроме типа integer есть несколько других типов переменных для хранения целых чисел: byte — целые числа в диапазоне^ 0..255; • shortint — целые числа в диапазоне -128..127; word — целые числа в диапазоне 0..65535; • longint — целые числа в диапазоне -2147483648..2147483647. На переменную типа byte и shortint в памяти выделяется 1 байт, на переменную типа word — 2 байта, на переменную типа longint — 4 байта. Размер переменных типа integer зависит от версии языка (2 или 4 байта). Для хранения вещественных переменных тоже существует несколько типов: • single — число одинарной точности (4 байта); • real — классический тип языка Паскаль (6 байтов); • double — число двойной точности (8 байтов); • extended — число расширенной точности (10 байтов). Как мы обсуждали в главе 4, большинство вещественных чисел хранится в памяти неточно, и в результате операций с ними накапливается вычислительная ошибка. Поэтому для работы с целочисленными данными не нужно использовать вещественные переменные. Диапазон состоит из всех целых чисел от минимального до максимального значения (включая обе эти границы). Логические переменные в Паскале относятся к типу boolean и принимают значения True (истина) и False (ложь). Несмотря на то, что теоретически для хранения логического значения достаточно одного бита памяти, обычно такая переменная занимает в памяти один байт (или даже несколько байтов). Так как процессор может читать и записывать в память только целые байты, операции с логическими переменными в этом случае выполняются 6bicrpee. Переменные типа char могут хранить один символ (точнее, его код) размером 1 байт. Символьные строки относятся к типу string (во многих версиях Паскаля длина строки не может быть больше 255 символов). Арифметические выражения и операции В языках программирования используется линейная запись арифметических выражений (без многоэтажных дробей). В школьном алгоритмическом языке выражение записывается в одну строку, а в Паскале запись можно переносить на следующие строки. Арифметические выражения могут содержать константы (постоянные значения), имена переменных, знаки арифметических операций, круглые скобки (для изменения порядка действий) и вызовы функций. Например: а:=(с+5-1)/2*d а:=(с+5-1)/2*d; При определении порядка действий используется приоритет (старшинство) операций. Они выполняются в следующем порядке: • действия в скобках; • умножение и деление, слева направо; • сложение и вычитание, слева направо. Таким образом, умножение и деление имеют одинаковый приоритет, более высокий, чем сложение и умножение. Поэтому в приведённом примере значение выражения, заключённого в скобки, сначала разделится на 2, а потом умножится на d. Если в выражение входят переменные разных типов, в некоторых случаях происходит автоматическое приведение типа к более «широкому». Например, результат умножения целого числа на вещественное — это вещественное число. Переход к более «узкому» типу автоматически не выполняется, поэтому, например, вещественное значение нельзя записать в целую переменную. Нужно помнить, что результат деления (операции «/») — это вещественное число, даже если делимое и делитель — целые и делятся друг на друга нацело^. Часто нужно получить целый результат деления целых чисел и остаток от деления. В этом случае в школьном алгоритмиче- О о в некоторых языках, например в Си, это не так: при делении целых чисел получается целое число и остаток отбрасывается. Алгоритмизация и программирование ском языке используют функции div и mod, а в Паскале — одноимённые операции (они имеют такой же приоритет, как умножение и деление): d:= 85; = 8 а: = 5 Ь = 85 = div(d,10) = mod(d,10) I I = d div 10; { = d mod 10; { = 8 = 5 Нужно учитывать, что для отрицательных чисел эти операции по-разному выполняются в разных языках. Например, внешне следующие программы аналогичны: вывод div (-7,2), write (-7 div 2, ','); вывод mod(-7,2) write(-7 mod 2); Ho программа на школьном алгоритмическом языке выведет результат «-4,1», а программа на Паскале — «-3,-1». Дело в том, что с точки зрения теории чисел остаток — это неотрицательное число, поэтому -7 = (-4) • 2-1-1, т. е. частное от деления (-7) на 2 равно -4, а остаток равен 1. Поэтому в среде КуМир эти операции выполняются математически правильно. В то же время во многих языках (например, в Паскале и в Си) при целочисленном делении используется модуль числа, а затем к частному и остатку добавляется знак «минус»: 7 = 3-2+ 1=>-7 = (-3)-2-1. При таком подходе частное от деления (-7) на 2 равно -3, а результат операции mod равен -1. В школьном алгоритмическом языке есть операция возведения в степень, которая обозначается двумя звездочками: «**». Например, выражение у = 2х^ +2^ запишется так: у:= 2*x**2+z**3 Возведение в степень имеет более высокий приоритет, чем умножение и деление. В языке Паскаль операции возведения в степень нет. Вещественные значения При записи вещественных чисел в программе целую и дробную части разделяют не запятой (как принято в отечественной математической литературе), а точкой. Например: вещ X var х: double; х:= 123.456 х:= 123.456; Вычисления §56 Вещественное значение нельзя записывать в целочисленную переменную. В языке Паскаль при выводе на экран вещественных значений по умолчанию используется так называемый научный (или экспоненциальный) формат, предназначенный для записи как очень больших, так и очень маленьких чисел. Например, программа а:=1; write(а/3); выведет на экран результат в виде З.ЗЗЗЗЗЗЕ-001 что означает 3,333333 10"^ =0,3333333, т. е. до буквы Е указывают значащую часть числа, а после неё — порядок (см. § 29). Для того чтобы вывести вещественное число в «нормальном» виде, используют форматный вывод: после двоеточия записывают общее количество знакомест, которое нужно отвести на число, а затем, снова через двоеточие — количество знаков в дробной части.___ Такую же форму записи можно использовать и в среде КуМир (начиная с версии 2.0). Например, программа а := 123 ВЫВОД а:5 а := 123; write ( а:5 ) . выводит то же значение в 7 позициях с тремя знаками в дробной части: __0.333 Поскольку эта запись занимает 5 позиций (а под неё отведено 7 позиций), перед числом добавляются два пробела, обозначенные знаком «^». Стандартные функции В арифметических выражениях можно использовать стандартные математические функции, например: abs(x) — модуль числа х; sqrt (х) — квадратный корень из числа х (для х > 0); sin (х) — синус угла х, заданного в радианах; cos (х) — косинус угла х, заданного в радианах; ехр (х) — экспонента числа х, т. е. е^, где е » 2,718 — основание натуральных логарифмов; In (х) — натуральный логарифм числа х (для х > 0). Алгоритмизация и программирование О Последние две функции позволяют выполнить возведение в степень в Паскале, используя равенство -еу\пх Существуют функции для перехода от вещественных значений к целым. В языке Паскаль есть функции: trunc (х) — отбрасывание дробной части вещественного числа х; round (х) — округление вещественного числа х до ближайшего целого. В школьном алгоритмическом языке есть функция выделения целой части числа: int(x). Нужно иметь в виду, что функция trunc в Паскале отбрасывает дробную часть, а функция int в школьном алгоритмическом языке находит целую часть по правилам математики (как наибольшее целое число, не превосходящее данное). Поэтому при работе с отрицательными числами они могут давать разный результат: вывод int (-1.5) I = -2 write(trunc(-1.5)); { = -1 ) Функция frac(x) в языке Паскаль выделяет дробную часть вещественного числа х. Случайные числа В некоторых задачах необходимо моделировать случайные события, например результат бросания игрального кубика (на нём может выпасть число от 1 до 6). Как сделать это на компьютере, который по определению «неслучаен», т. е. строго выполняет заданную ему программу? Случайные числа — это последовательность чисел, в которой невозможно предсказать следующее число, даже зная все предыдущие. Чтобы получить истинно случайные числа, можно, например, бросать игральный кубик или измерять какой-то естественный шумовой сигнал (например, радиошум или электромагнитный сигнал, принятый из космоса). На основе этих данных составлялись и публиковались таблицы случайных чисел, которые использовали в разных областях науки. Вернёмся к компьютерам. Ставить сложную аппаратуру для измерения естественных шумов или космического излучения на каждый компьютер очень дорого, и повторить эксперимент будет невозможно — завтра все значения будут уже другими. Существующие таблицы слишком малы, когда, скажем, нужно получать 100 случайных чисел каждую секунду. Для хранения больших таблиц требуется много памяти. Вычисления §56 Чтобы выйти из положения, математики придумали алгоритмы получения псевдослучайных («как бы случайных») чисел. Для «постороннего» наблюдателя псевдослучайные числа практически неотличимы от случайных, но они вычисляются по некоторой математической формуле^; зная первое число («зерно»), можно по формуле вычислить второе, затем третье и т. п. В школьном алгоритмическом языке существуют две функции для получения случайных (т. е. псевдослучайных) чисел в заданном интервале: rand (а, Ь) — случайное вещественное число в полуинтервале [а, Ь); irand (а, Ь) — случайное целое число на отрезке [а,Ь]. В Паскале есть аналогичные функции: random — случайное вещественное число в полуинтервале [0,1) (вызов функции без параметров); random (N) — случайное целое число на отрезке [О, N-1]; Для того чтобы записать в целую переменную п случайное число в диапазоне от 1 до 6 (результат бросания кубика), можно использовать такие операторы: n:=irand(l, 6) n:=random(6)+1; Вещественное случайное число в полуинтервале от 5 до 12 (не включая 12) получается так: x:=rand(5, 12) х:=7*random+5; Вопросы и задания 1. Какие типы данных вы знаете? 2. Почему во многих языках программирования есть несколько целочисленных и вещественных типов данных? 3. Чем отличается символьная переменная от строковой? 4. Какие данные записываются в логические переменные? Сколько места в памяти они занимают? О в стандартные библиотеки языков программирования обычно входит линейный конгруэнтный генератор псевдослучайных целых чисел, использующий формулу = остаток от деления (аХ^+с) на т, где Xj^i и Xj^ — следующее и предыдущее псевдослучайные числа; а, с VI т — целые числа, подобранные так, чтобы в получаемой цепочке чисел было как можно меньше закономерностей. Например, в трансляторе Borland Delphi использовались значения а =134775813, с = 1ит=232. Алгоритмизация и программирование О 5. Что такое приоритет операций? Зачем он нужен? 6. В каком порядке выполняются операции, если они имеют одинаковый приоритет? 7. Зачем в выражениях используются скобки? 8. Что происходит, если в выражение входят переменные разных типов? Какого типа будет результат? 9. Опишите операции div и mod. Подумайте, почему они не определены для вещественных чисел. 10. Расскажите о проблеме вычисления остатка в различных языках программирования. Обсудите в классе этот вопрос. 11. Как выполняется операция возведения в степень? 12. Какие стандартные математические функции вы знаете? В каких единицах задаётся аргумент тригонометрических функций? 13. Как выполнить округление (к ближайшему целому) в школьном алгоритмическом языке? 14. Какие числа называют случайными? Зачем они нужны? 15. Как получить «естественное» случайное число? Почему такие числа почти не используются в цифровой технике? 16. Чем отличаются псевдослучайные числа от случайных? 17. Какие функции для получения псевдослучайных чисел вы знаете? Подготовьте сообщение а) «Типы данных и переменные в языке Си» б) «Типы данных и переменные в языке Javascript» в) «Типы данных и переменные в языке Python» г) «Вычисление остатка от деления в языках программирования» д) «Датчики псевдослучайных чисел» Задачи 1. Найдите в справочной системе или в Интернете диапазон значений для вещественных типов данных. 2. Напишите программу, которая находит сумму, произведение и среднее арифметическое трёх целых чисел, введённых с клавиатуры. Например, при вводе чисел 4, 5 и 7 мы должны получить ответ 44-5-1-7 = 16, 4-5-7 = 140, (4 -I- 5 -Ь 7)/3 = 5,333333. 3. Напишите программу, которая вводит радиус круга и вычисляет площадь этого круга и длину окружности. На языке Паскаль можно использовать встроенную константу Pi, равную числу л. 4. Напишите программу, которая меняет местами значения двух переменных в памяти. *5. В задаче 4 попробуйте найти решение, которое не использует дополнительные переменные. Вычисления §56 6. Напишите программу, которая возводит введённое число в степень 10, используя только операции сложения и умножения. Что произойдёт, если ввести большое число, например 78? Попытайтесь объяснить полученный результат. 7. Вычислите значение вещественной переменной с при а = 2 и Ь = 3: а) с: = а+1/3 б) с:=а+4/2*3+6 в) с:=а+4)/2*3 г) с:=(а+4)/(Ь+3)*а 8. Вычислите значение целочисленной переменной с при а = 26 и fe = 6: а) с: = mod (а, Ь) +Ь С: = а mod b + b; б) с := div (а, Ь) +а с: = а div b + a; в) Ь: = div (а, Ь) Ь: = а div b; c:=div(a, Ь) с: = а div b; г) Ь: = div (а, Ь) +Ь Ь: = а div b + b; c: = mod(a, Ь) +а с; = а mod b + a; д)b: = mod(a, Ь) +4 Ь:= а mod b + 4; с: = mod (а, Ь) +1 с: = а mod b + 1; е) Ь:= div (а, Ь) Ь;= а div b; с: = mod (а, Ь+1) с:= а mod (b+1); ж)b: = mod(a, Ь) Ь: = а mod b; с: = div (а, Ь+1) с:= а div (b+1); 9. Выполните задание 8 при а = -22 и Ь = 4. Чем различаются результаты работы программ на школьном алгоритмическом языке и на Паскале? 10. Напишите программу, которая вводит трёхзначное число и разбивает его на цифры. Например, при вводе числа 123 программа должна вывести «1,2,3*. 11. Напишите программу, которая вводит координаты двух точек на числовой оси и выводит расстояние между ними. Учитывайте, что первой может быть введена меньшая координата. 12. Напишите программы на обоих языках, которые вводят два вещественных числа (х и у) и вычисляют значение хУ. 13. Напишите программу на школьном алгоритмическом языке, которая округляет вещественное число до ближайшего целого. 14. Напишите программу, которая вводит два целых числа, а и 6 (а < Ь) и выводит на экран 5 случайных целых чисел на отрезке [а, Ь]. 15. Напишите программу, которая моделирует бросание двух игральных кубиков: при запуске выводит случайное число в диапазоне от 2 до 12. Алгоритмизация и программирование 16. Напишите программу, которая случайным образом выбирает дежурных: выводит два случайных числа в диапазоне от 1 до N, где N — количество учеников вашего класса. С какой проблемой вы можете столкнуться? 17. Напишите программу, которая вводит два вещественных числа, а и Ь (а < Ь) и выводит на экран 5 случайных вещественных чисел в полуинтервале [а, Ь). §57 Ветвления Условный оператор Возможности, описанные в предыдущих параграфах, позволяют писать линейные программы, в которых операторы выполняются последовательно друг за другом, и порядок их выполнения не зависит от входных данных. В большинстве реальных задач порядок действий может несколько изменяться, в зависимости от того, какие данные поступили. Например, программа для системы пожарной сигнализации должна выдавать сигнал тревоги, если данные с датчиков показывают повышение температуры или задымлённость. Для этой цели в языках программирования предусмотрены условные операторы. Например, для того чтобы записать в переменную М максимальное из значений переменных а и Ь, можно использовать оператор: if а>Ь then если а>Ь то М:=а иначе М:=Ь все М:=а else М:=Ь; Видно, что запись на школьном алгоритмическом языке — это практически точный перевод записи ключевых слов языка Паскаль на русский язык. Обратите внимание, что в языке Паскаль перед ключевым словом else (иначе) точка с запятой не ставится. В приведённом примере условный оператор записан в полной форме: в обоих случаях (истинно условие или ложно) нужно выполнить некоторые действия. Программа выбора максимального значения может быть написана иначе: Ветвления §57 М:=а если Ь>а то М:=Ь все М:=а; if Ь>а then М:=Ь; Здесь использован условный оператор в неполной форме, потому что в случае, когда условие ложно, ничего делать не требуется (нет слова иначе и операторов после него). Для того чтобы сделать текст программы более понятным, всё тело условного оператора сдвинуто вправо. Вообще говоря, это не обязательно: в Паскале вообще вся программа может быть записана в одну строку, а в школьном алгоритмическом языке важно только разбиение программы на строки, а отступы игнорируются. Тем не менее запись с отступами значительно повышает читаемость программ, и мы далее будем её использовать!. Часто при каком-то условии нужно выполнить сразу несколько действий. Например, в задаче сортировки значений переменных а и 6 по возрастанию нужно поменять местами значения этих переменных, если а > Ь: если а>Ь то с: =а а:=Ь Ь:=с все if а>Ь then begin с: =а ; a: =b ; Ь: =с end; В школьном алгоритмическом языке форма записи совсем не меняется, а на Паскале после ключевого слова then нужно записать составной оператор, в котором между словами begin и end может быть сколько угодно команд. Кроме знаков < , > в условиях можно использовать другие знаки отношений: <= (меньше или равно), >= (больше или равно), = (равно) и о (не равно, два знака < , > без пробела). Внутри условного оператора могут находиться любые операторы, в том числе и другие условные операторы. Например, пусть возраст Андрея записан в переменной а, а возраст Бориса — в переменной Ь. Нужно определить, кто из них старше. Одним условным оператором тут не обойтись, потому что есть три возможных В некоторых языках, например в языке Python, отступы обязательны и все строки одного уровня вложенности должны иметь одинаковые отступы. О Алгоритмизация и программирование результата: старше Андрей, старше Борис и оба одного возраста. Решение задачи можно записать так: если а>Ь то вывод 'Андрей старше' иначе если а=Ь то if а>Ь then writeln('Андрей старше') else if a=b then вывод ' Одного возраста ' writeln (' Одного возраста') иначе else вывод 'Борис старше' writeln('Борис старше'); все все Условный оператор, проверяющий равенство, находится внутри блока иначе (else), поэтому он называется вложенным условным оператором. Как видно из этого примера, использование вложенных условных операторов позволяет выбрать один из нескольких (а не только из двух) вариантов. При работе с вложенными условными операторами в языке Паскаль нужно помнить правило: любой блок else относится к ближайшему предыдущему оператору if, у которого такого блока ещё не было. Например, оператор if а>Ь then write('А') else if a=b then write('=') else write('Б'); может быть записан с выделением структуры так: if а>Ь then write('А') else if a=b then write('=') else write('Б'); Здесь второй блок else относится к ближайшему (второму, вложенному) условному оператору, поэтому буква Б будет выведена только тогда, когда оба условия окажутся ложными. Сложные условия Предположим, что некоторая фирма набирает сотрудников, возраст которых — от 25 до 40 лет включительно. Нужно написать программу, которая запрашивает возраст претендента и выдает ответ: подходит он или не подходит по этому признаку. Ветвления §57 в качестве условия в условном операторе можно указать любое логическое выражение, в том числе сложное условие, составленное из простых отношений с помощью логических операций (связок) «И», «ИЛИ» и «НЕ» (см. главу 3). На языке Паскаль они записываются на английском языке: and, or и not. Пусть в переменной v записан возраст сотрудника. Тогда нужная программа будет выглядеть так: если V >= 25 и V <= 40 то вывод 'подходит' иначе вывод 'не подходит' все if (V >= 25) and (v <= 40) then writeln('подходит') else writeln('не подходит'); Обратите внимание, что в Паскале каждое простое условие заключается в скобки. Это связано с тем, что в этом языке отношения имеют более низкий приоритет, чем логические операции, которые в обоих языках выполняются в таком порядке: сначала все операции «НЕ», затем — «И», и в самом конце — «ИЛИ» (во всех случаях слева направо). Для изменения порядка действий используют круглые скобки. В языке Паскаль есть операция «исключающее ИЛИ» (хог), которая имеет такой же приоритет, что и операция «ИЛИ». Множественный выбор Условный оператор предназначен, прежде всего, для выбора одного из двух вариантов (простого ветвления). Иногда нужно сделать выбор из нескольких возможных вариантов. Пусть, например, в переменной т хранится номер месяца, и нужно вывести на экран его русское название. Конечно, в этом случае можно использовать 12 условных операторов: если т=1 то вывод 'январь' все если т=2 то вывод 'февраль' все if m=l then write('январь'); if m=2 then write('февраль'); если m=12 то вывод 'декабрь' все if m=12 then write('декабрь' 5—49 Алгоритмизация и программирование Вместо многоточий могут быть записаны аналогичные операторы для остальных значений т. Но во многих языках программирования для подобных случаев есть специальный оператор выбора: выбор при т=1: вывод 'январь' при т=2: вывод 'февраль' case m of 1: write('январь'); 2: write('февраль') при m=12: вывод 'декабрь' иначе вывод 'ошибка' все 12: write('декабрь') else write('ошибка') end; Кроме очевидных 12 блоков здесь добавлен ещё один, который сигнализирует об ошибочном номере месяца. Он начинается ключевым словом иначе (в Паскале — else). В школьном алгоритмическом языке для выбора можно использовать любые условия (а не только равенство). Например, следующий оператор записывает в переменную sgn знак значения переменной х: выбор при х<0: sgn:=-l при х=0: sgn:=0 при х>0: sgn:=l все В Паскале можно через запятую указывать список значений, для которых выполняются одинаковые действия. Например, программа для определения количества дней в месяце (для невисокосного года) может быть записана так: case m of 2: d:=28; 1,3,5,7,8,10,12: d; else d:=30 end; =31 Допускаются также интервалы (диапазоны), в них начальное и конечное значения отделены двумя точками. Следующая программа выводит социальный статус человека в зависимости от возраста: Ветвления §57 case V of О..6: write{'дошкольник') ; 7.. 17: write('школьник') else write('взрослый') end; Если в каком-то из вариантов нужно выполнить несколько действий, в языке Паскаль используется составной оператор: нужные команды заключаются в операторные скобки begin и end. Подготовьте сообщение а) «Условные операторы и операторы выбора в языке Си» б) «Условные операторы и операторы выбора в языке Python* Вопросы и задания 1. Чем отличаются разветвляющиеся алгоритмы от линейных? 2. Как вы думаете, почему не все задачи можно решить с помощью линейных алгоритмов? Приведите примеры таких задач. 3. Как вы думаете, хватит ли линейных алгоритмов и ветвлений для разработки любой программы? 4. Почему нельзя выполнить обмен значений двух переменных в два шага: а:=Ь; Ь:=а? 5. Чем различаются условные операторы в полной и неполной формах? Как вы думаете, можно ли обойтись только неполной формой? 6. Какие отношения вы знаете? Как обозначаются отношения «равно» и «не равно»? 7. Что такое сложное условие? 8. Как определяется порядок вычислений в сложном условии? Расскажите об особенностях вычисления логических выражений в языке Паскаль. 9. Зачем нужен оператор выбора? Как можно обойтись без него? 10. Расскажите о различиях в операторах выбора в школьном алгоритмическом языке и в Паскале. 11. Как в операторе выбора записать, что нужно делать, если ни один вариант не подошёл? 12. Как в операторе выбора в языке Паскаль выполнить для какого-то варианта несколько операторов? 1 Алгоритмизация и программирование О Задачи 1. Покажите, что приведённая программа не всегда верно определяет максимальное из трёх чисел, записанных в переменные а, Ь и с: если а>Ь то М:=а иначе М:=Ь все если с>Ь то М:=с иначе М:=Ь все if а>Ь then М:=а else М:=Ь; if с>Ь then М:=с else М:=Ь; Приведите контрпример, т. е. значения переменных, при котором в переменной М будет получен неверный ответ. Как нужно доработать программу, чтобы она всегда работала правильно? 2. Напишите программу, которая выбирает максимальное и минимальное из пяти введённых чисел. 3. Напишите программу, которая определяет, верно ли, что введённое число трёхзначное. 4. Напишите программу, которая вводит номер месяца и выводит название времени года. Оператор выбора использовать не разрешается. При вводе неверного номера месяца должно быть выведено сообщение об ошибке. 5. Решите предыдущую задачу с помощью оператора выбора. 6. Напишите программу, которая вводит с клавиатуры номер месяца и определяет, сколько дней в этом месяце. При вводе неверного номера месяца должно быть выведено сообщение об ошибке. 7. Напишите программу, которая вводит с клавиатуры номер месяца и день и определяет, сколько дней осталось до Нового года. При вводе неверных данных должно быть выведено сообщение об ошибке. 8. Напишите программу, которая вводит возраст человека (целое число, не превышающее 120) и выводит этот возраст со словом «год», ♦ года* или «лет». Например: *21 год», «22 года», «25 лет». 9. Напишите программу, которая вводит целое число, не превышающее 100, и выводит его прописью, например: 21 -> «двадцать один». 10. Напишите программу, которая вводит координаты точки на плоскости и определяет, попала ли эта точка в заштрихованную область. Ветвления §57 11. Напишите два варианта программы, которая вводит координаты точки на плоскости и определяет, попала ли эта точка в заштрихованную область. Один вариант программы должен использовать сложные условия, второй — обходиться без них. у = sin X у = 0,5 0 вывод 'привет', нс уменьшить счётчик на 1 Циклические алгоритмы §58 в этих примерах мы использовали цикл с условием, который выполняется до тех пор, пока некоторое условие не станет ложным. Циклы с условием Рассмотрим следующую задачу: определить количество цифр в десятичной записи целого положительного числа. Будем предполагать, что исходное число записано в целую переменную п. Сначала составим алгоритм решения этой задачи. Чтобы считать что-то в программе, нужно использовать переменную, которую называют счётчиком. Для подсчёта количества цифр нужно как-то отсекать эти цифры по одной, с начала или с конца, каждый раз увеличивая счётчик. Начальное значение счётчика должно быть равно нулю, так как до выполнения алгоритма ещё не найдено ни одно цифры. Для отсечения первой цифры необходимо заранее знать, сколько цифр в десятичной записи числа, т. е. нужно заранее решить ту задачу, которую мы решаем. Следовательно, этот метод не подходит. Отсечь последнюю цифру проще — достаточно разделить число нацело на 10 (поскольку речь идёт о десятичной системе). Операции отсечения и увеличения счётчика нужно выполнять столько раз, сколько цифр в числе. Как же «поймать» момент, когда цифры кончатся? Несложно понять, что в этом случае результат очередного деления на 10 будет равен нулю, это и говорит о том, что отброшена последняя оставшаяся цифра. Изменение переменной п и счётчика для начального значения 1234 можно записать в виде таблицы на рис. 8.1. Псевдокод выглядит так: п счётчик 1234 0 123 1 12 2 1 3 0 4 Рис. 8.1 счётчик:=0 пока п>0 отсечь последнюю цифру п увеличить счётчик на 1 Алгоритмизация и программирование Программа на школьном алгоритмическом языке очень похожа на псевдокод, а программа на Паскале почти совпадает с его переводом на английский язык: count:=0 нц пока п>0 п:=div(п,10) count:=count+l кц count:=0; while n>0 do begin n:=n div 10; count:=count+l end; Здесь целочисленная переменная-счётчик имеет имя count. Отметим, что в Паскале после ключевого слова do стоит составной оператор, ограниченный ключевыми словами begin ... end. Если в теле цикла нужно выполнить только один оператор, эти операторные скобки можно не ставить. Обратите внимание, что проверка условия выполняется в начале цикла. Такой цикл называется циклом с предусловием (т. е. с предварительной проверкой условия) или циклом «пока». Если в начальный момент значение переменной п будет нулевое или отрицательное, цикл не выполнится ни одного раза. В данном случае количество шагов цикла «пока» неизвестно, оно равно количеству цифр введённого числа, т. е. зависит от исходных данных. Цикл этого вида может быть использован и в том случае, когда число шагов известно заранее или может быть вычислено: к:=0 нц пока к<10 вывод 'Привет', нс к:=к+1 кц к:=0; while к<10 do begin writeln('Привет'); к:=к+1 end; Если условие в заголовке цикла никогда не нарушится, цикл будет работать бесконечно долго. В этом случае говорят, что программа зациклилась. Например, если забыть увеличить переменную k в рассмотренном выше примере, программа зациклится: к:=0 нц пока к<10 вывод 'Привет', нс кц к:=0; while к<10 do begin writeln('Привет'); end; Циклические алгоритмы §58 Во многих языках программирования существует цикл с постусловием, в котором условие проверяется в конце цикла. Это полезно в том случае, когда нужно обязательно выполнить цикл хотя бы один раз. Например, пусть пользователь должен ввести с клавиатуры положительное число. Для того чтобы защитить программу от неверных входных данных, можно использовать цикл с постусловием: нц вывод "Введите п>0; ввод п кц при п>0 repeat write('Введите п>0: read(п); until п>0; Этот цикл закончится тогда, когда станет истинным условие л>0 в последней строке, т. е. тогда, когда пользователь введёт допустимое значение. Обратите внимание на особенности этого вида цикла: • при входе в цикл условие не проверяется, поэтому цикл всегда выполняется хотя бы один раз; • в последней строке указывают условие окончания цикла (а не условие его продолжения). Цикл с переменной В информатике важную роль играют степени числа 2 (2, 4, 8, 16 и т. д.) Чтобы вывести все степени двойки от 2^ до 2^®, мы уже можем написать такую программу с циклом «пока»: к:=1 к:=1; п;=2 нц пока к<=10 п; =2 ; while к<=10 do begin вывод П, НС п:=п*2 writeln (п); п:=п * 2; к:=к+1 к:=к+1 кц end; Вы наверняка заметили, что переменная k используется трижды (см. выделенные блоки): в операторе присваивания начального значения, в условии цикла и в теле цикла (увеличение на 1). Чтобы собрать все действия с ней в один оператор, во мно- Алгоритмизация и программирование гие языки программирования введён особый вид цикла — цикл с переменной. В заголовке этого цикла задаются начальное и конечное значения этой переменной, а шаг её изменения по умолчанию равен 1: п: =2 нц для к от 1 до 10 вывод п, нс п: =п*2 кц п:=2; for к:=1 to 10 do begin writeln(n); n:=n * 2 end; Здесь, в отличие от цикла «пока», переменная цикла может быть только целой. С каждым шагом цикла переменная цикла может не только увеличиваться, но и уменьшаться на 1. Для этого в школьном алгоритмическом языке добавляется параметр шаг, а в Паскале ключевое слово to заменяется на down to («движение вниз до»). Следующая программа выводит квадраты натуральных чисел от 10 до 1 в порядке убывания: нц для к от 10 до вывод к*к, нс кц шаг -1 for к:-10 downto 1 do writeln(k*k); В школьном алгоритмическом языке шаг изменения переменной цикла может быть любым целым числом, а в Паскале — только 1 или (-1). Вложенные циклы В более сложных задачах часто бывает так, что на каждом шаге цикла нужно выполнять обработку данных, которая также представляет собой циклический алгоритм. В этом случае получается конструкция «цикл в цикле» или вложенный цикл. Предположим, что нужно найти все простые числа в диапазоне от 2 до 1000. Простейший (но не самый быстрый) алгоритм решения такой задачи на псевдокоде выглядит так: нц для п от 2 до 1000 если число п простое то вывод п, нс все кц Циклические алгоритмы §58 Как же определить, что число простое? Как известно, простое число делится только на 1 и само на себя. Если число п не имеет делителей в диапазоне от 2 до л-1, то оно простое, а если хотя бы один делитель в этом интервале найден, то составное. Чтобы проверить делимость числа п на некоторое число А, нужно взять остаток от деления л на А. Если этот остаток равен нулю, то л делится на А. Таким образом, программу можно записать так (здесь л, А и count — целочисленные переменные, count обозначает счётчик делителей): нц для п от 2 до 1000 count:=0 нц для к от 2 до п-1 если mod(n,k)=0 то count:=count+l все кц если count=0 то вывод п, нс все кц for п;=2 to 1000 do begin count:=0; for к:=2 to n-1 do if n mod k=0 then count:=count+1; if count=0 then writeln (n); end; Попробуем немного ускорить работу программы. Делители числа обязательно идут в парах, причём в любой паре меньший из делителей не превосходит л/л (так как произведение двух делителей, каждый из которых больше 7л, будет больше, чем л). Поэтому внутренний цикл можно выполнять только до значения л/л вместо л-1. Для того чтобы работать только с целыми числами (и таким образом избежать вычислительных ошибок), лучше заменить условие А < л/л на равносильное ему условие А^ < л. При этом потребуется перейти к внутреннему циклу с условием: count:=0 к: =2 нц пока к*к<=п если mod(n,k)=0 то count:=count+l все к:=к+1 кц count:=0; к:=2; while к*к<=п do begin if n mod k=0 then count:=count+l; k:=k+l end; Алгоритмизация и программирование Чтобы ещё ускорить работу цикла, заметим, что когда найден хотя бы один делитель, число уже заведомо составное, и искать другие делители в данной задаче не требуется. Поэтому можно закончить цикл. Для этого в условие работы цикла добавляется условие count = О, связанное с имеющимся условием с помощью операции «И»: нц пока к*к<=п и count=0 кц while (к*к<=п) do begin end; and (count=0) В любом вложенном цикле переменная внутреннего цикла изменяется быстрее, чем переменная внешнего цикла. Рассмотрим, например, такой вложенный цикл: нц для i от 1 до 4 нц для к от 1 до for i:=l to 4 do begin for k:=l to i do begin КЦ КЦ end end; Ha первом шаге (при i = 1) переменная k принимает единственное значение 1. Далее, при i = 2 переменная k принимает последовательно значения 1 и 2. На следующем шаге при i = 3 переменная k проходит значения 1, 2 и 3, и т. д. Вопросы и задания 1. Что такое цикл? 2. Сравните цикл с переменной и цикл с условием. Какие преимущества и недостатки есть у каждого из них? 3. Что означает выражение «цикл с предусловием»? 4. В каком случае цикл с предусловием не выполняется ни разу? 5. В каком случае программа, содержащая цикл с условием, может зациклиться? Приведите пример такой программы. 6. В каком случае цикл с переменной не выполняется ни разу? 7. Верно ли, что любой цикл с переменной можно заменить циклом с условием? Верно ли обратное утверждение? Ответ обоснуйте. 8. В каком случае можно заменить цикл с условием на цикл с переменной? Циклические алгоритмы §58 9. Как будет работать приведённая в параграфе программа, которая считает количество цифр введённого числа, при вводе отрицательно-го числа? Если вы считаете, что она работает неправильно, укажите, как её нужно доработать. Подготовьте сообщение а) «Операторы цикла в языке Си» б) «Операторы цикла в языке Python» А Задачи 1. Напишите программу, которая вводит два целых числа и находит их произведение, не используя операцию умножения. Учтите, что числа могут быть отрицательными. 2. Напишите программу, которая вводит натуральное число N и находит сумму всех натуральных чисел от 1 до N. Используйте сначала цикл с условием, а потом — цикл с переменной. 3. Напишите программу, которая вводит натуральное число N и выводит первые N чётных натуральных чисел. 4. Напишите программу, которая вводит натуральные числа а и ft, и выводит квадраты натуральных чисел в диапазоне от а до Ь. Например, если ввести 4 и 5, программа должна вывести: 4*4=16 5*5=25 5. Напишите программу, которая вводит натуральные числа а и Ь, и выводит сумму квадратов натуральных чисел в диапазоне от а до Ь. 6. Напишите программу, которая вводит натуральное число N и выводит на экран N псевдослучайных чисел. Запустите её несколько раз, объясните результаты опыта. 7. Найдите все пятизначные числа, которые при делении на 133 дают в остатке 125, а при делении на 134 дают в остатке 111. 8. Напишите программу, которая вводит натуральное число N и выводит на экран все натуральные числа, не превосходящие N и делящиеся на каждую из своих цифр. 9. Числа Армстронга. Натуральное число называется числом Армстронга, если сумма цифр числа, возведённых в N-ю степень, где N — количество цифр в числе, равна самому числу. Например: 153 = 1® -ь 5® -ь 3®. Найдите все трёхзначные и четырёхзначные числа Армстронга. О Алгоритмизация и программирование 10. Автоморфные числа. Натуральное число называется автоморфным, если оно равно последним цифрам своего квадрата. Например: 25^ = 625. Напишите программу, которая вводит натуральное число iV и выводит на экран все автоморфные числа, не превосходящие N. 11. Напишите программу, которая считает количество чётных цифр введённого числа. 12. Напишите программу, которая считает сумму цифр введённого числа. 13. Напишите программу, которая определяет, верно ли, что введённое число содержит две одинаковые цифры, стоящие рядом (как, например, 221). 14. Напишите программу, которая определяет, верно ли, что введённое число состоит из одинаковых цифр (как, например, 222). *15. Напишите программу, которая определяет, верно ли, что введённое число содержит по крайней мере две одинаковые цифры, возможно, не стоящие рядом (как, например, 212). 16. Используя сначала цикл с условием, а потом — цикл с переменной, напишите программу, которая выводит на экран чётные степени числа 2 от 2^° до 2^ в порядке убывания. 17. Алгоритм Евклида для вычисления наибольшего общего делителя (НОД) двух натуральных чисел формулируется так: нужно заменять большее число на разность большего и меньшего до тех пор, пока одно из них не станет равно нулю; тогда второе и есть НОД. Напишите программу, которая реализует этот алгоритм. Какой цикл тут нужно использовать? 18. Напишите программу, использующую модифицированный алгоритм Евклида', нужно заменять большее число на остаток от деления большего на меньшее до тех пор, пока этот остаток не станет равен нулю; тогда второе число и есть НОД. 19. Добавьте в решение двух предыдущих задач вычисление количества шагов цикла. Заполните таблицу (в строки ^шаги-1» и «шаги-2» записывается количество шагов для двух версий алгоритма Евклида). а 64168 358853 6365133 17905514 549868978 ь 82678 691042 11494962 23108855 298294835 НОД(а, Ь) шаги-1 шаги-2 Циклические алгоритмы §58 20. Напишите программу, которая вводит с клавиатуры 10 чисел и вычисляет их сумму и произведение. 21. Напишите программу, которая вводит с клавиатуры числа до тех пор, пока не будет введено число 0. В конце работы программы на экран выводится сумма и произведение введённых чисел. 22. Напишите программу, которая вводит с клавиатуры числа до тех пор, пока не будет введено число 0. В конце работы программы на экран выводятся минимальное и максимальное из введённых чисел. 23. Напишите программу, которая вводит с клавиатуры натуральное число N и определяет его факториал, т. е. произведение натуральных чисел от 1 до N\ N\=\-2 Z-... N. Что будет, если ввести большое значение N (например, 20)? 24. Напишите программу, которая вводит натуральные числа А 1л N к вычисляет . 25. Напишите программу, которая выводит на экран все цифры числа, начиная с первой. 26. Ряд чисел Фибоначчи задаётся следующим образом: первые два числа равны 1 (1^ = 7^ = 1), а каждое следующее равно сумме двух предыдущих: 7^ Напишите программу, которая вводит натуральное число N и выводит на экран первые N чисел Фибоначчи. 27. Напишите программу, которая вводит натуральные числа а и Ь и выводит все простые числа в диапазоне от а до Ь. 28. Совершенным называется число, равное сумме всех своих делителей, меньших его самого (например, число 6 = 1 -ь 2 -(- 3). Напишите программу, которая вводит натуральное число N и определяет, является ли число N совершенным. 29. Напишите программу, которая вводит натуральное число N и находит все совершенные числа в диапазоне от 1 до N. 30. В магазине продаётся мастика в ящиках по 15, 17, 21 кг. Как купить ровно 185 кг мастики, не вскрывая ящики? Сколькими способами можно это сделать? *31. Ввести натуральное число N и вывести значение числа 1/iV, выделив период дроби. Например: 1/2 = 0,5 или 1/7 = 0,(142857). *32. В телевикторине участнику предлагают выбрать один из трёх заг крытых чёрных ящиков, причём известно, что в одном из них приз, а в двух других пусто. После этого ведущий открывает один пустой ящик (но не тот, который выбрал участник) и предлагает заново сделать выбор, но уже между двумя оставшимися ящиками. Используя псевдослучайные числа, выполните моделирование 1000 раундов этой игры и определите, как следует поступить участнику, чтобы с большей вероятностью получить приз: выбрать тот же ящик, что и в начале игры, или другой. 1 Алгоритмизация и программирование §59 Процедуры Что такое процедура? Предположим, что в нескольких местах программы требуется выводить на экран сообщение об ошибке: Ошибка программы. Это можно сделать, например, так: вывод "Ошибка программы" write('Ошибка программы'); Конечно, можно вставить этот оператор вывода везде, где нужно вывести сообщение об ошибке. Но тут есть две сложности. Во-первых, при этом строка-сообщение будет храниться в памяти много раз. Во-вторых, если мы задумаем поменять текст сообщения, нужно будет искать эти операторы вывода по всей программе. Для таких случаев в языках программирования предусмотрены процедуры — вспомогательные алгоритмы, которые выполняют некоторые действия. алг С процедурой program withProc; Обратим внимание на разницу оформления программы с процедурой в школьном алгоритмическом языке и в Паскале. В школьном алгоритмическом языке процедура оформляется точно так же, как и основной алгоритм, но размещается после основной программы. Процедуры §59 в Паскале процедура начинается с ключевого слова procedure, тело процедуры начинается с ключевого слова begin и заканчивается ключевым словом end с точкой с запятой. Процедура располагается после блока объявления переменных, но выше основной программы. Фактически мы ввели в язык программирования новую команду Error, которая была расшифрована прямо в теле программы. Для того чтобы процедура заработала, в основной программе (или в другой процедуре) необходимо ее вызвать по имени. Как мы видели, использование процедур сокраш;ает код, если какие-то операции выполняются несколько раз в разных местах программы. Кроме того, иногда большую программу разбивают на несколько процедур для удобства, оформляя в виде процедур отдельные этапы сложного алгоритма. Такой подход делает всю программу более понятной. Процедура с параметрами Процедура Error при каждом вызове делает одно и то же. Более интересны процедуры, которым можно передавать параметры (аргументы) — дополнительные данные, которые изменяют выполняемые действия. Предположим, что в программе требуется многократно выводить на экран запись целого числа (0..255) в 8-битном двоичном коде. Старшая цифра в такой записи — это частное от деления числа на 128. Далее возьмём остаток от этого деления и разделим на 64 — получается вторая цифра и т. д. Алгоритм, решающий эту задачу для переменной л, можно записать так: к:=128 нц пока к>0 вывод div(n,k) п:= mod(п,к) к:= div(к,2) кц к:=128; while к>0 do begin write(n div к); n: = n mod k; к:= к div 2 end; Писать такой цикл каждый раз, когда нужно вывести двоичное число, очень утомительно. Кроме того, легко сделать ошибку или опечатку, которую будет сложно найти. Поэтому лучше оформить этот вспомогательный алгоритм в виде процедуры. Но этой Алгоритмизация и программирование процедуре нужно передать значение параметра — число для перевода в двоичную систему. Программа получается такой: алг Двоичный код нач printBin(99) кон алг printBin(цел пО) нач цел п, к п: = пО к:= 128 нц пока к>0 вывод div(n,k) п:= mod(п, к) к:= div(к,2) кц кон program binCode; procedure printBin(n: integer); var k: integer; begin k:= 128; while k>0 do begin write(n div k); n:= n mod k; k:= к div 2 end end; begin printBin(99) end. Основная программа содержит всего одну команду — вызов процедуры printBin для значения 99. В заголовке процедуры в скобках записывают тип и внутреннее имя параметра (т. е. имя, по которому к нему можно обращаться в процедуре). Значение параметра, переданное из вызывающей программы в процедуру (в этом примере — число 99), обычно называют аргументом. В процедуре объявлена локальная (внутренняя) переменная k — она известна только внутри этой процедуры. Обратите внимание, что в школьном алгоритмическом языке локальные переменные объявляются после ключевого слова нач, а в языке Паскаль — до слова begin. В школьном алгоритмическом языке запрещено изменять параметры процедуры внутри процедуры, поэтому мы назвали параметр пО, а в начале процедуры скоцировали его значение в переменную п. Параметров может быть несколько, в этом случае они перечисляются в заголовке процедуры через запятую (в школьном алгоритмическом языке) или точку с запятой (в Паскале). Например, процедуру, которая выводит экран среднее арифметическое двух целых чисел, можно записать так: Процедуры §59 алг printSred(цел а, цел Ь) нач вывод (а+Ь)/2 кон procedure printSred (а: integer; b: integer); begin write((a+b)/2); end. Если несколько параметров одного типа стоят в списке один за другим, их можно определить списком: алг printSred (цел а, Ь) procedure printSred(a, b: integer); нач begin вывод (a+b)/2 write((a+b)/2); KOH end. Изменяемые параметры Напишем процедуру, которая меняет местами значения двух переменных. Проще всего для этого использовать третью переменную (пока напишем программу только на Паскале): program Exchange; var X, у: integer; procedure Swap(a, b: integer); var c: integer; begin c:=a; a:=b; b:=c end; begin x:=2; y:=3; Swap(x, y) ; write(x, ' ', y) end. После запуска этой программы обнаружится, что значения переменных X ш у остались прежними: на экран будет выведено: 2 3. Дело в том, что эта процедура работает с копиями переданных ей параметров. Это значит, что процедура Swap создаёт в памяти временные локальные переменные с именами а и 6 и копирует в них переданные значения переменных хну основной программы. Поэтому и все перестановки в нашей программе были Алгоритмизация и программирование сделаны именно с копиями, а значения переменных х и у не изменились. Такая передача параметров называется передачей по значению. Чтобы решить проблему, нужно явно сказать, чтобы процедура работала с теми же ячейками памяти, что и основная программа. Для этого в Паскале в заголовке процедуры перед именем изменяемого параметра пишут ключевое слово var: procedure Swap( var integer); Теперь процедура решает поставленную задачу: на выходе мы увидим: 3 2, что и требовалось. В подобных случаях говорят, что параметры передаются по ссылке, а не по значению. Это означает, что фактически в процедуру передаётся адрес переменной и можно изменять значение этой переменной, записывая новые данные по этому адресу. При вызове процедуре Swap можно передавать только переменные, но не константы (постоянные) и не арифметические выражения. Например, вызовы Swap (2, 3) и Swap(x, у+3) противоречат правилам языка программирования, и программа выполняться не будет. В школьном алгоритмическом языке все параметры делятся на аргументы (исходные данные, обозначаются арг) и результаты (ключевое слово рез, эти значения процедура передаёт вызывающей программе). По умолчанию (если не указано иначе) все параметры считаются аргументами. Поэтому два следующих заголовка равносильны: алг Swap(цел а, Ь) и алг Swap( арг цел а, Ь) В нашем случае параметры процедуры одновременно являются и аргументами, и результатами, поэтому их нужно объявлять с помощью ключевого слова аргрез. Приведём полную программу: алг Обмен нач цел х=2, у=3 Swap(x, у) вывод X, ' ', у кон щ Процедуры §59 алг Swap(aprpes цел а, Ь) нач цел с с:=а; а:=Ь; Ь:=с кон Вопросы и задания 1. Что такое процедуры? В чём смысл их использования? 2. Как оформляются процедуры в школьном алгоритмическом языке и в Паскале? 3. Достаточно ли включить процедуру в текст программы, чтобы она «сработала»? 4. Что такое параметры? Зачем они используются? 5. Какие переменные называются локальными? Где они объявляются? 6. Как оформляются процедуры, имеющие несколько параметров? 7. Что такое изменяемые параметры? Зачем они используются? 8. Как в заголовке процедуры отличить изменяемый параметр от неизменяемого? Приведите примеры. 9. Какие типы параметров выделяются в школьном алгоритмическом языке? Как они объявляются? Подготовьте сообщение а) «Процедуры в языке Си» б) «Процедуры в языке Python» Задачи 1. Напишите процедуру, которая выводит на экран запись числа, меньшего, чем 8^°, в виде 10 знаков в восьмеричной системе счисления. 2. Напишите процедуру, которая выводит на экран запись числа, меньшего, чем 16‘* = 65 536, в виде 4 знаков в шестнадцатеричной системе счисления. 3. Напишите процедуру, которая принимает параметр — натуральное число N и выводит на экран квадрат из звёздочек со стороной N. 4. Напишите процедуру, которая принимает числовой параметр — возраст человека в годах и выводит этот возраст со словом «год», ♦ года» или «лет». Например, 21 год, 22 года, 12 лет. О Алгоритмизация и программирование 5. Напишите процедуру, которая выводит переданное ей число прописью. Например: 21 -> двадцать один. 6. Напишите процедуру, которая принимает параметр — натуральное число N и выводит первые N чисел Фибоначчи (см. задачу 26 к § 58). 7. Напишите процедуру, которая определяет, верно ли, что переданное ей число — простое. (Используйте изменяемые параметры.) 8. Напишите процедуру, которая выводит на экран в столбик все цифры переданного ей числа, начиная с последней. 9. Напишите процедуру, которая выводит на экран в столбик все цифры переданного ей числа, начиная с первой. 10. Напишите процедуру, которая выводит на экран все делители переданного ей числа (в одну строчку). 11. Напишите процедуру, которая принимает параметр — натуральное число N — и выводит на экран линию из N символов *12. Напишите процедуру, которая выводит на экран запись переданного ей числа в римской системе счисления. §60 функции Пример функции С функциями вы уже знакомы, потому что наверняка применяли стандартные функции языка программирования (например, abs, sin, cos). Функция, как и процедура, — это вспомогательный алгоритм, который может принимать параметры (аргументы). Но, в отличие от процедуры, функция всегда возвращает значение-результат. Результатом может быть число, символ, символьная строка или данные другого типа. Составим функцию, которая вычисляет сумму цифр числа. Будем использовать следующий алгоритм (предполагается, что число записано в переменной п): сумма:=0 нц пока поО сумма: =сумма-ьтос1 (п, 10) п:=div(п,10) кц функции §60 Чтобы получить последнюю цифру числа (которая добавляется к сумме), нужно взять остаток от деления числа на 10. Затем последняя цифра отсекается, и мы переходим к следующей цифре. Цикл продолжается до тех пор, пока значение п не станет равно нулю. Как указать в программе, чему равно значение функции? Для этого часто используют такой приём: значение функции записывается в специальную переменную. В школьном алгоритмическом языке имя этой переменной — знач, а в Паскале оно совпадает с именем функции (во многих версиях Паскаля можно использовать вместо этого встроенную переменную Result): end. Обратим внимание на особенности записи: тип возвращаемого значения указывается в заголовке функции (в школьном алгоритмическом языке — перед именем функции, в Паскале — в конце заголовка через двоеточие). Так же как и в процедурах, в функциях можно объявлять и использовать локальные переменные. Они входят в «зону видимости» только этой функции, для всех остальных функций и процедур они недоступны. Функции, созданные в программе таким образом, применяются точно так же, как и стандартные функции. Их можно вызывать везде, где может использоваться выражение того типа, кото- Алгоритмизация и программирование рый возвращает функция. Приведём несколько примеров вызова функций на школьном алгоритмическом языке: х:= 2*smnDigits(п+5) z:= sumDigits (к) + surtiDigits (in) если mod(sumDigits(n),2) = 0 выгод 'Сумма цифр чётная'^ нс вывод 'Она равна sumDigits(п) кц Логические функции Достаточно часто применяют специальный тип функций, которые возвращают логическое значение (да или нет. True или False). Иначе говоря, такая логическая функция отвечает на вопрос «Да или нет?» и возвращает 1 бит информации. Вернёмся к задаче, которую мы уже рассматривали: вывести на экран все простые числа в диапазоне от 2 до 1000. Алгоритм определения простоты числа оформим в виде функции. При этом его можно легко вызвать из любой точки программы. Запишем основную программу на псевдокоде: алг Простые числа нач цел i нц для i от 2 до 100 если i — простое то вывод i, нс все кц кон program PrimeNum; var i; integer; begin for i:=2 to 100 do then if 1 — простое writeln(i) end. Предположим, что у нас уже есть логическая функция is Prime, которая определяет простоту переданного ей числа и возвращает да (в Паскале — True), если число простое, и нет (False) в противном случае. Такую функцию можно использовать вместо выделенного блока алгоритма: если isPrime(i) то вывод i, нс все if isPrime(i) then writeln (i); функции Остаётся написать саму функцию is Prime. Будем использовать уже известный алгоритм: если число п в интервале от 2 до 4п не имеет ни одного делителя, то оно простое 1. алг лог isPrime(цeл п) нач цел count=0, к к: =2 нц пока к*к<=п и count=0 если mod(n,k)=0 то count:=count+l все к:=к+1 кц знач:=(count=0) кон function isPrime(n: integer): boolean; var count, k: integer; begin count:=0; к: =2 ; while (k*k<=n) and (count=0) do begin if n mod k=0 then count:=count+l; k:=k+l end; isPrime:=(count=0) end; Эта функция возвращает логическое значение, на это указывает ключевое слово лог (в Паскале — boolean). Значение функции определяется как знач:=(count=0) Это оператор присваивания. Слева от знака «:=» записана логическая переменная, а справа — логическое выражение (условие). Если это выражение истинно, то в переменную знач записывается значение да, иначе — значение нет. Логические функции можно использовать так же, как и любые условия: в условных операторах и циклах с условием. Например, такой цикл останавливается на первом введённом составном числе: ВВОД П ыц пока isPrime(n) вывод 'простое число', нс ввод п кц read(п); while isPrime(n) do begin writeln('простое число'); read(n) end; Эту программу можно ещё немного усовершенствовать: после числа 2 имеет смысл проверять только нечётные делители, увеличивая на каждом шаге значение к сразу на 2. Алгоритмизация и программирование е Вопросы и задания 1. Что такое функция? Чем она отличается от процедуры? 2. Как оформляются функции в тексте программы (сравните школьный алгоритмический язык и Паскаль)? 3. Как по тексту программы определить, какое значение возвращает функция? Приведите пример. 4. Какие функции называются логическими? Зачем они нужны? Подготовьте сообщение а) «Функции в языке Си» б) «Функции в языке Python» О Задачи 1. Напишите функцию, которая вычисляет максимальное из трёх чисел. 2. Напишите функцию, которая вычисляет сразу максимальное и минимальное из трёх чисел. (Используйте изменяемые параметры.) 3. Напишите функцию, которая вычисляет количество цифр числа. 4. Напишите функцию, которая вычисляет наибольший общий делитель двух чисел. 5. Напишите функцию, которая вычисляет наименьшее общее кратное двух чисел. 6. Напишите функцию, которая «разворачивает» десятичную запись числа наоборот, например из 123 получается 321, а из 3210 — 0123. 7. Напишите функцию, которая моделирует бросание двух игральных кубиков (на каждом может выпасть от 1 до 6 очков). (Используйте генератор псевдослучайных чисел.) 8. Напишите функцию, которая вычисляет факториал натурального числа N. 9. Напишите функцию, которая вычисляет N-e число Фибоначчи. 10. Дружественные числа — это два натуральных числа, таких что сумма всех делителей одного числа (меньших самого этого числа) равна другому числу, и наоборот. Найдите все пары дружественных чисел, каждое из которых меньше 10 000. Используйте функцию, которая вычисляет сумму делителей числа. 11. Напишите программу, которая вводит натуральное число N и находит все числа на отрезке [0, N], сумма цифр которых не меняется при умножении числа на 2, 3, 4, 5, 6, 7, 8 и 9 (например, число 9). Используйте функцию для вычисления суммы цифр числа. Рекурсия §61 12. Напишите логическую функцию, которая определяет, верно ли, что число N — совершенное, т. е. равно сумме своих делителей, меньших его самого. 13. Простое число называется гиперпростым, если любое число, получающееся из него отбрасыванием нескольких цифр, тоже является простым. Например, число 733 — гиперпростое, так как и оно само, и числа 73 и 7 — простые. Напишите логическую функцию, которая определяет, верно ли, что число N — гиперпростое. Используйте уже готовую функцию isPrime. §61 Рекурсия Что такое рекурсия? Вспомним определение натуральных чисел. Оно состоит из двух частей: 1) 1 — натуральное число; 2) если п — натуральное число, то л -1- 1 — тоже натуральное число. Вторая часть этого определения в математике называется индуктивной: натуральное число определяется через другое натуральное число, и таким образом определяется всё множество натуральных чисел. В программировании этот приём называют рекурсией. Рекурсия — это способ определения множества объектов через само это множество на основе заданных простых базовых случаев. О Первая часть в определении натуральных чисел — это и есть тот самый базовый случай. Если убрать первую часть из определения, оно будет неполно: вторая часть даёт только метод перехода к следующему значению, но не даёт никакой «зацепки», не отвечает на вопрос «откуда начать». Алгоритмизация и программирование Похожим образом задаются числа Фибоначчи: первые два числа равны 1, а каждое из следующих чисел равно сумме двух предыдущих: 2)F„ =F„_i +F„_2 дляп>2. Популярные примеры рекурсивных объектов — фракталы. Так в математике называют геометрические фигуры, обладающие самоподобием. Это значит, что они составлены из фигур меньшего размера, каждая из которых подобна целой фигуре. На рисунке 8.2 показан треугольник Серпинского — один из первых фракталов, который предложил в 1915 г. польский математик В. Серпинский. Равносторонний треугольник делится на 4 равных треугольника меньшего размера (см. рис. 8.2, слева), затем каждый из полученных треугольников, кроме центрального, снова делится на 4 ещё более мелких треугольника и т. д. На рисунке 8.2 справа показан треугольник Серпинского с тремя уровнями деления. Ханойские башни Согласно легенде, конец света наступит тогда, когда монахи Великого храма города Бенарас смогут переложить 64 диска разного диаметра с одного стержня на другой. Вначале все диски на- Рекурсия §61 низаны на первый стержень. За один раз можно перекладывать только один диск, причём разрешается класть только меньший диск на больший. Есть также и третий стержень, который можно использовать в качестве вспомогательного (рис. 8.3). Рис. 8.3 Решить задачу для 2, 3 и даже 4 дисков довольно просто. Проблема в том, чтобы составить алгоритм для любого числа дисков. Пусть нужно перенести п дисков со стержня 1 на стержень 3. Представим себе, что мы как-то смогли переместить га - 1 дисков на вспомогательный стержень 2. Тогда остаётся перенести самый большой диск на стержень 3, а затем га - 1 меньших дисков со вспомогательного стержня 2 на стержень 3, и задача будет решена. Получается такой псевдокод: перенести (п-1, 1, 2) 1 -> 3 перенести (п-1, 2, 3) Процедура перенести (которую нам предстоит написать) принимает три параметра: число дисков, начальный и конечный стержни. Таким образом, мы свели задачу переноса га дисков к двум задача переноса га - 1 дисков и одному элементарному действию — переносу 1 диска. Заметим, что при известных номерах начального и конечного стержней легко рассчитать номер вспомогательного, так как сумма номеров равна 1 -Ь 2 -Ь 3 = 6. Получается такая (пока не совсем верная) процедура: Алгоритмизация и программирование алг Hanoi (цел п, к, т) нач цел р р:=б-к-т Hanoi(п-1, к, р) вывод к, ' -> ', т, Hanoi(п-1, р, т) кон Эта процедура вызывает сама себя, но с другими значениями параметров. Такая процедура называется рекурсивной. О Рекурсивная процедура (функция) — это процедура (функция), которая вызывает сама себя напрямую или через другие процедуры и функции. Основная программа для решения задачи, например, с четырьмя дисками будет содержать всего одну строку (перенести 4 диска со стержня 1 на стержень 3): Hanoi(4, 1, 3) Если вы попробуете запустить эту программу, она зациклится, т. е. будет работать бесконечно долго. В чём же дело? Вспомните, что определение рекурсивного объекта состоит из двух частей. В первой части определяются базовые объекты (например, первое натуральное число), именно эта часть «отвечает» за остановку рекурсии в программе. Пока мы не определили такое условие останова, процедура будет бесконечно вызывать саму себя (это можно проверить, выполняя программу по шагам). Когда же остановить рекурсию? Очевидно, что если нужно переложить О дисков, задача уже решена, ничего перекладывать не надо. Это и есть условие окончания рекурсии: если значение параметра п, переданное процедуре, равно О, нужно выйти из процедуры без каких-либо действий. Для этого в школьном алгоритмическом языке используется оператор выход (в Паскале — оператор exit). Правильная версия процедуры выглядит так: Рекурсия §61 алг Hanoi(цел п, к, т) нач если п=0 то выход все цел р р:=6—к—m Hanoi(n-1, к, р) вывод к, ' , т, нс Hanoi(п-1, р, т) кон procedure Hanoi(n, к, m: integer); var p: integer; begin if n=0 then exit; p:=6—k—m; k, p) ; ' -> m); p, m) Hanoi (n-1, writeln(k, Hanoi(n-1, end; Чтобы переложить N дисков, нужно выполнить 2^-1 перекладываний. Для N = 64 это число равно 18 446 744 073 709 551 615. Если бы монахи, работая день и ночь, каждую секунду перемещали один диск, им бы потребовалось 580 миллиардов лет. Примеры Пример 1. Составим процедуру, которая переводит натуральное число в двоичную систему. Мы уже занимались вариантом этой задачи, где требовалось вывести 8-битную запись числа из диапазона 0..255, сохранив лидирующие нули. Теперь усложним задачу: лидирующие нули выводить не нужно, а натуральное число может быть любым (в пределах допустимого диапазона для выбранного типа данных). Стандартный алгоритм перевода числа в двоичную систему можно записать, например, так: нц пока поО вывод mod(n,2) n:=div(n,2) кц Проблема в том, что двоичное число выводится «задом наперёд», т. е. первым будет выведен последний разряд. Как «перевернуть» число? Есть разные способы решения этой задачи, которые сводятся к тому, чтобы запоминать остатки от деления (например, в символьной строке) и затем, когда результат будет полностью получен, вывести его на экран. Однако можно применить красивый подход, использующий рекурсию. Идея такова: чтобы вывести двоичную запись числа п, нужно сначала вывести двоичную запись числа div(n, 2), а затем последнюю цифру — mod(n, 2). Если число-параметр равно Алгоритмизация и программирование нулю, нужно выйти из процедуры. Такой алгоритм очень просто программируется: алг printBin(цел п) нач если п=0 то выход все printBin(div(п, 2)) вывод mod(n,2) кон procedure printBin(п: integer); begin if n=0 then exit; printBin(n div 2); write(n mod 2) end; Конечно, решить эту задачу можно было и с помощью цикла. Поэтому можно сделать важный вывод: рекурсия заменяет цикл. При этом программа, как правило, становится более понятной. Пример 2. Составим функцию, которая вычисляет сумму цифр числа. Будем рассуждать так: сумма цифр числа п равна значению последней цифры плюс сумма цифр числа div(n, 10). Сумма цифр однозначного числа равна самому этому числу, это условие окончания рекурсии. Получаем следующую функцию: function sumDig (n: integer): integer; var sum: integer; begin sum:=n mod 10; if n>=10 then sum:=sum+sumDig (n div 10); sumDig:= sum end; Пример 3. Алгоритм Евклида, один из древнейших известных алгоритмов, предназначен для поиска наибольшего общего делителя (НОД) двух натуральных чисел. Формулируется он так. алг цел sumDig(цел п) нач 3Ha4:=mod(п,10) если п>=10 то знач:=3Ha4+sumDig(div (n,10)) все кон О Алгоритм Евклида. Чтобы найти НОД двух натуральных чисел, нужно вычитать из большего числа меньшее до тех пор, пока меньшее не станет равно нулю. Тогда второе число и есть НОД исходных чисел. Рекурсия §61 Этот алгоритм может быть сформулирован в рекурсивном виде. Во-первых, в нём для перехода к следующему шагу используется равенство НОД(а, Ь) — НОД(а - Ь, Ь) при а > Ь. Кроме того, задано условие останова: если одно из чисел равно нулю, то НОД совпадает со вторым числом. Поэтому можно написать такую рекурсивную функцию: алг цел NOD(цел а, Ь) нач если а=0 или Ь=0 то знач:=а+Ь выход все если а>Ь то знач:=NOD(а-Ь, Ь) иначе знач:=ЫОО(а, Ь-а) все кон function NOD(a,b: integer): integer; begin if (a = 0) or (b = 0) then, begin NOD:= a Ч- b; exit; end; if a > b then NOD:= NOD(a - b, b) else NOD:= NOD(a, b - a) end; Заметим, что при равенстве одного из чисел нулю второе число совпадает с суммой двух чисел, поэтому в качестве результата функции принимается а + Ь. Существует и более быстрый вариант алгоритма Евклида (модифицированный алгоритм), в котором большее число заменяется на остаток от деления большего числа на меньшее. Как работает рекурсия Рассмотрим вычисление факториала N1: так называют произведение всех натуральных чисел от 1 до заданного числа N: ЛГ! = 1 • 2 • 3 • Факториал может быть также введён с по- мощью рекуррентной формулы, которая связывает факториал данного числа с факториалом предыдущего^: N1 = 1, еслиА^ = 1; N (N-1)!, если N>2. Здесь первая часть описывает базовый случай (условие окончания рекурсии), а вторая — переход к следующему шагу. Запи- I В математике принято, что факториал нуля равен 1. Поэтому равенство О! = 1 можно тоже принять за базовый случай. 6—49 Алгоритмизация и программирование шем соответствующую функцию на школьном алгоритмическом языке, добавив в начале и в конце операторы вывода: алг цел Fact(цел N) нач вывод '-> N=', N, нс если N<=1 то знач:=1 иначе знач:=N*Fact(N-1) все вывод '<- N=', N, нс кон -> N=3 -> N=2 -> N=1 <- N=1 <- N=2 <- N=3 О Справа от программы показан протокол её работы при вызове Fact(3) (для наглядности сделаны отступы, показывающие вложенность вызовов). Из протокола видно, что вызов Fact (2) происходит раньше, чем заканчивается вызов Fact(3). Это значит, что компьютеру нужно где-то (без помощи программиста) запомнить состояние программы (в том числе значения всех локальных переменных) и адрес, по которому нужно вернуться после завершения вызова Fact (2). Для этой цели используется стек. Стек (англ, stack — кипа, стопка) — особая область памяти, в которой хранятся локальные переменные и адреса возврата из процедур и функций. Один из регистров процессора называется указателем стека (англ, stack pointer, SP) — в нём записан адрес последней занятой ячейки стека. При вызове процедуры в стек помещаются значения всех её параметров, адрес возврата и выделяется место под локальные переменные. На рисунке 8.4, а показано начальное состояние стека, серым цветом выделены занятые ячейки. Когда функция Fact вызывается из основной программы с параметром 3, в стек записывается значение параметра, затем — адрес возврата А, и выделяется место для локальной переменной знач, в которую будет записан результат* (рис. 8.4, б). При втором и третьем вложенных вызовах в Результат функции, как правило, передаётся в вызывающую программу через регистры, но во время работы функции хранится в стеке. Рекурсия §61 стек добавляются аналогичные блоки данных (рис. 8.4, в и г). Заметьте, что в нашем случае адрес возврата Ар (точка внутри функции Fact после рекурсивного вызова) в последних двух блоках будет один и тот же, SP а I б Fact (3) Fact (1)| SP \ SP \ Рис. 8.4 А 1знач1 А знач 2 Ар знач| SP А знач 2 Ар знач 1 Ар знач Когда выполняется возврат из процедуры, состояние стека изменяется в обратную сторону: г — в — б — а. Что же следует из этой схемы? Во-первых, с каждым новым вызовом расходуется дополнительная стековая память. Если вложенных вызовов будет очень много (или если процедура создаёт много локальных переменных), эта память закончится, и программа завершится аварийно. Во-вторых, при каждом вызове процедуры некоторое время затрачивается на выполнение служебных операций (занесение данных в стек и т. п.), поэтому, как правило, рекурсивные программы выполняются несколько дольше, чем аналогичные нерекурсивные. Всегда ли можно написать нерекурсивную программу? Оказывается, всегда. Доказано, что любой рекурсивный алгоритм может быть записан без использования рекурсии. Хотя: • часто при этом программа усложняется и становится менее понятной; • нерекурсивная версия нередко требует дополнительного расхода памяти. О Алгоритмизация и программирование Например, для вычисления факториала можно использовать обычный цикл: знач:=1 нц для i от 1 до N знач:=знач*1 кц В данном случае такой итерационный (т. е. повторяющийся, циклический) алгоритм значительно лучше, чем рекурсивный: он не расходует стековую память и выполняется быстрее. Поэтому здесь нет никакой необходимости использовать рекурсию. Итак, рекурсия — это мощный инструмент, заменяющий циклы в задачах, которые можно свести к более простым задачам того же типа. В сложных случаях использование рекурсии позволяет значительно упростить программу, сократить её текст и сделать более понятной. Вместе с тем, если существует простое решение задачи без использования рекурсии, лучше применить именно его. Нужно стараться обходиться без рекурсии, если вложенность вызовов получается очень большой или подпрограмма использует много локальных данных. А Вопросы и задания 1. Что такое рекурсия? Приведите примеры. 2. Почему любое рекурсивное определение состоит из двух частей? 3. Что такое рекурсивная процедура (функция)? 4. Расскажите о задаче «Ханойские башни». Попытайтесь придумать алгоритм её решения, не использующий рекурсию. 5. Процедура А вызывает процедуру Б, а процедура Б — процедуру А и саму себя. Какую из этих процедур можно назвать рекурсивной? 6. В каком случае рекурсия никогда не остановится? Докажите, что в рассмотренных в параграфе задачах этого не случится. 7. Что такое стек? Как он используется при выполнении программ? 8. Почему при использовании рекурсии может случиться переполнение стека? 9. Назовите достоинства и недостатки рекурсии. Когда её следует использовать, а когда — нет? Массивы §62 Подготовьте сообщение а) «Фракталы» б) «Числа Фибоначчи» в) «Рекурсия вокруг нас» г) «Рекурсия в программировании: за и против» д) «Рекурсия в произведениях искусства» Задачи 1. Придумайте свою рекурсивную фигуру и опишите её. *2. Используя графические возможности языка программирования, который вы изучаете, постройте на экране треугольник Серпинского и другие фракталы. 3. Напишите рекурсивную процедуру для перевода числа в двоичную систему, которая правильно работала бы для нуля (выводила бы 0). *4. Дано натуральное число N. Требуется получить и вывести на экран все возможные различные способы представления этого числа в виде суммы натуральных чисел (т. е. 1 Н- 2 и 2 -ь 1 — это один и тот же способ разложения числа 3). Решите задачу с помощью рекурсивной процедуры. 5. Напишите рекурсивную процедуру для перевода числа из двоичной системы счисления в десятичную. 6. Напишите рекурсивную и нерекурсивную функции, вычисляющие НОД двух натуральных чисел с помощью модифицированного алгоритма Евклида. Какой вариант вы предпочтёте? О §62 Массивы Что такое массив? Основное предназначение современных компьютеров — обработка большого количества данных. При этом надо как-то обращаться к каждой из тысяч (или даже миллионов) ячеек с данными. Очень сложно дать каждой ячейке собственное имя и при этом не запутаться. Из этой ситуации выходят так: дают имя не ячейке, а группе ячеек, в которой каждая ячейка имеет собственный номер. Такая область памяти называется массивом. Массив — это группа переменных одного типа, расположенных в памяти рядом (в соседних ячейках) и имеющих общее имя. Каждая ячейка в массиве имеет уникальный номер. О Алгоритмизация и программирование О Q Для работы с массивами нужно в первую очередь научиться: • выделять память нужного размера под массив; • записывать данные в ячейку массива; • читать данные из ячейки массива. Чтобы использовать массив, надо его объявить: определить тип массива (тип входящих в него элементов), выделить место в памяти и присвоить имя. Имена массивов строятся по тем же правилам, что и имена переменных. В школьном алгоритмическом языке массивы называются таблицами. При их объявлении к названию типа данных добавляется слово таб: целтаб А[1:5] вещтаб V[О:5] логтаб L(-5:5] симтаб S[65;90] В квадратных скобках через двоеточие записываются границы индексов — номеров ячеек массива. В приведённом примере массив А — это массив целых значений, ячейки имеют номера от 1 до 5. Массив вещественных значений V содержит 6 элементов с номерами от нуля^ до 5. В логическом массиве L ячейки нумеруются от -5 до 5, а в символьном массиве S — от 65 до 90. В школьном алгоритмическом языке объявлять массивы (как и переменные) можно в любом месте программы. В языке Паскаль массивы объявляются в блоке объявления переменных (выше ключевого слова begin) и начинаются ключевым словом array (в переводе с англ. — массив). Объявления, аналогичные приведённым на школьном алгоритмическом языке, выглядят так: var А: аггау[1..5] of integer; V: array[0..5] of real; L: array[-5..5] of boolean; S: array[65..90] of char; Минимальный и максимальный индексы разделяются двумя точками. Для того чтобы обратиться к элементу массива, нужно записать имя массива и в квадратных скобках — индекс нужного 1 Нумерация с нуля часто используется в языках программирования, например в языке Си и родственных ему языках. Массивы §62 элемента, например А[3]. Индексом может быть не только число, но значение целой переменной или арифметического выражения целого типа. В следующем примере массив заполняется квадратами первых натуральных чисел; алг Массив нач цел i, N=10 целтаб А[1:N] нц для i от 1 до N A[i]:=i*i кц кон program qq; const N=10; var A: array[l..N] of integer; i: integer; begin for i:=l to N do A[i]:=i*i; end. В школьном алгоритмическом языке можно при объявлении массива указывать вычисляемые границы индексов, зависящие от переменных. В данном случае массив А состоит из 10 элементов, потому что к моменту его объявления в переменной N было число 10. В Паскале при объявлении границ индексов массивов можно использовать константы — постоянные величины, имеющие имя. В приведённом примере с помощью ключевого слова const объявлена константа N, равная 10. Константы обычно вводятся выше блока объявления переменных. Использование констант очень удобно, потому что при изменении размера массива в программе нужно поменять только одно число — значение этой константы. Далее во всех примерах мы будем считать, что в программе объявлен целочисленный массив А с индексами от 1 до Л^, а также целочисленная переменная t, которая будет обозначать индекс элемента массива. Чтобы ввести такой массив или вывести его на экран, нужно использовать цикл, т. е. ввод и вывод массива выполняется поэлементно: нц для i от 1 до N вывод 'А[',i,']=' ввод A[i] кц for i:=l to N do begin write('A[',i,']='); read(A[i]) end; НЦ для i от 1 до вывод A[i], ' ' кц N for i:=l to N do write(A[i],' '); Алгоритмизация и программирование в этом примере перед вводом очередного элемента массива на экран выводится подсказка. Например, при вводе 3-го элемента будет выведено: А[3]=. После вывода каждого элемента ставится пробел, иначе все значения сольются в одну строку. В учебных примерах массивы часто заполняют случайными числами: нц для i от 1 до N A[i]:=irand(20,100) вывод A[i], ' ' кц for i:=l to N do begin A[i]:=20+random(81) ; write(A[i], ' ') end; Перебор элементов Перебор элементов состоит в том, что мы в цикле просматриваем все элементы массива и, если нужно, выполняем с каждым из них некоторую операцию. Для этого удобнее всего использовать цикл с переменной, которая изменяется от минимального до максимального индекса. Для массива, элементы которого имеют индексы от 1 до N, цикл выглядит так: нц для i от 1 до N for i:=l to N do begin кц end; Здесь вместо многоточия можно добавлять операторы, работающие с элементом A[i]. Во многих задачах нужно найти в массиве все элементы, удовлетворяющие заданному условию, и как-то их обработать. Простейшая из таких задач — подсчёт нужных элементов. Для решения этой задачи нужно ввести переменную-счётчик, начальное значение которой равно нулю. Далее в цикле (от 1 до N) просматриваем все элементы массива. Если для очередного элемента выполняется заданное условие, то увеличиваем счётчик на 1. На псевдокоде этот алгоритм выглядит так: счётчик:=0 нц для i от 1 до N если условие выполняется для A[i] то счётчик:=счётчик+1 все кц Предположим, что в массиве А записаны данные о росте игроков баскетбольной команды (в сантиметрах). Найдем количество Массивы §62 игроков, рост которых больше 180 см, но меньше 190 см. В следующей программе используется переменная-счётчик count'. count:=0; for i:=l to N do if (180 5). 6. Заполните массив случайными числами в диапазоне 20.. 100 и подсчитайте отдельно число элементов с чётными и нечётными значениями. 7. Заполните массив случайными числами в диапазоне 1000..2000 и подсчитайте число элементов, у которых вторая с конца цифра — чётная. 8. Заполните массив случайными числами в диапазоне 0..100 и подсчитайте отдельно среднее значение всех элементов, меньших 50, и среднее значение всех элементов, которые больше или равны 50. §63 Алгоритмы обработки массивов Поиск в массиве Требуется найти в массиве элемент, значение которого равно значению переменной X, или сообщить, что такого элемента в массиве нет. Алгоритм решения сводится к просмотру всех элементов массива с первого до последнего. Как только будет найден элемент, равный X, нужно выйти из цикла и вывести результат. Напрашивается такой алгоритм: i:=l нц пока А[i]<>Х i:=i+l кц вывод 'А[', i, '] = Ч X Он хорошо работает, если нужный элемент в массиве есть, однако приведёт к ошибке, если такого элемента нет, — получится зацикливание и выход за границы массива. Поэтому в условие нужно добавить ещё одно ограничение: i<=N. Если после оконча- Алгоритмы обработки массивов §63 ния цикла это условие нарушено, значит, поиск был неудачным — элемента нет: i:=l нц пока i<=N и A[i]OX i:=i+l кц если i<=N‘ то вывод 'A[',i,']='/Х иначе вывод 'Не нашли!' все i :=1; while (i<=N) and (A[i]<>X) do i:=i+l; if i<=N then write('A[', i, X) else write('He нашли!'); Отметим одну тонкость. В сложном условии i<=N и A[i]OX первой должно проверяться именно отношение i<=N. Если первая часть условия, образованного с помощью операции «И», ложно, то вторая часть, как правило^, не вычисляется — уже понятно, что всё условие ложно. Дело в том, что если i>N, проверка условия A[i]oX приводит к выходу за границы массива, и программа может завершиться аварийно. Возможен ещё один поход к решению этой задачи: используя цикл с переменной, перебирать все элементы массива и досрочно завершить цикл, если найдено требуемое значение. пХ: = 0; for i:=l to N do if A[i]=X then begin nX: = i ; break end; if nX>0 then write('A[', nX, ']=', X) else write('He нашли!'); nX:= 0 НЦ для i от 1 до N если A[i]=X TO nX: = i выход все кц если nX>0 то вывод 'А[', пХ, ' ] =' иначе вывод 'Не нашли!' все Здесь для выхода из цикла используется оператор выход (в Паскале — break), номер найденного элемента сохраняется в переменной пХ. Если её значение осталось равным нулю (не изменилось в ходе выполнения цикла), то в массиве нет элемента, равного X. Это зависит от транслятора и его настроек. В школьном алгоритмическом языке и во многих других современных языках (например, в С, C+-I-, Python, Javascript, РНР) такое поведение гарантировано стандартом, а в Паскале — нет. Алгоритмизация и программирование Максимальный элемент Найдём в массиве максимальный элемент. Для его хранения выделим целочисленную переменную М. Будем в цикле просматривать все элементы массива один за другим. Если очередной элемент массива больше, чем максимальный из предыдущих (находящийся в переменной М), запомним новое значение максимального элемента в М. Остается решить, каково должно быть начальное значение М. Во-первых, можно записать туда значение, заведомо меньшее, чем любой из элементов массива. Например, если в массиве записаны натуральные числа, можно записать в М ноль. Если содержимое массива неизвестно, можно сразу записать в М значение Л[1], а цикл перебора начать со второго элемента: М:=А[1] нц для i от 2 до N если А[i]>М то М:=А[i] все кц вывод М М:=А[1]; for i:=2 to N do if A[i]>M then M:=A[i]; write(M); Теперь предположим, что нужно найти не только значение, но и номер максимального элемента. Казалось бы, нужно ввести ещё одну переменную пМах для хранения номера, сначала записать в неё 1 (считаем первый элемент максимальным) и затем, когда найдём новый максимальный элемент, запоминать его номер в переменной пМах: М:=А[1]; пМах:=1 нц для 1 от 2 до I если А[i]>М то М:=А[i] пМах:=i все кц вывод 'А[', пМах, М:=А[1]; пМах:=1; for i:=2 to N do if A[i]>M then begin M:=A[i]; nMax:=i; end; write('A[', nMax, ']=' »M); M Однако это не самый лучший вариант. Дело в том, что по номеру элемента можно всегда определить его значение. Поэтому достаточно хранить только номер максимального элемента. Если этот номер равен пМах, то значение максимального элемента равно А[пМах]: Алгоритмы обработки массивов §63 пМах:=1 нц для i от 2 до N если A[i]>A[nMax] то пМах:=i все кц вывод 'А[', пМах, А[пМах] пМах:=1; for i:=2 to N do if A[i]>A[nMax] then nMax:=i; write ('A[', nMax, 4 = 4 A[nMax]); Реверс массива Реверс массива — это перестановка его элементов в обратном порядке: первый элемент становится последним, а последний — первым (рис. 8.5). 1 2 N-1 N 7 12 5 34 40 23 1 2 1 N-1 N 23 40 34 5 12 7 Рис. 8.5 Из рисунка 8.5 следует, что 1-й элемент меняется местами с N-M, второй — с (N - 1)-м и т. д. Сумма индексов элементов, участвующих в обмене, для всех пар равна N -t- 1, поэтому элемент с номером i должен меняться местами с (ЛГ -t 1 - 1)-м элементом. Кажется, что можно написать такой цикл: нц для i от 1 до N поменять местами A[i] и A[N+l-i] кц Однако это неверно. Посмотрим, что получится для массива из четырёх элементов (рис. 8.6). A[l]-wl[4] А12]^А[3] А[3]^А[2] А[4]^А [1] 7 12 40 23 23 12 40 7 23 40 12 7 23 12 40 7 7 12 40 23 Рис. 8.6 Алгоритмизация и программирование Как видите, массив вернулся в исходное состояние: реверс выполнен дважды. Поэтому нужно остановить цикл на середине массива: нц для i от 1 до div(N,2) поменять местами A[i] и A[N+l-i] кц Для обмена используется вспомогательная целая переменная с: нц для i от 1 до div(N,2) с:=А[i] Ati]:=A[N+l-i] A[N+l-i]:=c КЦ for i:=l to N div 2 do begin C:=A[i]; A[i]:=A[N+l-i]; A[N+l-i]:=c end; Сдвиг элементов массива При удалении и вставке элементов необходимо выполнять сдвиг части или всех элементов массива в ту или другую сторону. Массив часто рисуют в виде таблицы, где первый элемент расположен слева. Поэтому сдвиг влево — это перемещение всех элементов на одну ячейку, при котором А[2] переходит на место А[1], А[3] — на место А[2] и т. д. (рис. 8.7). N-1 N 7 12 5 34 40 23 1 2 4 N-1 N 12 5 34 40 23 23 Рис. 8.7 Последний элемент остаётся на своём месте, поскольку новое значение для него взять неоткуда — массив кончился. Алгоритм выглядит так: нц для i от 1 до N-1 A[i]:=A[i+l] кц for i:=l to N-1 do A[i]:=A[i+l]; Алгоритмы обработки массивов ЛИ Обратите внимание, что цикл заканчивается при i = N - 1 (а не N), чтобы не было выхода за границы массива, т. е. обращения к несуществующему элементу A[iV-l-l]. При таком сдвиге первый элемент пропадает, а последний дублируется. Можно старое значение первого элемента записать на место последнего. Такой сдвиг называется циклическим (см. § 28). Предварительно (до начала цикла) первый элемент нужно запомнить во вспомогательной переменной, а после завершения цикла записать его в последнюю ячейку массива: с:=А[1] нц для i от 1 до N-1 A[i]:=A[i+l] кц A[N]:=с с:=А[1]; for i:=l to N-1 do A[i]:=A[i+l]; A[N]:=c; Отбор нужных элементов Требуется отобрать все элементы массива А, удовлетворяющие некоторому условию, в массив В. «Очевидное» решение: нц для i от 1 до N если условие выполняется для A[i] то B[i]:=A[i] все кц На самом деле это решение неудачное, потому что нужные элементы в массиве В оказываются расположенными вразброс, на тех местах, где они стояли в массиве А. Поэтому работать с таким массивом В очень неудобно. На рисунке 8.8 изображён случай, когда отбираются элементы с чётными значениями. А 12 5 34 11 23 46 1 i В 12 ? 34 ? - 46 Рис. 8.8 Будет удобно, если все отобранные элементы будут стоять в начале массива В (рис. 8.9). Алгоритмизация и программирование 12 5 1 34 11 23 46 \ У 12 34 1 46 ? ? ? count Рис. 8.9 Для этого вводят переменную-счётчик, в которой считают количество найденных элементов. Сначала её значение равно нулю. Как только очередной подходящий элемент найден, счётчик увеличивается на 1, и теперь значение счётчика — это номер первой свободной ячейки массива В, в неё и записывается найденное значение. Программа, отбирающая все элементы с чётными значениями, выглядит так: count:=0 нц для i от 1 до N если mod(A[i],2)=0 то count:=count+l В[count]:=А[i] все кц count:=0; for i:= 1 to N do if A[i] mod 2=0 then begin count:= count + 1; В[count]:= A[i]; end; Нужно помнить, что только первые count элементов массива В рабочие, остальные содержат неизвестные данные. Например, вот так можно вывести найденные элементы на экран: нц для i от 1 до count вывод в[i], ' ' кц for i:=l to count do write(B[i], Если вместо массива В использовать тот же массив А, где находятся исходные числа, все «нужные» элементы будут сгруппированы в начале, а их количество записано в переменной count (рис. 8.10). 12 5 1 34 11 23 46 \ У ^— 12 34 46 11 23 46 count Рис. 8.10 Алгоритмы обработки массивов §63 Вопросы и задания 1. Почему при поиске индекса максимального элемента необязательно хранить само значение максимального элемента? 2. Что такое реверс массива? 3. Как вы думаете, какую ошибку чаще всего делают начинающие программисты, программируя реверс массива? 4. Как вы думаете, какие проблемы (и ошибки) могут возникнуть при циклическом сдвиге массива вправо! 5. Что произойдёт с массивом при выполнении следующего фрагмента программы? нц для i от 1 до N-1 A[i+1]:=A[i] кц for i:=l to N-1 do A[i+1]:=A[i]; 6. Как при использовании приведённого алгоритма поиска определить, что элемент не найден? 7. Что такое выход за границы массива? Почему он может быть опасен? 8. Опишите «очевидный» алгоритм отбора части элементов одного массива в другой массив. Почему его не используют? Подготовьте сообщение а) «Выход за границы массива» б) «Алгоритмы работы со списками на языке Python» Задачи 1. Напишите программу, которая находит максимальный и минимальный из элементов массива с чётными положительными значениями. Если в массиве нет элементов с чётными положительными значениями, нужно вывести сообщение об этом. 2. Введите массив с клавиатуры и найдите (за один проход) количество элементов, имеющих максимальное значение. 3. Найдите за один проход по массиву три его различных элемента, которые меньше всех остальных («три минимума»). *4. Заполните массив случайными числами в диапазоне 10..12 и найдите длину самой длинной последовательности стоящих рядом элементов с одинаковыми значениями. 5. Заполните массив случайными числами в диапазоне 0..4 и выведите на экран номера всех элементов, значение которых равно X (X вводится с клавиатуры). О Алгоритмизация и программирование 6. Заполните массив случайными числами и переставьте соседние элементы, поменяв 1-й элемент со 2-м, 3-й — с 4-м и т. д. 7. Заполните массив с чётным количеством элементов случайными числами и выполните реверс отдельно для первой и второй половин массива. 8. Заполните массив случайными числами и выполните реверс для части массива между элементами с индексами К и М (включая эти элементы). 9. Напишите программу для выполнения циклического сдвига массива вправо на 4 элемента. 10. Найдите в массиве все простые числа и скопируйте их в новый массив. *11. Найдите в массиве все числа Фибоначчи и скопируйте их в новый массив. §64 Сортировка Q Сортировка порядке. это расстановка элементов массива в заданном Порядок сортировки может быть любым, для чисел обычно рассматривают сортировку по возрастанию (или убыванию) значений. Возникает естественный вопрос: зачем сортировать данные? На него легко ответить, вспомнив, например, работу со словарями: сортировка слов по алфавиту облегчает поиск нужной информации. Программисты изобрели множество способов сортировки. В целом их можно разделить на две группы: 1) простые, но медленно работающие (на больших массивах) и 2) сложные, но быстрые. Мы изучим два классических метода из первой группы и один метод из второй — знаменитую «быструю сортировку», предложенную Ч. Хоаром. Далее мы будем рассматривать сортировку массива по возрастанию (или убыванию) значений. Для массивов, в которых есть одинаковые элементы, используются понятия «сортировка по неубыванию» и «сортировка по невозрастанию». Сортировка по убыванию выполняется аналогично. Сортировка §64 Метод пузырька (сортировка обменами) Название этого метода произошло от известного физического явления — пузырёк воздуха в воде поднимается вверх. Если говорить о сортировке массива, сначала поднимается «наверх» (к началу массива) самый «лёгкий» элемент (элемент с минимгильными значениями), затем следующий и т. д. Сначала сравниваем последний элемент с предпоследним. Если они стоят неправильно (меньший элемент «ниже»), то меняем их местами. Далее так же рассматриваем следующую пару элементов и т. д. (рис. 8.11). Рис. 8.11 После обработки пары (А[1], А[2]) минимальный элемент стоит на месте А[1]. Это значит, что на следующих этапах его можно не рассматривать. Первый цикл, устанавливающий на свое место первый (минимальный) элемент, можно на псевдокоде записать так: нц для j от N-1 до 1 шаг -1 если A[j-H]=nEnd то выход все L:=nStart; R:=nEnd; X:=A[div(L+R,2)] нц пока L<=R | разделение нц пока A[L]X; R:=R—1 кц если L<=R то c:=A[L]; A[L]:=A[R]; A[R]:=c L:=L+1; R:=R-1 все кц qSort(nStart, R) qSort(L, nEnd) KOH I рекурсивные вызовы Сортировка §64 Для того чтобы отсортировать весь массив, нужно вызвать эту процедуру так: qSort(l, N) Скорость работы быстрой сортировки зависит от того, насколько удачно выбирается вспомогательный элемент X. Самый лучший случай — когда на каждом этапе массив делится на две равные части. Худший случай — когда в одной части оказывается только один элемент, а в другой — все остальные. При этом глубина рекурсии достигает N, что может привести к переполнению стека (нехватке стековой памяти). Для того чтобы уменьшить вероятность худшего слз^ая, в алгоритм вводят случайность: в качестве X на каждом шаге выбирают не середину рабочей части массива, а элемент со случайным номером: X:=A[irand(L, R) ] В таблице 8.1 сравнивается время сортировки (в секундах) массивов разного размера, заполненных случайными значениями, с использованием трёх изученных алгоритмов. Таблица 8.1 N Метод пузырька Метод выбора Быстрая сортировка 1000 0,24 с 0,12 с 0,004 с 5000 5,3 с 2,9 с 0,024 с 15000 45 с 34 с 0,068 с Как показывают эти данные, преимущество быстрой сортировки становится подавляющим при увеличении N. Вопросы и задания 1. Что такое сортировка? 2. На какой идее основан метод пузырька? Метод выбора? 3. Объясните, зачем нужен вложенный цикл в описанных методах сортировки. 4. Сравните на примере метод пузырька и метод выбора. Какой из них требует меньше перестановок? е Алгоритмизация и программирование 5. Расскажите про основные идеи метода «быстрой сортировки». 6. Как нужно изменить приведённые в параграфе алгоритмы, чтобы элементы массива были отсортированы по убыванию? 7. Как вы думаете, можно ли использовать метод «быстрой сортировки» для нечисловых данных, например для символьных строк? 8. От чего зависит скорость «быстрой сортировки»? Какой самый лучший и самый худший случай? 9. Как вы думаете, может ли метод «быстрой сортировки» работать дольше, чем метод выбора (или другой «простой» метод)? Если да, то при каких условиях? Подготовьте сообщение а) «Сортировка вставкой» б) «Сортировка слиянием» в) «Сортировка списков на языке Python» Задачи 1. Отсортировать массив и найти количество различных чисел в нём. 2. Напишите программу, в которой сортировка выполняется «методом камня» — самый «тяжёлый» элемент опускается в конец массива. 3. Напишите вариант метода пузырька, который заканчивает работу, если на очередном шаге внешнего цикла не было перестановок. 4. Напишите программу, которая сортирует массив по возрастанию последней цифры числа. 5. Напишите программу, которая сортирует массив по убыванию суммы цифр числа. 6. Напишите программу, которая сортирует первую половину массива по возрастанию, а вторую — по убыванию (элементы из первой половины не должны попадать во вторую и наоборот). 7. Напишите программу, которая сортирует массив, а затем находит максимальное из чисел, встречающихся в массиве несколько раз. *8. Напишите программу, которая сравнивает количество перестановок при сортировке одного и того же массива разными методами. Проведите эксперименты для возрастающей последовательности (уже отсортированной), убывающей (отсортированной в обратном порядке) и случайной. Двоичный поиск §65 §65 Двоичный поиск Ранее мы уже рассматривали задачу поиска элемента в массиве и привели алгоритм, который сводится к просмотру всех элементов массива. Такой поиск называют линейным. Для массива из 1000 элементов нужно сделать 1000 сравнений, чтобы убедиться, что заданного элемента в массиве нет. ЕЗсли число элементов (например, записей в базе данных) очень велико, время поиска может оказаться недопустимым, потому что пользователь не дождётся ответа. Как вы помните, основная задача сортировки — облегчить последующий поиск данных. Вспомним, как мы ищем нужное слово (например, слово «гравицапа») в словаре. Сначала открываем словарь примерно в середине и смотрим, какие там слова. Если они начинаются на букву «Л», то слово «гравицапа» явно находится на предыдущих страницах, и вторую часть словаря можно не смотреть. Теперь так же проверяем страницу в середине первой половины, и т. д. Такой поиск называется двоичным. Понятно, что он возможен только тогда, когда данные предварительно отсортированы. Для примера на рис. 8.12 показан поиск числа X = 44 в отсортированном массиве. Серым фоном выделены ячейки, которые уже не рассматриваются, потому что в них не может быть заданного числа. Перемен- € А[1] A[iV+l] 6 34 44 55 67 78 82 t L с ▼ t П 6 34 44 55 67 78 82 t L c ▼ t R 6 34 44 55 67 78 : 82 t L t R 6 34 44 55 67 78 82 t t L R Рис. 8.12 Алгоритмизация и программирование ные L и R ограничивают «рабочую зону» массива: L содержит номер первого элемента, а R — номер элемента, следующего за последним. Таким образом, нужный элемент (если он есть) находится в части массива, которая начинается с элемента A[L\ и заканчивается элементом A[i?-1]. На каждом шаге вычисляется номер среднего элемента «рабочей зоны», он записывается в переменную с. Если Х<А[с], то этот элемент может находиться только левее А[с], и правая граница R перемещается в с. В противном случае нужный элемент находится правее середины или совпадает с А[с\, при этом левая граница L перемещается в с. Поиск заканчивается при выполнении условия L = i? - 1, когда в рабочей зоне остаётся один элемент. Если при этом A[L] = X, то в результате найден элемент, равный X, иначе такого элемента нет. цел L, R, с L:=l; R:=N+1 нц пока L0 то вывод 'Номер символа ', иначе вывод 'Символ не найден. все s:='Здесь был Вася.'; n:=Pos ('с', S); if п>0 then write('Номер символа ', п) else write('Символ не найден.'); Символьные строки §66 Функция позиция возвращает целое число — номер символа, с которого начинается образец (буква ’с') в строке s. Если в строке несколько образцов, функция находит первый из них. Если образец не найден, функция позиция возвращает О (недействительный номер символа). В языке Паскаль функция Роз (от англ, position — позиция) работает точно так же. Пример обработки строк Предположим, что с клавиатуры вводится строка, содержащая имя, отчество и фамилию человека, например: Василий Алибабаевич Хрюндиков Каждые два слова разделены одним пробелом, в начале строки пробелов нет. В результате обработки должна получиться новая строка, содержащая фамилию и инициалы: Хрюндиков в.А. Возможный алгоритм решения этой задачи может быть на псевдокоде записан так: ввести строку s найти Б строке s первый пробел имя := всё, что слева от первого пробела удалить из строки s имя с пробелом найти Б строке s первый пробел отчество := всё, что слева от первого пробела удалить из строки s отчество с пробелом | осталась фамилия S := S + ' ' Ч- имя[1] + ' . ' Ч- отчество [1] Ч- Мы последовательно выделяем из строки три элемента: имя, отчество и фамилию, используя тот факт, что они разделены одиночными пробелами. После того как имя сохранится в отдельной переменной, в строке s останутся только отчество и фамилия. После «изъятия» отчества остаётся только фамилия. Теперь нужно собрать строку-результат из частей: «сцепить» фамилию и первые буквы имени и отчества, поставив пробелы и точки между ними. Для выполнения всех операций будем использовать стандартные функции, описанные выше. 7—49 Алгоритмизация и программирование Приведём полные программы на школьном алгоритмическом языке: алг ФИО нач лит S, name, name2 цел п вывод 'Введите имя, отчество и фамилию:' ввод S п:=позиция{' ', S); name:=5[1:п-1] | вырезать имя удалить(S, 1, п) п:=позиция(' ', S) пате2:=5[1:п-1] | вырезать отчество удалить(S, 1, п) I осталась фамилия s:=s + ' ' + name[l] + '. ' + name2[l] + '.' вывод s кон и на Паскале: program FIO; var s, name, name2: string; n: integer; begin write('Введите имя, отчество и фамилию: '); readln(s); n:=Pos(' ', s); name:=Copy(s, 1, n-1); {вырезать имя} Delete (s, 1, n) ; n:=Pos (' ', s); name2:=Copy(s, 1, n-1); {вырезать отчество) Delete (s, 1, n) ; {осталась фамилия) s : =s + ' ' + name [ 1 ] + ' . ' + name2 [ 1 ] + ' . '; writeln (s); end. ' Преобразования число строка В практических задачах часто нужно преобразовать число, записанное в виде цепочки символов, в числовое значение, и наоборот. Для этого в школьном алгоритмическом языке есть стандартные функции: Символьные строки §66 " лит_в_цел • лит_в_вещ цел_в_лит вещ в лит переводит строку в целое число; переводит строку в вещественное число; переводит целое число в строку; переводит вещественное число в строку. Разберём такой пример: лит S, цел N, вещ X, лог ОК з: = Ч23' N:=лит_в_цел(s, ОК) если не ОК то вывод s:='123.456'; Х:=лит в вещ(з, ОК) I N = 123 'Ошибка! все I X = 123.456 если не ОК то вывод 'Ошибка!' все Строку не всегда можно преобразовать в число (например, если в ней содержатся буквы). Поэтому функции лит_в_цел и лит_в_вещ используют второй параметр — логическую переменную ОК, в которую записывается да, если операция закончилась успешно, и «нет» в противном случае. При обратном преобразовании таких проблем быть не может: N:=123 3:=цел_в_лит(N) | з = '123' Х:=123.45б 3:=вещ_в_лит(X) | з = '123.456' В языке Паскаль строка преобразуется в число (целое или вещественное) с помощью процедуры Val: var г: integer; 3: ^ '123' Val(s, N, г); {N=123} з:='123.456'; Val(s, X, г); {Х=123.45б) Третий параметр г служит для того, чтобы зафиксировать ошибку: если после вызова процедуры Val он равен нулю, то ошибки не было, иначе в переменную г записывается номер первого ошибочного символа. Алгоритмизация и программирование Преобразование числа в строку выполняет процедура St г: N:=123; Str(N, s); {s='123'} Х:=123.45б; Str(X, s); {s='1.234560E+002'} Str(X:10:3, s); {s='123.456'} По умолчанию вещественные числа представлены в научном (экспоненциальном) формате ('1.234560Е+002 ' означает 1,23456-Ю^). В последней строке примера используется форматный вывод: запись Х:10:3 означает «вывести число в 10 позициях с 3 знаками в дробной части». Строки в процедурах и функциях Строки можно передавать в процедуры и функции как аргументы (значения параметров), а также возвращать как результат функций. Построим процедуру, которая заменяет в строке s все вхождения слова-образца wOld на слово-замену wNew (здесь wOld и wNew — это имена переменных, а выражение «слово wOld^ означает «слово, записанное в переменную wOldo). Сначала разработаем алгоритм решения задачи. На первый взгляд кажется, что можно написать такой алгоритм на псевдокоде: нц пока слово wOld есть в строке s удалить слово wOld из строки вставить на это место слово wNew кц Однако такой алгоритм работает неверно, если слово wOld входит в состав wNew, например, нужно заменить '12' на 'А12В' (покажите самостоятельно, что это приведет к зацикливанию). Чтобы избежать подобных проблем, попробуем накапливать результат в другой символьной строке res, удаляя из строки s уже обработанную часть. Предположим, что на некотором шаге в оставшейся части строки s обнаружено слово wOld (рис. 8.13, а). Символьные строки res wOld Рис. 8.13 Теперь нужно выполнить следующие действия: 1) ту часть строки s, которая стоит слева от образца, «прицепить» в конец строки res (рис. 8.13, б); 2) «прицепить» в конец строки res слово-замену wNew (рис. 8.13, в); 3) удалить из строки s начальную часть, включая найденное слово-образец (рис. 8.13, г). Далее все эти операции (начиная с поиска слова wOld в строке s) выполняются заново до тех пор, пока строка s не станет пустой. Если очередное слово-образец найти не удалось, вся оставшаяся строка S приписывается в конец строки-результата, и цикл заканчивается. В начале работы алгоритма в строку res записывается пустая строка ' ', не содержащая ни одного символа. В таблице 8.3 приведён протокол работы алгоритма замены для строки '12.12.12', в которой нужно заменить слово ' 12 ' на ' А12В'. Таблица 8.3 Рабочая строка s Результат res '12.12.12' •• '.12.12' 'А12В' '.12' 'А12В.А12В' 'А12В.А12В.А12В' 1 Алгоритмизация и программирование Теперь можно написать процедуру на школьном алгоритмическом языке. Так как она должна менять строку s, эта строка должна быть одновременно аргументом и результатом (в школьном алгоритмическом языке — аргреэ), а старое и новое слова — это просто аргументы (арг). алг replaceAll(аргрез лит s, арг лит wOld, wNew) нач лит res цел р, 1еп 1еп:=длин(wOld) res:='' нц пока nnMH(s)>0 р:=позиция(wOld, s) если р<0 то res:=res+s; выход все если р>1 то res:=res+s[1:р-1] все res:=res+wNew если р+1еп>длин(s) то S : =' ' иначе s:=s[р+1еп:длин(s)] все кц s:=res кон Дадим некоторые пояснения к программе. Переменная р — это номер первого символа первого найденного слова-образца wOld, а в переменной 1еп записана длина этого слова. Если после поиска слова значение р меньше нуля (образец не найден), происходит выход из цикла: если р<0 то res:=res+s; выход все Если р > 1, то слева от образца есть какие-то символы, и их нужно «прицепить» к строке res: если р>1 то res:=res+s[1:р-1] все Условие р+1еп>длин (s) означает, что образец стоит в самом конце слова, при этом остаток строки s — пустая строка. В конце программы результат записывается на место исходной строки S. Символьные строки §66 Приведём пример использования процедуры: алг Замена всех нач лит 3='12.12.12' replaceAll(S, '12', 'А12В') вывод S кон Построенную выше процедуру в функцию. Для этого нужно: можно легко превратить • в заголовке функции указать, что она возвращает строку (добавить ключевое слово лит); • все параметры должны быть аргументами (нужно убрать аргрез и арг); поскольку в школьном алгоритмическом языке нельзя менять аргументы внутри процедуры, назовём первый параметр (исходную строку) sO, и введём дополнительную переменную S для работы со строкой в процедуре; • в конце нужно записать результат во встроенную переменную знач, а не в S. Ниже показаны все изменённые части подпрограммы: гшг лит replaceAll(лит зО, wOld, wNew) нач лит 3 3: =з0 I тело процедуры знач:=гез кон Вызывать функцию можно таким образом: алг Замена всех нач лит 3='12.12.12' з:=гер1асеА11(3, '12', 'А12В') вывод 3 кон I Алгоритмизация и программирование Рекурсивный перебор В алфавите языке племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на экран все слова, состоящие из К букв, которые можно построить из букв этого алфавита. Это типичная задача на перебор вариантов, которую удобно свести к задаче меньшего размера. Будем определять буквы слова последовательно, одну за другой. Первая буква может быть любой из четырёх букв алфавита. Предположим, что сначала первой мы поставили букву 'ЬГ. Тогда для того, чтобы получить все варианты с первой буквой 'ЬГ, нужно перебрать все возможные комбинации букв на оставшихся К - 1 позициях: Перебор К-1 / символов Ы ?Т т т Далее поочерёдно ставим на первое место все остальные буквы, повторяя процедуру: алг перебор К символов нач w[l] W[l] W[l] W[l] кон = 'Ы'; = 'Ш' ; = 'Ч'; =' О' ; перебор последних К-1 символов перебор последних К-1 символов перебор последних К-1 символов перебор последних К-1 символов Здесь через w обозначена символьная строка, в которой хранится рабочее слово. Таким образом, задача для слов длины К свелась к 4 задачам для слов длины К-1. Как вы знаете, такой прием называется рекурсией, а процедура — рекурсивной. Когда рекурсия должна закончиться? Тогда, когда все символы будут расставлены. При этом нужно вывести получившееся слово на экран и выйти из процедуры. Подсчитаем количество всех возможных слов длины К. Очевидно, что слов длины 1 всего 4. Добавляя ещё одну букву, получаем 4 • 4 = 16 комбинаций, для трёх букв — 4 • 4 • 4 = 64 слова и т. д. Таким образом, из 4 букв можно составить 4^ слов длины К. В основной программе построим слово (символьную строку) word нужной длины (что в ней будет записано, не имеет значе- Символьные строки §66 ния). Процедуре TumbaWords передаётся алфавит в виде символьной константы, слово word и число уже установленных символов (в начале — 0): алг ЬШ1Ч0 нач лит word = кон лит wora = | из К символов TumbaWords('ЫШЧО', word, 0) В процедуре используется описанный выше рекурсивный алгоритм: алг TumbaWords(лит А, wO, цел N) нач если N = flHHH(wO) то | слово построено вывод wO, нс выход все цел i лит W W: =w0 нц для i от 1 до длин(А) w[N+l]:=A[i] TumbaWords(А, w, N+1) I рекурсия кц кон Если условие в начале процедуры ложно (не все символы расставлены), в цикле перебираем все символы алфавита и поочерёдно ставим их на первое свободное место, а затем вызываем рекурсивно эту же процедуру, увеличивая третий параметр на 1. Поскольку школьный алгоритмический язык не позволяет менять переменную-аргумент, мы вынуждены ввести дополнительную локальную переменную w. Приведём аналогичную программу на Паскале: program YSCH0; var word: string; procedure TumbaWords(A, var i: integer; w: string; N: integer); Алгоритмизация и программирование begin if N=Length(w) then begin writeln(w); exit; end; for i:=l to Length(A) do begin w[N+l]:=A[i]; TumbaWords(A, w, N+1); end; end; begin word:= TumbaWords ('ШЧО', word, 0) ; end. Сравнение и сортировка строк Строки, как и числа, можно сравнивать. Для строк, состоящих из одних букв (русских или латинских), результат сравнения очевиден: меньше будет та строка, которая идет раньше в алфавитном порядке. Например, слово «паровоз» будет «меньше», чем слово «пароход»: они отличаются в пятой букве: 'в' < 'х'. Более короткое слово, которое совпадает с началом более длинного, тоже будет стоять раньше в алфавитном списке, поэтому 'пар' < 'парк'. Но откуда компьютер «знает», что такое алфавитный порядок? И как сравнивать слова, в которых есть строчные и заглавные буквы, а также цифры и другие символы? Что больше, 'ПАР', 'Пар' или 'пар'? Оказывается, при сравнении строк используются коды символов. Тогда получается, что: 'ПАР' < 'Пар' < 'пар'. Возьмём пару 'ПАР' и 'Пар'. Первый символ в обоих словах одинаков, а второй отличается — в первом слове буква заглавная, а во втором — такая же, но строчная. Во всех современных таблицах символов (включая UNICODE) заглавные буквы стоят раньше строчных и поэтому имеют меньшие коды. Поэтому 'А' < 'а', 'П' < 'а' и 'ПАР' < 'Пар' < 'пар'. А как же с другими символами (цифрами, латинскими буквами)? Цифры стоят в кодовой таблице по порядку, причём раньше, чем латинские буквы; латинские буквы — раньше, чем русские; Символьные строки заглавные буквы (русские и латинские) соответствующие строчные. Поэтому: — раньше, чем '5STEAM' < 'STEAM' < 'Steam' < 'steam' < 'ПАР' < 'Пар' < 'пар'. Сравнение строк используется, например, при сортировке. Рассмотрим такую задачу: надо ввести с клавиатуры 10 фамилий и вывести их на экран в алфавитном порядке. Для сортировки удобно выделить массив строк, который в школьном алгоритмическом языке объявляется как литтаб, а в Паскале — array of string. Ввод и вывод выполняются с помощью стандартных циклов, а сортировка — любым известным способом, например методом пузырька: алг Сортировка строк нач цел i, j, N=10 литтаб S[1:N] лит si i от S[i] нц для ввод кц нц для 1 до N 1 от 1 до N-1 нц для j от N-1 до i шаг если S[j+l]0 удалить (S, р, 1еп) вставить(sNew, s, р) р:=позиция(sOld, s) кц знач:=s кон Приведите пример входных данных, при которых эта функция работает неправильно. 7. Напишите рекурсивную версию процедуры replaceAll. Сравните две версии. Какую из них вы рекомендуете выбрать и почему? 8. Напишите функцию, которая изменяет в имени файла расширение на заданное (например, на Ьак). Функция принимает два параметра: имя файла и нужное расширение. Учтите, что в исходном имени расширение может быть пустым. 9. Напишите функцию, которая определяет, сколько раз входит в символьную строку заданное слово. 10. С клавиатуры вводится число N, обозначающее количество футболистов команды «Бублик», а затем — N строк, в каждой из которых — информация об одном футболисте в таком формате: <Фамилия> <Имя> <год рождения> <голы> Данные разделяются одним пробелом. Нужно подсчитать, сколько футболистов, родившихся в период с 1998 по 2000 г., не забили мячей вообще. 11. В условиях задачи 10 определите фамилию и имя футболиста, забившего наибольшее число голов, и количество забитых им голов. 12. В условиях задачи 10 выведите в алфавитном порядке фамилии и имена всех футболистов, которые забили хотя бы один гол. В списке не более 100 футболистов. 13. Измените программу рекурсивного перебора так, чтобы длину слова можно было ввести с клавиатуры. 14. Выведите на экран все слова из К букв, в которых буква «Ы» встречается более 1 раза, и подсчитайте их количество. Алгоритмизация и программирование 15. Выведите на экран все слова из К букв, в которых есть одинаковые буквы, стоящие рядом (например, «ЫШШО»), и подсчитайте их количество. 16. В языке племени «тумба-юмба» запрещено ставить две гласные буквы подряд. Выведите все слова длины К, удовлетворяющие этому условию, и найдите их количество. *17. Напишите программу перебора слов заданной длины, не использующую рекурсию. Попробуйте составить функцию, которая на основе некоторой комбинации вычисляет следующую за ней. *18. Перестановки. К вам пришли К гостей. Напишите прогргичму, которая выводит все перестановки — способы посадить их за столом. Гостей можно обозначить латинскими буквами. §67 Матрицы Что такое матрицы? Многие программы работают с данными, организованными в виде таблиц. Например, при составлении программы для игры в крестики-нолики нужно запоминать состояние каждой клетки квадратной доски. Можно поступить так: пустым клеткам присвоить код -1, клетке, где стоит нолик, — код О, а клетке с крестиком — код 1. Тогда информация о состоянии поля может быть записана в виде таблицы (рис. 8.14). о X 1 -1 0 1 о X 2 -1 0 ШЛ О X 3 0 1 -1 Рис. 8.14 Такие таблицы называются матрицами или двумерными массивами. Каждый элемент матрицы, в отличие от обычного (линейного) массива, имеет два индекса — номер строки и номер столбца. На рисунке 8.14 серым фоном выделен элемент, находящийся на пересечении второй строки и третьего столбца. Матрицы §67 Матрица — это прямоугольная таблица, составленная из элементов одного типа (чисел, строк и т. д.). Каждый элемент матрицы имеет два индекса — номера строки и столбца. О При объявлении матриц указывают два диапазона индексов (для строк и столбцов): цел N=3, М=4 целтаб A[1:N,1:M] вещтаб Х[-3:0,-8:М] логтаб L[1:N,0:1] const N=3, М=4; var А: array[1..N,1..М] of integer; X: array[-3..О,-8..М] of double; L: array[1..N,0..1] of boolean; Каждому элементу матрицы можно присвоить любое значение, допустимое для выбранного типа данных. Поскольку индексов два, для заполнения матрицы нужно использовать вложенный цикл. Далее в примерах будем считать, что объявлена матрица из N строк и М столбцов, а i и у — целочисленные переменные, обозначающие индексы строки и столбца. В следующем примере матрица заполняется случайными числами и выводится на экран: нц для i от 1 до N нц для j от 1 до М A[i,j]:=irand(20,80) вывод A[i,j], ' ' кц вывод, НС кц for i: =1 to N do begin for j:=1 to M do begin A[i, j] : =random (20)-!-80; write(A[i,j]:3) end; writeln end; Такой же двойной цикл нужно использовать для перебора всех элементов матрицы. Вот как вычисляется сумма значений всех элементов: S: =0 нц для i от 1 до N нц для j от 1 до М s:=s+A[i,j] кц кц S :=0 for i:=1 to N do for j:=l to M do s:=s+A[i,j]; Алгоритмизация и программирование Обработка элементов матрицы Покажем, как можно обработать (например, сложить) некоторые элементы квадратной матрицы А, содержащей N строк и N столбцов. На рисунке 8.15, а выделена главная диагональ матрицы, на рис. 8.15, б — вторая, побочная диагональ, на рис. 8.14, в — главная диагональ и все элементы под ней. тт ■ю-'t i fe 1 Ш Рис. 8.15 Главная диагональ — это элементы А[1,1], А[2,2], ..., А[АГ,ЛГ], т. е. элементы, у которых номер строки равен номеру столбца. Для перебора этих элементов нужен один цикл: 1 до N for i:=l to N do begin {работаем с end; нц для 1 от I работаем с кц A[i,i] A[i,i] } Элементы побочной диагонали — это А[1,ЛГ], A[2,iV-l], ..., А[А/,1]. Заметим, что сумма номеров строки и столбца для каждого элемента равны N + 1, поэтому получаем такой цикл перебора: for i:=l to N do begin (работаем с A[i,N+l-i] } end; НЦ для i от 1 до N I работаем с A[i,N+l-i] кц В случае обработки всех элементов на главной диагонали и под ней (см. рис. 8.15, в) нужен вложенный цикл: номер строки будет меняться от 1 до N, а номер столбца для каждой строки i — от 1 до г: нц для i от 1 до ____ нц для j от 1 до| i I for i:=l to N do begin for j:=l to| i |do begin I работаем c|A[i,j] КЦ КЦ {работаем c |A[i,j] end end; Матрицы §67 Чтобы переставить строки или столбцы, достаточно одного цикла. Например, переставим строки 2 и 4, используя вспомогательную целую переменную с: нц для j от 1 до М с:=А[2,j] А[2,j]:=А[4,j] А[4,j]:=с кц Вопросы и задания for j:=l to М do с:=А[2,j]; A[2, j ] :=А[4, j ] ; A[4,j]:=c; end; 1. Что такое матрицы? Зачем они нужны? 2. Сравните понятия «массив» и «матрица». 3. Как вы думаете, можно ли считать, что первый индекс элемента матрицы — это номер столбца, а второй — номер строки? 4. Могут ли индексы элементов матрицы принимать отрицательные и нулевые значения? 5. Что такое главная и побочная диагонали матрицы? 6. Почему суммирование элементов главной диагонали требует одиночного цикла, а суммирование элементов под главной диагональю — вложенного? Подготовьте сообщение а) «Матрицы в языке Си» б) «Матрицы в языке Python» Задачи 1. Напишите программу, которая находит минимальный и максимальный элементы матрицы и их индексы. 2. Напишите программу, которая находит минимальный и максимальный элементы из элементов матрицы с чётными положительными значениями и их индексы. Учтите, что таких элементов в матрице может и не быть. 3. Напишите программу, которая выводит на экран строку матрицы, сумма значений элементов которой наибольшая. 4. Напишите программу, которая выводит на экран столбец матрицы, сумма значений элементов которого наименьшая. 5. Напишите программу, которая заполняет матрицу случайными числами, а затем записывает нули во все элементы выше главной диагонали. О Алгоритмизация и программироаанив 6. Напишите программу, которая заполняет матрицу случайными числами, а затем записывает нули во все элементы выше побочной диагонали. 7. Напишите программу, которая заполняет матрицу размером 7x7 случайными числами, а затем записывает в элементы, отмеченные на рисунках, число 99. 8. Заполните матрицу, содержащую N строк и М столбцов, натуральными числами по спирали и змейкой, как на рисунках. -4-- „2- -3- -4 1 -н- -12 1 5 1 1 iO-- ..8-- -Z. 1 -6 1 1 ✓ -Л / Л i /' / / / io / 6- / -•7 11- 42 1 -Ч 1 2 5 i 8 1 в-- t -4 i 9- -lb 9. Заполните квадратную матрицу случайными числами и выполните её транспонирование: так называется процедура, в результате которой строки матрицы становятся столбцами, а столбцы — строками. 1 2 3 4' 5 6 7 8 9 4 7 2 5 8 3 6 9 10. Пиксели рисунка закодированы числами от 0 до 255 (обозначающими яркость пикселей) в виде матрицы, содержащей N строк и М столбцов. Нужно преобразовать рисунок в чёрно-белый по следующему алгоритму: • вычислить среднюю яркость пикселей по всему рисунку; • все пиксели, яркость которых меньше средней, сделать чёрными (записать код 0), а остальные — белыми (код 255). Работа с файлами 11. Пиксели рисунка закодированы числами (обозначающими цвет) в виде матрицы, содержащей N строк и М столбцов. Выполните отражение рисунка сверху вниз, как показано на рисунке. 1 2 3 4 5 6 7 8 9 7 8 9 4 5 6 1 2 3 12. Пиксели рисунка закодированы числами (обозначающими цвет) в виде матрицы, содержащей N строк и М столбцов. Выполните поворот рисунка вправо на 90 градусов, как показано на рисунке. 1 2 3 4 5 6 7 8 9 7 4 1 8 5 2 9 6 3 *13. Напишите программу, которая играет с человеком в крестики-нолики. *14. В матрице, содержащей N строк и М столбцов, «записана» карта островного государства Лимония (нули обозначают море, а единицы — сушу). Все острова имеют форму прямоугольника. Напишите программу, которая по готовой карте определяет количество островов. §68 Работа с файлР"'' Как работать с файлами? Файл — это набор данных на диске, имеющий имя. С точки зрения программиста, бывают файлы двух типов: 1) текстовые, которые содержат текст, разбитый на строки; таким образом, из всех специальных символов в текстовых файлах могут быть только символы перехода на новую строку; Алгоритмизация и программирование 2) двоичные, в которых могут содержаться любые данные и любые коды без ограничений; в двоичных файлах хранятся рисунки, звуки, видеофильмы и т. д. Мы будем рассматривать только текстовые файлы. Работа с файлом из программы включает три этапа. Сначала надо открыть файл, т. е. сделать его активным для программы. Если файл не открыт, то программа не может к нему обращаться. При открытии файла указывают режим работы: чтение, запись или добавление данных в конец файла. Чаще всего открытый файл блокируется так, что другие программы не могут использовать его. Когда файл открыт (активен), программа выполняет все необходимые операции с ним. После этого нужно закрыть файл, т. е. освободить его, разорвать связь с программой. Именно при закрытии все последние изменения, сделанные программой в файле, записываются на диск. Такой принцип работы иногда называют «принципом сэндвича», в котором три «слоя»: «хлеб», затем «начинка», и потом снова «хлеб» (рис. 8.16). Открыть файл Работа с файлом Закрыть файл Рис. 8.16 В большинстве языков программирования с файлами работают через вспомогательные переменные (их называют указателями, идентификаторами и т. п.). Например, в школьном алгоритмическом языке существуют стандартные функции: • открыть на чтение; • открыть на запись; • открыть на добавление, которые принимают имя файла (символьную строку) и возвращают ссылку на открытый файл (ключ файла), которая записывается в специальную переменную типа файл. Команда закрыть закрывает открытый файл: файл Fin, Fout Fin:=oткpыть на чтение('input.txt') Fout:=открыть на запись{'output.txt') Работа с файлами §68 I здесь работаем с файлами закрыть(Fin) закрыть(Fout) После закрытия файла файловую переменную можно использовать повторно, для работы с этим или другим файлом. После окончания работы программы все открытые файлы закрываются автоматически. Если файл, который открывается на чтение, не найден, возникает ошибка. Если существующий файл открывается на запись, его содержимое уничтожается. Чтение из текстовых файлов выполняет команда ввод, а запись — команда вывод. При работе с файлами на первом месте в списке параметров нужно указать файловую переменную, в которой записан номер открытого файла. В остальном чтение и запись происходит так же, как и для стандартных устройств — клавиатуры и текстового экрана (эта пара устройств называется терминалом или консолью). Если в переменных Fin и Fout записаны ключи файлов, открытых соответственно на ввод и на вывод, можно написать так: ввод Fin, а, Ь вывод Fout, а. Ь, '=', а+Ь У нас получилась версия программы, которая складывает два числа, прочитанные из одного файла, и записывает результат в другой файл. Как правило, текстовый файл — это «устройство» последовательного доступа к данным. Это значит, что для того, чтобы прочитать 100-е по счёту значение из файла, нужно сначала прочитать предыдущие 99. В своей внутренней памяти система хранит положение указателя (файлового курсора), который определяет текущее место в файле. При открытии файла указатель устанавливается в самое начало файла, при чтении смещается на позицию, следующую за прочитанными данными, а при записи — на следующую свободную позицию. Если нужно повторить чтение с начала файла, нужно закрыть его, а потом снова открыть. В школьном алгоритмическом языке вместо этого используется команда начать чтение: начать чтение(Fin) Алгоритмизация и программирование Когда файловый курсор указывает на конец файла, логическая функция конец файла возвращает значение «истина»: если конец файла (Fin) вывод 'Данные кончились' все В языке Паскаль для работы с текстовыми файлами используются файловые переменные типа Text: var Fin, Fout: Text; Сначала их нужно с помощью процедуры Assign связать с именами файлов, к которым будем обращаться: Assign(Fin, 'input.txt'); Assign(Fout, 'output.txt'); Эти файлы ещё не открыты, и работать с ними нельзя. Для открытия файлов в разных режимах существуют стандартные процедуры • Reset — открыть на чтение, • Rewrite — открыть на запись, • Append — открыть на добавление. У них один параметр — файловая переменная, которая была предварительно связана с именем файла. После окончания работы файлы закрываются командой Close: Reset(Fin); Rewrite(Fout); {здесь работаем с файлами} Close(Fin); Close(Fout); Для чтения и записи используются процедуры read, readln, write и writeln, в которых в качестве первого параметра указывают файловую переменную: readln(Fin, а, Ь); writeln(Fout, а, '+' Ь, '=', а+Ь); Работа с файлами Напомним, что readln, в отличие от read, читает всё до конца строки. В приведённом выше примере после прочтения значений переменных а и Ь все оставшиеся символы до конца строки игнорируются, а следующий вызов read или readln берёт данные уже с новой строки. Функция Eof (англ. EOF — end of file — конец файла) возвращает значение True (истина), если указатель стоит на последней позиции файла: if Eof(Fin) then write('Данные кончились'); Неизвестное количество данных Предположим, что в текстовом файле записано в столбик неизвестное количество чисел и требуется найти их сумму. В этой задаче не нужно одновременно хранить все числа в памяти (и не нужно выделять массив!), достаточно читать по одному числу: нц пока не конец файла прочитать число из файла добавить его к сумме кц Далее будем считать, что файловая переменная Fin связана с файлом, открытым на чтение. Основная часть программы (без объявления переменных, открытия и закрытия файлов) выглядит так: S:=0 нц пока не конец файла (Fin) ввод Fin, X S:=S+x кц S:=0; while not Eof (Fin) do begin readln(Fin, x); S:=S+x end; Обработка массивов В текстовом файле записано не более 100 целых чисел. Требуется вывести в другой текстовый файл те же числа, отсортированные в порядке возрастания. Особенность этой задачи в том, что для сортировки нам нужно удерживать в памяти все числа, т. е. для их хранения нужно вы- Алгоритмизация и программирование делить массив. Косвенно на это указывает ограничение — чисел не более 100. Поэтому массив должен иметь не менее 100 элементов: цел МАХ=100 целтаб А[1:МАХ] const МАХ=100; var А: array[1..МАХ] of integer; Основная интрига состоит в том, что количество чисел точно не известно. Следовательно, нам нужно считывать значения и записывать их последовательно в первые ячейки массива, пока данные не закончатся — тогда цикл чтения останавливается. Кроме того, нужно сделать защиту от слишком большого количества данных: если 100 чисел уже записаны в массив, цикл должен остановиться. Ниже приведены циклы чтения на школьном алгоритмическом языке: N:=0; нц пока не конец файла(Fin) и N <Имя> <Количество баллов> Вывести фамилии и имена тех учеников, которые получили больше 80 баллов. 14. В задаче 13 добавить к списку нумерацию, например: 1) Иванов Вася 2) Петров Петя 15. В задаче 14 сократить имя до одной буквы и поставить перед фамилией: 1) В. Иванов 2) П. Петров 16. В задаче 15 отсортировать список по алфавиту (по фамилии). *17. В задаче 15 отсортировать список по убыванию полученного балла (вывести балл в выходной файл). Практические работы к главе 8 Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа № 25 № 26 № 27 № 28 № 29 № 30 № 31 № 32 № 33 № 34 № 35 № 36 № 37 № 38 № 39 № 40 № 41 № 42 «Простые вычисления» «Ветвления* «Сложные условия» «Множественный выбор» «Задачи на ветвления» «Циклы с условием» «Циклы с условием» «Циклы с переменной* «Вложенные циклы» «Процедуры» «Процедуры с изменяемыми параметрами» «Функции» «Логические функции» «Рекурсия» «Стек» «Перебор элементов массива* «Линейный поиск» «Поиск максимального элемента массива» Работа с файлами §68 Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа Работа № 43 № 44 № 45 № 46 № 47 № 48 № 49 № 50 № 51 № 52 № 53 № 54 № 55 № 56 № 57 № 58 № 59 № 60 № 61 Алгоритмы обработки массивов» Отбор элементов массива по условию» Метод пузырька» Метод выбора» Быстрая сортировка» Двоичный поиск» Посимвольная обработка строк» Функции для работы со строками» Преобразования "строка-число" » Строки в процедурах и функциях» Рекурсивный перебор» Сравнение и сортировка строк» Обработка символьных строк: сложные задачи» Матрицы» Обработка блоков матрицы» Файловый ввод и вывод» Обработка массивов из файла» Обработка строк из файла» Обработка смешанных данных из файла» ЭОР к главе 8 на сайте ФЦИОР (http//fcior.edu.ru) - Понятие алгоритма, его свойства. Линейный алгоритм • Основные структуры данных <- Классификация языков программирования. Компиляторы и интерпретаторы • Реализация основных алгоритмических конструкций • Алгоритмы сортировки • Алгоритмы поиска • Организация работы с текстовыми файлами Самое важное в главе 8 • Алгоритмы могут записываться на псевдокоде, в виде блок-схем и на языках программирования. Алгоритм, записанный на языке программирования, называется программой. • Данные, с которыми работает программа, хранятся в переменных. Переменная — это величина, которая имеет имя, тип и значение. Значение переменной может изменяться во время выполнения программы. Алгоритмизация и программирование Любой гшгоритм можно записать, используя последовательное выполнение операторов, ветвления и циклы. Ветвления предназначены для выбора вариантов действий в зависимости от выполнения некоторых условий. Цикл — это многократное повторение одинаковых действий. Подпрограммы — это вспомогательные алгоритмы, которые могут многократно вызываться из основной программы и других подпрограмм. Подпрограммы-процедуры выполняют описанные в них действия, а подпрограммы-функции в дополнение к этому возвращают результат этих действий (число, символ, логическое значение и т. д.). Дополнительные данные, передаваемые в подпрограмму, называют аргументами. В подпрограмме эти данные представлены как локальные переменные, которые называются параметрами подпрограммы. Рекурсивные алгоритмы основаны на последовательном сведении исходной задачи ко всё более простым задачам такого же типа (с другими значениями параметров). Рекурсия служит заменой циклу. Любой рекурсивный алгоритм можно записать без рекурсии, но во многих случаях такая запись более длинная и менее понятная. Массив — это группа переменных одного типа, расположенных в памяти рядом (в соседних ячейках) и имеющих общее имя. Каждая ячейка массива имеет уникальный индекс (как правило, это номер элемента). Сортировка — это расстановка элементов массива в заданном порядке. Цель сортировки — облегчить последующий поиск. Для отсортированного массива можно применить двоичный поиск, который работает значительно быстрее, чем линейный. Символьная строка — это последовательность символов, расположенных в памяти рядом (в соседних ячейках). Строка представляет собой единый объект, она может менять свою длину во время работы программы. Матрица — это прямоугольная таблица, составленная из элементов одного типа (чисел, строк и т. д.). Каждый элемент матрицы имеет два индекса — номера строки и столбца. До выполнения операций с файлом нужно открыть файл (сделать его активным), а после завершения всех действий — закрыть (освободить). Глава 9 Решение вычислительных задач на компьютере §69 Точность вычислений «Недостатки математического образования с наибольшей отчётливостью проявляются в чрезмерной точности численных расчётов», — писал выдающийся немецкий математик первой половины XIX века Карл Фридрих Гаусс. Все практические расчёты выполняются неточно, с некоторой погрешностью (ошибкой, отклонением от истинного значения). В первую очередь это связано с тем, что неточно известны исходные данные, которые получаются в результате измерений. Погрешности измерений Окружающие нас предметы имеют различные числовые характеристики (длину, массу, объём и др.), которые часто приходится измерять для решения практических задач. Для измерений используются приборы, каждый из которых имеет определённую точность. Это значит, что с помощью данного прибора невозможно зафиксировать изменение величины, меньшее, чем цена деления шкалы этого прибора. Поэтому измеренное значение величины всегда отличается от точного (истинного), разность между ними называют погрешностью измерения. Пусть нужно найти толщину дна кружки, используя только линейку с ценой деления 1 мм. Линейкой можно измерить высоту кружки снаружи и глубину внутри (рис. 9.1). При этом точность измерений будет не выше чем 1 мм (0,1 см). Например, если измеренная высота кружки оказалась примерно 8,2 см, на самом деле она может быть от 8,1 до 8,3 см. Если измеренная глубина равна 7,8 см, фактическая может быть от 7,7 до 7,9 см. Рис. 9.1 I Решение вычислительных задач на компьютере О Используя данные измерений, можно найти толщину дна как разность 8,2 - 7,8 = 0,4 см. Это не означает, что толщина дна действительно такая. Действительно, с учётом ошибок измерений она может быть равна как 8,1 - 7,9 = 0,2 см, так и 8,3 - 7,7 = 0,6 см. Таким образом, реальная толщина может быть от 0,2 до 0,6 см (разница в 3 раза!), и в полученном ответе (0,4 см) нет ни одной верной значащей цифры! Обычно в этом случае пишут ответ в виде 0,4 ± 0,2 см. В приведённом примере погрешность 0,2 см — это так называемая абсолютная погрешность Ах. Для оценки качества измерений чаще используют относительную погрешность, которая вычисляется как отношение абсолютной погрешности Ах к истинному значению величины х*: 5 =.^.100%. X Поскольку истинное значение, как правило, неизвестно, его обычно заменяют на полученный результат изменений. В данном случае относительную погрешность можно оценить как 5 =2i£.100% = 50%. 0,4 Это очень большое значение, которое говорит о низкой точности измерений. Погрешности вычислений Пусть нужно вычислить площадь сечения цилиндра, диаметр которого D = 1,2 см известен с точностью 0,1 см. По известной формуле площади круга получаем (например, на калькуляторе): S = = и3097335592325565846551617980&.. Значит ли это, что мы нашли площадь с такой точностью? Конечно, нет. Вспомним, что диаметр был измерен с точностью 0,1 см, т. е. он мог быть в самом Рис. 9.2 Точность вычислений деле равен как 1,1 см, так и 1,3 см. В этих «крайних» случаях получаем площадь л1,1^ 4 = 0,950... и л-1,32 = 1,327... Таким образом, следует записать ответ в виде S » 1,1 ± 0,2 см2. Относительную погрешность результата можно оценить как 5^ =5^ 100% «18%. 1,1 Заметим, что мы не учитывали погрешность, связанную с неточностью задания иррационального числа к. Все практические расчёты выполняются неточно. Погрешность результата вычислений определяется в первую очередь погрешностью исходных данных. О Теперь вернёмся к расчётам с помощью компьютера. Как вы знаете из главы 4, данные записываются в память в двоичном коде ограниченной длины, при этом практически все вещественные числа хранятся неточно. При выполнении вычислений погрешности накапливаются, поэтому при сложных расчётах может получиться неверный ответ. Например, с точки зрения точности очень плохо, если ответ — это небольшое (по модулю) число, которое вычисляется как разность двух неточных больших чисел (вспомните пример с кружкой!). Погрешность резко возрастает при делении на неточное малое по модулю число. Предположим, что нужно вычислить значение а с х =-----, Ь d причём а, Ъ, с тл d — вещественные числа, которые получены в результате вычислений с погрешностью 0,001: а = 1000 ±0,001; 6=0,002+0,001; с = 1000±а001; с/ = а003±а001. Легко проверить, что вычисленное значение х может находиться в интервале от -166 667 до 750 001, т. е. относительная 8-^9 Решение вычислительных задач на компьютере погрешность превышает 300%! Такой метод расчётов вычислительно неустойчив: малые погрешности в исходных данных могут привести к огромным погрешностям в решении. Подводя итог, можно выделить несколько источников погрешностей при компьютерных вычислениях: • неточность исходных данных; • неточность записи вещественных чисел в двоичном коде конечной длины; погрешности приближённого вычисления некоторых стандартных функций (например, sin(x) или cos(x)); • накопление погрешностей при арифметических действиях с неточными данными; • собственная погрешность используемого метода (для приближённых методов, рассматриваемых в следующем параграфе). Проблемы, возникающие при вычислениях с конечной точностью, изучает вычислительная математика, задача которой — разработать вычислительно устойчивые методы решения задач, при которых небольшие погрешности исходных данных мало влияют на результат. Иногда этого удаётся добиться простым изменением порядка действий или преобразованием формул. Вопросы и задания 1. Как вы понимаете приведённое в параграфе высказывание К. Ф. Гаусса? 2. Какие величины можно измерять? Какие приборы для этого используются? Приведите примеры. 3. Какова цена деления у ваших наручных часов? 4. Как определить цену деления для приборов с цифровыми индикаторами? Приведите примеры. 5. Что такое абсолютная и относительная погрешности? Какое из этих значений более важно в практических задачах? 6. Что такое вычислительно неустойчивый метод? 7. Перечислите источники погрешностей при компьютерных вычислениях. 8. Какие задачи изучает вычислительная математика? Подготовьте сообщение а) «Абсолютная и относительная погрешность* б) «Вычислительная устойчивость методов» Решение уравнений §70 Задачи 1. Как изменятся абсолютная и относительная погрешности результата, если при вычислении площади сечения (см. задачу в тексте параграфа) в качестве п использовать число 3,14? 2. Радиус шарика R измерили с точностью 0,1 см и получили 1,2 см. Затем рассчитали его объём по формуле О V = 4-л-л® = 7^3822947387088. Запишите ответ в этой задаче, оставив нужно количество значащих цифр. 3. С помощью рулетки размеры бруса (220 см х 11 см х 10 см) измерили с точностью 1 см. Определите его объём. Запишите ответ с учётом точности полученного результата. *4. Пётр и Павел измеряют плотность меди. У них есть медные бруски разной величины, линейка и весы. Пётр взял брусок с размерами (по результатам измерений) 2x2x2 см, а Павел — с размерами 5x5x5 см. При измерении массы брусков у Петра получилось 70 г, а у Павла — 1120 г. Погрешность измерения длины — 1 мм, погрешность измерения массы — 10 г. С какой абсолютной и относительной погрешностью определили плотность меди Пётр и Павел? Какой брусок нужно было выбирать, чтобы погрешность была наименьшей? §70 Решение уравнений Приближённые методы На уроках математики вас учили искать решение уравнения в виде формулы, выражающей неизвестную величину через известные. Например, решение уравнения ах + Ь=1 при можно записать в виде х = (1-Ь)/а. Такое решение называется аналитическим, оно может быть использовано для теоретического исследования (изучения влияния исходных данных на результат). Однако не все уравнения можно (на современном уровне развития математики) решить аналитически. Иногда решение есть, но очень сложное. Например, уравнение jc = cosjc так просто не решается. В этом случае приходится использовать другие методы решения, например графический: построить по точкам графики функций, стоящих в левой и правой частях равенства, и посмотреть, где они пересекаются (рис. 9.3). Затем решение можно уточнять. Решение вычислительных задач на компьютере У У = COS X / л: 0,5- ж ' ж ' X. ж 1 X ж 1 X ж 1 X ж ' X Ж • X 0 0,5 X* 1,0 1,5\ -0,5- Рис. 9.3 уменьшая шаг при построении графика до получения требуемой точности. Если нужна высокая точность, графический метод требует очень большого объёма вычислений, который имеет смысл поручить компьютеру. Однако нужно как-то учесть, что компьютер не способен «посмотреть» на график, и для уточнения решения может использовать только числовые данные. Компьютерный алгоритм решения уравнения может выглядеть примерно так: 1) выбрать отрезок [cq, 6q] для поиска решения (обычно предполагается, что на этом отрезке решение есть, и притом только одно); 2) с помощью некоторого алгоритма уточнить решение, перейдя к меньшему отрезку [а, &]; 3) повторять шаг 2, пока длина отрезка (содержащего решение) не станет достаточно мала. Здесь не совсем ясно, что значит «пока длина отрезка не станет достаточно мала». Обычно задается нужная точность а: это означает, что отклонение полученного решения от истинного х* не должно быть больше е. Если корень уравнения находится на отрезке [а, 6], то в качестве решения лучше всего взять его середину (а+Ь)/2. В*йтв1М‘случае погрешность будет минимальной: не больше половины длины отрезка. Поэтому цикл нужно остановить, когда длина отрезка станет меньше, чем 2а. Часто используется другой вариант, когда отрезок не нужен, а требуется знать только одну точку вблизи решения: 1) выбрать начальное приближение лгд около решения; 2) с помощью некоторого алгоритма перейти к следующему приближению X, которое находится ближе к точному решению X*; 3) повторять шаг 2, пока на очередном шаге решение не изменится на величину, меньшую, чем допустимая погрешность а. Подобные методы решения уравнений называются приближёнными. Их суть в том, что решение последовательно уточняется до тех пор, пока не будет найдено с требуемой точностью. Поскольку при каждом уточнении выполняются одинаковые действия, можно назвать такие методы итерационными (от лат. iteration — повторение). Решение уравнений §70 Приближённые методы имеют ряд недостатков: • получается приближённое решение, а не точное; это значит, что нельзя написать х* = 1,2345, нужно использовать знак приближённого равенства: х* « 1,2345 (отметим еш;ё раз, что практически все вычисления с дробными числами на компьютере выполняются неточно); • мы получаем не формулу, а число, по которому невозможно оценить, как меняется решение при изменении исходных данных (сложно выявить зависимость от параметра); объём вычислений может быть слишком велик, часто это не позволяет использовать приближённые методы в системах реального времени; • не всегда можно оценить погрешность результата. Однако в некоторых практических случаях приближённые методы более полезны, чем аналитические. Они обладают следующими достоинствами: • часто получение аналитического решения невозможно или требует значительных усилий, тогда как приближенные методы позволяют достаточно быстро решить задачу с заданной точностью; • при компьютерных расчётах (с конечной точностью) вычисления по «точным» аналитическим формулам часто могут давать очень неточный результат из-за щ^ццслительной неустойчивости метода. Нередко для таких задач (например, для решения систем линейных уравнений) специально разрабатываются приближённые методы, которые дают значительно более точное решение. Метод перебора Как принято в вычислительной математике, далее мы будем рассматривать уравнение общего вида f(x) = 0, к которому можно привести любое заданное уравнение. Например, для уравнения X = cos X получаем f(x) = х- cos х. Предположим, что нужно найти решение уравнения /(л:) = 0 с точностью Б, причём известно (например, видно на графике), что решение находится справа от некоторой точки х = а. В этом случае можно разбить всю область, где может быть решение, на узкие полоски шириной 5=2е, и выбрать такую полоску, где график функции пересекает ось ОХ (рис. 9.4). Решение вычислительных задач на компьютере у у-fix) Для того чтобы поручить решение этой задачи компьютеру, нужно отве-тить на два вопроса: 1)Как с помощью математических опе- ^ раций определить, что в полосе [х, л: + 5] есть решение? ---тИ рЦ И 2) Что считать решением уравнения, LaJ когда такая полоса определена? Проще ответить на второй вопрос: Рис. 9.4 лучше всего взять в качестве решения середину полосы, т. е. точку х* =х + е (в этом случае погрешность будет не больше, чем е). Для того чтобы определить, есть ли решение на отрезке [х, х + 5], сравним значения функции на концах этого отрезка. Рассмотрим три случая, показанные на рис. 9.5, а-в. y-f(xL X х+5 /(х)<0, /(х+5)<0 X х+5 /(х)<0, /(х+5)>0 X х+5 /(х)>0, /(х+5)>0. ОПОП 04S б Рис. 9.5 в Несложно понять, что если график пересекает ось ОХ, то на концах отрезка функция имеет разные знаки, т. е. Дх) /(х + 5) < 0. При этом важно, чтобы график не имел разрывов. О Если непрерывная функция имеет разные знаки на концах отрезка [х^, Xg], то в некоторой точке внутри этого отрезка она равна нулю. Таким образом, нужно найти отрезок шириной 2е, на концах которого функция имеет разные знаки, и взять в качестве решения его середину. Решение этой задачи при а = 0 может выглядеть, например, так (слева приведена программа на школьном алгоритмическом языке, а справа — на языке Паскаль): Решение уравнений §70 алг Перебор нач вещ eps, X, delta eps:=0.001 х:=0 delta:=2*eps нц пока f(х)*f(x+delta)>0 X:=x+delta КЦ вывод 'x = x+eps KOH алр вещ f(вещ x) нач знач:=x—cos(x) KOH const eps=0.001; var X, delta: real; function f(x: real):real; begin f:=x-cos(x); end; begin x:=0; delta:=2*eps; while f(x)*f(x+delta)>0 do X:=x+delta; writeln('x=',(x+eps):6:3); end. Здесь заданная точность e хранится в виде константы eps, а вычисление функции f{x) оформлено в виде подпрограммы-функции f. Поиск решения начинается с нуля (в других задачах начальное значение может быть другим). Цикл останавливается, когда для очередного отрезка получаем f{x) ■ f{x + 5) < 0. Нужно понимать, что при вычислениях на реальном компьютере мы не можем задавать произвольно малое значение е. Точность ограничена типом данных, с помощью которого выполняются вычисления. В практических расчётах чаще всего используются данные с двойной точностью (англ, double), для которых предельная точность близка к 10“^® (вспомните материал § 26 и 29). Обратите внимание, что в этом простейшем варианте программа зациклится, если справа от нуля решения нет. Подумайте, как изменить программу так, чтобы зацикливания не было. Кроме того, в приведённом алгоритме есть и ещё одна возможная неточность: подумайте, что случится, если случайно получится f(x) = о или f{x+8) = 0. Поскольку условие цикла при этом нарушается, цикл закончится, и будет получен результат с требуемой точностью е. Однако в этом случае можно было бы определить решение более точно, что вам и предлагается сделать самостоятельно. Главный недостаток метода перебора — большое количество операций. Например, для решения уравнения с точностью 0,001 может понадобиться несколько тысяч вычислений значения функции fix). Поэтому сначала можно использовать перебор с достаточно большим шагом, чтобы отделить корни, т. е. найти ин- 1 Решение вычислительных задач на компьютере тервалы, в каждом из которых есть только один корень. После этого выполняется уточнение корней — перебор внутри каждого из таких интервалов с шагом 6 = 2е, достаточным для определения решения с заданной точностью. Метод деления отрезка пополам Есть старая задача-шутка: «Как поймать льва в Африке?» Предлагается перегородить забором всю Африку, разбив её на две равные части, и ждать, где появится лев. Затем часть, в которой есть лев, разделить забором на две равные области и т. д. В конце концов, лев окажется в маленькой клетке. На самом деле эта шутка иллюстрирует метод деления отрезка пополам (метод бисекции), с помощью которого можно найти решение уравнения на некотором интервале (если оно там есть). Пусть некоторая функция у = f(x) непрерывна на отрезке [а, Ь] и имеет разные знаки в точках х = а и х = Ь (рис. 9.6). Тогда в одной из промежуточных точек х = х* она обращается в ноль, т. е. уравнение /(л:) = 0 имеет решение. Найти его можно так: 1) вычислить середину отрезка с =-; 2 2) если на отрезке [а, с] есть решение, присвоить &:=с, иначе присвоить а:=с; 3) повторять шаги 1-2 до тех пор, пока Ъ - а > 2е. В пункте 2 нам нужно ответить на вопрос, если решение на отрезке [а, с]. Мы уже умеем это делать: решение есть, если /(а) /(с) <0. В простейшем варианте цикл, уточняющий решение, можно записать в виде: delta:=2*eps нц пока Ь—a>delta с:=(а+Ь)/2 если f(a)*f(c)<0 то Ь: =с иначе а:=с delta:=2*eps; while b-a>delta do begin c:= (a+b)/2; if f(a)*f(c)<0 then b:=c else a:=c; end; Решение уравнений §70 все кц вывод writeln('X = (а+Ь)/2:6:3); X = (а+Ь)/2 Однако в приведённом алгоритме есть одна проблема, которая проявляется в том случае, когда на очередном шаге f{a) = О или /(с) = 0. Предположим, что рассматривается функция f{x) = х - 1, и мы выбрали для поиска отрезок [0, 2]. Тогда на первом же шаге получаем с = 1, так что /(с) = 0; это приводит к выполнению присваивания а:=с. Поэтому на втором шаге получаем f(a) = 0, а на всех последующих шагах — f(a) /(c)>0, что, в конечном счёте, даёт неверный ответ х = 2, Чтобы решить эту проблему, вернёмся к формулировке «на отрезке [а, fe] есть решение, если функция f{x) имеет разные знаки на концах этого отрезка». В школьном алгоритмическом языке есть функция sign, которая возвращает знак числа, т. е. вычисляет функцию: -1, еслих<0, sign{x) = ■ о, если х = 0, 1, еслих>(Х Тогда условный оператор в теле цикла можно заменить так: если sign (f (а) ) osign (f (с) ) if sign (f (а) ) osign (f (с) ) then b:= c else a:= c; Теперь программа даёт правильное решение даже для рассмотренных выше особых случаев (проверьте это самостоятельно). К сожалению, во многих версиях Паскаля^ функции sign нет, но вы легко можете её написать. На каждом шаге этого цикла ширина отрезка уменьшается в 2 раза, за п шагов она уменьшится в 2" раз. Таким образом, при выборе единичного начального отрезка для получения решения с точностью 0,001 достаточно 10 шагов цикла. Метод деления отрезка пополам очень прост и надёжен, позволяет найти решение с заданной точностью (в пределах точности машинных вычислений). Однако для его применения нужно заранее отделить корни уравнения, т. е. найти отрезки, каждый из которых содержит только один корень. Для отделения корней то Ь:= с иначе а:= с все В среде FreePascal функция sign входит в модуль Math, который нужно подключить командой uses Math; Решение вычислительных задач на компьютере можно использовать построенный график функции или метод перебора с некоторым шагом. Таким образом, решение уравнения проводится в два этапа — отделение корней и уточнение корней. К сожалению, метод деления отрезка пополам неприменим для решения систем уравнений с несколькими неизвестными. Пример: полёт мяча Для иллюстрации рассмотрим такую задачу: Вася бросает мяч со скоростью 12 м/с. Под каким углом к горизонту Васе нужно бросить мяч, чтобы попасть в мишень на высоте 4 м на расстоянии 10 м? В момент броска мяч находится на высоте 2 м (рис. 9.7). Примем за начало координат точку, откуда вылетает мяч. Обозначим через Uq начальную скорость мяча, через Н — разницу высот (Н = 4 - 2 = 2 м), а через S — расстояние до мишени (S = 10 м). Вудем считать мяч материальной точкой; поскольку его скорость невысока, сопротивлением воздуха можно пренебречь. Известные из физики уравнения движения запишутся в виде: x = Uq f сова, у =1>о ^ sina- gt^ где ^«9,81 м/с^ — ускорение свободного падения. Задача сводится к тому, чтобы найти два неизвестных, # и а, при которых x = Sny = H: 2 S = OQ-fcosa, H = VQ-tsina-----. 2 Время t можно сразу выразить из первого уравнения: S t = - Vq cos а Решение уравнений §70 Подставляя этот результат во второе уравнение, получаем уравнение с одним неизвестным а, которое можно привести к стандартному виду /(а) = 0, где: gS^ f(a) = S tga - 2у2 cos 2 а Я = 0. Решать его аналитически достаточно сложно^, поэтому мы найдём приближённое решение. При вычислении тригонометрических функций угол измеряется в радианах, поэтому нужно искать решение в диапазоне углов а от 0 до ti/2. Мы не знаем, сколько решений имеет уравнение, поэтому изменим метод перебора так, чтобы найти все решения. Цикл while не будет останавливаться на первом найденном решении, а будет продолжаться, пока угол не станет больше я/2. Если в какой-то полосе есть решение, вычисляем угол в градусах и выводим его на экран. Приведём основные части программ на школьном алгоритмическом языке: pi:=3.1415926 u:=0 delta:=2*eps нц пока uад)^ Броня у f(alphii) 6 0 =RADIANS(A6) =S/v/C0SCB6) =v*SIN(B6)*C6-9,81*C6"2/2 =D6-H 7 5 S ю: Рис. 9.10 Обратите внимание, что в формулах мы используем имена ячеек S, Н и V, Это абсолютные ссылки, не меняющиеся при копировании; например, вместо имени S можно было бы написать адрес $В$1, но это было бы менее понятно. Эти формулы можно просто «растянуть» (скопировать) вниз за маркер заполнения. Теперь построим график функции /(а). Сначала нужно выделить данные в столбцах А и Е, это можно сделать, если удерживать нажатой клавишу Ctrl. Затем строим диаграмму типа Диаграмма XY (в Excel — диаграмма Точечная) — рис. 9.11. График функции пересекает ось ОХ в двух точках, т. е. уравнение Да) = 0 имеет два решения, одно около 35°, второе — около 65°. Теперь уточним решение, используя возможности табличного процессора, в котором реализован один из приближённых мето- Решение вычислительных задач на компьютере дов решения уравнений. Для этого нужно знать начальное приближение Oq — значение неизвестной величины, достаточно близкое к решению. По графику мы определили, что первый раз график пересекает ось ОХ для значения угла около 35°, поэтому можно взять Oq = 35°. Запишем это значение в свободную ячейку, например в Н2, и добавим недостающие формулы так, чтобы получить значение функции /(а) в ячейке L2 (рис. 9.12). Н I к L 1 Угол Угол (рад) Время У f(alpha) 2 35 Рис. 9.12 Задача подбора параметра формулируется так: «установить в ячейке ... значение ..., изменяя значение ячейки ...». Например, в нашем случае нужно установить в ячейке L2 значение О, изменяя Н2. Ячейка L2 называется целевой, потому что наша цель — получить в ней определённое значение (ноль). Ячейка Н2 — это изменяемая ячейка. В главном меню выбираем пункт Сервис, Подбор параметра и вводим эти данные (рис. 9.13). Подбор параметра Настройки по умолчанию XJ Яч. с формулой |$L$2 L^l Целевое значение |о Изменяемая яч. |$Н$2 ок Отмена Справка Рис. 9.13 После нажатия на кнопку ОК найденное решение уравнения будет записано в ячейку Н2. Как же найти второе решение? Для этого нужно выбрать другое начальное приближение, например «о ~ ® остальном по- рядок действий не меняется. Сделайте это самостоятельно. Проверьте, что будет происходить при изменении начальной скорости до 10 м/с и до 20 м/с. Попробуйте объяснить эти результаты с точки зрения физики. Решение уравнений §70 Вопросы и задания 1. Какие методы называются приближёнными? В каких случаях они используются? 2. Что такое итерационный метод? 3. Сравните приближённые и аналитические методы решения уравнений. В чём достоинства и недостатки каждого подхода? 4. Объясните, в чём заключается метод перебора. В чём его недостатки? 5. Как с помощью математических операций определяют, есть ли решение уравнения на заданном отрезке? В каких случаях такой подход не сработает? 6. Как избежать зацикливания в методе перебора? 7. Объясните, почему методом перебора при ширине полосы 5 = 2е можно найти решение с точностью е. 8. Что такое отделение корней и уточнение корней? 9. Объясните изменения, сделанные в первоначальной программе для решения уравнения методом перебора, которые позволили в одном цикле найти все решения на заданном отрезке. 10. Объясните, как работает метод деления отрезка пополам. Сравните его с методом перебора. Задачи 1. Решите уравнение x2=5cos(x-l) методом перебора и методом деления отрезка пополам. Сравните количество шагов цикла при использовании каждого метода. 2. Решите уравнение =5соз(д;-1), используя табличный процессор. *3. Попытайтесь улучшить программу для метода перебора, используя одно из значений функции, вычисленных на предыдущем шаге цикла. *4. Попытайтесь улучшить программу для метода деления отрезка пополам, используя одно из значений функции, вычисленных на предыдущем шаге цикла. 5. Экспериментально (пробуя различные значения е) определите, с какой точностью можно найти решение уравнения =5cos(x-l) в вашей среде программирования. 6. Решите задачу из примера «Полёт мяча» с помощью собственной программы, а затем с помощью табличного процессора. Обсудите преимущества и недостатки этих способов решения. *7. Используя замену z = ——, постройте аналитическое решение уравне- cos^a ния из примера «Полёт мяча». Для практических вычислений используйте электрюнные таблицы. Сравните точное и численное рюшения. о Решение вычислительных задач на компьютере §71 Дискретизация Вычисление длины кривой Определим длину траектории L, по которой летит шарик, брошенный под углом к горизонту (см. задачу в § 70). Это не так просто, потому что траектория — кривая линия. Постараемся как-то свести задачу к более простой, которую мы умеем решать. Если бы линия состояла из отдельных отрезков, её длину можно было бы точно вычислить с помощью теоремы Пифагора. Например, длина ломаной на рис. 9.14 равна: L = ^(Х2 -Xi)2 +(l/2 -I/i)2 -н д/(Хд -ЛГ2)2 -Ь (j/g - Рис. 9.14 Используя эту идею, разделим кривую линию на небольшие участки и заменим каждый участок отрезком так, чтобы получилась ломаная (штриховая линия на рис. 9.15). Обычно разбивают исходный отрезок [о, 6] (на котором нужно определить длину кривой) на равные участки длины Л. Конечно, длина ломаной отличается от длины кривой, но естественно предположить, что при уменьшении шага разбиения Л эта разница будет уменьшаться. Дискретизация §71 Обратим внимание, что мы фактически выполнили дискретизацию — представили кривую в виде набора точек, при этом информация о поведении функции между этими точками была потеряна (вспомните оцифровку звука!). Величина h называется шагом дискретизации. Подведём итоги: • дискретизация позволяет представить задачу в виде, пригодном для компьютерных расчётов; • при дискретизации часть информации теряется, поэтому все методы, основанные на дискретизации, — приближённые, они решают задачу с некоторой погрешностью; • чтобы уменьшить погрешность, нужно уменьшать шаг дискретизации (увеличивать количество точек), но при этом возрастёт объём (и время) расчётов; • при выборе малого шага дискретизации на результат могут сильно влиять погрешности вычислений, вызванные неточностью представления веш;ественных чисел в памяти компьютера (см. § 29). Теперь можно составить программу. Будем считать, что константы (или переменные) а, Ь и h задают границы отрезка и шаг дискретизации. Тогда основная часть программы может выглядеть так на школьном алгоритмическом языке: х:=а; L:=0 нц пока х<Ь yl:=f(X) у2:=f(x+h) L:=L+sqrt(h*h+(у1-у2)*(у1-у2)) X:=x+h; кц вывод 'Длина кривой ', L и на Паскале: х:=а; L:=0; while x f{X2), то минимум функции находится на отрезке [Xj, 6], поэтому отрезок [а, Xj ] можно отбросить — переместить левую границу в точку х^; если /(х^) < /(Xg), то правая граница отрезка перемещается в точку Xg. Остаётся один вопрос: как выбирать г на каждом шаге? Проще всего вычислять его по формуле г = к ф - а), где k — постоянный коэффициент (0< к< 0,5). Тогда ширина отрезка на следующем шаге будет равна Ь-а + к-{Ь -а) = (0,5 + к) {Ь-а). т. е. составит 0,5 +к от первоначальной ширины. Для ускорения поиска выгодно, чтобы это отношение было как можно меньше, т. е. чтобы коэффициент к был возможно ближе к нулю (ноль выбирать нельзя, потому что при этом точки Xj и Xg совпадут, и метод не будет работать). Программа может выглядеть примерно так: к:=0.01 delta:=2*eps нц пока b-a>delta г:=к*(Ь-а) х1:= (а+Ь)/2-г х2:= (а+Ь)/2 + г если f(xl)>f(x2) то а: =х1 к:=0.01; delta:=2*eps; while b-a>delta do begin r:=k*(b-a); xl:=(a+b)/2-r; x2:=(a+b)/2+r; if f(xl)>f(x2) then a: =xl Оптимизация §72 иначе Ь:=х2 все кц вывод 'X =', else Ь:=х2 end; writeln('X =' (a+b)/2:10:3); (a+b)/2 В качестве упражнения можно исследовать работу этой программы при разных значениях k, подсчитав для каждого варианта количество шагов цикла, которое потребуется для получения решения с заданной точностью. Супдествует вариант метода дихотомии, при котором на каждом шаге цикла нужно вычислять только одно значение функции (второе «переходит» с предыдущего шага). В этом случае нужно выбирать коэффициент k так, чтобы выполнялось равенство 0,5 + ft = i, где ф — отношение «золотого сечения»: Ф Ф= 11:!^ «1,618... 2 Пример: оптимальная раскройка листа Рассмотрим пример практической задачи оптимизации. В углах квадратного листа железа, сторона которого равна 1 м, вырезают четыре квадрата со стороной х. Затем складывают получившуюся развёртку (по штриховым линиям на рис. 9.21), сваривают швы и таким образом получается бак. Рис. 9.21 Требуется выбрать размер выреза х так, чтобы получился бак наибольшего объёма. Для того чтобы грамотно поставить задачу оптимизации, нужно: 1) определить целевую функцию: в данном случае выразить объём бака через неизвестную величину л:; 2) задать ограничения на возможные значения х. Решение вычислительных задач на компьютере Легко видеть, что основание получившегося бака — это квадрат со стороной Z (см. рис. 9.21), а его высота равна х. Величина z зависит от X и равна 2=1- 2х, поэтому объём бака вычисляется по формуле V =х(1-2х)^, это и есть целевая функция, для которой нужно найти максимум. Понятно, что X не может быть меньше нуля. Вместе с тем х не может быть больше, чем половина стороны исходного листа (0,5 м), поэтому ограничения запишутся в виде двойного неравенства: о < X < 0,5. Заметим, что при х = 0 и х = 0,5 объём бака равен нулю (в первом случае равна нулю высота, во втором — площадь основания). Таким образом, нужно искать максимум целевой функции /(х) = х(1-2х)2 на отрезке [0, 0,5]. Для этого можно использовать метод дихотомии (сделайте это самостоятельно). Не забудьте, что приведённый выше вариант программы рассчитан на поиск минимума, а в этой задаче нужно найти максимум. Использование табличных процессоров В стандартной поставке OpenOffice.org Calc модуль оптимизации работает только для линейных функций. Для того чтобы решить рассмотренную выше задачу с баком, нужно использовать модуль Solver for Nonlinear Programming (он входит в стандартную поставку последних версий LibreOffice) и в параметрах модуля оптимизации выбрать один из методов нелинейной оптимизации. В табличном процессоре Excel оптимизация выполняется с помощью стандартной надстройки «Поиск решения». Сначала построим график функции, как мы делали это при решении уравнения (рис. 9.22). Оптимизация §72 Рис. 9.23 По этому графику видно, что функция имеет единственный максимум в районе точки Xq =0,2. Это значение можно выбрать в качестве начального приближения для поиска. Выделим в таблице две ячейки (например, Е2 и F2), в первую запишем начальное приближение (0,2), а во вторую — формулу для вычисления объёма для этого значения х (рис. 9.23). Задача оптимизации формулируется в виде «найти максимум {или минимум) целевой функции в ячейке ..., изменяя значения ячеек ... при ограничениях ...». В нашей задаче целевая ячейка — F2 (нужно найти ее максимум), изменяемая ячейка — Е2. Выбираем в главном меню пункт Сервис, Поиск решения, в появившемся окне вводим адреса целевой и изменяемой ячеек (для этого можно установить курсор в нужное поле ввода и щёлкнуть по ячейке) и ограничения (рис. 9.24). Решатель ■ Х| |$F$2 Целевая ячейка Оптимизация результа- Максимум С" Минимум С" Значение Путем изменения ячеек fiiii L&J Ссылка на ячейку fiiii $Е$2 S1 Операция Значение 1>= d |o 1<= d |o,5 1<= w 1 — 1<= d 1 Параметры,.. | Справка Закрыть Решить Рис. 9.24 Решение вычислительных задач на компьютере После щелчка на кнопке Решить в ячейку Е2 будет записано оптимальное значение д:, а в целевую ячейку — соответствующее (максимальное) значение объёма. Надстройка «Поиск решения» позволяет: находить'максимум или минимум целевой функции; решать уравнения, задавая желаемое значение целевой функции; • использовать несколько изменяемых ячеек и диапазонов, например запись А2:А6;В15 в списке изменяемых ячеек означает «изменять все ячейки диапазона А2:А6 и ячейку В15»; использовать ограничения типа «меньше или равно», «больше или равно», «равно», «целое» и «двоичное» (только О или 1). Кнопка Параметры позволяет опытным пользователям менять настройки алгоритма оптимизации. Вопросы и задания 1. Что такое оптимизация? 2. Что такое целевая функция? 3. Какое решение называется оптимальным? 4. Почему выражение «самый оптимальный» безграмотно? 5. Что можно сказать о рекламной фразе «Этот крем обеспечивает оптимгьльный цвет лица»? 6. Зачем нужны ограничения в задаче оптимизации? 7. В чём разница между понятиями «локальный минимум» и «глобальный минимум»? 8. Что такое начальное приближение? 9. Почему результат решения задачи оптимизации чаще всего зависит от выбора начального приближения? 10. Объясните принцип работы метода дихотомии. 11. Обязательно ли при использовании метода дихотомии брать пробные точки симметрично относительно середины отрезка? Ответ обоснуйте. 12. Когда метод дихотомии не будет работать (может выдать неверный ответ)? 13. Подумайте, можно ли задачу решения уравнения сформулировать как задачу оптимизации. Подготовьте сообщение: а) «Оптимизация для функции двух переменных» б) «Оптимизация методом случайного поиска* в) «Программное обеспечение для решения задач оптимизации» Оптимизация §72 Задачи 1. Примените метод дихотомии для решения задачи оптимальной раскройки, которая разобрана в параграфе. Решите задачу, используя разные значения коэффициента к, и постройте график зависимости количества шагов цикла от ft. *2. Напишите программу, которая реализует метод «золотого сечения» (на каждом шаге вычисляется только одно значение функции). *3. Банка имеет форму цилиндра^, полная площадь её поверхности (боковая поверхность и два круга-основания) равна 100 см^. Определите радиус и высоту банки, которая при этих условиях имеет максимальный объём. *4. Банка имеет форму цилиндра, её объём равен 500 см^. Определите радиус и высоту банки, которая при этих условиях имеет минимальную площадь полной поверхности. 5. Некоторая фирма хочет провести рекламную кампанию в газетах. Данные о цене рекламного объявления и тиражах газет внесены в таблицу: О Газета Тираж Цена одного объявления, руб. Кол-во объявле- ний Расходы, руб. Охват Ведомости 10 000 1000 1 1000 10 000 Туризм 3500 570 2 1140 7000 Спорт 6000 700 3 2100 18 000 Правда 20 000 1250 4 5000 80 000 Всего 9240 115 000 в каждую газету нужно дать не менее одного и не более 6 объявлений. С помощью надстройки «Поиск решения» табличного процессора определите, сколько объявлений нужно дать в каждую газету, чтобы обеспечить общий охват не менее 200 000 человек и при этом израсходовать как можно меньше денег. 6. В условиях задачи 5 определите, сколько объявлений нужно дать в каждую газету, чтобы обеспечить наибольший общий охват и при этом израсходовать не более 15 000 рублей. Задачи 3 и 4 предложены В. Я. Лаздиным. Решение вычислительных задач на компьютере §73 Статистические расчёты о Статистика — это наука, которая изучает методы обработки и анализа больших массивов данных. О Табличные процессоры стали незаменимым инструментом для решения этих задач. И Excel, и Calc содержат несколько десятков встроенных статистических функций. Свойства ряда данных Простейшая задача статистики — изучить свойства одного ряда данных. Ряд данных X длиной л — это множество значений Xj,JC2,...,x„. Для ряда можно определить количество элементов, их сумму, среднее значение, минимальное и максимальное значения и т. д. Далее мы приводим как английские названия функций (для Calc), так и русские (для русской версии Excel). Пусть ряд данных записан в ячейках А1:А20. Его сумма, среднее, минимальное и максимальное значения могут быть определены с помощью следующих формул: сумма: среднее: минимальное: максимальное: =SUM(A1:A20) =AVERAGE(A1: А20) =MIN(A1:A20) =МАХ(А1:А20) =СУММ(А1:А20) =СРЗНАЧ(А1:А20) =МИН(А1:А20) =МАКС(А1:А20) Функции SUM (русское название — СУММ) и AVERAGE (СРЗНАЧ) учитывают только числа в указанном диапазоне (без учёта пустых и текстовых ячеек). Количество числовых значений можно подсчитать с помощью функции COUNT (СЧЁТ), например: =COUNT(A1:A20) =СЧЁТ(А1:А20) С помощью функции COUNTIF (СЧЕТЕСЛИ) можно подсчитать число элементов ряда, удовлетворяющих некоторому условию. Например, если в диапазоне А1:А20 записаны школьные отметки, формула =COUNTIF(A1:A20;"=5") Статистические расчёты вычисляет число пятёрок, а формула =COUNTIF(A1:A20;">3") вычисляет общее число четвёрок и пятёрок (всех ячеек, значения которых больше 3). Более сложная характеристика ряда — среднеквадратическое отклонение или стандартное отклонение , с помощью которого оценивается «разброс» значений JC]^,X2,...,x„ относительно среднего значения ряда х: V"i=i Среднеквадратическое отклонение — это неотрицательная величина (подумайте почему). Чем больше а^, тем больше разброс значений относительно среднего. Для вычисления стандартного отклонения в табличных процессорах используется функция STDEVP (СТАНДОТКЛОНП): =STDEVP(A1:A20) Условные вычисления =СТАНДОТКЛОНП(А1:А20) Как вы знаете, в программировании важнейшую роль играют условные операторы (ветвления), позволяющие выбирать один из двух (или нескольких) вариантов обработки данных. В табличных процессорах тоже возможны условные вычисления, при которых в ячейку заносится то или иное значение в зависимости от выполнения какого-то условия. Предположим, что в книжном интернет-магазине «Бука» доставка покупок бесплатна для тех, кто сделал заказ на сумму более 500 рублей, а для остальных доставка стоит 20% от суммы (рис. 9.25). А L 6 С 1 Заказ .Сумма 1Доставка i 2 1234; 256 еуб.| 51 руб.| 3 1345; 128 Р16.1 26 руб.! 4 1456i 1 024 руб.1 о| 5 15651 512 py6.i 01 1576' 345jDy6., 69 руб. Рис. 9.25 Решение вычислительных задач на компьютере Таким образом, есть два варианта вычисления стоимости доставки, поэтому в формулах столбца С нужно использовать ветвление. Например, алгоритм вычисления значения ячейки С2 может выглядеть так: «если В2>500, записать в ячейку О, иначе записать значение В2*0,2». В программе на Паскале мы бы записали: if В2>500 then С2:=0 else С2:=В2*0.2; В табличных процессорах для условных вычислений используют функцию IF (ЕСЛИ): =ЩВ2>500;0;В2*0,2) =ЕСЛИ(В2>500;0;В2*0,2) У этой функции три аргумента, разделённые точками с запятой: 1) условие (В2>500); 2) значение ячейки в том случае, когда условие истинно (0); 3) значение ячейки в том случае, когда условие ложно (В2*0,2). Первый аргумент может быть сложным условием, которое строится с помощью функций NOT (НЕ, отрицание), AND (И, логическое умножение) и OR (ИЛИ, логическое сложение). Например, если бесплатная доставка распространяется только на заказы, у которых номер меньше 1500 и сумма больше 500 рублей, в ячейку С2 нужно записать такую формулу: =IF(AND(A2<1500;B2>500);0;B2*0,2) Здесь использовано сложное условие AND(A2<1500;B2>500), которое истинно только при одновременном выполнении обоих простых условий: А2<1500 и В2>500. Второй и третий аргументы функции IF могут содержать вложенные вызовы этой функции. Пусть, например, для заказов стоимостью более 200 рублей (но не больше 500) стоимость доставки составляет 10% от суммы: if В2>500 then С2:=0 else if В2>200 then C2:=B2*0.1 else С2:=В2*0.2; Статистические расчёты §73 в табличном процессоре этот гшгоритм запишется в виде: =IF(B2>500;0;IF(B2>200;B2*0,1;B2*0,2)) Связь двух рядов данных Одна из задач обработки данных — установить взаимосвязь между величинами, процессами, явлениями. Пусть существуют два ряда данных одинаковой длины: ■^1’^2’*■ •’■^л ^ У1’У2’’“’Уп‘ Например, первый ряд — это температура воздуха за п последних дней, а второй ряд — значения атмосферного давления в те же дни. Требуется определить, есть ли связь между этими рядами, и оценить, насколько она сильная. Для решения этой задачи чаще всего используется коэффициент корреляции (англ, correlation — взаимоотношение, связь): О -у) f‘xy Здесь хну — средние значения рядов, а неквадратические отклонения. н а у — их сред- Величина р^у — это безразмерный коэффициент^, причём можно показать, что всегда -1<р^у<1. Если р^„>0, то увеличе ху ■ ние значения х (в среднем) приводит к увеличению у; если же р^У < О, то при увеличении х значение у чаще всего уменьшается. Чем больше модуль р^^, тем сильнее связь между двумя величинами. При р^у =-1 или Рд.ц =1 они строго связаны линейной за- ху висимостью у -kx + b, где ft и 6 — некоторые числа. В случае Рху =-1 эта зависимость убывающая (ft<0), а при р^у =1 — возрастающая (ft>0). Считается, что между хну есть сильная связь, если |р^у|>0,5. При меньших значениях р„,, делать какие-то далеко идущие вы-воды не следует (связь слабая или не обнаружена). Для вычисления коэффициента корреляции в табличных процессорах используется функция CORREL (КОРРЕЛ): =CORREL(Al: А20;В1 :В20) =КОРРЕЛ(А1: А20;В1 :В20) Попробуйте доказать это самостоятельно. Решение вычислительных задач на компьютере Обратите внимание, что у этой функции два аргумента (два ряда данных одинаковой длины), адреса двух диапазонов отделяются точкой с запятой. Нужно учитывать, что коэффициент корреляции лучше всего обнаруживает линейную зависимость. Если связь есть, но она далека от линейной, коэффициент корреляции может быть невысок. В таких случаях для установления связи нужно использовать более сложные методы, которые мы здесь рассматривать не будем. Вопросы и задания 1. Что изучает статистика? Как вы думаете, в чём её задача? 2. Как влияют пустые ячейки в электронной таблице на результат работы функций COUNT и AVERAGE? 3. Чем отличаются функции COUNT и COUNTIF? 4. Что показывает среднеквадратическое отклонение? 5. Что показывает коэффициент корреляции? 6. Для двух рядов коэффициент корреляции равен (-0,5). Что можно сказать о возможной связи этих рядов между собой? 7. Для двух рядов коэффициент корреляции равен 0,1. Что можно сказать о возможной связи этих рядов между собой? О Задачи 1. В электронной таблице значение формулы =SUM(B1:B2) равно 5. Чему равно значение ячейки ВЗ, если значение формулы =AVERAGE(B1:B3) равно 3? 2. В электронной таблице значение формулы =SUM(C3:E3) равно 12. Чему равно значение формулы =AVERAGE(C3:F3), если значение ячейки F3 равно 4? 3. В электронной таблице значение формулы =SUM(A2:D2) равно 12. Чему равно значение формулы =AVERAGE(A2;E2), если значение ячейки Е2 равно 13? 4. В электронной таблице значение формулы =AVERAGE(A6:C6) равно (-2). Чему равно значение формулы =SUM(A6:D6), если значение ячейки D6 равно 6? 5. В электронной таблице значение формулы =AVERAGE(B5:E5) равно 10. Чему равно значение формулы =SUM(B5:F5), если значение ячейки F5 равно 1? 6. В электронной таблице значение формулы =AVERAGE(A1:C1) равно 6. Чему равно значение ячейки D1, если значение формулы =SUM(A1:D1) равно 7? Статистические расчёты §73 7. В электронной таблице значение формулы =AVERAGE(A3:D4) равно 6. Чему равно значение формулы =AVERAGE(A3:C4), если значение формулы =SUM(D3:D4) равно 6? 8. В электронной таблице значение формулы =AVERAGE(C2:D5)'paB-но 4. Чему равно значение формулы =SUM(C5:D5), если значение формулы =AVERAGE(C2:D4) равно 6? *9. Как изменится значение ячейки СЗ, если после ввода формул переместить содержимое ячейки В2 в ВЗ? А В С 1 1 2 2 2 6 =COUNT(Al:B2) 3 =AVERAGE(A1:C2) 10. Доставка товара в фирме «Рога и копыта» стоит 200 рублей, если в доме есть лифт. Если лифта нет, подъём на каждый этаж стоит 200 рублей: А В С D 1 Заказ Этаж Лифт Доставка 2 12 5 нет 1000 3 34 2 да 200 4 56 8 да 200 Какую формулу нужно записать в ячейку D2? 11. При приёме на работу претенденты проходят два тура собеседования. В каждом туре выставляется оценка от 0 до 100 баллов. На работу принимаются те, кто в каждом туре набрал не менее 80 баллов. А В С D 1 Фамилия 1-й тур 2-й тур Принят 2 Иванов 80 80 да 3 Петров 90 70 нет 4 Сидоров 85 90 да Какую формулу нужно записать в ячейку D2? Решение вычислительных задач на компьютере 12. Решите задачу 11 при условии, что на работу принимаются все, кто набрал 90 баллов хотя бы в одном туре собеседования. 13. Сниженный тариф на телефонные разговор — 2 рубля за минуту разговора — действует в рабочие дни после 20 часов и в выходные дни. Обычный тариф — 5 рублей за минуту. Дни в таблице нумеруются с 1 до 7 (1 — понедельник). А В С D 1 Код Время День недели Тариф, руб. 2 12 21:12:20 2 2 3 34 17:23:50 1 5 4 56 10:21:42 7 2 Какую формулу нужно записать в ячейку D2? Момент времени 20:00:00 в формуле нужно записывать как Т1МЕ(20;0;0). 14. При покупке на сумму более 1000 рублей в магазине владельцам дисконтных карт предоставляется скидка 5%. А В С D 1 Код Цена, руб. Дисконтная карта Со скидкой,руб. 2 12 1 200 нет 1 200 3 34 1 450 да 1 378 4 56 750 да 750 Какую формулу нужно записать в ячейку D2? 15. Во время уценки цена всех товаров, которых хранятся на складе более 6 месяцев, снижается на 20% (если цена товара больше 1000 рублей) или на 10% (если цена меньше 1000 рублей). А В С D 1 Код Цена, руб. Хранится (месяцев) Новая цена, руб. 2 12 1 200 3 1 200 3 34 1 450 7 1 160 4 56 750 12 675 Какую формулу нужно записать в ячейку D2? Обработка результатов эксперимента §74 §74 Обработка результатов эксперимента Зачем это нужно? Многие практические задачи связаны с проведением эксперимента, в результате которого исследователь с помощью измерительных приборов получает массивы данных. Затем эти данные необходимо обработать, для того чтобы выявить закономерности, подтвердить или опровергнуть выводы теории и т, п. Например, с помощью динамометра и линейки можно экспериментально определить жёсткость пружины (рис. 9.26). Для этого используется закон Гука, связывающий приложенную силу F, жёсткость пружины k и её удлинение А1 линейной зависимостью: F=k-Al. Рис. 9.26 Определив жёсткость пружины k, мы сможем вычислять её удлинение при любой нагрузке (в пределах действия закона Гука), не выполняя новых измерений. Величина k зависит от материала пружины и её размеров. Для определения жёсткости k на нижний конец пружины подвешивают груз известной массы т (так что сила F = mg тоже известна) и измеряют удлинение пружины А1. Тогда k = FjAl. Обычно такой эксперимент проводится несколько раз, в результате получается серия значений (для i=l,2,...,n) и соответствующих им удлинений АЦ. Для каждой пары рассчитанная жёсткость ki=Fi/Ali будет, скорее всего, различной. Конечно, можно принять за k среднее значение по всем полученным измерениям. Однако такой подход не очень хорошо обоснован с научной точки зрения. Поэтому были разработаны другие методы, один из которых рассматривается далее. Метод наименьших квадратов Предположим, что есть два ряда данных одинаковой длины: и Предполагается, что они связаны ли- нейной зависимостью y=k x, где k — неизвестный коэффициент. Требуется найти оптимальное значение k, которое лучше всего соответствует исходным данным. Решение вычислительных задач на компьютере Поскольку речь идёт о задаче оптимизации, нужно определить функцию, которая позволяет оценить, насколько хорошо выбранная зависимость соответствует исходным данным. Предположим, что выбран некоторый коэффициент k, так что для каждого Xj можно найти соответствующее ему значение функции =k x^. В идеале график функции должен проходить через все точки (Xj,i/i), {Х2,У2\ •••> (^л*Ул)» т. е. при всех i должно выполняться условие Yj =i/j. Однако на практике этого, скорее всего, не будет (рис. 9.27). Отклонение полученной линии от исходных данных определяется разностями У; -у^: чем они меньше (по модулю), тем лучше соответствие. Однако сумма этих разностей даёт неправильную оценку точности — слагаемые с разными знаками могут скомпенсировать друг друга. Чтобы решить эту проблему, можно сложить квадраты этих величин и выбрать k так, чтобы эта сумма Е = -у^)2 =(Y, -J/i)2 +(У2 -У2)2+...-КУл -Ул)" 1=1 была минимальной. Такой подход называется методом наименьших квадратов. Впервые его предложил немецкий математик К. Ф. Гаусс. Как найти коэффициент k наилучшим образом, т. е. так, чтобы сумма квадратов Е была минимальной? Для этого заменим У^ н&k^x^ и раскроем скобки в формуле для вычисления £: (Yj -1/^)2 ={k x^ -z/i)2 =k^xf +yf. Группируя слагаемые, содержащие и k, получаем: E = Ak^ -Bk + C, n n n где A = , В = 2^x^ i/j и C = ^yf. График зависимости E от k — i=l i=l i=l это парабола, причём её ветви направлены вверх, потому что Обработка результатов эксперимента §74 л > о (это сумма квадратов). Вершина параболы (и минимум функ- ции!) находится в точке k =-, это и будет оптимальное решение. 2А Таким образом, алгоритм для определения оптимального значения k приобретает вид: 1) вычислить коэффициенты параболы А = и В = 2'^х^у^; В i=l i=l 2) вычислить k =-. 2А Решение получилось простым только потому, что мы выбрали очень простую функцию, линейную с нулевым свободным членом. В более сложных случаях строгое решение задачи оптимизации требует знания высшей математики. Если исходные данные записаны в массивах л:[1..^] и i/[l..iV], программа для рассмотренного случая выглядит так: А:=0; В:=0 нц для i от 1 до N А:=А+х[i]*х[i] B:=B+x[i]*y[i] кц к:=В/А А:=0; В:=0; for i:=l to N do begin A:=A+x[i]*x[i]; B:=B+x[i]*y[i]; end; k:=B/A; Чтобы избавиться от лишних операций, умножение на 2 при вычислении В и деление на 2 при вычислении k не выполняется (применение двух этих операций не меняет результат). Для решения задачи методом наименьших квадратов можно использовать табличные процессоры с модулем поиска решения. Пусть в результате измерений получены точки (1; 1,1), (2; 1,8) и (3; 3,5). Занесём эти координаты в столбцы А и В, в ячейку В1 запишем начальное приближение для k, а в столбец С — значения функции у - k x для значений х из столбца А (рис. 9.28). А 1 к 1,000 2 Е =SUMXMY2(B5;B7;C5:C7) X У Y S ■ 1 1.1 =$В$ГА5 б 2 1.8 =$В$ГАБ 7 3 3.5 =$В$ГА7 Рис. 9.28 Решение вычислительных задач на компьютере Величина Е — это сумма квадратов разностей двух рядов, которая вычисляется с помощью функции SUMXMY2 (СУММКВРАЗН). У этой функции два аргумента — ряд у (измеренные значения в столбце В) и ряд У (вычисленные значения функции в столбце С). Задача оптимизации — найти минимальное значение Е (в ячейке В2), изменяя значение k в ячейке В1 — решается с помощью надстройки «Поиск решения». Восстановление зависимостей Пусть заданы пары значений х и у, и предполагается, что они связаны некоторой зависимостью у = f{x), которую нужно найти для того, чтобы вычислять значение функции в других точках, для которых значения у неизвестны. Такая задача называется задачей восстановления зависимости. Если вид функции не задан, эта задача некорректна, потому что через заданные точки можно провести сколько угодно различных линий (графиков функций), и невозможно сказать, какая из них лучше подходит (рис. 9.29). Поэтому для того, чтобы сделать задачу осмысленной, нужно заранее задать вид функции, так что останется только найти её неизвестные коэффициенты. Откуда взять вид функции? В некоторых случаях он известен из физических законов, описывающих явление (так было в примере с исследованием закона Гука). Иногда вид зависимости можно определить по внешнему виду расположения точек. Также можно попробовать функции разного типа и выбрать лучший вариант. Часто используют следующие типы функций (рис. 9.30): Обработка результатов эксперимента §74 • линейную I/= а • X + 6; • логарифмическую I/=а-Inх +ft; • показательную (экспоненциальную) у = а Ь^; • степенную I/=а •X*’. Линия тренде для рядов даннык 'Столбец В* Тип |линия| Тип регрессии------- (• Оииегиый f' Логарифмический Экспоненциальный Степень Уравнение -17 (Показать уравнение |7 Показать козффиииент детериинации (R>) (Ж Отмена Огфавка установить Рис. 9.30 Задача сводится к тому, чтобы выбрать коэффициенты а и ft наилучшим образом. Для её решения «вручную» нужно применять методы вычислительной математики, выходящие за рамки школьного курса. Однако в современных табличных процессорах есть встроенные возможности для решения задачи восстановления зависимостей. Полученные графики оптимальных функций называются линиями тренда (англ, trend — основное направление развития). Сначала нужно ввести исходные данные (координаты точек) в таблицу и построить по ним диаграмму типа Диаграмма XY (в Excel — диаграмма Точечная). Лучше оставить на диаграмме только точки, не соединяя их линией. Для того чтобы построить линию тренда, надо щёлкнуть правой кнопкой мыши на одной из точек и выбрать пункт Вставить линию тренда из контекстного меню. В появившемся окне можно выбрать вид зависимости. Если установить флажок Показать уравнение, уравнение линии тренда будет показано на диаграмме. Флажок Показать коэффициент детерминации (R2) позволяет Решение вычислительных задач на компьютере увидеть, насколько точно полученная линия соответствует исходным данным. Коэффициент вычисляется по формуле Д2 =1-М---------, ZO/i -у)^ i=l где через у обозначено среднее значение ряда у. Дробь, которая вычитается из единицы, — это дисперсия ошибки приближения, делённая на дисперсию ряда у. Чем меньше это отношение (и чем больше коэффициент R^), тем больше найденная зависимость соответствует исходным данным. В лучшем случае = 1, при этом у^ = У; для всех i , т. е. все значения функции совпадают с заданными. Из приведённой формулы видно, что имеет наибольшее П значение, когда сумма квадратов отклонений Е = ^(у^ - У^ ми- 1=1 нимальна. Это значит, что задача поиска максимума R^ решается методом наименьших квадратов. Если нужно найти неизвестные коэффициенты функции, которая не входит в стандартный набор (например, у =а• sinfrx+ с), можно применить метод наименьших квадратов с помощью надстройки «Поиск решения». Прогнозирование Во многих задачах (например, в экономике) в результате обработки данных нужно сделать прогноз. Если найдена зависимость у = f(x), эта задача решается просто — нужно найти значения функции для тех значений х, которые нас интересуют. Однако может получиться так, что функция, которая очень хорошо соответствует имеющимся данным (см. функцию y = f(x) на рис. 9.31), оказывается непригодна для прогноза. Обработка результатов эксперимента §74 в таких случаях для решения задачи прогнозирования нужно выбирать другую функцию, которая дает меньшее значение , но лучше показывает закономерность изменения величины (например, возрастаюш;ий характер функции). Вопросы и задания 1. Объясните, почему экспериментгшьные исследования требуют специальных методов обработки данных. 2. Объясните суть метода наименьших квадратов. Почему можно считать такой подход решением задачи оптимизации? Подготовьте сообщение а) «Интерполяция» б) «Экстраполяция* в) «Аппроксимация» Задачи 1. Результаты серии измерений, сделанных для определения жёсткости пружины на основе закона Гука, записаны в таблицу: F,H 1 3 6 10 М, м 0,028 0,070 0,170 0,260 Используя метод наименьших квадратов, определите жёсткость пружины. Решите задачу разными способами (с помощью собственной программы и табличного процессора), сравните результаты. *2. Используя те же данные, что и в задаче 1, найдите жёсткость пружины другим способом. Введём величину, обратную жёсткости: т) = 1/Л, тогда Д/ = т^ Р. Сначала, применив метод наименьших квадратов, найдите г|, а затем рассчитайте k = 1/г). Сравните результат с тем, что получилось в задаче 1. Объясните расхождение. 3. Почему задача восстановления зависимости некорректна, если не задан вид функции? 4. Доходы начинающей фирмы (в тысячах рублей) за первые 5 лет работы приведены в таблице: Год 1 2 3 4 5 Доход 93 187 270 321 350 О Решение вычислительных задач на компьютере с помощью табличного процессора найдите зависимость дохода от года работы (выберите лучший из стандартных вариантов, с наибольшим значением R^). С помощью этой зависимости сделайте прогноз развития фирмы на 2 года вперед. *5. При изучении волн измерили отклонение уровня поверхности воды у от «нулевого* уровня в одной точке в разные моменты времени f. t 0 0,2 0,4 0,6 0,8 1 у 1 2 1,2 -0,6 -2 -1,5 Предполагается, что волна описывается формулой у =a-sin{b-t+с), где а, Ь и с — некоторые числа. Определите неизвестные коэффициенты методом наименьших квадратов с помощью табличного процессора. В качестве начального приближения можно выбрать а »1; й « 4; с «1. Практические работы к главе 9 Работа Работа Работа Работа Работа Работа Работа Работа Работа X» 62 X» 63 X» 64 X» 65 X» 66 Хо 67 Х2 68 X» 69 Хо 70 Х2 71 X» 72 «Решение уравнений методом перебора* «Решение уравнений методом деления отрезка пополам * «Решение уравнений в табличных процессорах» «Вычисление длины кривой» «Вычисление площади фигуры» «Оптимизация. Метод дихотомии» «Оптимизация с помощью табличных процессоров» «Статистические расчеты» «Условные вычисления» «Метод наименьших квадратов» «Линии тренда» ЭОР к главе 9 на сайте ФЦИОР (http//fcior.edu.ru) Точность вычислений Особенности выполнения вычислений на ЭВМ. Потеря точности • Уравнения с одной переменной. Корни уравнения. Линейные уравнения Дискретизация сигналов Задачи оптимизации. Динамическое программирование • Основные алгоритмы работы со структурами данных Обработка результатов эксперимента §74 Самое важное в главе 9 • Погрешность вычислений — это разница между вычисленным значением величины и её точным (истинным) значением. Погрешность бывает абсолютная и относительная (в процентах). Для оценки точности измерений и расчётов более полезна относительная погрешность. • Точность вычислений определяется точностью исходных данных и погрешностями метода. • Компьютер позволяет легко находить приближённые решения многих задач, которые трудно решаются аналитически (или не решаются вообще). • Многие приближённые методы решения уравнений — итерационные, т. е. основаны на многократном повторении некоторого алгоритма, который позволяет на каждом шаге приближаться к точному решению. Процедура заканчивается, когда отклонение полученного приближённого решения от точного становится меньше заданной величины е. • Дискретизация — необходимый этап подготовки вычислительных задач для решения на компьютере. Чтобы повысить точность, нужно уменьшать шаг дискретизации, но это увеличивает объём вычислений. • Оптимизация — это поиск наилучшего решения в заданных условиях. В задачах оптимизации необходимо ввести целевую функцию, для которой требуется найти минимум или максимум. Кроме того, в большинстве практических случаев нужно задать ограничения на допустимые значения переменных. • Большинство приближённых методов оптимизации позволяет искать только локальный минимум (максимум), в этом случае результат оптимизации зависит от выбора начального приближения. • Цель статистических расчётов — выявить закономерности путём математической обработки больших массивов данных. 0 Для того чтобы задача восстановления зависимости по точкам была корректной, необходимо заранее выбрать вид функции, так что останется определить лишь её неизвестные коэффициенты. Глава 10 Информационная безопасность §75 Основные понятия Зависимость современных организаций от компьютерных технологий стала настолько сильной, что вывод из строя компьютерной сети или программного обеспечения может остановить работу предприятия. Чтобы этого не произошло, нужно соблюдать правила информационной безопасности. О Информационная безопасность — это защищённость информации от любых действий, в результате которых владельцам или пользователям информации может быть нанесён недопустимый ущерб. Причиной такого ущерба может быть искажение или утеря информации, а также неправомерный доступ к ней. Прежде всего в защите нуждаются государственная и военная тайны, а также коммерческая, юридическая и врачебная тайны. Необходимо защищать личную информацию: паспортные данные, данные о банковских счетах, пароли на сайтах, а также любую информацию, которую можно использовать для шантажа, вымогательства и т. п. Конечно, невозможно защититься от любых потерь, поэтому задача состоит в том, чтобы исключить именно недопустимый ущерб. С точки зрения экономики, средства защиты не должны стоить больше, чем возможные потери. Защита информации — это меры, направленные на то, чтобы не потерять информацию, не допустить её искажения, а также не допустить, чтобы к ней получили доступ люди, не имеющие на это права. В результате нужно обеспечить: • доступность информации — возможность получения информации за приемлемое время; • целостность (отсутствие искажений) информации; • конфиденциальность информации (недоступность для посторонних). Основные понятия §7Э Доступность информации нарушается, например, когда оборудование выходит из строя или веб-сайт не отвечает на запросы пользователей в результате массовой атаки вредоносных программ через Интернет. Нарушения целостности информации — это кража или искажение информации, например подделка сообщений электронной почты и других цифровых документов. Конфиденциальность информации нарушается, когда информация становится известной тем людям, которые не должны о ней знать (происходит перехват секретной информации). В компьютерных сетях защищённость информации снижается в сравнении с отдельным компьютером, потому что: • в сети работает много пользователей, их состав меняется; • есть возможность незаконного подключения к сети; • существуют уязвимости в сетевом программном обеспечении; • возможны атаки взломщиков и вредоносных программ через сеть. В России вопросы, связанные с защитой информации, регулирует закон «Об информации, информационных технологиях и о защите информации». Технические средства защиты информации — это замки, решётки на окнах, системы сигнализации и видеонаблюдения, другие устройства, которые блокируют возможные каналы утечки информации или позволяют их обнаружить. Программные средства обеспечивают доступ к данным по паролю, шифрование информации, удаление временных файлов, защиту от вредоносных программ и др. Организационные средства включают: • распределение помещений и прокладку линий связи таким образом, чтобы злоумышленнику было сложно до них добраться; • политику безопасности организации. Серверы, как правило, находятся в отдельном (охраняемом) помещении и доступны только администраторам сети. Важная информация должна периодически копироваться на резервные носители (диски или магнитную ленту) для сохранения её в случае сбоев. Обычные сотрудники (не администраторы): • имеют право доступа только к тем данным, которые им нужны для работы; О Информационная безопасность €i не имеют права устанавливать программное обеспечение; раз в месяц должны менять пароли. Самое слабое звено любой системы защиты — это человек. Некоторые пользователи могут записывать пароли на видном месте (чтобы не забыть) и передавать их другим, при этом возможность незаконного доступа к информации значительно возрастает. Поэтому очень важно обучить пользователей основам информационной безопасности. Большинство утечек информации связано с инсайдерами (англ, inside — внутри) — недобросовестными сотрудниками, работающими в фирме. Известны случаи утечки закрытой информации не через ответственных сотрудников, а через секретарей, уборщиц и другой вспомогательный персонал. Поэтому ни один человек не должен иметь возможности причинить непоправимый вред (в одиночку уничтожить, украсть или изменить данные, вывести из строя оборудование). Вопросы и задания 1. Что такое информационная безопасность? 2. Что входит в понятие «защита информации»? 3. На какие группы делятся средства защиты информации? 4. Какие меры безопасности обычно применяются в организациях? 5. Почему при объединении компьютеров в сеть безопасность снижается? 6. Кто такие инсайдеры? §76 Вредоносные программы Что такое компьютерный вирус? О Компьютерный вирус — это программа, способная создавать свои копии (не обязательно совпадающие с оригиналом) и внедрять их в файлы и системные области компьютера. При этом копии могут распространяться дальше. Как следует из этого определения, основная черта компьютерного вируса — это способность распространяться при запуске. Вредоносные программы §76 Вирус — это один из типов вредоносных программ. Однако очень часто вирусами называют любые вредоносные программы (англ, malware). Вредоносные программы — это программы, предназначенные для незаконного доступа к информации, для скрытого использования компьютера или для нарушения работы компьютера и компьютерных сетей. О Зачем пишут такие программы? Во-первых, с их помощью можно получить управление компьютером пользователя и использовать его в своих целях. Например, через заражённый компьютер злоумышленник может взламывать сайты и незаконно переводить на свой счёт деньги. Некоторые программы блокируют компьютер и для продолжения работы требуют отправить платное SMS-сообщение. Зараженные компьютеры, подключенные к сети Интернет, могут объединяться в сеть специального типа — ботнет (от англ. robot — робот и network — сеть). Такая сеть часто состоит из сотен тысяч компьютеров, обладающих в сумме огромной вычислительной мощностью. По команде «хозяина» ботнет может организовать атаку на какой-то сайт. В результате огромного количества запросов сервер не справляется с нагрузкой, сайт становится недоступен, и бизнесмены несут большие денежные потери. Такая атака называется DoS-атакой^ (англ. DoS — Denial of Service — отказ в обслуживании). Кроме того, ботнеты могут использоваться для подбора паролей, рассылки спама (рекламных электронных сообщений) и другой незаконной деятельности. Во-вторых, некоторые вредоносные программы предназначены для шпионажа — передачи по Интернету секретной информации с вашего компьютера: паролей доступа к сайтам, почтовым ящикам, учётным записям в социальных сетях, банковским счетам и электронным платёжным системам. В результате таких краж пользователи теряют не только данные, но и деньги. В-третьих, иногда вирусы пишутся ради самоутверждения программистами, которые по каким-то причинам не смогли при- Здесь речь идёт, строго говоря, о распределённой DoS-атаке (англ. DDoS — Distributed DoS), которая проводится сразу со многих компьютеров. 10—49 Информационная безопасность О менить свои знания для создания полезного ПО. Такие программы нарушают нормальную работу компьютера: время от времени перезагружают его, вызывают сбои в работе операционной системы и прикладных программ, уничтожают данные. Наконец, существуют вирусы, написанные ради шутки. Они не портят данные, но приводят к появлению звуковых или зрительных эффектов (проигрывание мелодии; искажение изображения на экране; кнопки, убегающие от курсора и т. п.). Создание и распространение компьютерных вирусов и вредоносных программ — это уголовные преступление, которое предусматривает (в особо тяжких случаях) наказание до 7 лет лишения свободы (Уголовный кодекс РФ, статья 273). Признаки заражения вирусом: • замедление работы компьютера; уменьшение объема свободной оперативной памяти; • зависание, перезагрузка или блокировка компьютера; • ошибки при работе ОС или прикладных программ; - изменение длины файлов, появление новых файлов (в том числе скрытых); • рассылка сообщений по электронной почте без ведома автора. О Для того чтобы вирус смог выполнить какие-то действия, он должен оказаться в памяти в виде программного кода и получить управление компьютером. Поэтому вирусы заражают не любые данные, а только программный код, который может выполняться. Например: • исполняемые программы (с расширениями ехе, сот); • загрузочные секторы дисков; • пакетные командные файлы (bat); • драйверы устройств; • библиотеки динамической загрузки (dll), функции из которых вызываются из прикладных программ; • документы, которые могут содержать макросы — небольшие программы, выполняющиеся при нажатии на клавиши или выборе пункта меню; например, макросы нередко используются в документах пакета Microsoft Office; • веб-страницы (в них можно внедрить программу-скрипт, которая выполнится при просмотре страницы на компьютере пользователя). Вредоносные программы §76 в отличие от кода программ файлы с данными (например, тексты, рисунки, звуковые и видеофайлы) только обрабатываются, но не выполняются, поэтому заложенный в них код никогда не должен получить упргшление компьютером. Однако из-за ошибок в программном обеспечении может случиться так, что специально подобранные некорректные данные вызовут сбой программы обработки и выполнение вредоносного кода^. Таким образом, существует некоторый шанс, что вредоносная программа, внедрённая в рисунок или видеофайл, все-таки запустится. Сейчас существуют два основных источника заражения вредоносными программами — флэш-диски и компьютерные сети. Компьютер может быть заражён при: • запуске заражённого файла; • загрузке с заражённого диска CD/DVD или флэш-диска; • автозапуске заражённого диска CD/DVD или флэш-диска (вирус автоматически запускается из файла autorun.inf в корневом каталоге диска); • открытии заражённого документа с макросами; • открытии сообщения электронной почты с вирусом или запуске заражённой программы, полученной в приложении к сообщению; • открытии веб-страницы с вирусом; • установке активного содержимого для просмотра веб-страницы. Кроме того, есть вирусы-черви, которые распространяются по компьютерным сетям без участия человека. Они могут заразить компьютер даже тогда, когда пользователь не сделал никаких ошибочных действий. О Типы вредоносных программ К вредоносным программам относятся компьютерные вирусы, черви, троянские программы и др. По «среде обитания» обычно выделяют следующие типы вирусов: • файловые — внедряются в исполняемые файлы, системные библиотеки и т. п.; В 2002 г. был обнаружен вирус, который внедрялся в рисунки формата JPEG. Однако он получал управление только из-за ошибки в системной библиотеке Windows, которая была быстро исправлена. Информационная безопасность загрузочные — внедряются в загрузочный сектор диска или в главную загрузочную запись жёсткого диска (англ. MBR — Master Boot Record)’, опасны тем, что загружаются в память раньше, чем ОС и антивирусные программы; • макровирусы — поражают документы, в которых могут быть макросы; • скриптовые вирусы — внедряются в командные файлы или в веб-страницы (записывая в них код на языке VBScript или JavaScript); , сетевые вирусы — распространяются по компьютерным сетям. Некоторые вирусы при создании новой копии немного меняют свой код, для того чтобы их было труднее обнаружить. Такие вирусы называют полиморфными (от греч. лоЛ.и — много, рорсрг) — форма, внешний вид). Червь — это вредоносная программа, которая распространяется по компьютерным сетям. Наиболее опасны сетевые черви, которые используют «дыры» (ошибки в защите, уязвимости) операционных систем и распространяются очень быстро без участия человека. Червь посылает по сети специальный пакет данных — эксплойт (англ, exploit — эксплуатировать), который позволяет выполнить код на удалённом компьютере и внедриться в систему. Как правило, вскоре после обнаружения уязвимости выпускается обновление программного обеспечения («заплатка*, «патч»); если его установить, то червь становится неопасен. К сожалению, системные администраторы не всегда вовремя устанавливают обновления. Это приводит к эпидемиям сетевых червей, которые по статистике вызывают наибольшее число заражений. Заражённые компьютеры используются для рассылки спама или массовых DoS-атак на сайты в Интернете. Почтовые черви распространяются как приложения к сообщениям электронной почты. Они представляют собой программы, которые при запуске заражают компьютер и рассылают свои копии по всем адресам из адресной книги пользователя. Из-за этой опасности многие почтовые серверы (например, mail.google.com) не разрешают пересылку исполняемых файлов. Чтобы заставить пользователя запустить червя, применяются методы социальной инженерии: текст сообщения составляется так, чтобы заинтересовать человека и спровоцировать его на Вредоносные программы §76 запуск программы, приложенной к письму. В некоторых случаях программа-вирус упакована в архив и защищена паролем, но находится немало людей, которые распаковывают его (пароль указывается в письме) и запускают программу. Часто в почтовых сообщениях содержится только ссылка на сайт, содержащий вирус. Иногда файл, пришедший как приложение к письму, имеет двойное расширение, например: СуперКартинка.jpg . ехе В самом деле это программа (расширение имени файла ехе), но пользователь может увидеть только первые две части имени и попытаться открыть такой «рисунок». Существуют черви, которые могут распространяться через файлообменные сети, чаты и системы мгновенных сообщений (например, ICQ), но они мало распространены. Ещё одна группа вредоносных программ — троянские программы, или «троянцы» (трояны). Троянский конь — это огромный деревянный конь, которого древние греки подарили жителям Трои во время Троянской войны. Внутри него спрятались воины, которые ночью выбрались, перебили охрану и открыли ворота города. Троянские программы проникают на компьютер под видом «полезных» программ, например кодеков для просмотра видео или экранных заставок. В отличие от вирусов и червей они не могут распространяться самостоятельно и часто «путешествуют» вместе с червями. Среди «троянцев» встречаются: клавиатурные шпионы — передают «хозяину» все данные, вводимые с клавиатуры (в том числе коды доступа к банковским счетам и т. п,); • похитители паролей — передают пароли, запомненные, например, в браузерах; • утилиты удалённого управления — позволяют злоумышленнику управлять компьютером через Интернет (например, загружать и запускать любые файлы); • логические бомбы — при определённых условиях (дата, время, команда по сети) уничтожают информацию на дисках. Большинство существующих вирусов написано для ОС Windows, которая установлена более чем на 90% персональных компьютеров. Информационная безопасность Известны также вирусы для Мае 0S и Linux, но не каждому удается их запустить. Дело в том, что обычный пользователь (не администратор) в этих операционных системах не имеет права на изменение системных файлов, поэтому Мае OS и Linux считают защищёнными от вирусов. Кроме того, вирусы часто полагаются на то, что системные функции размещаются в памяти по определённым адресам. При сборке ядра Linux из исходных кодов эти адреса могут меняться, поэтому вирус, работающий на одном дистрибутиве, может не работать на других. Вопросы и задания 1. Что такое компьютерный вирус? Чем он отличается от других программ? 2. Что такое вредоносные программы? Какие вредоносные программы вы знаете? 3. Перечислите признаки заражения компьютера вирусом. 4. Какие вредные действия могут совершать вредоносные программы? 5. Какие объекты могут быть заражены вирусами? 6. Какие объекты не заражаются вирусами? 7. При каких действиях пользователя возможно заражение вирусом? 8. Является ли создание и распространение вирусов уголовным преступлением? 9. Какие типы вирусов вы знаете? 10. Что означает сокращение MBR? 11. Чем опасны загрузочные вирусы? 12. Что такое макровирусы? Какие файлы они поражают? 13. Что могут заражать скриптовые вирусы? 14. Что такое полиморфные вирусы? Почему их сложно обнаруживать? 15. Что такое сетевой червь? 16. Что такое эксплойт? 17. Почему необходимо сразу устанавливать обновления для операционных систем? 18. С какими целями могут быть использованы компьютеры, заражённые сетевым червем? 19. Почему многие почтовые серверы запрещают пересылку исполняемых файлов? 20. Что такое социальная инженерия? Как она используется авторами вирусов? 21. Что такое троянские программы? Какие типы троянских программ вы знаете? 22. Какие операционные системы лучше защищены от вирусов? Почему? Защита от вредоносных программ 1 Подготовьте сообщение: а) «Сетевые черви» б) «Социальная инженерия» в) «Троянские программы» г) «Вредоносные программы для Linux и MacOS» д) «Вредоносные программы и закон» §77 Защита от вредоносных программ Антивирусные программы Антивирус — это программа, предназначенная для борьбы с вредоносными программами. О Антивирусы выполняют три основные задачи: 1) не допустить заражение компьютера вирусом; 2) обнаружить присутствие вируса в системе; 3) удалить вирус без ущерба для остальных данных. Код большинства вирусов содержит характерные цепочки байтов — сигнатуры (от лат. signare — подписать). Если в файле обнаруживается сигнатура какого-то вируса, можно предположить, что файл заражён. Такой подход используется всеми антивирусными программами. Сигнатуры известных вирусов хранятся в базе данных антивируса, которую нужно регулярно обновлять через Интернет. Современные антивирусы — это программные комплексы, состоящие из нескольких программ. Чаще всего они включают антивирус-сканер (иногда его называют антивирус-доктор) и антивирус-монитор. Для того чтобы антивирус-сканер начал работу, пользователь должен его запустить и указать, какие файлы и папки нужно проверить. Это «защита по требованию». Сканеры используют два основных метода поиска вирусов: • поиск в файлах сигнатур вирусов, которые есть в базе данных; после обнаружения файл с вирусом можно вылечить, а если это не получилось — удалить; i Информационная безопасность • эвристический анализ (греч, еирг1ка — «нашёл!»), при котором программа ищет в файле код, похожий на вирус. Эвристический анализ часто позволяет обнаруживать полиморфные вирусы (изменяющие код с каждым новым заражением), но не гарантирует это. Кроме того, случаются ложные срабатывания, когда «чистый» файл попадает под подозрение. Главный недостаток сканеров состоит в том, что они не могут предотвратить заражение компьютера, потому что начинают работать только при ручном запуске. Антивирусы-мониторы — это программы постоянной защиты, они находятся в памяти в активном состоянии. Их основная задача — не допустить заражения компьютера и получения заражённых файлов извне. Для этого мониторы: • проверяют «на лету» все файлы, которые копируются, перемещаются или открываются в различных прикладных программах; • проверяют используемые флэш-диски; • перехватывают действия, характерные для вирусов (форматирование диска, замена и изменение системных файлов) и блокируют их; проверяют весь поток данных, поступающий из Интернета (сообщения электронной почты, веб-страницы, сообщения ICQ). Мониторы ведут непрерывное наблюдение, блокируют вирус в момент заражения. Иногда они могут перехватить и неизвестный вирус (сигнатуры которого нет в базе), обнаружив его подозрительные действия. Главный недостаток антивирусов-мониторов — значительное замедление работы системы, особенно на маломощных компьютерах. Кроме того, мониторы фактически встраиваются в операционную систему, поэтому ошибки разработчиков антивируса могут привести к печальным последствиям (вплоть до удаления системных библиотек и вывода ОС из строя). Бывает и так, что при запущенном мониторе некоторые программы работают неправильно или вообще не работают. Тем не менее не рекомендуется отключать монитор, особенно если вы работаете в Интернете или переносите файлы с помощью флэш-дисков. Защита от вредоносных программ §77 Современные антивирусы частично защищают компьютер ещё и от: • фишинга — выманивания паролей для доступа на сайты Интернета с помощью специально сделанных веб-страниц, которые внешне выглядят так же, как «официальные» сайты; • рекламных баннеров и вспльшающих окон на веб-страницах; • спама — рассылки нежелательных рекламных сообщений по электронной почте. Большинство антивирусных программ — условно-бесплатные (англ, shareware), пробные версии с ограниченным сроком действия можно свободно загрузить из Интернета. Наиболее известны антивирусы \Ук AVP (www.kaspersky.ru), DrWeb (www. drweb.com), Nod32 (www.eset.com), ^ McAfee (home.mcafee. com). Ha многих сайтах (www.kaspersky.ru, www.freedrweb.com) доступны для скачивания лечащие программы-сканеры, которые бесплатны для использования на домашних компьютерах. В отличие от полных версий в них нет антивируса-монитора, и базы сигнатур не обновляются. Существуют антивирусы, бесплатные для использования на домашних компьютерах, например Microsoft Security Essentials (www.microsoft.com), ^ Avast Home (www.avast.com), ^ Antivir Personal (free-av.com), ^ AVG Free (free.grisoft.com). Антивирус ClamAV (www.clamav.net) распространяется свободно с исходным кодом. На сайтах некоторых компаний можно найти онлайновые антивирусы (например, http://www.kaspersky.ru/virusscanner). Они устанавливают на компьютер специальный сканирующий модуль и проверяют файлы и оперативную память. Как правило, онлайновые антивирусы могут обнаружить вирусы, но не удаляют их, предлагая приобрести коммерческую версию. Брандмауэры Для защиты отдельных компьютеров и сетей от атак из Интернета (в том числе и вирусных) используются брандмауэры (нем. Brandmauer — стена между зданиями для защиты от распространения огня). Их также называют сетевыми экранами или фаейрволами (от англ, firewall — противопожарная стена). Брандмауэры запрещают передачу данных по каналам связи, которые часто используют вирусы и программы для взлома сетей. Информационная безопасность На рисунке 10.1 показана защита одного компьютера с помощью брандмауэра, точно так же защищаются от угроз из Интернета локальные сети. Брандмауэр Рис. 10.1 Брандмауэр входит в состав современных версий ОС Windows, в ядро Linux также включён встроенный брандмауэр Netfilter. Иногда устанавливают дополнительные брандмауэры, например Agnitum Outpost (www.agnitum.com), ^ Kerio Winroute Firewall (kerio.ru) или бесплатную программу ^ Comodo Personal Firewall (WWW. personal! ire wall. comodo. com). Меры безопасности Главный вред, который могут нанести вредоносные программы, — это потеря данных или паролей доступа к закрытой информации. Чтобы уменьшить возможный ущерб, рекомендуется регулярно делать резервные копии важных данных на дисках CD/DVD или флэш-дисках. Если вы работаете в сети, желательно включать антивирус-монитор и брандмауэр. Монитор сразу сообщит об опасности, если вставленный флэш-диск содержит вирус. Все новые файлы (особенно программы!) нужно проверять с помощью антивируса-сканера. Не рекомендуется открывать подозрительные сообщения электронной почты, полученные с неизвестных адресов, особенно файлы-приложения (помните про методы социальной инженерии — заинтересовать жертву и заставить запустить программу). Опасно также переходить по ссылкам в тексте писем, с большой вероятностью они ведут на сайты, зараженные вирусами. Если компьютер заражён, нужно отключить его от компьютерной сети и запустить антивирус-сканер. Очень часто это позволяет удалить вирус, если его сигнатура есть в базе данных. Если антивирус не был установлен раньше, можно попробовать установить его на заражённый компьютер, но это не всегда приводит к успеху (вирус может блокировать установку антивируса). В Защита от вредоносных программ §77 Если антивирус-сканер не обнаруживает вирус или не может его удалить, можно попытаться (желательно с другого компьютера) найти в Интернете бесплатную утилиту для лечения с новыми базами сигнатур. Например, утилита Curelt (www.freedrweb.com) не требует установки и может быть запущена с флэш-диска. Даже если удалить вирус не удастся, скорее всего, он будет обнаружен, и программа покажет его название. Следующий шаг — искать в Интернете утилиту для удаления именно этого вируса (например, ряд утилит можно найти на сайте support.kaspersky.ru). В особо тяжёлых случаях для уничтожения вирусов приходится полностью форматировать жёсткий диск компьютера, при этом все данные теряются. Вопросы и задания 1. Что такое антивирус? Какие задачи он решает? 2. Что такое сигнатура? 3. Почему нужно регулярно обновлять базы сигнатур антивирусов? 4. Чем отличается антивирус-сканер от антивируса-монитора? 5. Что значит «защита по требованию»? 6. Что такое эвристический анализ? В чём его достоинства и недостатки? 7. Какие функции у антивируса-монитора? Каковы его недостатки? 8. Что такое фишинг? 9. Что такое спам? 10. Какие ограшичения есть у пробных версий коммерческих антивирусов? 11. Что такое онлайновый антивирус? 12. Что такое брандмауэр? Зачем он нужен? 13. В чём заключается основной вред, наносимый вирусами? Как можно уменьшить возможные потери? 14. Как можно улучшить безопасность компьютера при работе в сети Интернет? 15. Какие меры безопасности необходимы при работе с электронной почтой? 16. Какие действия можно предпринять, если компьютер заражен вирусом? Подготовьте сообщение а) «Бесплатное антивирусное программное обеспечение» б) «Онлайновые антивирусы» в) «Настройка брандмауэра» Информационная безопасность О §78 Шифрование Один из методов защиты информации от неправомерного доступа — это шифрование, т. е. кодирование специального вида. Шифрование — это преобразование (кодирование) открытой информации в зашифрованную, недоступную для понимания посторонними. Шифрование применяется в первую очередь для передачи секретной информации по незащищённым каналам связи. Шифровать можно любые данные — тексты, рисунки, звук, базы данных и т. д. Человечество применяет шифрование с того момента, как появилась секретная информация, которую нужно было скрыть от врагов. Первое известное науке шифрованное сообщение — египетский текст, в котором вместо принятых тогда иероглифов были использованы другие знаки. Методы шифрования и расшифровывания сообщения изучает наука криптология, история которой насчитывает около четырех тысяч лет. Она состоит из двух ветвей: криптографии и криптоанализа. Криптография — это наука о способах шифрования информации. Криптоанализ — это наука о методах и способах вскрытия шифров. О Обычно предполагается, что сам алгоритм шифрования известен всем, но неизвестен его ключ, без которого сообщение невозможно расшифровать. В этом заключается отличие шифрования от простого кодирования, при котором для восстановления сообщения достаточно знать только алгоритм кодирования. Ключ — это параметр алгоритма шифрования (шифра), позволяющий выбрать одно конкретное преобразование из всех вариантов, предусмотренных алгоритмом. Знание ключа позволяет свободно зашифровывать и расшифровывать сообщения. Шифрование Jflf Все шифры (системы шифрования) делятся на две группы — симметричные и несимметричные (с открытым ключом). Симметричный шифр означает, что и для шифрования, и для расшифровывания сообш;ений используется один и тот же ключ. В системах с открытым ключом используются два ключа — открытый и закрытый, которые связаны друг с другом с помощью некоторых математических зависимостей. Информация шифруется с помощью открытого ключа, который доступен всем желающим, а расшифровывается с помощью закрытого ключа, известного только получателю сообщения. Криптостойкость шифра — это устойчивость шифра к расшифровке без знания ключа. О Стойким считается алгоритм, который для успешного раскрытия требует от противника недостижимых вычислительных ресурсов, недостижимого объёма перехваченных сообщений или такого времени, что по его истечении защищённая информация будет уже не актуальна. Шифр Цезаря 1 ____ один из самых известных и самых древних шифров. В этом шифре каждая буква заменяется на другую, расположенную в алфавите на заданное число позиций k вправо от неё. Алфавит замыкается в кольцо, так что последние символы заменяются на первые. На рисунке 10.2 — пример шифра Цезаря (со сдвигом 3)2. Назван в честь римского императора Гая Юлия Цезаря, использовавшего его для секретной переписки. Будем считать, что буквы «Е» и «Ё* совпадают. 1 Информационная безопасность Знаменитая фраза «ПРИШЕЛ УВИДЕЛ ПОБЕДИЛ» при использовании шифра Цезаря со сдвигом 3 будет закодирована так: ТУЛЫИО ЦЕЛЗИО ТСДИЗЛО Если первая буква алфавита имеет код О, вторая — код 1 и т. д., алгоритм шифрования может быть выражен формулой y = {x + k) mod п, где X — код исходного символа, k — величина сдвига, у — код символа-замены, п — количество символов в алфавите, а запись (х + k) mod п обозначает остаток от деления х + k на п. Операция взятия остатка от деления необходима для того, чтобы замкнуть алфавит в кольцо. Например, при использовании русского алфавита (32 буквы, без буквы «Ё») для буквы «Я» (код 31) получаем код заменяющего символа (31 + 3) mod 32 = 2, это буква «В». Ключом для шифра Цезаря служит сдвиг к, если его знать, то сообщение легко расшифровать. Для этого используется формула х = {у -к + п) mod п. Шифр Цезаря относится к шифрам простой подстановки, так как каждый символ исходного сообщения заменяется на другой символ из того же алфавита. Такие шифры легко раскрываются с помощью частотного анализа, потому что в каждом языке частоты встречаемости букв примерно постоянны для любого достаточно большого текста. Значительно сложнее сломать шифр Виженера^, который стал естественным развитием шифра Цезаря. Для использования шифра Виженера используется ключевое слово, которое задает переменную величину сдвига. Например, пусть ключевое слово — «ЗАБЕГ». По таблице (рис. 10.3) определяем коды букв. 0 1 2 3 4 5 6 7 8 9 А Б В г Д Е Ж 3 И Й ... Рис. 10.3 Получаем: «3» — 7, «А» — 0, «Б» — 1, «Е» — 5, «Г» — 3. Это значит, что для кодирования первой буквы любого текста используется сдвиг 7, для кодирования второй — 0 (символ не меняется) и т. д. Для пятой буквы используется сдвиг 3, а для шес- Назван по имени Блеза Виженера, швейцарского дипломата XVI века. Шифрование §78 той — снова 7 (начинаем «проходить» кодовое слова с начала). Фраза «ПРИШЕЛ УВИДЕЛ ПОБЕДИЛ» при использовании шифра Виженера с ключом «ЗАБЕГ» будет закодирована в виде «ЦРЙЭИТ УГНЗМЛ РУДМДЙР». Шифр Виженера обладает значительно более высокой криптостойкостью, чем шифр Цезаря. Это значит, что его труднее раскрыть — подобрать нужное ключевое слово. Теоретически, если длина ключа равна длине сообщения и каждый ключ используется только один раз, шифр Виженера обладает абсолютной криптостойкостью — взломать его невозможно. Вопросы и задания 1. Чем различаются понятия «шифрование» и «кодирование»? 2. Что такое ключ? 3. Как называется наука, изучающая методы шифрования? 4. Что такое симметричный шифр? Какая проблема возникает при использовании симметричного шифра, если участники переписки находятся в разных странах? 5. Что такое несимметричные шифры? На чём основана их надёжность? 6. Что такое криптостойкость алгоритма? Какой алгоритм считается криптостойким? Подготовьте сообщение а) «Полиграммные шифры подстановки» б) «Шифрование и закон» в) «Криптостойкость шифров» г) «Частотный анализ» Задачи 1. Зашифруйте с помощью шифра Цезаря со сдвигом 6 высказывание «ЛЮДИ ОХОТНО ВЕРЯТ ТОМУ, ЧЕМУ ЖЕЛАЮТ ВЕРИТЬ». 2. Напишите программу, которая выполняет шифрование строки с помощью шифра Цезаря. *3. Попытайтесь расшифровать сообщение, закодированное шифром Цезаря с неизвестным сдвигом: «ХШЖНПУТ ФКХКОЙКТ». Для этого можно написать программу. 4. Используя шифр Виженера с ключом «ЛЕНА», зашифруйте сообщение «НЕЛЬЗЯ ОБИЖАТЬ ГОСТЯ». *5. Измените программу для шифрования с помощью шифра Цезаря так, чтобы учитывать букву Ё. *6. Измените программу для шифрования с помощью шифра Цезаря так, чтобы учитывать и букву Ё, и пробел. А О i Информационная безопасность §79 Хэширование и пароли в современных информационных системах часто используется вход по паролю. Если при этом где-то хранить пароли всех пользователей, система становится очень ненадёжной, потому что «утечка» паролей позволит сразу получить доступ к данным. Вместе с тем кажется, что пароли обязательно где-то нужно хранить, иначе пользователи не смогут войти в систему. Однако это не совсем так. Можно хранить не пароли, а некоторые числа, полученные в результате обработки паролей. Простейший вариант — сумма кодов символов, входящих в пароль. Для пароля «А123» такая сумма равна 215 = 65 (код «А») + 49 (код «1») + 50 (код «2») 4- 51 (код «3»). Фактически мы определили функцию Н(М), которая сообщение М любой длины превращает в короткий код т. Такую функцию называются хэш-функцией (от англ, hash — мешанина, крошить), а само полученное число — хэш-кодом, хэш-суммой или просто хэшем исходной строки. Важно, что, зная хэш-код, невозможно восстановить исходный пароль! В этом смысле хэширование — это необратимое шифрование. Итак, вместо пароля «А123» мы храним число 215. Когда пользователь вводит пароль, мы считаем сумму кодов символов этого пароля и разрешаем вход в систему только тогда, когда она равна 215. И вот здесь возникает проблема: существует очень много паролей, для которых наша хэш-функция даёт значение 215, например «В023». Такая ситуация — совпадение хэш-кодов различных исходных строк — называется коллизией (англ. collision — столкновение). Коллизии будут всегда — ведь мы «сжимаем» длинную цепочку байтов до числа. Казалось бы, ничего хорошего не получилось: если взломщик узнает хэш-код, то, зная алгоритм его получения, он сможет легко подобрать пароль с таким же хэшем и получить доступ к данным. Однако это произошло потому, что мы выбрали плохую хэш-функцию. Математики разработали надёжные (но очень сложные) хэш-функции, обладающие особыми свойствами: 1) хэш-код очень сильно меняется при малейшем изменении исходных данных; Хэширование и пароли §79 2) при известном хэш-коде т невозможно за приемлемое время найти сообщение М с таким хэш-кодом (Н(М) = т); 3) при известном сообщении М невозможно за приемлемое время найти сообщение с таким же хэш-кодом (ЩМ) = ЩМ^)). Здесь выражение «невозможно за приемлемое время» (или «вычислительно невозможно») означает, что эта задача решается только перебором вариантов (других алгоритмов не существует), а количество вариантов настолько велико, что на решение могут уйти сотни и тысячи лет. Поэтому даже если взломщик получил хэш-код пароля, он не сможет за приемлемое время получить сам пароль (или пароль, дающий такой же хэш-код). Чем длиннее пароль, тем больше количество вариантов. Кроме длины для надёжности пароля важен используемый набор символов. Например, очень легко подбираются пароли, состоящие только из цифр. Если же пароль состоит из 10 символов и содержит латинские буквы (заглавные и строчные) и цифры, перебор вариантов (англ, brute force — метод «грубой силы») со скоростью 10 млн паролей в секунду займет более 2000 лет. Надёжные пароли должны состоять не менее чем из 7-8 символов; пароли, состоящие из 15 символов и более, взломать методом «грубой силы» практически невозможно. Не используйте пароли типа «12345», «qwerty», свой день рождения, номер телефона. Плохо, если пароль представляет собой известное слово, для этих случаев взломщики используют подбор по словарю. Сложнее всего подобрать пароль, который представляет собой случайный набор заглавных и строчных букв, цифр и других знаков^. Сегодня для хэширования в большинстве случаев применяют алгоритмы MD5, SHA1 и российский алгоритм, изложенный в ГОСТ Р34.11-94 (он считается одним из самых надёжных). В криптографии хэш-коды чаще всего имеют длину 128, 160 и 256 битов. Хэширование используется также для проверки правильности передачи данных: различные контрольные суммы — это не что иное, как хэш-коды. Однако такой пароль сложно запомнить. Информационная безопасность О 8. 9. *10. Вопросы и задания 1. Что такое хэширование? Хэш-функция? Хэш-код? 2. Какую хэш-функцию вы используете, когда начинаете искать слово в словаре? 3. Что такое коллизии? Почему их должно быть как можно меньше? 4. Какие требования предъявляются к хэш-функциям, которые используются при хранении паролей? 5. Что значит «вычислительно невозможно*? 6. Взломщик узнал хэш-код пароля администратора сервера. Сможет ли он получить доступ к секретным данным на сервере? 7. Какие свойства пароля влияют на его надёжность? Как выбрать надёжный пароль? Какие алгоритмы хэширования сейчас чаще всего применяются? Предложите какой-нибудь свой метод хэширования. Подумайте, как часто при его использовании могут происходить коллизии. Подготовьте сообщение а) «Где используют хэши?* б) «Хэширование и передача данных* в) «Хэширование с "солью"» Задачи 1. Напишите программу, которая запрашивает длину пароля, количество используемых символов и скорость перебора (например, в миллионах вариантов в секунду) и находит время, необходимое для подбора пароля методом «грубой силы». 2. Компьютер выполняет перебор со скоростью 10 млн паролей в секунду. С помощью программы (см. задачу 1) определите, какова должна быть длина пароля, чтобы время его взлома составило не менее 1 месяца, если: а) пароль состоит только из цифр; б) пароль состоит только из заглавных латинских букв и цифр; в) пароль состоит только из латинских букв (заглавных и строчных) и цифр. §80 Современные алгоритмы шифрования Государственным стандартом шифрования в России является алгоритм, зарегистрированный как ГОСТ 28147-89. Он является блочным шифром, т. е. шифрует не отдельные символы, а 64-бит- Современные алгоритмы шифрования §80 ные блоки. В алгоритме предусмотрены 32 цикла преобразования данных с 256-битным ключом, за счёт этого он очень надёжен (обладает высокой криптостойкостью). На современных компьютерах раскрытие этого шифра путём перебора ключей («методом грубой силы») займёт не менее сотен лет, что делает такую атаку бессмысленной. В США в качестве стандарта принят блочный шифр AES {англ. Advanced Encryption Standard, передовой стандарт шифрования), выбранный в 2001 г. по результатам проведённого конкурса. Шифр AES используется также в защищённых беспроводных сетях (WiFi). В Интернете популярен алгоритм RSA, названный так по начальным буквам фамилий его авторов — Р. Райвеста (R. Rivest), А. Шамира (А. Shamir) и Л. Адлемана (L. Adleman). Это алгоритм с открытым ключом, стойкость алгоритма основана на том, что перемножить два очень больших простых числа достаточно просто, а вот разложить такое произведение на простые сомножители очень трудно (эту задачу сейчас умеют решать только перебором вариантов). Поскольку количество вариантов огромно, для раскрытия шифра требуется много лет работы современных компьютеров. Для применения алгоритма RSA требуется построить открытый и секретный ключи следующим образом. 1. Выбрать два больших простых числа, р и д. 2. Найти их произведение п = р д и значение ф = (р -1) • (д -1). 3. Выбрать число е (1<е<ф), которое не имеет общих делителей с ф. 4. Найти число d, которое удовлетворяет условию d e = k(p + l для некоторого целого k. 5. Пара значений (е, л) — это открытый ключ RSA (его можно свободно публиковать), а пара (d, п) — это секретный ключ. Передаваемое сообщение нужно сначала представить в виде последовательности чисел в интервале от 0 до л - 1. Для шифрования используют формулу у = mod л, где X — исходное сообщение (число), (е,л) — открытый ключ, у — закодированное сообщение (число), а запись х^ mod л обозначает остаток от деления х^ на л. Расшифровка сообщения выполняется по формуле X = у’^ mod л. Информационная безопасность Это значит, что зашифровать сообщение может каждый (открытый ключ общеизвестен), а прочитать его — только тот, кто знает секретный показатель степени d. Для лучшего понимания мы покажем работу алгоритма RSA на простом примере. Возьмём р = 3 и д = 7, тогда находим п = p q = 21 и ф = (р-1)(<7-1) = 12. Выберем е = Ъ, тогда равенство d e = ft

1® mod 21 = 1, 2 => 2® mod 21 = 11, 3 => 3® mod 21 = 12, т. е. зашифрованное сообщение состоит из чисел 1, 11 и 12. Зная секретный ключ (17, 21), можно его расшифровать: 1=> 117 mod 21 = 1, iizi>iii7mod21 = 2, 12 => 12i7 mod 21 = 3. Мы получили исходное сообщение. Конечно, вы заметили, что при шифровании и расшифровке приходится вычислять остаток от деления очень больших чисел (например, 1217) ^ Оказывается, само число 1217 g этом случае находить не нужно. Достаточно записать в обычную целочисленную переменную, например х, единицу, а потом 17 раз выполнить преобразование jc = 12 • х mod 21. После этого в переменной х будет значение 1217 j^od 21 = 3. Попробуйте доказать правильность этого алгоритма. Чтобы взломать шифр, злоумышленнику надо узнать секретный показатель степени d. А для этого необходимо найти большие простые числа р и q, такие что n = p q. Если п велико, это очень сложная задача, её решение перебором вариантов на современном компьютере займёт сотни лет. В 2009 г. группа учёных из разных стран в результате многомесячных расчётов на сотнях компьютеров смогла расшифровать сообщение, зашифрованное алгоритмом RSA с 768-битным ключом. Поэтому сейчас надёжными считаются ключи с длиной 1024 бита и более. Если будет построен работающий квантовый компьютер, взлом алгоритма RSA будет возможен за очень небольшое время. При использовании симметричных шифров всегда возникает проблема: как передать ключ, если канал связи ненадёжный? Ведь, получив ключ, противник сможет расшифровать все дальнейшие сообщения. Для алгоритма RSA этой проблемы нет, сто- Современные алгоритмы шифрования §80 ронам достаточно обменяться открытыми ключами, которые можно показывать всем желающим. У алгоритма RSA есть ещё одно достоинство: его можно использовать для цифровой подписи сообщений. Она служит для доказательства авторства документов, защиты сообщений от подделки и умышленных изменений. Цифровая подпись — это набор символов, который получен в результате шифрования сообщения с помощью личного секретного кода отправителя. Отправитель может передать вместе с исходным сообщением такое же сообщение, зашифрованное с помощью своего секретного ключа (это и есть цифровая подпись). Получатель расшифровывает цифровую подпись с помощью открытого ключа. Если она совпала с незашифрованным сообщением, можно быть уверенным, что его отправил тот человек, который знает секретный код. Если сообщение было изменено при передаче, оно не совпадёт с расшифрованной цифровой подписью. Так как сообщение может быть очень длинным, для сокращения объёма передаваемых данных чаще всего шифруется не всё сообщение, а только его хэш-код. Во многих современных программах есть возможность шифровать данные с паролем. Например, офисные пакеты OpenOffice.org и Microsoft Office позволяют шифровать все создаваемые документы (для их просмотра и/или изменения нужно ввести пароль). При создании архива (например, в архиваторах Qzip> ^WinRAR, Щ WinZip) также можно установить пароль, без которого извлечь файлы невозможно. В простейших задачах для шифрования файлов можно использовать бесплатную программу Шифровальщик (www. familytree.ru/ru/cipher.htm), версии которой существуют для Linux и Windows. Программы TrueCrypt (www.truecrypt.org), BestCrypt (www.jetico.com) и FreeOTFE (freeotfe.org) создают логические диски-контейнеры, информация на которых шифруется. Свободно распространяемая программа |£ DiskCryptor (diskcryptor.net) позволяет шифровать разделы жёстких дисков и даже создавать шифрованные флэш-диски и диски CD/DVD. Программа ^ GnuPG (gnupg.org) также относится к свободному программному обеспечению. В ней поддерживаются симметричные и несимметричные шифры, а также различные алгоритмы электронной цифровой подписи. О Информационная безопасность О Вопросы и задания 1. Какой алгоритм шифрования принят в России в качестве государственного стандарта? 2. Что такое блочный алгоритм шифрования? 3. К какому типу относится алгоритм RSA? На чем основана его криптостойкость? 4. Что такое цифровая подпись? 5. Как можно использовать алгоритм RSA для цифровой подписи? Подготовьте сообщение а) «Стандарты шифрования разных стран» б) «Шифрование с открытым ключом: за и против* в) «Алгоритм Эль-Гамаля» г) «Цифровая подпись в Российской Федерации» Задачи *1. Напишите программу, которая строит открытый и секретный ключи RSA для небольших множителей р и q. *2. Напишите программу, которая шифрует и расшифровывает сообщения с помощью алгоритма при небольших значениях открытого и секретного ключей. §81 Стеганография При передаче сообщений можно не только применять шифрование, но и скрывать сам факт передачи сообщения. О Стеганография — это наука о скрытой передаче информации путём скрытия самого факта передачи информации. Древнегреческий историк Геродот описывал, например, такой метод: на бритую голову раба записывалось сообщение, а когда его волосы отрастали, он отправлялся к получателю, который брил его голову и читал сообщение. Классический метод стеганографии — симпатические (невидимые) чернила, которые проявляются только при определенных условиях (нагрев, освещение, химический проявитель). Например, текст, написанный молоком, можно прочитать при нагреве. Стеганография §81 Сейчас стеганография занимается скрытием информации в текстовых, графических, звуковых и видеофайлах с помощью программного «внедрения» в них нужных сообщений. Простейшие способ — заменять младшие биты файла, в котором закодировано изображение. Причём это нужно сделать так, чтобы разница между исходным и полученным рисунками была неощутима для человека. Например, в чёрно-белом рисунке (256 оттенков серого) яркость каждого пикселя кодируется 8 битами. Если поменять 1-2 младших бита этого кода, «встроив» туда текстовое сообщение, фотография, в которой нет чётких границ, почти не изменится. При замене одного бита каждый байт исходного текстового сообщения хранится в младших битах кодов 8 пикселей. Например, пусть первые 8 пикселей рисунка имеют такие коды: 10101101 10010100 00101010 01010010 10101010 10101010 10101011 10101111 Чтобы закодировать в них код буквы изменить младшие биты кодов: «и» (llOOlOOOg), нужно 10101101 10010101 0010101001010010 10101014 10101010 10101010 loioiiiO 1 1 0 0 1 0 0 0 Получателю нужно взять эти младшие биты и «собрать» их вместе в один байт. Для звуков используются другие методы стеганографии, основанные на добавлении в запись коротких условных сигналов, которые обозначают 1 и О и не воспринимаются человеком на слух. Возможна также замена одного фрагмента звука на другой. Для подтверждения авторства и охраны авторских прав на изображения, видео и звуковые файлы применяют цифровые водяные знаки — внедрённую в файл информацию об авторе. Они получили своё название от старых водяных знаков на деньгах и документах. Для того чтобы установить авторство фотографии, достаточно расшифровать скрытую информацию, записанную с помощью водяного знака. Иногда цифровые водяные знаки делают видимыми (текст или логотип компании на фотографии или на каждом кадре видеофильма). На многих сайтах, занимающихся продажей цифровых фотографий, видимые водяные знаки размещены на фотографиях, предназначенных для предварительного просмотра. Информационная безопасность Вопросы и задания 1. Что такое стеганография? 2. Какие методы стеганографии существовали до изобретения компьютеров? 3. Как можно добавить текст в закодированное изображение? 4. На чем основаны методы стеганографии для звуковых данных и видеоданных? 5. Что такое цифровые водяные знаки? Зачем они используются? Подготовьте сообщение «Водяные знаки в цифровую эпоху» §82 Безопасность в Интернете Угрозы безопасности Если компьютер подключён к Интернету, появляются дополнительные угрозы безопасности. Атаку через сеть могут проводить злоумышленники и боты (программы-роботы), находящиеся в других городах и странах. Можно выделить три основные цели злоумышленников: • использование вашего компьютера для взлома других компьютеров, атак на сайты, рассылки спама, подбора паролей и т. п.; • кража секретной информации — данных о банковских картах, имён и паролей для входа на почтовые серверы, в социальные сети, платёжные системы; • мошенничество — хищение чужого имущества путём обмана. Первые две угрозы связаны, главным образом, с вредоносными программами: вирусами, червями и «троянцами», которые позволяют злоумышленнику управлять компьютером через сеть и получать с него данные. Мошенничество процветает потому, что многие пользователи Интернета очень доверчивы и неосторожны. Классический пример мошенничества — так называемые нигерийские письма, приходящие по электронной почте. Пользователя от имени какого-то бывшего высокопоставленного лица просят принять участие в переводе крупных денежных сумм за границу, обещая выплачивать большие проценты. Если получатель соглашается, мошенники постепенно выманивают у него деньги. Безопасность в Интернете §82 Фишинг (англ, phishing, искажение слова fishing — рыбная ловля) — это выманивание паролей. Для этого чаще всего используются сообщения электронной почты, рассылаемые якобы от имени администраторов банков, платёжных систем, почтовых служб, социальных сетей. В сообщении говорится, что ваш счёт (или учётная запись) заблокирован, и даётся ссылка на сайт, который внешне выглядит как настоящий, но расположен по другому адресу (это можно проверить в адресной строке браузера). Неосторожный пользователь вводит своё кодовое имя и пароль, с помощью которых мошенник получает доступ к данным или банковскому счёту. Антивирусы и последние версии браузеров содержат специальные модули для обнаружения подозрительных сайтов {«анти-фишинг») и предупреждают о заходе на такой сайт. Кроме того, нужно помнить, что администраторы сервисов никогда не просят пользователя сообщить свой пароль по электронной почте. Мошенничество может быть связано и с вредоносными программами. В 2010 г. несколько миллионов компьютеров в России было заражено троянской программой Winlock, которая блокировала компьютер и требовала отправить платное SMS-сообщение для снятия блокировки. Правила личной безопасности Вредоносные программы, распространяющиеся через Интернет, представляют серьёзную угрозу безопасности данных. Нужно помнить, что многих проблем можно избежать, если работать в Интернете только из-под ограниченной учётной записи (без прав администратора). Кроме того, желательно своевременно обновлять программное обеспечение; особенно важно устанавливать «заплатки», связанные с безопасностью. Чтобы ваши пароли не украли, лучше не запоминать их в браузере (иногда они хранятся в открытом виде и могут быть украдены троянской программой). Заходя под своим именем в закрытую зону сайта с другого компьютера, нужно отмечать флажок Чужой компьютер, иначе тот, кто после вас откроет эту страницу на вашем компьютере, сможет получить доступ к вашим данным. На многих сайтах предусмотрена возможность восстановления пароля по секретному вопросу. Этот вопрос нужно выбирать так, чтобы никто другой не знал ответа на него и, самое важное, не мог его выведать. Например, ответы на вопросы «Как звали вашу первую собаку?», «Какое ваше любимое блюдо?» и т. п. часто можно найти на персональных страничках авторов в социальных Информационная безопасность сетях (в заметках, подписях к фотографиям и т. п.)- Если мама автора имеет свою страничку, на ней, скорее всего, можно найти её девичью фамилию, поэтому вопрос «Какова девичья фамилия вашей матери?» тоже лучше не использовать. Нужно понимать, что, размещая какую-то информацию в Интернете, вы делаете её доступной для широкого круга лиц, включая работодателей, милицию, официальные органы и даже преступников. Возможны ситуации, когда эта информация (личные данные, фотографии, высказывания на форумах и в блогах) может быть использована против вас, даже если она находится в закрытом разделе сайта. Для передачи информации, которую необходимо сохранить в тайне, лучше применять шифрование (например, упаковать данные в архив с паролем). Наибольший уровень безопасности обеспечивается при денежных расчётах через Интернет: вместо протокола HTTP используют защищенный протокол HTTPS (англ. Hypertext Transfer Protocol Secure — безопасный HTTP), который предусматривает шифрование данных (например, с помощью алгоритма RSA). Поэтому нужно проверять, чтобы адрес на странице ввода пароля в таких системах начинался с https://, а не с http://. Современные молодые люди часто общаются в чатах, форумах и т. п., в том числе с теми, кого они не знают лично. Продолжение такого виртуального (компьютерного, электронного) знакомства в реальной жизни весьма опасно, потому что нередко участники чатов и форумов представляются не теми, кем они являются на самом деле. Вопросы и задания 1. Какие угрозы безопасности существуют при подключении к Интернету? 2. Какие схемы интернет-мошенничества вам известны? 3. Какие меры безопасности нужно соблюдать при работе в Интернете? 4. Как обеспечивается безопасность обмена данными при денежных расчётах в Интернете? Подготовьте сообщение а) «Нигерийские письма» б) «Фишинг» в) «Безопасность финансовых расчётов в Интернете» Безопасность в Интернете §82 Практические работы к главе 10 Работа № 73 Работа № 74 Работа № 75 Работа № 76 «Использование антивирусных программ» «Простые алгоритмы пхифрования данных» «Современные алгоритмы шифрования и хэширования» «Использование стеганографии» ЭОР к главе 10 на сайте ФЦИОР (http//fcior.edu.ru) • Организация защиты при работе в сети • Компьютерные вирусы и антивирусные программы Методы и средства защиты программных продуктов • Сетевые и интернет-технологии. Компьютерная безопасность • Информационная безопасность Самое важное в главе 10 • Информационная безопасность — это защищённость информации от любых действий, в результате которых может быть искажена или утеряна информация либо нарушена её конфиденциальность, а владельцам или пользователям информации нанесён недопустимый ущерб. • Основные угрозы информационной безопасности — выход оборудования из строя, неправомерный доступ к информации, вредоносные программы. • Слабое звено любой системы информационной защиты — это человек. • Шифрование — это преобразование открытой информации в зашифрованную, недоступную для понимания посторонних. • Существуют системы шифрования с открытым ключом, при использовании которых все данные могут передаваться по незащищённому каналу связи. • Цифровая подпись — это набор символов, который получен в результате шифрования сообщения с помощью личного секретного кода отправителя. Навигационные значки Уважаемые ученики] В работе с книгой вам помогут навигационные значки: О о о — важное утверждение или определение. — вопросы и задания к параграфу. — дополнительное разъяснение. — задания для подготовки к итоговой аттестации. — к каждой главе учебника рекомендуются: 1) электронные образовательные ресурсы (ЭОР) с сайта Федерального центра образовательных ресурсов (ФЦИОР): http://fcior.edu.ru Доступ к ЭОР из каталога ФЦИОР: http://fcior.edu.ru/catalog/meta/4/mc/discipline% 2000/mi/4.06/p/page.html. Ресурсы размещены в алфавитном порядке, согласно названиям учебных тем; 2) практические работы на методическом сайте издательства lbz.metodist.ru в авторской мастерской К. Ю. Полякова и Е. А. Еремина. — Проектное или исследовательское задание. В ходе выполнения проекта (исследования) вы можете: • подготовить набор полезных ссылок с использованием веб-ресурсов; • подготовить небольшое выступление с использованием презентации (5-7 мин.); • оформить доклад и поместить его на сайт школьной конференции; • подтвердить полученные результаты расчётами и графиками (диаграммами); • подготовить видеоролик; • разместить материалы проекта (исследования) в коллекции обучающих модулей по предмету на сайте школы. Для заметок Для заметок '%! Г i J.W» rgii’i-i'i i - . * 1 W^'l> ' .r‘t . <^y ^ . ..- . I V.