Языки и технология программирования
Языки и технология программирования
Министерство общего и профессионального образования Российской Федерации Уральский государственный университет им. А.М. Горького Лахтин А.С., Искакова Л.Ю. Языки и технология программирования. Начальный курс. Учебное пособие Екатеринбург 1998 Лахтин А.С., Искакова Л.Ю. Языки и технология программирования. Начальный курс. Учеб. пособие. Екатеринбург, 1998. Данное учебное пособие представляет собой первую часть одноименного лекционного курса, который читается студентам математико-механического факультета в 1 семестре. Начальный курс посвящен изложению основ создания программ. Изложение ведется с использованием языка программирования Турбо Паскаль. Рассматриваются некоторые классические алгоритмы. Приводятся примеры решения типовых задач. Пособие предназначено для студентов дистантной формы обучения специальности "Информационные системы", а также может быть использовано для студентов дневной формы обучения по этой специальности. А.С. Лахтин, Л.Ю. Искакова, 1998. СОДЕРЖАНИЕ ВВЕДЕНИЕ ОСНОВЫ ЯЗЫКА АЛГОРИТМЫ АЛФАВИТ ЯЗЫКА СТРУКТУРА ПРОГРАММЫ ТИПЫ ДАННЫХ Целые типы Вещественные типы Логический тип Символьный тип ВЫРАЖЕНИЯ СОВМЕСТИМОСТЬ ТИПОВ ДАННЫХ ЛИНЕЙНЫЕ АЛГОРИТМЫ ПУСТОЙ И СОСТАВНОЙ ОПЕРАТОРЫ ОПЕРАТОР ПРИСВАИВАНИЯ ПРОСТЕЙШИЙ ВВОД И ВЫВОД РАЗВЕТВЛЯЮЩИЕСЯ АЛГОРИТМЫ ОПЕРАТОР ПЕРЕХОДА УСЛОВНЫЙ ОПЕРАТОР ОПЕРАТОР ВЫБОРА ЦИКЛИЧЕСКИЕ АЛГОРИТМЫ ЦИКЛЫ С ПАРАМЕТРОМ. ЦИКЛЫ С УСЛОВИЕМ. ПОЛЬЗОВАТЕЛЬСКИЕ ТИПЫ ДАННЫХ ПЕРЕЧИСЛЯЕМЫЙ ТИП ТИП-ДИАПАЗОН МАССИВЫ ЗАПИСИ РАБОТА СО СТРОКАМИ ПРОЦЕДУРЫ И ФУНКЦИИ Параметры-значения Параметры-переменные Параметры-константы ОТКРЫТЫЕ ПАРАМЕТРЫ-МАССИВЫ БЕСТИПОВЫЕ ПАРАМЕТРЫ ПРОЦЕДУРНЫЕ ТИПЫ РЕКУРСИЯ ТИПИЗИРОВАННЫЕ КОНСТАНТЫ МОДУЛИ АЛГОРИТМЫ ПОИСКА ЛИНЕЙНЫЙ ПОИСК ПОИСК С БАРЬЕРОМ ДВОИЧНЫЙ (БИНАРНЫЙ) ПОИСК АЛГОРИТМЫ СОРТИРОВКИ СОРТИРОВКА ВЫБОРОМ СОРТИРОВКА ОБМЕНОМ (методом "пузырька") ШЕЙКЕРНАЯ СОРТИРОВКА СОРТИРОВКА ВКЛЮЧЕНИЕМ СОРТИРОВКА ХОАРА СОРТИРОВКА С ИСПОЛЬЗОВАНИЕМ ВЕКТОРА ИНДЕКСОВ МОДУЛЬ CRT (основные возможности) ЛИТЕРАТУРА ВВЕДЕНИЕ Первая версия языка Паскаль была разработана швейцарским ученым Никлаусом Виртом в 1968 году. Первоначально язык предназначался для целей обучения, поскольку он является достаточно детерминированным, т.е. все подчиняется определенным правилам, исключений из которых не так много. Основные характеристики: относительно небольшое количество базовых понятий, простой синтаксис, быстрый компилятор для перевода исходных текстов в машинный код. В 1992 г. фирма Borland International выпустила два пакета, основанных на языке Паскаль: Borland Pascal 7.0 и Turbo Pascal 7.0. Первый может работать в трех режимах - обычном и защищенном режимах MS DOS и в системе Windows. Для него необходимо порядка 30 Мбайт на жестком диске и около 2 Мбайт оперативной памяти. Турбо Паскаль 7.0 работает только в обычном режиме MS DOS и менее требователен к характеристикам компьютера. Поскольку основные компоненты, которые мы будем рассматривать в нашем курсе, совпадают в обоих продуктах, в дальнейшем будет использоваться название Турбо Паскаль. Пакет включает в себя алгоритмический язык программирования высокого уровня, встроенный редактор и среду, предназначенную для отладки и запуска программ. Кроме того, пакет содержит большой объем справочной информации (англоязычной). Как известно, языки программирования делятся на два типа: интерпретаторы и компиляторы. Турбо Паскаль относится к компиляторным языкам. ОСНОВЫ ЯЗЫКА АЛГОРИТМЫ Алгоритмом называют описание последовательности действий, необходимых для решения определенной задачи. Основными характеристиками алгоритма являются вычислительная сложность и емкостная сложность. Вычислительная или, иначе, временная сложность алгоритма - это количество элементарных операций в процессе его выполнения. Различают вычислительную сложность в среднем и в худшем случае. Емкостная сложность алгоритма - это объем используемых данных, а также объем кода самой программы. При создании алгоритма целью является сокращение как его вычислительной, так и емкостной сложности. Алгоритмы могут записываться различными способами, например, в виде блок-схем или в виде программ. Программа это набор указаний исполнителю, т.е. в нашем случае - компьютеру. АЛФАВИТ ЯЗЫКА Под алфавитом языка понимают совокупность допустимых символов. В языке Турбо Паскаль используются символы ASCII (американский стандартный код обмена информацией). Можно выделить четыре основные группы символов: символы, используемые в идентификаторах, разделители, специальные символы и неиспользуемые символы. Идентификатор - это имя любого объекта языка. Он может состоять из латинских букв (a...z), цифр (0...9) и знака подчеркивания и не должен начинаться с цифры. Прописные и строчные буквы в идентификаторах и зарезервированных словах считаются идентичными, они различаются лишь в строковых константах. Длина идентификатора не ограничена, но значимыми являются лишь первые 63 символа. Разделители используются для отделения друг от друга идентификаторов, чисел и зарезервированных слов. К разделителям относятся, например, пробел и комментарий. В любом месте программы, где разрешается один пробел, их можно вставить любое количество. Комментарии заключаются либо в фигурные скобки { комментарий 1 }, либо в символы (* комментарий 2 *) и могут занимать любое количество строк. Последовательность из трех символов (*) начинает комментарий до конца строки. Текст комментария игнорируется при компиляции, если это не директивы компилятора, которые имеют вид {$ }. ПРИМЕР : (*Допустимый {{{в (* программе} комментарий*). (*Недопустимый {{{в (* программе*) комментарий*). К специальным знакам относятся знаки пунктуации (. () [] .. : ;), знаки операций и зарезервированные слова. Знаки операций могут быть как символьные (+,-,*,/ и т.д.), так и буквенными (mod, div, not). Зарезервированные слова являются служебными и не могут быть переопределены пользователем, т.е. их нельзя использовать как имена пользовательских объектов. Неиспользуемые символы - это коды ASCII, которые используются только в комментариях и символьных строках, но не в языке. К ним относятся все русские буквы, а также символы %, &, ! и т.п. СТРУКТУРА ПРОГРАММЫ В программе, написанной на Турбо Паскале, могут быть следующие разделы: Program ... ; { Заголовок программы } Uses ... ; { Подключение модулей } Label ... ; { Раздел объявления меток } Const ... ; { Раздел объявления констант } Type ... ; { Раздел объявления новых типов } Var ... ; { Раздел объявления переменных } Procedure ... ; { Описание своих процедур } Function ... ; { Описание своих функций } Begin { начало основной программы } ...; { Операторы } ...; End. Обязательной частью является лишь тело программы, которое начинается словом begin, а заканчивается словом end с точкой. Операторы в Паскале разделяются точкой запятой. Заголовок программы является хотя и необязательным, но желательным элементом и состоит из зарезервированного слова program и идентификатора - имени программы, за котором следует точка с запятой. Порядок объявлений и описаний не регламентируется. ПРИМЕР : Простейшая программа. program prim_1; { демонстрация структуры программы} {эта программа не требует никаких объявлений и описаний} begin write('Привет! Вот мы и начали.') (* эта строка текста появится на экране *) end. ТИПЫ ДАННЫХ Понятие типа данных является ключевым в языке Паскаль. Тип данных характеризует внутреннее представление, множество допустимых значений для этих данных, а также совокупность операций над ними. Среди типов данных различают стандартные (предопределенные разработчиками языка) и пользовательские (определяемые программистом в своей программе). Мы будем рассматривать следующие стандартные типы: целые числа, вещественные числа, логический тип, символьный и строковый типы. Программист может описать свой тип на основе этих базовых в разделе описания типов, который начинается словом Type. Затем для каждого типа следует конструкция вида: идентификатор типа = определение типа; Рассмотрим сначала простые типы данных, каждый из которых определяет упорядоченное множество значений: целые типы, логический тип, символьный тип, вещественные типы. Все эти типы, кроме вещественных являются порядковыми. Каждому значению порядкового типа функция Ord ставит в соответствие натуральное число - порядковый номер данного значения в множестве допустимых значений. К любым порядковым типам также можно применять функции Pred - возвращает предыдущее значение и Succ - следующее значение. Тип относится к упорядоченным если для переменных и выражений этого типа определены операции отношения или сравнения: =, <>, <, >, <=, >=. Любой порядковый тип является упорядоченным, но не наоборот. Так вещественные типы и тип string упорядоченные, но не порядковые. Целые типы В языке Турбо Паскаль определено 5 целых типов: Shortint (-128 ... 127, 1 байт), Integer (-32767 ... 32768, 2 байта), Longint (-2147483648 ... 2147483647, 4 байта), Byte (0 ... 255, 1 байт), Word (0 ... 65535, 2 байта). Для целых чисел определены такие операции. Унарные: +,-. Бинарные: сложение, вычитание, умножение, получение частного (div) и остатка (mod) при целочисленном делении и некоторые другие. Также с целыми числами можно производить операции, результаты которых не целые числа. Это обычное деление и операции отношения. Кроме того, имеется большое количество встроенных функций для работы с целыми числами: abs, sqr, sqrt, sin, cos, exp, ln и др. Вещественные типы В Турбо Паскале имеется 5 вещественных типов. Real (занимает 6 байт, диапазон от 2.9E-39 до 1.7E+38 по модулю, точность 11-12 значащих цифр) Single (занимает 4 байта, диапазон от 1.5E-45 до 3.4E+38 по модулю, точность 7-8 значащих цифр) Double (занимает 8 байт, диапазон от 5.0Е-324 до 1.7Е+308 по модулю, точность 15-16 значащих цифр) Extended (занимает 10 байт, диапазон от 3.4E-4932 до 1.1E+4932 по модулю, точность19-20 значащих цифр). Comp (занимает 8 байт, диапазон от -9.2E-18 до 9.2E+18, хранятся точно, поскольку это целые числа) Вещественные типы являются упорядоченными, но не порядковыми. Операции над вещественными числами: сложение ,вычитание, умножение, деление и операции отношения. Кроме того, имеется большое количество встроенных функций для работы с числами: abs, sqr, sqrt, sin, cos и т.п. Вещественные числа хранятся неточно. Каждый из имеющихся вещественных типов гарантирует правильное хранение только определенного количества значащих цифр, их называют верными цифрами. С математической точки зрения, из за особенностей внутреннего представления речь идет об относительной погрешности. Неточности в хранении вещественных чисел могут привести к тому, что при вычитании близких чисел может произойти потеря значимости. Это же объясняет, почему следует избегать сравнения вещественных величин на точное равенство. ПРИМЕР: тип Single - хранится 7-8 знаков после десятичной точки, тип Double - 15-16, тип Extended - 19-20. program sravnenie; var x : single; y : double;z : extended; begin x := 1/3; y := 1/3; z := abs(x-y); writeln('z=',z); end. Эта программа выдаст в результате число z=9.93410748106882E-0009. Обычно принято считать, что a=b, если выполняется условие abs(a-b)<eps. Число eps можно определять следующим образом: min(abs(a),abs(b))*10^(-m), где m - необходимое число совпадающих десятичных разрядов. Логический тип Переменные логического типа Boolean занимают в памяти один байт и могут принимать одно из двух значений False - ложное или True - истинное. Этот тип является порядковым (Ord(False) = 0, Ord(True) = 1) и, следовательно, упорядоченным. Результат любых операций сравнения имеет логический тип и может быть присвоен логической переменной. Для операндов типа boolean определены следующие логические операции: NOT - отрицание (превращает false в true, а true в false), AND - логическое умножение "и", OR - логическое сложение "или", XOR - исключающее или (true если операнды разные). Принцип действия этих операций можно проиллюстрировать такими схемами: |
AND | false | true | | false | false | false | | true | false | true | | |
|
OR | false | true | | false | false | true | | true | true | true | | |
|
XOR | false | true | | false | false | true | | true | true | false | | |
Символьный тип Символьный тип Char также называют литерным. Он позволяет работать с символами, которые записываются двумя способами: в одинарных кавычках или по их коду, например 'a', 'B', '*' или, что то же самое, #97, #130, #42. В отличие от текста программы на паскале, символы, соответствующие строчным и заглавным буквам различаются. Множество значений типа Char представляет собой полный набор ASCII - символов (американская стандартная кодировка). В компьютере хранятся шестнадцатеричные коды символов (1 байт), которые и используются в операциях отношения (сравнения). Функция Ord выдает код соответствующего символа, который может быть от 0 до 255. Обратной функцией, которая по коду выдает соответствующий символ, является функция Chr. ВЫРАЖЕНИЯ Выражение - это единица языка, которая определяет способ вычисления некоторого значения. Выражения формируются из констант, переменных, функций, знаков операций и круглых скобок по определенным синтаксическим правилам. Константами называются параметры программы, значения которых не меняются в процессе ее выполнения. Они встречаются либо непосредственно в виде значения, либо в виде идентификатора константы, описанного в разделе, начинающемся со слова Const. Для каждой константы в разделе указывается конструкция вида: идентификатор константы = значение; Целые константы содержат лишь цифры и знак: -214, 23, вещественные могут содержать также десятичную точку, показатель степени и символ e, который заменяет основание 10 в записи числа: -0.5, -1e-5, 7.2e+15. Логические константы - это значения False или True. Символьная константа представляет собой символ ASCII, заключенный в апострофы. Если символ не имеет физического изображения, то пишется знак # и рядом ASCII-код символа без апострофов. Переменными называются параметры программы, которые могут менять свое значение в процессе ее выполнения. Все без исключения переменные должны быть описаны в разделе программы, начинающемся со слова VAR. Затем следуют конструкции вида: список идентификаторов переменных: тип1; список идентификаторов переменных: тип2; В списке имена переменных перечисляются через запятую. Кроме базовых типов Турбо Паскаля здесь можно использовать свои типы (описанные ранее в разделе Type). В Турбо Паскале имеется большое количество встроенных функций для работы с данными каждого типа. Имена (указатели) этих функций с аргументом в круглых скобках могут также встречаться в выражениях. Знаки операций зависят от типа используемых в выражении операндов и рассмотрены выше. Круглые скобки используются для изменения порядка вычисления частей выражения. Выражения без скобок вычисляются в порядке, соответствующем приоритету операций. Приоритеты расставлены таким образом: вычисления в круглых скобках; вычисление значений функций; унарные операции ( not,+,- ); операции типа умножения ( *,/,div,mod,and ); операции типа сложения ( +,-, or, xor ); операции отношения ( =, <>, <, >, <=, >= ). В логическом выражении 2<=4 and 5>3 Паскаль выдаст ошибку, поскольку операция and будет выполнена раньше операций сравнения. Верная запись - (2<=4) and (5>3). СОВМЕСТИМОСТЬ ТИПОВ ДАННЫХ Когда в операциях или операторах вашей программы присутствуют данные разных типов, то встает вопрос об их совместимости. В языке Турбо Паскаль этому вопросу уделяется очень большое внимание, разработаны строгие правила, определяющие идентичность, совместимость в общем случае и совместимость по присваиванию различных типов. Нам в начале курса достаточно помнить следующее. Переменные или выражения одного типа являются полностью совместимыми. Другим понятием является совместимость по присваиванию. Присваивание переменной одного типа выражения другого типа допустимо в том случае, когда множество значений второго типа является подмножеством значений первого. Например, результат сложения двух целых переменных типа integer и word может присваиваться в целую переменную, тип которой только longint, поскольку только этот целый тип содержит в себе весь возможный диапазон значений как для типа integer, так и для типа word. Также, можно присваивать целое выражение в вещественную переменную или символьное выражение в строку. ЛИНЕЙНЫЕ АЛГОРИТМЫ Алгоритмические действия над исходными данными и рабочими объектами языка, необходимые для решения поставленной задачи описываются при помощи операторов Турбо Паскаля. Операторы разделяются точкой с запятой, их последовательность и составляет тело программы. Наиболее простой случай представляют собой линейные алгоритмы. При выполнении линейных участков алгоритма операторы выполняются последовательно друг за другом в том порядке, в котором они перечислены в программе. При этом могут использоваться операторы присваивания, операции ввода и вывода. ПУСТОЙ И СОСТАВНОЙ ОПЕРАТОРЫ В программе может применяться пустой оператор, не выполняющий никакого действия. Он представляет собой точку с запятой. Составным оператором считается последовательность произвольных операторов, заключенная в операторные скобки - зарезервированные слова begin ... end. Допускается произвольная глубина вложенности составных операторов. Составной оператор применяется там, где по синтаксическим правилам языка может стоять только один оператор, а нам надо выполнить несколько действий. В этом случае набор необходимых команд должен быть оформлен как составной оператор. По сути, все тело программы представляет собой один составной оператор. ОПЕРАТОР ПРИСВАИВАНИЯ Оператор присваивания используется для задания значения переменных и имеет следующий синтаксис: имя_переменной := выражение; Вычисляется выражение, стоящее в правой части оператора, после чего его значение записывается в переменную, имя которой стоит слева. Тип выражения и тип переменной должны быть совместимы, т.е. множество допустимых значений для типа выражения содержится во множестве допустимых значений для типа переменной. ПРОСТЕЙШИЙ ВВОД И ВЫВОД Рассмотрим простейшие процедуры ввода и вывода. По умолчанию ввод осуществляется с клавиатуры, а вывод на экран. К операторам ввода относятся: Read(<список переменных через запятую>); Readln(<список переменных>); Readln; Второй отличается от первого тем, что после ввода переводит курсор на новую строку, точнее, в конце своей работы считывает с клавиатуры код клавиши <Enter>. Третий оператор используется для организации паузы - выполнение программы продолжится, как правило, только после нажатия на клавиатуре клавиши <Enter>. К операторам вывода относятся: Write(<список вывода>); Writeln(<список вывода>); Writeln; В списке вывода кроме имен переменных можно писать строковые константы (последовательность символов в апострофах) и даже выражения (выводятся их значения). Второй оператор отличается от первого тем, что после вывода переводит курсор на новую строку. Третий оператор просто переводит курсор на новую строку. Существует так называемый форматированный вывод. Можно задать количество позиций, отводимых под число. Для целых - после выражения или переменной через двоеточие указывается меньше какого количества позиций не может быть выделено значению. Для вещественных - дополнительно через двоеточие можно указать количество цифр в дробной части. При этом происходит округление в ближнюю сторону. ПРИМЕР: Простые вычисления. program vvod_vyvod; const n=1.5; var y1,y2:real; x:byte; begin writeln('Введите натуральное число <= 255'); readln(x); y1:=cos(n); y2:=cos(x); write('Зачем-то посчитали: '); writeln('n=',n,' y1=',y1:7:4, cos(Pi/2):8:4); {напечатается Зачем-то посчитали: n= 1.50000000000000E+0000 y1= 0.0707 1.0000} writeln('x=',x:3,' y2=',y2:7:4); end. РАЗВЕТВЛЯЮЩИЕСЯ АЛГОРИТМЫ В Турбо Паскале имеется возможность нелинейного хода программы, т.е. выполнения операторов не в том порядке, в котором они записаны. Такую возможность нам предоставляют разветвляющиеся алгоритмы. Они могут быть реализованы одним из трех способов: с использованием операторов перехода, условного оператора или оператора выбора. ОПЕРАТОР ПЕРЕХОДА Оператор перехода имеет вид GOTO <метка>. Он позволяет передать управление непосредственно на нужный оператор программы. Перед этим оператором должна располагаться метка отделенная от него двоеточием. В Турбо Паскале в качестве меток выступают либо целые числа от 0 до 9999, либо идентификаторы. Все метки должны быть описаны в разделе объявления меток следующим образом: label <список меток через запятую> ; Каждой меткой в программе может быть помечен только один оператор. Операторов перехода с одной и той же меткой можно писать любое количество. Необходимо, чтобы раздел описания метки, сама метка и оператор перехода с ее использованием располагались в пределах одного блока программы (см. тему процедуры и функции). Кроме того, нельзя передавать управление внутрь структурированных операторов (например, if, for, while, repeat и др.). УСЛОВНЫЙ ОПЕРАТОР Условный оператор IF позволяет изменить порядок выполнения команд в зависимости от некоторого логического условия, т.е. он осуществляет ветвление вычислительного процесса. Условный оператор имеет вид: IF <условие> THEN <оператор1> [ELSE <оператор2>]; В случае истинности логического выражения, стоящего в условии, выполняется <оператор1>, а <оператор2> пропускается. При ложном значении логического выражения пропускается <оператор1> и выполняется <оператор2>. Оператор IF может быть полным (присутствуют обе ветви) или неполным (Else-ветви нет, при ложном условии ничего не делается). По правилам каждая из ветвей может содержать либо один выполняемый оператор, либо несколько, объединенных в составной. Точка с запятой перед Else считается ошибкой. ПРИМЕР: Ввести целое число. Вывести соответствующий ему символ ASCII-таблицы, либо сообщить, что такого символа нет (0-31 - управляющие коды, затем до 256 - печатаемые символы). program ascii_symbol; var i:word; begin write('Введите целое число: '); readln(i); if (i>31) and (i<256) then writeln('Соответствующий символ - ', Chr(i)) else writeln('Такого символа нет'); readln end. ОПЕРАТОР ВЫБОРА Если у вас не два возможных варианта выполнения программы, а больше, то может использоваться оператор выбора CASE. Структура этого оператора в Турбо Паскале: CASE <ключ_выбора> OF C1 : <оператор1>; C2 : <оператор2>; CN : <операторN>; [ELSE <оператор0>;] END; Здесь <ключ_выбора> - это выражение порядкового типа, в зависимости от значения которого принимается решение; C1,...,CN - значения, с которыми сравнивается значение <ключа>; <оператор1>,..., <операторN> - оператор (возможно составные), из которых выполняется тот, с константой которого происходит первое совпадение значения <ключа>, <оператор0> выполнится, если значение ключа не совпадает ни с одной из констант C1,...,CN. Ветвь Else не обязательна, и в отличие от оператора if, перед ней можно ставить точку с запятой. Если для нескольких значений <ключа> действия совпадают, то эти константы можно перечислить через запятую перед двоеточием или даже задать диапазон значений (нижняя граница .. верхняя граница). ПРИМЕР: Вводится целое число, если это цифра, то определить четная она или нет, а если число, то определить попадает ли оно в диапазон от 10 до 100, если нет, то выдать соответствующее сообщение. program chislo; var i:integer; begin write('Введите целое число: '); readln(i); case i of 0,2,4,6,8 : writeln('Четная цифра'); 1,3,5,7,9 : writeln('Нечетная цифра'); 10...100,200 : writeln('Число от 10 до 100 или 200'); else writeln('Число либо отрицательное, либо > 100, но не 200'); end; readln end. ЦИКЛИЧЕСКИЕ АЛГОРИТМЫ Турбо Паскаль позволяет использовать три различных оператора для организации повторяющихся последовательностей действий, которые называют циклами. ЦИКЛЫ С ПАРАМЕТРОМ Оператор цикла For организует выполнение одного оператора заранее определенное число раз. Его еще называют цикл со счетчиком. Существует две формы оператора: FOR <параметр> := <nz> TO <kz> DO <оператор>; FOR <параметр> := <nz> DOWNTO <kz> DO <оператор>; Здесь параметр цикла (счетчик) представляет собой переменную порядкового (ординального) типа; <nz> и <kz> - выражения, определяющие начальное и конечное значение счетчика; <оператор> - один (возможно составной) оператор, который называют телом цикла, повторяемый определенное число раз. На первом шаге цикла параметр принимает значение nz. В этот же момент происходит вычисление kz - значения параметра на последнем шаге цикла. После каждого выполнения тела цикла, если параметр цикла не равен kz, происходит изменение параметра на следующее большее или меньшее значение в зависимости от формы оператора for, т.е. неявно происходит выполнение одного из двух операторов: <параметр> := Succ(<параметр>); <параметр> := Pred(<параметр>); В случае nz > kz в первой форме оператора или nz < kz во второй его форме ошибки не происходит, но цикл не выполняется ни разу. После завершения работы цикла значение параметра остается равным kz. РЕКОМЕНДАЦИИ: Использовать цикл for при заранее известном количестве повторений. Не изменять параметр в теле цикла. При использовании кратных (вложенных) циклов применять разные переменные в качестве параметров. Определять до цикла значения всех используемых в нем переменных. Не ставить точку с запятой после do. ПРИМЕР: Вводятся 10 чисел, посчитать среди них количество положительных. program cycle_for1; var i,kn:byte; x:real; begin kn:=0; for i:=1 to 10 do begin writeln('Введите ',i,' число: '); readln(x); if x>0 then kn:=kn+1 {увеличиваем количество на 1} end; writeln('Вы ввели ',kn,' положительных чисел.'); readln end. ПРИМЕР: Напечатать буквы от 'Z' до 'A'. program cycle_for2; var c:char; begin for c:='Z' downto 'A' do write(c); readln end ПРИМЕР: Вычислить N-е число Фиббоначчи. Числа Фиббоначчи строятся следующим образом: F(0)=F(1)=1; F(i+1)=F(i)+F(i-1); для i>=1. Это пример вычислений по рекуррентным формулам. program Fib; var a,b,c:word; i,n:byte; begin write('введите номер числа Фиббоначчи '); readln(N); a:=1; {a=F(0), a соответствует F(i-2)} b:=1; {b=F(1), b соответствует F(i-1)} for i:=2 to N do begin c:=a+b; {c соответствует F(i)} a:=b; b:=c; {в качестве a и b берется следующая пара чисел} end; writeln(N,'-е число Фиббоначчи =',b); {для N>=2 b=c} readln end. ЦИКЛЫ С УСЛОВИЕМ Если заранее неизвестно число повторений цикла, то используются циклы с условием. В паскале имеется два типа таких циклов. Циклы While называют циклами с предусловием. Они имеют вид WHILE <логич.выражение> DO <оператор>; Цикл While организует выполнение одного (возможно составного) оператора пока истинно логическое выражение, стоящее в заголовке цикла. Поскольку значение логического выражения проверяется в начале каждой итерации, то тело цикла может не выполниться ни разу. Таким образом, в этом цикле логическое выражение - это условие продолжения работы в цикле. Другой вариант циклов с условием - это циклы Repeat. Их называют циклами с постусловием. Они имеют вид REPEAT <оператор 1> ... <оператор N> UNTIL <логич.выражение> Оператор Repeat организует повторяющееся выполнение нескольких операторов до тех пор пока не станет истинным условие, стоящее в Until-части. Тело цикла обязательно выполняется хотя бы один раз. Таким образом, в этом цикле логическое выражение - это условие выхода из цикла. При создании циклических алгоритмов Турбо Паскаль позволяет использовать процедуры Continue и Break. Процедура Continue досрочно завершает очередной шаг цикла, передает управление на заголовок. Процедура Break реализует немедленный выход из цикла. РЕКОМЕНДАЦИИ: Для того, чтобы избежать зацикливания программы необходимо обеспечить изменение на каждом шаге цикла значения хотя бы одной переменной, входящей в условие цикла. После выхода из цикла со сложным условием (с использованием операций and, or, xor) как правило необходима проверка того, по какому условию цикл завершен. ПРИМЕР: Пары неотрицательных вещественных чисел вводятся с клавиатуры. Посчитать произведение для каждой пары и сумму всех чисел. program cycle_while; var x,y,sum:real; otv:char; begin sum:=0; otv='Д'; while (otv='Д') or (otv='д') do begin write('Введите числа x,y > 0 '); readln(x,y); writeln('Их произведение = ',x*y:8:3); sum:=sum+x+y; write('Завершить программу (Д/Н)? '); readln(otv); end; writeln('Общая сумма = ',sum:8:3); readln end. ПРИМЕР: В той же задаче можно использовать другой цикл с условием: program cycle_repeat; var x,y,sum:real; otv:char; begin sum:=0; repeat write('Введите числа x,y > 0 '); readln(x,y); writeln('Их произведение = ',x*y:8:3); sum:=sum+x+y; write('Завершить программу (Д/Н)? '); readln(otv); until (otv='Д') or (otv='д'); writeln('Общая сумма = ',sum:8:3); readln end. ПРИМЕР: Нахождение наибольшего общего делителя двух целых чисел с помощью Алгоритма Эвклида. program Evklid;
Страницы: 1, 2
|