Составитель А.М. Сулейманова УДК 681.3 ББК 32.973.26-018.2.75 РЕАЛИЗАЦИЯ АЛГОРИТМОВ РАЗВЕТВЛЯЮЩЕЙСЯ И ЦИКЛИЧЕСКОЙ СТРУКТУРЫ В ИНТЕГРИРОВАННОЙ СРЕДЕ ТУРБО ПАСКАЛЬ: Методические указания к лабораторному практикуму по курсу «Информатика и программирование»/ Уфимск. гос. авиац. техн. ун-т; Сост. А.М Сулейманова.- Уфа, 2003.- 22 с. Содержатся сведения, необходимые для составления алгоритмов и программ, представлены способы реализации программ разветвляющейся и циклической структуры. Практическое применение иллюстрируется различными примерами. Обсуждается методика выполнения лабораторной работы. Приведены перечни заданий на выполнение лабораторных работ. Библиогр.: 3 назв. Рецензенты: Р.В.Насыров, Л.Ф.Розанова © Уфимский государственный авиационный технический университет, 2003 3 СОДЕРЖАНИЕ 1. ЦЕЛЬ РАБОТЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.1. Оператор присваивания . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2. Составной оператор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.3. Условные операторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.3.1. Оператор IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.3.2. Оператор CASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.4. Операторы цикла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.4.1. Оператор WHILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.4.2. Оператор REPEAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.4.3. Оператор FOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.5. Вложенные циклы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.6. Оператор перехода и пустой оператор . . . . . . . . . . . . . . . . .14 3. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ . . . . . . . . . . . . . . . . . . . . 17 4. ТРЕБОВАНИЯ К ОТЧЕТУ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 5. КОНТРОЛЬНЫЕ ВОПРОСЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 6. ВАРИАНТЫ ЗАДАНИЙ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 СПИСОК ЛИТЕРАТУРЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4 ЛАБОРАТОРНАЯ РАБОТА РЕАЛИЗАЦИЯ АЛГОРИТМОВ РАЗВЕТВЛЯЮЩЕЙСЯ И ЦИКЛИЧЕСКОЙ СТРУКТУРЫ В ИНТЕГРИРОВАННОЙ СРЕДЕ ТУРБО ПАСКАЛЬ 1. ЦЕЛЬ РАБОТЫ Целью настоящей работы является изучение методов программирования алгоритмов с разветвляющейся и циклической структурой. 2. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ Операторы языка программирования Turbo Pascal, представленные в нужной последовательности, позволяют реализовать алгоритм решения задачи. При этом каждый из операторов выполняет некоторое действие над данными. Операторы Turbo Pascal подразделяются на две группы: простые и структурированные. Простые операторы не содержат в себе других операторов; структурированные включают в себя другие операторы - как простые, так и структурированные. (В последнем случае в состав операторов могут входить и другие операторы, иными словами, возможно множество уровней вложенности операторов.) К простым операторам относятся оператор присваивания, оператор перехода и пустой оператор, а к структурированным составной оператор, условные операторы (IF и CASE) и операторы цикла (WHILE, REPEAT и FOR). 2.1. Оператор присваивания Нам уже известно, что знак присваивания (:=) делит этот оператор на две части. В правой части представлено выражение, состоящее из идентификаторов констант, переменных, функций и знаков операций, которое необходимо вычислить. После вычисления полученное значение присваивается переменной, указанной в левой части оператора. При этом тип переменной должен быть совместим с типом вычисленного выражения. Вот примеры операторов присваивания: а:=b+с; а:='Ь'; 5 new:=234; x:=true; 2.2. Составной оператор Составной оператор представляет собой последовательность некоторых операторов, выполняющихся в том порядке, в каком они представлены в тексте программы. Зарезервированные слова BEGIN и END являются так называемыми операторными скобками, в которые заключены операторы, входящие в составной оператор. Когда, в зависимости от определенного условия, требуется обеспечить последовательное выполнение некоторого набора операторов, без составного оператора не обойтись. Составной оператор имеет вид begin SI; S2; … Sn end; Здесь S1-Sn - операторы, образующие составной оператор; зарезервированные слова BEGIN и END - операторные скобки. Частный случай составного оператора – раздел операторов (или тело) любой программы на Turbo Pascal. Составной оператор может включать другие составные операторы (т.е. составным может быть любой из операторов S1-Sn), причем допускается любой уровень вложенности. 2.3. Условные операторы Если в программе, в зависимости от некоторого условия, требуется выбрать тот или иной вариант действий, можно воспользоваться одним из условных операторов. В Turbo Pascal предусмотрены два условных оператора - IF и CASE. 2.3.1. Оператор IF Оператор IF имеет вид: If р then a1 else а2 При выполнении этого оператора сначала вычисляется некоторое логическое выражение Р (условие), в случае истинности которого выполняется оператор А1, а в случае ложности - оператор А2. Использованные здесь ключевые слова IF, THEN и ELSE имеют смысл если, то и иначе соответственно. Возможен сокращенный вариант оператора IF: if р then a1 6 Здесь, если условие Р истинно, выполняется оператор al. Если же условие Р ложно, управление просто передается следующему (за оператором IF) оператору в программе. Можно сказать, что первый вариант оператора IF осуществляет выбор между двумя действиями, а второй - между действием и отсутствием действия. Что представляет собой условие? В принципе, в этом качестве может быть просто использовано логическое значение TRUE или FALSE, либо константа логического типа, имеющая одно из этих значений. Ошибка здесь зафиксирована не будет. Однако в этом случае теряется смысл применения оператора IF, поскольку заранее известно, какое действие будет выполнено. Например, если D константа типа Boolean, имеющая значение TRUE, то использовать оператор IF if d then c:=a+b else c:=a-b; бессмысленно, поскольку заведомо известно, какое действие будет выполнено, и вместо условного оператора следует просто записать с:=а+b; Поэтому, как правило, в качестве условия используется переменная логического типа (типа Boolean) либо один из операторов сравнения. Сравнивать между собой числа и другие значения в Turbo Pascal можно с помощью шести операторов. Речь идет об операторах > (больше), < (меньше), = (равно), <> (не равно), >= (больше или равно) и <= (меньше или равно). Результат сравнения всегда представляет собой значение логического типа. Так, результатом сравнения 77>63 будет TRUE, а результатом сравнения 82<47 - FALSE. В условии также широко могут использоваться три логических оператора: NOT, AND и OR. Например, выражение x1 and х2 будет иметь значение TRUE, если xI и x2 принадлежат логическому типу и оба равны TRUE. Вот примеры операторов IF, которые могут встретиться в программах: if x>y then z:=x/2 else z:=y+2; if a and b>c then d:=a+b else d:=c; 7 Во многих программах, в зависимости от некоторого условия, часто требуется выполнить не одно, а последовательность действий. Однако оператор IF в Turbo Pascal обеспечивает выполнение единственного оператора, присутствующего после зарезервированного слова THEN или ELSE. Выйти из положения можно, применив составные операторы. Оператор IF с составными операторами выглядит так: if р then begin s1 s2; ..sn end else begin v1; v2; . .vn end; Здесь s1-sn и v1-vn - некоторые операторы, образующие составные операторы. Turbo Pascal допускает вложенность операторов IF. Рассмотрим пример. Если некоторая переменная X положительна, требуется извлечь из нее квадратный корень, если отрицательна возвести в квадрат, а если равна нулю - прибавить к ней 2. Эту задачу можно реализовать следующим образом: if x>0 then x:=sqrt(x) else if x<0 then x:=sqr(x) else x:=x+2; При вкладывании операторов IF один в другой может возникнуть синтаксическая неоднозначность. В самом деле, к какому из двух ключевых слов IF относится ключевое слово ELSE в операторе: if x then if у then sl else s2 Варианты можно представить, введя операторные скобки (пары зарезервированных слов BEGIN..END). Первый вариант: if x then begin if у then s1 end else s2 Второй вариант: 8 if x then begin if у then s1 else s2 end; Какой из двух вариантов изберет компилятор Turbo Pascal? Все очень просто. Компилятор ассоциирует ключевое слово ELSE с ближайшим ключевым словом IF, расположенным в тексте программы выше и еще не связанным с иным ключевым словом ELSE, в нашем случае действенным окажется второй вариант. Если же потребуется реализовать первый вариант, можно воспользоваться операторными скобками. 2.3.2. Оператор CASE Рассмотренный выше оператор IF позволяет осуществить выбор одной из двух альтернатив. Но что если число вариантов нужно иметь больше? Например, если требуется согласно номерам дней недели отображать на экране их названия? Многие начинающие программисты для решения подобной задачи предпочтут воспользоваться последовательностью операторов IF: if х=1 then write (понедельник); if х=2 then write (вторник); if x=3 then write (среда); if x=4 then write (четверг); if x=5 then write (пятница); if x=6 then write (суббота); if x=7 then write (воскресенье); Однако такой подход затрудняет понимание исходного текста программы, поскольку сразу неочевидно, что здесь будет выполнен один и только один из семи операторов IF. Кроме того, такая конструкция малоэффективна, поскольку при этом условие придется проверять во всех семи операторах IF и это неизбежно увеличит время выполнения программы. Целесообразнее воспользоваться вложенным оператором IF. Один вложенный оператор часто будет выполняться быстрее последовательности из нескольких операторов IF, поскольку при совпадении первого условия управление сразу передается следующему (после вложенного) оператору, без проверки оставшихся условий, но такая конструкция чересчур громоздка. (Считается, что в операторе IF допустимы не более двух-трех 9 уровней вложения.) Здесь всего семь альтернатив, а что если вариантов выбора потребуется иметь несколько десятков? Применение оператора IF в этом случае крайне неудобно. Выйти из положения позволяет оператор CASE. Оператор CASE имеет вид case р of a: s1; b:s2; … n:sn; else s(n+1) end; При выполнении этого оператора сначала вычисляется некоторое выражение Р, называемое селектором выбора, а затем, в зависимости от полученного значения (если оно равно одной из констант А, В, ..., N, которые называются константами выбора), выполняется один из операторов: S1, S2,..., Sn, - помеченный соответствующей константой. Причем каждый из этих операторов может быть составным. Операторы S1, S2, ..., Sn отделяются один от другого точками с запятой. Значение селектора выбора в операторе CASE может повторяться, однако в этом случае будет выполнена только первая подходящая ветвь, а затем управление передается следующему (после CASE) оператору в программе. Если значение выражения Р не совпадает ни с одной из констант выбора, выполняется оператор S(n+1), содержащийся после ключевого слова ELSE, причем ветвь ELSE в операторе CASE необязательна. Использованные здесь зарезервированные слова CASE, OF, ELSE и END имеют смысл вариант, из, иначе и конец соответственно. Выражение, играющее роль селектора выбора, должно принадлежать порядковому типу данных (т.е. типу, имеющему конечное число значений). К порядковым относятся, например, типы данных Integer, Boolean и Char. Однако тип Real порядковым не является. Кроме одиночных констант, в вариантах оператора CASE могут использоваться диапазоны значений и списки (представленные через запятую): case x of 1..5: sl 2, 3, 8:s2 10 4, 6, 9..13:s3 else s4 end; Так, в этом примере оператор s3 будет выполнен, если переменная X имеет одно из значений: 4, 6, 9, 10, 11, 12, 13. Вернемся теперь к предыдущему примеру вложенного оператора IF (отображение названий дней недели). Попробуем реализовать эту задачу с помощью оператора CASE. Вот как это должно выглядеть: case x of 1:write ('понедельник'); 2:write ('вторник'); 3:write ('среда'); 4:write ('четверг'); 5:write ('пятница'); 6:write ('суббота'); 7:write ('воскресенье'); end; 2.4. Операторы цикла Для многократного повторения одних и тех же действий в Turbo Pascal предусмотрены три оператора цикла. Если число повторений цикла (или итераций) заранее неизвестно, однако известно условие завершения цикла, в таких случаях применяются операторы REPEAT и WHILE. Если же число повторений известно, то применяется оператор FOR. 2.4.1. Оператор WHILE Оператор цикла WHILE, известный как оператор цикла с предусловием, имеет вид while р do s; При выполнении этого оператора сначала вычисляется некоторое логическое выражение Р (условие), принадлежащее типу Boolean, в случае истинности которого выполняется оператор S (являющийся, как правило, составным оператором). После этого вычисление условия, его проверка и выполнение оператора S повторяются до тех пор, пока выражение Р не становится равным FALSE. Затем управление передается следующему (после WHILE) 11 оператору в программе. Использованные здесь ключевые слова WHILE и DO имеют смысл пока и выполнять соответственно. Если условие Р равно FALSE с самого начала, оператор S, который называется телом цикла, не выполнится ни разу. Если условие Р тождественно TRUE (while true do s), цикл будет бесконечным. Очевидно, для того чтобы тело цикла выполнилось несколько раз (чтобы количество циклов было больше нуля, но меньше бесконечности), условие должно каждый раз преобразовываться в теле цикла. Рассмотрим пример использования оператора WHILE. Предположим, даны числа Х и Y (Х>1). Требуется получить все члены бесконечной последовательности X, X², X³, .... которые меньше Y. Исходный текст программы вычисления последовательности степеней: program sequence; var x,y,z: real; begin read(x,y); z:=x; while z<y do begin writeln(z); z:=z*x end end. 2.4.2. Оператор REPEAT Оператор цикла REPEAT, известный как оператор цикла с постусловием, имеет вид repeat s until р; При выполнении этого оператора сначала выполняется тело цикла (S), затем вычисляется некоторое логическое выражение Р (условие), принадлежащее типу Boolean, в случае ложности которого вновь выполняется тело цикла. Затем выполнение тела цикла, вычисление условия Р и его проверка повторяются до тех пор, пока выражение Р не становится равным TRUE. После этого управление передается следующему (за REPEAT) оператору в программе. Использованные здесь зарезервированные слова REPEAT и UNTIL имеют смысл повторять и пока не соответственно. 12 Оператор цикла REPEAT отличается от оператора WHILE, вопервых, тем, что здесь условие проверяется после выполнения тела цикла. Иными словами, гарантируется хотя бы однократное его выполнение. Во-вторых, оператор REPEAT выполняется до тех пор, пока условие равно FALSE, и управление передается следующему (за REPEAT) оператору, когда условие становится равным TRUE (для оператора WHILE имеет место обратная зависимость). Даже если условие Р равно TRUE с самого начала, тело цикла выполнится хотя бы раз. Если условие Р тождественно FALSE (repeat s until false), цикл будет бесконечным. Для того чтобы понять разницу между операторами цикла WHILE и REPEAT, рассмотрим соответствующие фрагменты программ, вычисляющих степени числа 3 в диапазоне между 1 и 300. Цикл WHILE а:=1; while a<300 do begin writeln (a); a:=a*3 end; Цикл REPEAT а:=1; repeat writeln (a); a:=a*3 until a>=300 Прежде всего бросается в глаза, что условия повторения цикла для двух случаев противоположны. Это объясняется тем, что в операторе WHILE цикл выполняется, пока условие не примет значение FALSE, а в операторе REPEAT - пока условие не примет значение TRUE. Также следует обратить внимание, что тело цикла REPEAT не требуется заключать в операторные скобки BEGIN..END. Если в операторе WHILE после ключевого слова DO выполняется единственный оператор (и если требуется циклически выполнять несколько действий, приходится несколько операторов объединять в составной оператор), то в операторе REPEAT между ключевыми словами REPEAT и UNTIL можно ввести любое количество операторов, без необходимости заключать их в операторные скобки. Наконец, в операторе REPEAT после последнего оператора в теле цикла нет точки с запятой. Это еще одна особенность оператора REPEAT - перед ключевым словом UNTIL точка с запятой необязательна. 13 2.4.3. Оператор FOR Оператор цикла FOR, известный как оператор цикла с параметром, имеет вид for i=a to b do s; При выполнении этого оператора сначала вычисляется некоторое начальное значение А, которое присваивается переменной I, называемой параметром цикла. Затем вычисляется конечное значение В и проверяется, имеет ли место равенство I=В. Если равенства нет, выполняется оператор S, который может быть составным, и переменная увеличивается на единицу. После этого проверка (не равен ли параметр конечному значению), выполнение оператора S и увеличение переменной на единицу выполняются циклически до тех пор, пока не наступает равенство I=В. Параметр цикла I, а также начальное и конечное значения (А и В) могут принадлежать любому порядковому типу (например, Integer или Char). (Но при этом все они должны быть одного типа.) Если начальное значение превышает или равно конечному значению с самого начала, оператор S не выполнится ни разу. Использованные здесь зарезервированные слова FOR, TO и DO имеют смысл от, до и выполнять соответственно. Оператор цикла FOR имеет такие особенности: • в теле цикла запрещается явно изменять значение параметра цикла (с помощью оператора присваивания, например); • по завершении работы оператора цикла FOR значение параметра (I) считается неопределенным. Возможна и другая форма оператора цикла с параметром: for i=a downto b do s; Здесь, чтобы выполнялся оператор S, начальное значение А должно превышать конечное значение В. Кроме того, в этом случае параметр I с каждым циклом уменьшается на единицу, пока не становится равным конечному значению В. Оператор цикла с параметром следует использовать тогда, когда заранее точно известно, сколько раз должно быть выполнено тело цикла. Вот примеры оператора цикла с параметром: for i:=l to 5 do x:=sqr(x); for i:=z downto a do write (i); 14 В первом примере значение переменной X возводится в квадрат, затем полученная величина присваивается переменной X и так пять раз. Во втором примере оператор цикла с параметром использован для вывода букв латинского алфавита в обратном порядке (с z по а). Дело в том, что тип Char является порядковым, причем буквы начала алфавита (как значения типа Char) считаются меньше букв, взятых в конце алфавита. Не будет, например, ошибочным неравенство А<В. Для того чтобы понять разницу между операторами цикла WHILE и FOR, рассмотрим соответствующие фрагменты программ, выводящие на экран пустые строки. Цикл WHILE line:=l while line<n do begin writeln; line:=line+1 end; Цикл FOR for line=l to n do writeln Если переменная Line объявлена (в разделе описания переменных) как принадлежащая типу Integer, оператор FOR выведет на экран N пустых строк. Реализация задачи с помощью оператора FOR выглядит проще, поскольку здесь нет нужды в операторах присваивания line:=l и line:= line+1. 2.5. Вложенные циклы В программах на Turbo Pascal возможно использование вложенных циклов. Это подразумевает, что существует внешний цикл и один или несколько внутренних циклов. Каждое повторение внешнего цикла означает завершение всех внутренних циклов; при этом всем выражениям, которые управляют внутренними циклами, вновь присваиваются начальные значения. Приведем пример программы обнуления матрицы: For I:=1 to 10 do For J:=1 to 5 do A[I,J] := 0; {обнуление матрицы} 2.6. Оператор перехода и пустой оператор Оператор перехода имеет вид 15 goto P где Р - метка, которой помечен некоторый иной оператор в программе. Использованное здесь зарезервированное слово GOTO имеет смысл перейти. В данном случае речь идет о переходе на метку, указанную после оператора GOTO (и которой помечен иной оператор в программе). Оператор перехода предназначен для передачи управления в другую точку в программе (т.е. для нарушения естественного порядка выполнения операторов). Так, оператор перехода goto 11 передаст управление оператору с этой меткой, например 11: writeln В Turbo Pascal допускается использовать в качестве меток как числа (от 1 до 9999), так и идентификаторы. После оператора GOTO должна быть указана единственная метка и такой же меткой обязательно должен быть помечен один (и только один) из операторов в программе. Однако один и тот же оператор может помечаться несколькими метками. Иными словами, каждый оператор перехода передает управление в одну (и только в одну) точку программы, однако возможна передача управления из разных точек программы в одну точку. Все метки, используемые в программе, должны быть объявлены. Раздел описания меток находится между заголовком и телом программы. Текст программы, в которой использован оператор перехода, содержится в примере : program jump; label 1; var n:integer; begin read (n); if n>1000 then goto 1 else n:=n+100; write(n); 1: end. В программе Jump в разделе описания меток (LABEL) объявлена метка 1. Программа работает так. Вводится с клавиатуры 16 значение переменной N(типа. Integer). Если это значение превышает 1000, программа сразу завершается (поскольку метка 1 расположена рядом с зарезервированным словом END, завершающим программу). В противном случае к значению N прибавляется 100 и оно выводится на экран. Злоупотреблять использованием операторов GOTO не рекомендуется, поскольку в результате получаются малопонятные программы, тем более, что без оператора GOTO, как правило, можно обойтись другими средствами Turbo Pascal. Так, тело программы из предыдущего примера можно преобразовать следующим образом: begin read (n); if n<=1000 then begin n:=n+100; write(n) end; end. Если метка используется внутри процедуры или функции, она "видна" только в пределах этой процедуры или функции и должна быть описана в ней. Иными словами, передача управления снаружи внутрь процедуры или функции с помощью оператора перехода невозможна. О пустом операторе. Обратим внимание на метку в предыдущем примере. Вот как выглядит соответствующий фрагмент этой программы: if n>1000 then goto 1 else n:=n+100; write(n); l:end. Здесь метка расположена рядом с зарезервированным словом END, являющимся признаком конца тела программы. Однако, по определению, метками могут помечаться только операторы. Зарезервированное же слово END оператором не является, т.е., строго говоря, передать управление на конец составного оператора невозможно. Однако если считать, что метка здесь предшествует некоторому пустому оператору, то тогда такая конструкция становится легитимной. 17 Пустой оператор не выполняет никаких действий и в тексте программы о его присутствии свидетельствует только один символ "точка с запятой" (;). В конце составного оператора, перед зарезервированным словом END точка с запятой необязательна. Однако, когда рядом со словом END расположена метка, в этом случае перед меткой обязательно должна присутствовать точка с запятой, назначение которой в этом случае - послужить разделителем между последним реальным оператором и пустым оператором. Понятие пустой оператор делает возможными в программах такие экзотические конструкции, как begin ;;;;; end; или while p do begin end; Разумеется, от подобных операторов мало проку и чуть ли не единственная практическая польза от пустого оператора — возможность передать управление (с помощью оператора перехода) на конец составного оператора. 3. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ Для выполнения работы необходимо: 1. Повторить правила техники безопасности при работе с вычислительной техникой. 2. Изучить раздел "Операторы" лекционного курса, а также теоретическую часть настоящих методических указаний. 3. Получить у преподавателя вариант задания (варианты заданий приведены в разделе 6 настоящих методических указаний). 4. Написать программу на Турбо Паскале (при необходимости используя предварительно разработанный алгоритм). 5. Ввести программу в компьютер, отладить и результаты выполнения показать преподавателю. 6. В соответствии с требованиями, приведенными в разделе 4, оформить отчет по лабораторной работе. 7. Защитить лабораторную работу, продемонстрировав преподавателю: отчет по лабораторной работе; умение решать аналогичные задачи; теоретические знания. При подготовке к защите для самопроверки рекомендуется ответить на контрольные вопросы, приведенные в разделе 5. 18 4. ТРЕБОВАНИЯ К ОТЧЕТУ Отчет по выполненной лабораторной содержать: титульный лист; условие задания; текст программы на языке Турбо Паскаль. работе должен 5. КОНТРОЛЬНЫЕ ВОПРОСЫ 1. Что такое простые и структурные операторы? 2. Что такое оператор безусловного перехода? 3. Что такое пустой оператор? 4. Что такое составной оператор? 5. Какие существуют условные операторы в языке Паскаль? 6. Какие существуют операторы повтора в языке Паскаль, особенности каждого из них? 6. ВАРИАНТЫ ЗАДАНИЙ Вариант 1 Написать программы для решения задач: 1. Для заданного числа а найти корень уравнения f(х) = 0, где 2ax a 1 при a 0, ex f ( x) 1 иначе 2 1 a 2. Дано число х. Напечатать в порядке возрастания числа 1+|x| и (1+х2)x. 3. Вычислить: y 3 6 ... 96 99 4. Вычислить: . 2 3 90 e = cos x + cos x + cos x + … + cos x 5. Вычислить s - сумму квадратов всех попадающих в интервал (ln х, ех), х>1. целых чисел, Вариант 2 I. Даны числа a1, b1, c1, а2, b2, c2. напечатать координаты точки пересечения прямых, описываемых уравнениями a1x + b1y = c1 и а2х + b2у = c2, 19 либо сообщить, что эти прямые совпадают, не пересекаются или вовсе не существуют. 2. Даны числа а, b и c (а ≠ 0). Найти вещественные корни уравнения ах4 + bx2 +c = 0. Если корней нет, то сообщить об этом. 3. Вычислить: у = 1 !+ 2! + 3! +...+ n! (n>1 ). 4. Числа Фибоначчи (FП) определяются формулами fo = f1 = 1; fn = fn-1 + fn-2 при n= 2,3,... определить f - 40-е число Фибоначчи. 5. Дано ε>0. С точностью ε найти корень уравнения πх3 – ех2 + (2е + 1)х + π2 = 0. Вариант 3 1. Даны произвольные числа а, b и c. Если нельзя построить треугольник с такими длинами сторон, то напечатать 0, иначе напечатать 3, 2 или I в зависимости от того, равносторонний это треугольник, равнобедренный или какой-либо иной. 2. Вычислить c - наибольший делитель натуральных чисел а и b. 3. Вычислить у - первое из чисел sin х, sin sin x, sin sin sin x, ..., меньшее по модулю 10-4. 4. Числа Фибоначчи (FП) определяются формулами fo = f1 = 1; fn = fn-1 + fn-2 при n= 2,3,... найти f - первое число Фибоначчи, большее m (m>1). 5. Напечатать все простые делители заданного натурального числа. Вариант 4 1. Найти u - первый отрицательный член последовательности cos(ctg n), n = 1,2,3,... 2. Вычислить р = (1-1/22)(1-1/32)...(1-1/n2), n>2. 3. Вычислить k - количество точек с целочисленными координатами, попадающих в круг радиуса R(R>0) с центром в начале координат. 4. Числа Фибоначчи (FП) определяются формулами fo = f1 = 1; fn = fn-1 + fn-2 при n= 2,3,... вычислить s - сумму всех чисел Фибоначчи, которые не превосходят 1000. 5. Логической переменной р присвоить значение true, если целое n (n>1) - простое число, и значение false - иначе. 20 Вариант 5 1. Логической переменной b присвоить значение true, если числа х и у равны, и значение false - иначе. 2. Вычислить у = cos(1 + cоs(2 + ... + <cos(39-+ cos40)...)). 3. Приближенно вычислить интеграл ln( 2 sin x)dx, 0 используя формулу прямоугольников при n = 100: ∫ f(x)dx ≈ h [f(x1) + f(x2) +…+ f(xn)], где h = (b - a)/n, xi = a - ih - h/2. 4. Вычислить: k 10 sin kn k 1 k! s n 1 5. Определить k - количество трехзначных натуральных чисел, сумма цифр которых равна n (1≤n≤27). Операции деления (/, div и mod) не использовать. Вариант 6 1. Дано 50 вещественных чисел. Найти величину наибольшего из них. 2. Если уравнение ax2 + bx + c = 0 (a не равно 0) имеет вещественные корни, то логической переменной t присвоить значение true, а переменным x1 и x2 – сами корни, иначе же переменной t присвоить false, а значения переменных x1и x2 не менять. 3. Дано 50 вещественных чисел. Найти порядковый номер того из них, которое наиболее близко к какому-нибудь целому числу. 4. Дано натуральное k. Напечатать k-ю цифру последовательности 1234567891011121314…, в которой выписаны подряд все натуральные числа. 5.Даны целые числа x1, x2, …, x55. Вычислить величину x1(x2+x3)(x4+x5+x6)(x7+x8+x9+x10)…(x46+x47+…+x55). Вариант 7 1. Дано целое число n>0, за которым следует n вещественных чисел. Определить, сколько среди них отрицательных. 2. По номеру y (y>0) некоторого года определить c – номер его столетия (учесть, что, к примеру, началом XX столетия был 1901, а не 1900 год). 21 3. Дано 50 целых чисел. Определить, сколько из них принимает наибольшее значение. 4. Дано натуральное k. Напечатать k-ю цифру последовательности 149162536…, в которой выписаны подряд квадраты всех натуральных чисел. 5. Напечатать в возрастающем порядке все трехзначные числа, в десятичной записи которых нет одинаковых цифр (операции деления не использовать). Вариант 8 1. Дана непустая последовательность положительных целых чисел, за которой следует 0 (это признак конца последовательности). Вычислить среднее геометрическое этих чисел. 2. Значения переменных a, b и c поменять местами так, чтобы оказалось a≥b≥c. 3. Дано 50 вещественных чисел. Определить, сколько из них больше своих «соседей», т.е. предыдущего и последующего чисел. 4. Дано натуральное k. Напечатать k-ю цифру последовательности 1123581321…, в которой выписаны подряд все числа Фибоначчи. 5.Даны не менее трех различных натуральных чисел, за которыми следует 0. Определить три наибольших числа среди них. Вариант 9 1. Дана непустая последовательность положительных целых чисел, за которой следует 0 (это признак конца последовательности). Вычислить среднее арифметическое этих чисел. 2. Если значение переменной w не равно 0 и при этом котангенс от w меньше 0.5, тогда поменять знак у w, а если значение w равно 0, тогда присвоить w значение 1. 3. Дана непустая последовательность ненулевых целых чисел, за которой следует 0. Определить, сколько раз в этой последовательности меняется знак. (Например, в последовательности 1, -34, 8, 14, -5 знак меняется 3 раза). 4. Определить k – количество трехзначных натуральных чисел, сумма цифр которых равна n (1≤n≤27). Операции деления (/, div и mod) не использовать. 5. Вычислить 20 1 2 i , j 1 i j p 22 Вариант 10 1. Дано натуральное k. Определить k-ю цифру в последовательности 110100100010000100000… , в которой выписаны подряд степени 10. 2. Известно, что из четырех чисел a1, a2, a3, и a4 одно отлично от трех других, равных между собой; присвоить номер этого числа переменной n. 3. Дано 50 вещественных чисел. Вычислить разность между максимальным и минимальным из них. 4. Определить число, получаемое выписыванием в обратном порядке цифр заданного натурального числа. 5.Даны натуральное n и вещественные числа x1, y1, x2, y2, … xn, yn. Рассматривая пары xi,yi как координаты точек на плоскости, определить радиус наименьшего круга (с центром в начале координат), внутрь которого попадают все эти точки. СПИСОК ЛИТЕРАТУРЫ 1. Меженный О.А. Turbo Pascal: учитесь программировать. – М.: Издательский дом «Вильямс». 2001.- 448 с.: ил. 2. Милов А.В. Основы программирования в задачах и примерах.- Харьков: Фолио. 2002.- 397 с.: ил. 3. Климова Л.М. Pascal 7.0: практическое программирование. Решение типовых задач.- М.: Кудиц-Образ, 2000.- 425 с.: ил.