Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
М. П. Батура, В. Л. Бусько, А. Г. Корбит, Т. М. Кривоносова
Основы алгоритмизации и программирования.
Язык Си
Допущено Министерством образования Республики Беларусь
в качестве учебного пособия
для студентов учреждений, обеспечивающих получение
высшего образования по специальностям «Искусственный интеллект», «Программное обеспечение информационных технологий»,
«Автоматизированные системы обработки информации»,
«Электронные вычислительные средства»,
«Инженерно-психологическое обеспечение информационных технологий»
Минск БГУИР 2007
УДК 621.3 (075.8)
ББК 22.193 я 73
Б 28
Р е ц е н з е н т ы :
зав. кафедрой алгоритмики и дискретной математики БГУ,
д-р техн. наук, проф. В. М. Котов;
начальник кафедры систем автоматического управления Военной академии Республики Беларусь, д-р техн. наук, проф. В. А. Куренев
Батура, М. П.
Б 28 Основы алгоритмизации и программирования. Язык Си : учеб. пособие / М. П. Батура, В. Л. Бусько, А. Г. Корбит, Т. М. Кривоносова. Минск : БГУИР, 2007. 240 с. : ил.
ISBN 978-985-488-192-8
Материал пособия составлен на основе курса лекций по дисциплине «Основы алгоритмизации и программирования», читаемого авторами в Белорусском государственном университете информатики и радиоэлектроники на факультете информационных технологий и управления.
Содержание пособия охватывает темы, посвященные основным конструкциям языка Си. Приведенные примеры, иллюстрирующие основные возможности языка, прошли проверку в качестве консольных приложений среды программирования Visual C++ 6.0.
Неотъемлемой частью учебного пособия являются индивидуальные задания для практических и лабораторных работ. В приложениях рассматриваются некоторые элементы языка С++, приведены дополнительные задания.
УДК 621.3 (075.8)
ББК 22.193 я 73
ISBN 978-985-488-192-8 УО «Белорусский государственный
университет информатики
и радиоэлектроники», 2007
СОДЕРЖАНИЕ
[1] [1.1] 1.1. Этапы решения задач на ЭВМ [1.2] 1.2. Понятие алгоритма [1.3] 1.3. Свойства алгоритмов [1.4] 1.4. Сложность алгоритма [1.5] 1.5. Способы описания алгоритмов [1.6] 1.6. Способы реализации алгоритмов [1.7] 1.7. Пример простейшего линейного процесса [1.8] 1.7. Пример циклического процесса
[2] [2.1] 2.1. Алфавит языка Си [2.2] 2.2. Лексемы [2.3] 2.3. Идентификаторы и ключевые слова [2.4] 2.4. Комментарии [2.5] 2.5. Простейшая программа [2.6] 2.6. Основные типы данных [2.7] 2.7. Декларация объектов [2.8] 2.8. Данные целого типа (integer) [2.9] 2.9. Данные символьного типа (char) [2.10] 2.10. Данные вещественного типа (float, double) [2.11] 2.11. Использование модификаторов при декларации производных типов данных [3] ГЛАВА 3. Константы в программах [3.1] 3.1. Целочисленные константы [3.2] 3.2. Константы вещественного типа [3.3] 3.3. Символьные константы [3.4] 3.4. Строковые константы [4] ГЛАВА 4. Обзор операций [4.1] 4.1. Операции, выражения [4.2] 4.2. Арифметические операции [4.3] 4.3. Операция присваивания [4.4] 4.4. Сокращенная запись операции присваивания [4.4.0.1] Смысл записи [4.4.0.2] Значения [4.5] 4.5. Преобразование типов операндов арифметических операций [4.6] 4.6. Операция приведения типа [4.7] 4.7. Операции сравнения [4.8] 4.8. Логические операции [4.9] 4.9. Побитовые логические операции, операции над битами [4.10] 4.10. Операция «,» (запятая) [5] ГЛАВА 5. Обзор базовых инструкций языка Си [5.1] 5.1. Стандартная библиотека языка Си [5.2] 5.2. Стандартные математические функции [5.3] 5.3. Функции вывода данных на дисплей [5.4] 5.4. Функции ввода информации [5.4.1] Советы по программированию [6] ЗАДАНИЕ 1. Составление линейных алгоритмов [6.0.1] Первый уровень сложности [6.0.2] Второй уровень сложности
[7] [7.1] 6.1. Краткая характеристика операторов языка Си [7.2] 6.2. Условные операторы [7.3] 6.3. Условная операция «? :» [7.4] 6.4. Оператор выбора альтернатив (переключатель)
[8] [8.1] 7.1. Понятие циклического кода [8.2] 7.2. Оператор с предусловием while [8.3] 7.3. Оператор цикла с постусловием do while [8.4] 7.4. Оператор цикла с предусловием и коррекцией for
[9] [9.1] 8.1. Оператор безусловного перехода goto [9.2] 8.2. Операторы continue, break и return [9.3] 8.3. Функции exit и abort [9.3.1] Советы по программированию [10] ЗАДАНИЕ 2. Разветвляющиеся алгоритмы [10.0.1] Первый уровень сложности [10.0.2] Второй уровень сложности [11] ЗАДАНИЕ 3. Циклические алгоритмы [11.0.1] Первый уровень сложности [11.0.2] Второй уровень сложности [12] ГЛАВА 9. Указатели [12.1] 9.1. Определение указателей [12.2] 9.2. Операция sizeof [12.3] 9.3. Инициализация указателей [12.4] 9.4. Операции над указателями [13] ГЛАВА 10. Массивы [13.1] 10.1. Понятие массива [13.2] 10.2. Одномерные массивы [13.3] 10.3. Связь указателей и массивов [13.4] 10.4. Строки как одномерные массивы данных типа char [13.5] 10.5. Указатели на указатели [13.6] 10.6. Многомерные массивы [13.7] 10.7. Адресная функция [13.8] 10.8. Работа с динамической памятью [13.9] 10.9. Библиотечные функции [13.10] 10.10. Пример создания одномерного динамического массива [13.11] 10.11. Пример создания двухмерного динамического массива [14] ГЛАВА 11. Функции пользователя [14.1] 11.1. Декларация функции [14.2] 11.2. Вызов функции [14.3] 11.3. Передача аргументов в функцию [14.4] 11.4. Операция typedef [14.5] 11.5. Указатели на функции [14.6] 11.6. Рекурсивные функции [14.7] 11.7. Параметры командной строки функции main [15] ГЛАВА 12. Классы памяти и область действия объектов [15.1] 12.1. Классы памяти объектов в языке Cи [15.2] 12.2. Автоматические переменные [15.3] 12.3. Статические и внешние переменные [15.4] 12.4. Область действия переменных [15.4.1] Советы по программированию [16] ЗАДАНИЕ 4. Обработка массивов [16.0.1] Первый уровень сложности [16.0.2] Второй уровень сложности [17] ЗАДАНИЕ 5. Функции пользователя [17.0.1] Первый уровень сложности [17.0.2] Второй уровень сложности [18] ГЛАВА 13. Структуры, объединения, перечисления [18.1] 13.1. Структуры [18.2] 13.2. Декларация структурного типа данных [18.3] 13.3. Создание структурных переменных [18.4] 13.4. Обращение к полям структур [18.5] 13.5. Вложенные структуры [18.6] 13.6. Массивы структур [18.7] 13.7. Размещение структурных переменных в памяти [18.8] 13.8. Объединения [18.9] 13.9. Перечисления [18.10] 13.10. Битовые поля [19] ГЛАВА 14. Файлы в языке Си [19.1] 14.1. Открытие файла [19.2] 14.2. Закрытие файла [19.3] 14.3. Запись-чтение информации [19.4] 14.4. Позиционирование в файле [19.5] 14.5. Дополнительные файловые функции [19.5.1] Советы по программированию [20] ЗАДАНИЕ 6. Создание и обработка структур [20.0.1] Первый уровень сложности [20.0.2] Второй уровень сложности [21] ЗАДАНИЕ 7. Создание и обработка файлов [21.0.1] Первый уровень сложности [21.0.2] Второй уровень сложности [22] ГЛАВА 15. Динамические структуры данных [22.1] 15.1. Линейные списки [22.2] 15.2. Структура данных СТЕК [22.2.1] 15.2.1. Алгоритм формирования стека [22.2.2] 15.2.2. Алгоритм извлечения элемента из стека [22.2.3] 15.2.3. Просмотр стека [22.2.4] 15.2.4. Алгоритм освобождения памяти, занятой стеком [22.2.5] 15.2.5. Алгоритм проверки правильности расстановки скобок [22.3] 15.3. Структура данных ОЧЕРЕДЬ [22.3.1] 15.3.1. Формирование очереди [22.3.2] 15.3.2. Алгоритм удаления первого элемента из очереди [22.4] 15.4. Двунаправленный линейный список [22.4.1] 15.4.1. Формирование первого элемента [22.4.2] 15.4.2. Добавление элементов в конец списка [22.4.3] 15.4.3. Алгоритм просмотра списка [22.4.4] 15.4.4. Алгоритм поиска элемента в списке по ключу [22.4.5] 15.4.5. Алгоритм удаления элемента в списке по ключу [22.4.6] 15.4.6. Алгоритм вставки элемента в список после элемента с указанным ключом [22.5] 15.5. Нелинейные структуры данных [22.5.1] 15.5.1. Бинарные деревья [22.5.2] 15.5.2. Основные алгоритмы работы с бинарным деревом [22.5.3] 15.5.3. Формирование дерева [22.5.4] 15.5.4. Вставка нового элемента [22.5.5] 15.5.5. Удаление узла [22.5.6] 15.5.6. Алгоритмы обхода дерева [22.5.7] 15.5.7. Функция просмотра [22.5.8] 15.5.8. Освобождение памяти [22.6] 15.6. Построение обратной польской записи [22.6.1] 15.6.1. Алгоритм, использующий дерево [22.6.2] 15.6.2. Алгоритм, использующий стек [22.6.3] 15.6.3. Пример реализации [22.7] 15.7. Понятие хеширования [22.7.1] 15.7.1. Хеш-таблица и хеш-функции [22.7.2] 15.7.2. Примеры хеш-функций [22.7.3] 15.7.3. Схемы хеширования [22.7.4] 15.7.4. Примеры реализации схем хеширования [23] ЗАДАНИЕ 8. Обработка списков [23.0.1] Вариант 1. Однонаправленные списки [23.0.2] Вариант 2. Двунаправленные списки [24] ЗАДАНИЕ 9. Деревья и польская запись [24.0.1] Вариант 1. Создание и обработка структур типа «дерево» [24.0.2] Вариант 2. Создание и использование польской записи
[25] [25.1] 16.1. Потоковый ввод-вывод [25.2] 16.2. Управление выводом [25.3] 16.3. Проблема ввода-вывода кириллицы в среде Visual C++ [25.4] 16.4. Операции new и delete [25.5] 16.5. Дополнительные возможности при работе с пользовательскими функциями [25.6] 16.6. Шаблоны функций [25.6.1] Советы по программированию [26] ЗАДАНИЕ 10. Перегрузка функций [26.0.1] Первый уровень сложности [26.0.2] Второй уровень сложности
[27] [28] Операции языка Си
[29] [30] Возможности препроцессора [31] Интегрированная среда программирования Visual C++ [32] [33] Некоторые возможности отладчика Visual C++ [34] Некоторые возможности графической подсистемы [34.1] 6.1. Основные понятия [34.2] 6.2. Контекст устройства [34.3] 6.3. Примитивы GDI [34.4] 6.4. Пример вывода текста [34.5] 6.5. Получение описателя контекста устройства [34.6] 6.6. Основные инструменты графической подсистемы [34.7] 6.7. Закрашивание пустот [34.8] 6.8. Рисование линий и кривых [34.9] 6.9. Пример изображения графика функции sin [34.10] 6.10. Рисование замкнутых фигур [34.11] 6.11. Функция Polygon и режим закрашивания многоугольника [34.12] 6.12. Пример отображения линий [34.13] 6.13. Управление областями вывода и отсечением [34.14] 6.14. Растровая графика [35] ЗАДАНИЕ 11. Создание графических изображений [36] ЛИТЕРАТУРА |
ПРЕДИСЛОВИЕ
Алгоритмический язык Си был разработан в 1972 г. сотрудником фирмы AT&T Bell Laboratory Денисом Ритчи на базе языка В (автор К.Томпсон), который в свою очередь основывался на языке системного программирования BCPL. Первая версия языка была опубликована в книге авторов Б. Кернигана и Д. Ритчи и получила название стандарт K&R. Минимальная стандартная реализация, поддерживаемая любым компилятором, содержала всего 27 ключевых слов. Началось успешное развитие языка и, чтобы избежать путаницы, Американский институт стандартизации (American National Standart Institute) ввел в 1983 г. общий стандарт языка ANSI-стандарт.
Язык продолжает развиваться, и в 1985 г. появляется язык С++, который в основном сохраняет все черты обычного Си, но дополнен новыми существенными возможностями, которые позволили реализовать объектно-ориентированный стиль программирования.
Язык Си отражает возможности современных компьютеров и обладает следующими достоинствами это современный, эффективный, переносимый (мобильный), мощный и гибкий, удобный и обладающий рядом присущих ассемблеру управляющих конструкций язык высокого уровня.
Программы на Си отличаются компактностью и быстротой исполнения. Структура языка Си побуждает программиста использовать в своей работе нисходящее программирование, структурное программирование, пошаговую разработку модулей.
Любой язык представляет собой описание определенного набора действий (операции, операторы, функции) над некоторыми данными. Данным, над которыми выполняются эти действия, вместо номеров ячеек в памяти принято давать имена (идентификаторы), а содержимое ячеек называть переменными, или константами, в зависимости от того, изменяется значение в процессе работы или нет.
Под системой программирования понимают совокупность языка программирования и виртуальной машины, обеспечивающей выполнение программ, составленных на этом языке.
Виртуальная машина это программный комплекс, имитирующий работу реальной машины с определенным входным языком на ЭВМ с другим машинным языком, т.е. реализующий входной язык программирования. Виртуальная машина содержит транслятор и/или интерпретатор и может включать библиотеки стандартных подпрограмм, отладчик, компоновщик и другие сервисные средства.
Транслятор представляет собой программу, осуществляющую перевод текстов с входного языка на машинный язык. Одной из разновидностей транслятора является компилятор, обеспечивающий перевод программ с языка высокого уровня (приближенного к человеку) на язык более низкого уровня (близкий к ЭВМ), или машинозависимый язык.
Текст программы, записанный на языке высокого уровня и введенный с помощью клавиатуры в память компьютера, исходный модуль. Программы, написанные в среде программирования, предназначенной для языка Си, например Turbo C, имеют расширение *.с. Расширение *.cpp имеют программы, написанные в интегрированных средах Borland C++, Visual C++, Builder C++, предназначенных для написания программ как на языке Си, так и на языке С++.
Большинство трансляторов языка Си компиляторы.
Результат обработки исходного модуля компилятором объектный модуль (расширение *.obj). На этом этапе компилятор выделяет лексемы (элементарные конструкции языка), затем на основе грамматики распознает выражения и операторы, построенные из этих лексем. При этом компилятор выявляет синтаксические ошибки и, в случае их отсутствия, создает объектный модуль.
Исполняемый (абсолютный, загрузочный) модуль создает вторая специальная программа «компоновщик». Ее еще называют редактором связей (Linker). Она и создает загрузочный модуль (расширение *.exe) на основе одного или нескольких объектных модулей это программный модуль, представленный в форме, пригодной для выполнения.
Главным классифицирующим признаком языков и, следовательно, систем программирования, является принадлежность к одному из оформившихся к настоящему времени стилей программирования, основные среди которых процедурное, функциональное, логическое и объектно-ориен-
тированное.
Условно программированием можно назвать научную и практическую деятельность по созданию программ. Основной частью программирования является процесс решения задачи на ЭВМ, который можно разбить на следующие этапы:
1) математическая или информационная формулировка задачи;
2) выбор численного или иного метода решения поставленной задачи;
3) построение алгоритма решения поставленной задачи;
4) выбор языка программирования и запись построенного алгоритма по его правилам, т.е. написание текста программы;
5) отладка программы это процесс обнаружения, локализации и устранения возможных ошибок;
6) выполнение программы, т.е. получение требуемого результата.
Рассмотрим более подробно некоторые наиболее важные из приведенных этапов.
Понятие алгоритма занимает центральное место в современной математике и программировании.
Алгоритмизация сведение задачи к последовательным этапам действий так, что результаты предыдущих действий используются при выполнении последующих.
Рассмотрим вначале некоторые наиболее важные (фундаментальные) понятия программирования.
1. Действие это некоторая операция, имеющая конкретную продолжительность и приводящая к совершенно конкретному результату.
2. Каждое действие предполагает наличие некоторых данных, над которыми это действие совершается и по изменению состояния которых определяют результат этого действия.
3. Каждое действие должно быть таким, чтобы его можно было описать при помощи какого-либо языка (или набора формул); такое описание называют инструкция.
4. Если действие можно разложить на составные части, то его называют процессом (или вычислением).
5. Описание характера проведения процесса, т.е. последовательности выполняемых действий без привязки к какому-то конкретному процессору, называют алгоритмом.
Числовой алгоритм детально описанный способ преобразования числовых входных данных в выходные при помощи математических операций. Существуют нечисловые алгоритмы, которые используются в экономике, технике и научных исследованиях.
В общем, алгоритм строгий и четкий набор правил, определяющий последовательность действий, приводящих к достижению поставленной цели.
Дискретность значения новых величин (данных) вычисляются по определенным правилам из других величин с уже известными значениями.
Определенность (детерминированность) каждое правило из набора однозначно, а сами данные однозначно связаны между собой, т.е. последовательность действий алгоритма строго и точно определена.
Результативность (конечность) алгоритм решает поставленную задачу за конечное число шагов.
Массовость алгоритм разрабатывается так, чтобы его можно было применить для целого класса задач, например, алгоритм вычисления определенных интегралов с заданной точностью.
Выполнение любого алгоритма требует определенного объема памяти компьютера для размещения данных и программы, а также времени по обработке этих данных эти ресурсы ограничены и, следовательно, правомочен вопрос об эффективности их использования. Таким образом, в самом широком смысле понятие эффективности связано со всеми вычислительными ресурсами, необходимыми для работы алгоритма.
Однако обычно под «самым эффективным» понимается алгоритм, обеспечивающий наиболее быстрое получение результата, поэтому рассмотрим именно временнýю сложность алгоритмов.
Время работы алгоритма удобно выражать в виде функции от одной переменной, характеризующей «размер» конкретной задачи, т.е. объем входных данных, необходимых для ее решения. Тогда сравнительная сложность задач и может оцениваться через ее размер.
Поскольку описание задачи, предназначенной для решения посредством вычислительного устройства, можно рассматривать в виде слова конечной длины, представленной символами конечного алфавита, в качестве формальной характеристики размера задачи можно принять длину входного слова. Например, если стоит задача определения максимального числа в некоторой последовательности из n элементов, то и размер задачи будет n, поскольку любой вариант входной последовательности можно задать словом из n символов.
Временная сложность алгоритма это функция, которая каждой входной длине слова n ставит в соответствие максимальное (для всех конкретных задач длиной n) время, затрачиваемое алгоритмом на ее решение.
Различные алгоритмы имеют различную временную сложность и выяснение того, какие из них окажутся достаточно эффективны, а какие нет, определяется многими факторами. Однако для сравнения эффективности алгоритмов был предложен простой подход, позволяющий прояснить ситуацию. Речь идет о различии между полиномиальными и экспоненциальными алгоритмами.
Полиномиальным называется алгоритм, временнàя сложность которого выражается некоторой полиномиальной функцией размера задачи n. Алгоритмы, временнáя сложность которых не поддается подобной оценке, называются экспоненциальными.
Задача считается труднорешаемой, если для нее не удается построить полиномиального алгоритма. Это утверждение не является категорическим, поскольку известны задачи, в которых достаточно эффективно работают и экспоненциальные алгоритмы. Примером может служить симплекс-метод, который успешно используется при решении задач линейного программирования, имея функцию сложности f(n) = 2n. Однако подобных примеров не очень много, и общей следует признать ситуацию, когда эффективно исполняемыми можно считать полиномиальные алгоритмы с функциями сложности n, n2 или n3.
Например, при решении задачи поиска нужного элемента из n имеющихся в худшем варианте сложность равна n; если же оценить среднюю трудоемкость (продолжительность поиска), то она составит (n+1)/2 в обоих случаях функция сложности оказывается линейной n.
Сложность задачи вычисления определителя системы n линейных уравнений с n неизвестными характеризуется полиномом 3-й степени. Повышение быстродействия элементов компьютера уменьшает время исполнения алгоритма, но не уменьшает степень полинома сложности.
Существует несколько способов описания алгоритмов. Наиболее распространенные способы это словесное и графическое описания алгоритма.
Словесное описание алгоритма
В любом алгоритме для обозначения данных используют некоторый набор символов, называемых буквами. Конечную совокупность букв называют алфавитом, из любой конечной последовательности которого можно составить слово, т.е. в любом алфавите реальным данным можно сопоставить некоторые слова, в дальнейшем обозначающие эти данные.
При словесной записи алгоритм описывается с помощью естественного языка с использованием следующих конструкций:
1) шаг (этап) обработки (вычисления) значений данных «=»;
2) проверка логического условия: если (условие) истинно, то выполнить действие 1, иначе действие 2;
3) переход (передача управления) к определенному шагу (этапу) N.
Для примера рассмотрим алгоритм решения квадратного уравнения вида ax2+bx+c = 0:
1) ввод исходных данных a, b, c (a,b,c 0);
2) вычислить дискриминант D = b2 4ac ;
3) если D < 0, то перейти к п. 6, сообщив, что действительных корней нет;
4) иначе, если D 0, вычислить х1= (b+)/(2a) и х2 = (b)/(2a);
5) вывести результаты х1 и х2 ;
6) конец.
Графическое описание алгоритма
Графическое изображение алгоритма это представление его в виде схемы, состоящей из последовательности блоков (геометрических фигур), каждый из которых отображает содержание очередного шага алгоритма. А внутри фигур кратко записывают действие, выполняемое в этом блоке. Такую схему называют блок-схемой или структурной схемой алгоритма, или просто схемой алгоритма.
Правила изображения фигур сведены в единую систему программной документации (дата введения последнего стандарта ГОСТ 19.701.90 01.01.1992).
По данному ГОСТу графическое изображение алгоритма это схема данных, которая отображает путь данных при решении задачи и определяет этапы их обработки.
Схема данных состоит из следующих элементов:
Рассмотрим основные символы для изображения схемы алгоритма.
Символы ввода-вывода данных:
данные ввода-вывода, если носитель не определен;
ручной ввод с устройства любого типа, например с клавиатуры;
отображение данных в удобочитаемой форме на устройстве, например дисплее.
Символы процесса:
процесс отображение функции обработки данных, т.е. операции, приводящей к изменению указанного значения;
предопределенный процесс отображение группы операций, которые определены в другом месте, например в подпрограмме (функции);
решение отображение функции, имеющей один вход и ряд альтернативных выходов, из которых только один может быть активизирован после анализа условия, указанного внутри этого символа.
Символы линий отображают поток данных или управления. Линии горизонтальные или вертикальные, имеющие только прямой угол перегиба. Стрелки указатели направления не ставятся, если управление идет сверху вниз или слева направо.
Специальные символы
Соединитель используется при обрыве линии и продолжении ее в другом месте (необходимо присвоить название).
Терминатор вход из внешней среды или выход во внешнюю среду (начало или конец схемы программы).
Комментарий.
Любую программу можно разбить на блоки, реализованные в виде алгоритмов (процессов), которые можно разделить на три вида:
1) линейные (единственное направление выполнения);
2) разветвляющиеся (направление выполнения определяет условие);
3) циклические (отдельные участки вычислений выполняются многократно).
Любой циклический процесс включает в себя участок с разветвлением и может быть простым и сложным (вложенным).
Для решения вопроса о том, сколько раз нужно выполнить цикл, используется анализ переменной, которую называют параметром цикла.
Циклический процесс, в котором количество повторений заранее известно, называется циклом по счетчику, а циклический процесс, в котором количество повторений заранее неизвестно и зависит от получаемого в ходе вычислений результата, называют итерационным.
Наиболее часто в практике программирования требуется организовать расчет некоторого арифметического выражения при различных исходных данных. Например, такого:
где x > 0 вещественное, m целое.
Разработка алгоритма обычно начинается с составления схемы. Продумывается оптимальная последовательность вычислений, при которой, например, отсутствуют повторения. При написании алгоритма рекомендуется переменным присваивать те же имена, которые фигурируют в заданном арифметическом выражении либо иллюстрируют их смысл.
Для того чтобы не было «длинных» операторов, исходное выражение полезно разбить на ряд более простых. В нашей задаче предлагается схема вычислений, представленная на рис. 1.1.
Рис. 1.1. Схема линейного процесса
Она содержит ввод и вывод исходных данных, линейный вычислительный процесс, вывод полученного результата. Заметим, что выражение вычисляется только один раз. Введя дополнительные переменные a, b, c, мы разбили сложное выражение на ряд более простых.
Вычислить значение функции y = sin x, представленной в виде разложения в ряд, с заданной точностью, т.е. до тех пор, пока разность между соседними слагаемыми не станет меньше заданной точности:
.
Схема алгоритма, приведенная на рис. 1.2, реализует циклический процесс, в состав которого (в блоке проверки |E|< eps) входит участок разветвления.
Рис. 1.2. Схема циклического алгоритма
Любая программа, написанная на языке высокого уровня, состоит из последовательности инструкций, оформленных в строгом соответствии с набором правил, составляющих синтаксис данного языка.
При создании программ разработчик может допустить следующие ошибки: синтаксические и логические.
Синтаксические ошибки это результат нарушения формальных правил написания программы на конкретном языке программирования.
Логические ошибки разделяются, в свою очередь, на ошибки алгоритма и семантические ошибки.
Причиной ошибки алгоритма является несоответствие построенного алгоритма ходу получения конечного результата сформулированной задачи.
Причина семантической ошибки неправильное понимание смысла (семантики) операторов выбранного языка программирования.
Алфавит любого языка составляет совокупность символов тех неделимых знаков, при помощи которых записываются все тексты на данном языке.
Каждому из множества значений, определяемых одним байтом (от 0 до 255), в таблице знакогенератора ЭВМ ставится в соответствие символ. По кодировке фирмы IBM символы с кодами от 0 до 127, образующие первую половину таблицы знакогенератора, построены по стандарту ASCII и одинаковы для всех компьютеров, вторая половина символов (коды 128 255) может отличаться и обычно используется для размещения символов национального алфавита. Коды 176 223 отводятся под символы псевдографики, а коды 240 255 под специальные знаки (прил. 1).
Алфавит языка Си включает:
прописные и строчные буквы латинского алфавита и знак подчеркивания (код 95);
арабские цифры от 0 до 9;
специальные символы, смысл и правила использования которых будем рассматривать по тексту;
пробельные (разделительные) символы: пробел, символы табуляции, перевода строки, возврата каретки, новой страницы и новой строки.
Из символов алфавита формируются лексемы (или элементарные конструкции) языка минимальные значимые единицы текста в программе:
идентификаторы;
ключевые (зарезервированные) слова;
знаки операций;
константы;
разделители (скобки, точка, запятая, пробельные символы).
Границы лексем определяются другими лексемами, такими как разделители или знаки операций, а также комментариями.
Идентификатор (ID) это имя программного объекта