Учебное пособие для школьников 79 классов СанктПетербург Павловск 20152016 Введение
Скачать 0.84 Mb.
|
Оператор if (сокращенная форма) Часто встречается ситуация, когда ветвь else не нужна. В этом случае ее можно опустить. Например: if x<0 then x:=-x; Обратите внимание, что точка с запятой ставится после оператора x:=-x в отличие от полной формы. Пример программы с оператором if Program OddEven; { Определение четного или нечетного числа } var n : integer; begin write('Введите число '); readln(n); if odd(n) then writeln('Число нечетное') else writeln('Число четное'); end Вложенные операторы if Иногда возникает необходимость устроить развилку на более чем две ветви. В этом случае операторы if можно вкладывать один в другой. С точки зрения алгоритмической корректности лучше, если вложенный оператор находится в ветви else. Приведем сразу пример программы Program Sign; { Определение знака числа } var n : integer; begin write('Введите число '); readln(n); if n>0 then writeln('Число положительное') else if n=0 then writeln('Число ноль') else writeln('Число отрицательное') end Обратите внимание, что после вложенный оператор if можно не заключать в операторные скобки begin ... end, поскольку оператор if синтаксически рассматривается как один оператор. Если имеются вложенные операторы if, один из которых неполный, например: if n>0 then if n=0 then writeln('У вас ноль') else writeln('Число положительное') возникает неоднозначность: к какому if относится else. Принято, что else относится к ближайшему if, т.е. таки образом, как отражает запись данного примера. Если следовать правилу, помещая, по возможности, вложенные операторы в ветвь else, то таких ситуаций не будет. Тема №5. Оператор if А.С.Цветков, ABC Pascal - 19 - 19.09.2015 Логические выражения . В операторе if используются логические выражения, имеющие тип boolean 9 . Про такие выражения можно сказать только являются ли они истинными (true) или ложными (false). Простейший случай логического выражения – логическая переменная. Пример: var b : boolean; b:=true; if b then writeln('Все в порядке'); Такие логические переменные называют флагами, иногда их использование оказывается очень эффективным решением. Операции сравнения . Существует шесть бинарных 10 операций сравнения, у которых операнды могут быть самых разных типов (целые, вещественные, символьные строковые). < меньше <= меньше или равно > больше >= больше или равно = равно <> не равно Эти операции весьма часто используются для построения различных логических условий. Например: if a>0 then a:=1 else a:=-1. С точки зрения языка Pascal a>0 представляет собой логическое выражение (можно написать даже так: b:=a>0, если b – переменная булевского типа). Логические операции . Для составления сложных логических выражений могут использоваться две бинарные логические операции AND, OR и одна унарная 11 NOT. and – результат операции истинен тогда и только тогда, когда истины оба операнда. or – результат операции истинен тогда, когда истинен хотя бы один операнд. not – имеет результат противоположный операнду. Примеры операторов if со сложными условиями: if (x>=0) and (x<=1) then writeln('X находится в диапазоне от 0 до 1'); if not ((x>=0) and (x<=1)) then writeln('X вне диапазона 0-1'); if (x<0) or (x>1) then writeln('X вне диапазона 0-1'); Обратите внимание на скобки. Операции сравнения имеют самый низший приоритет, поэтому заключены в скобки. Приоритет операции and соответствует операции умножения, or – сложению, not – унарному минусу (т.е. самый высокий). 9 Назван в честь Дж. Буля – основателя математической логики. 10 Бинарные операции – имеющие два операнда, на которые действует эта операция. 11 Унарная операция – имеющая только один операнд. Тема №5. Оператор if А.С.Цветков, ABC Pascal - 20 - 19.09.2015 Задание №5 1. Вычислите логические выражения: not true and not false not true or not false not (true or false) not (true and false) 2. Напишите условие нахождения точки a в первом квадранте системы координат, считая ее координаты заданными переменными x, y. 3. Напишите программу, выводящую слова «зачет», если введено число 3, 4 или 5 и «незачет», если введено число 1 или 2. 4. Напишите программу, выводящую текст «плохо», «удовлетворительно», «хорошо» или «отлично», если введено число 2, 3, 4 или 5 соответственно. 5. Используя операцию определения остатка от деления (mod, стр. 5), модернизируйте программу Concentric (стр. 16), таким образом чтобы каждая 3-я окружность выводилась красным цветом, а остальные были синими. Вложенные циклы Довольно часто возникает ситуация, при которой в теле одного цикла встречается другой оператор цикла. Такие циклы называют вложенными циклами. Приведем простой пример. Выведем на экран таблицу умножения целых чисел от 1 до 10. Program Table; var i,j : integer; begin for i:=1 to 10 do begin for j:=1 to 10 do write(i*j:4); writeln end end. 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100 Здесь внутри тела внешнего цикла по переменной i, находится вложенный цикл по переменной j, который выводит в операторе write (не writeln!) произведение i*j, выделяя 4 позиции для результата. Далее идет оператор writeln, который переводит курсор на новую строку. Внешний цикл повторяет 10 раз эту операцию, формируя, таким образом, 10 строк таблицы, которая приведена справа. a X Y Тема №6. Оператор case А.С.Цветков, ABC Pascal - 21 - 19.09.2015 Оператор case Оператор case используется для создания развилки на более чем 2 ветви. Понять его работу поможет следующий пример. Program YourMark; { ваша отметка } var n : integer; begin write('Введите вашу отметку '); readln(n); case n of 2 : writeln('Плохо'); 3 : writeln('Удовлетворительно'); 4 : writeln('Хорошо'); 5 : writeln('Отлично'); end; end Обратите внимание, что оператор case заканчивается скобкой end. Если пользователь введет отметку, не попадающую в диапазон 2-5, то никаких действий выполняться не будет. Можно, конечно, обработать и эту ситуацию. Тогда синтаксис оператора case будет такой: Program YourMark2; { ваша отметка } var n : integer; begin write('Введите вашу отметку '); readln(n); case n of 2 : writeln('Плохо'); 3 : writeln('Удовлетворительно'); 4 : writeln('Хорошо'); 5 : writeln('Отлично') else writeln('Вы ввели недопустимую отметку!') end; end Обратите внимание на отсутствие точки с запятой перед else и двоеточия после else. Кроме единичных значений переключателя n можно указывать диапазон значений. Program YourMark3; { ваша отметка } var n : integer; begin write('Введите вашу отметку '); readln(n); case n of 2..3 : writeln('Это все очень плохо!'); 4 : writeln('Хорошо!'); 5..6 : writeln('Так держать!') else writeln('Вы ввели недопустимую отметку!') end; end Обратите внимание на отсутствие точки с запятой перед else и двоеточия после else. Тема №6. Оператор case А.С.Цветков, ABC Pascal - 22 - 19.09.2015 Задание № 6.1. По образцу программ, написанных на предыдущей странице, решите следующую задачу: Программа вводит число в диапазоне от 1 до 10 и выводит на экран значение числа русскими буквами (один, два, … десять). (2 балла) Задание № 6.2. Модифицируйте программу таким образом, чтобы она выводила название чисел в диапазоне от 1 до 99 (ну кассовый аппарат же это делает на чеках!). Подсказка №1. Для выделения числа десятков используйте хорошо знакомую вам операцию «остаток от деления». Т.е., если в переменной n находится введенное число, то получить число десятков очень просто – d:=n mod 10; Подсказка №2. Надо рассмотреть по сути три диапазона чисел: от 1 до 9, от 10 до 19, и от 20 до 99. (5 баллов) Задание № 6.3. Ну, если уж сделали предыдущую задачу, то расширьте диапазон чисел до 999. (еще 3 балла) Задание № 6.4*. Модифицируйте программу 6.3 (даже в сторону упрощения), так чтобы она выводила число в диапазоне от 1 до 999, записанное римскими цифрами. (еще 4 балла) Запись чисел римскими цифрами: 1 – I 2 – II 3 – III 4 – IV 5 – V 6 – VI 7 – VII 8 – VIII 9 – IX 10 – X 20 – XX 30 – XXX 40 – XL 50 – L 60 – LX 70 – LXX 80 – LXXX 90 – XC 100 – C 200 – CC 300 – CCC 400 – CD 500 – D 600 – DC 700 – DCC 800 – DCCC 900 – CM Запись остальных чисел происходит просто «склеиванием» записей приведенных чисел. Например: 23 – XXIII 357 – CCCLVII 888 – DCCCLXXXVIII 901 – CMI 109 – CIX Программирование на языке Паскаль Занятие №4 - 23 - 19.09.2015 Занятие №7 Операторы цикла While и Repeat … Until Мы уже познакомились с оператором цикла for, который используется в тех случаях, когда число повторений тела цикла известно заранее. В языке Pascal существуют еще два оператора цикла, которые используются в тех случаях, когда число повторений цикла заранее не известно, либо сложно вычислимо. Цикл While используется для повторения оператора (группы операторов) произвольное число раз, которое может быть заранее и не известно, причем проверка условия выполнения тела цикла происходит перед выполнением тела цикла. Синтаксис оператора: while условие do оператор; или while условие do begin оператор1; оператор2; end; Суть выполнения оператора заключается в проверке логического условия, если оно оказывается истинным, выполняются операторы тела цикла до тех пор, пока логическое условие не станет ложным. Если условие было ложным перед выполнением цикла, то операторы цикла никогда не выполняются. Если условие остается истинным всегда, то цикл никогда не закончится. Говорят, что программа зацикливается. Цикл repeat … until похож на цикл while. Его синтаксис: repeat оператор1; оператор2; until условие; Обратите внимание, что, несмотря на несколько операторов в теле цикла, begin и end отсутствуют. Сам оператор представляет собой скобки. Цикл начинается с выполнения операторов, затем проверяется условие, если оно ложно, то цикл повторяется, а если истинно, то завершается. Если условие истинно и перед выполнением цикла, то цикл выполняется один раз. Если условие остается ложным всегда, то программа зацикливается. Построим таблицу квадратов чисел от 1 до 10 с помощью цикла while и repeat … until. Program SquareW; var i : integer; begin i:=1 while i<=10 do begin writeln(i:4,sqr(i):4); i:=i+1; end; end. Program SquareR; var i : integer; begin i:=1 repeat writeln(i:4,sqr(i):4); i:=i+1; until i>10; end. Тема №7. Циклы while и repeat until А.С.Цветков, ABC Pascal - 24 - 19.09.2015 Рассмотрим следующий пример. Необходимо построить вложенные друг в друга концентрические окружности. Радиус самой большой окружности – 400 пикселей, а радиус каждой вложенной – в два раза меньше предыдущей, т.е. 200, 100, 50, … Радиус последней – 1 пиксель. Для решения этой задачи разумно использовать цикл while или repeat until, поскольку действительно сразу сложно понять сколько будет окружностей (хотя, конечно, можно сосчитать). Program Circles; Uses GraphABC; var r : integer; begin SetWindowSize(800,800); r:=400; repeat circle(400,400,r); r:=r div 2; until r<1; end Program Circles; Uses GraphABC; var r : integer; begin SetWindowSize(800,800); r:=400; while (r>=1) do begin circle(400,400,r); r:=r div 2; end; end Рассмотрим еще один пример. Программа должна рисовать случайные расположенные окружности случайного цвета и случайного размера (но не больше 10 пикселей) до тех пор, пока пользователь не нажмет на какую либо клавишу. Program Circles; Uses GraphABC, CRT; var r : integer; begin SetWindowSize(500,500); repeat SetBrushColor(random($FFFFFF)); circle(random(500),random(500),random(10)); delay(10); until keypressed; end Здесь используются несколько новых для нас приемов. Во-первых, функция keypressed, определенная в модуле CRT. Она возвращает значение true, если пользователь нажал любую клавишу. Оператор выбора цвета окружности SetBrushColor в качестве параметра использует значение random($FFFFFF). Аргумент функции random представляет максимально возможное числовое значение цвета, записанное в шестнадцатеричной системе исчисления, таким образом окружности будут заливаться случайным цветом от 0 (соответствует черному цвету) до $FFFFFF (соответствует белому цвету). К таким обозначениям цветов мы вернемся во время изучения языка HTML. Функция delay(n) выполняет задержку выполнения программы на n миллисекунд. Мы ее используем для того, чтобы окружности не выводились слишком быстро. Задание №7. 1. Напишите программу, которая вводила бы целые числа и суммировала их до тех пор, пока пользователь не ввел число 0. (5 баллов) 2. Модернизируете последний пример так, чтобы выводились случайные линии, либо прямоугольники. Тема №8. Вещественные вычисления А.С.Цветков, ABC Pascal - 25 - 19.09.2015 Занятие №8 Вещественные вычисления на языке Pascal До сих пор мы оперировали целыми числами. Однако в физических вычислениях в вычислениях, связанными с измерениями, мы сталкиваемся с другим классом чисел. В математике их называют вещественными (или действительными). Подмножеством вещественных чисел являются рациональные числа. В языке Pascal вводится тип данных real , который является моделью вещественных чисел в математике. Рассмотрим сразу пример: Program Krug; Uses CRT; // Вычисление длины окружности var r : real; // Радиус окружности s : real; // Длина окружности begin write('Введите радиус: '); readln(r); s:=2*3.1415926*r; writeln('Длина окружности: ',s:8:2); end Обратите внимание на описание переменных (тип real). Конечно, переменные можно описывать и несколько в одном операторе (r, s : real), но мы захотели добавить комментарии к описанию, поэтому описали переменные в отдельных операторах. Ввод вещественных чисел с клавиатуры ничем не отличается от ввода целых чисел. Вещественные числа могут, как и целые, участвовать в арифметических выражениях. К ним применимы операции сложения +, вычитания –, умножения *, а также деления /. Деление выполняется обычным способом, как в математике, т.е. 5/2 будет 2.5. Деление на цело (div), остаток от деления (mod) для вещественных чисел не определены! Запись вещественных чисел может быть в двух формах. Первая форма называется «с фиксированной точкой». Пример: 3.5, 2.0, +36.6, –40.123. Обратите внимание на то, что в качестве разделителя целой и дробной части используется точка, а не запятая. Вторая форма записи называется «с плавающей точкой». Эта запись похожа на стандартизованное представление чисел в математике (например 21 6.67 10 ⋅ ). В языке Pascal такое число можно записать в следующем виде 6.67E21, т.е. вместо ·10 в языке Pascal пишется буква E (большая или маленькая, всё равно). Приведем еще примеры записи вещественных чисел с плавающей точкой: 3E1, –2e+10, +1.234E–10, 65.2e+20. Часть числа до буквы E называется мантиссой, а после буквы E – порядком или экспонентой. Задание 8 (часть 1) 1. Запишите в языке Pascal в формате с плавающей точкой следующие числа: 33 2.99 10 ⋅ , 10 0.21 10 − − ⋅ , 8 35.6 10 ⋅ , 1200000, 0.000015 (5 баллов) 2. Запишите в языке Pascal в формате с фиксированной точкой следующие числа: 2.71828, 2 1.25 10 ⋅ , 1 1.5 10 − − ⋅ (3 балла) Тема №8. Вещественные вычисления А.С.Цветков, ABC Pascal - 26 - 19.09.2015 Вывод вещественных чисел с помощью оператора write/writeln происходит обычным способом. При выводе мы можем применять форматы вывода, отделяя их от переменной двоеточием. Формат вывода может состоять из одного или двух чисел, разделенных двоеточием (см. пример). При указании двух чисел первое определяет число позиций, резервируемых для вывода всего числа, а второе – число позиций для дробной части. Если в качестве формата вывода используется одно число, то оно определяет число позиций, резервируемых для вывода всего числа, а само число выводится в формате с плавающей точкой. В этом случае рекомендуется задавать значение формата не меньше 10, так как под экспоненту отводится пять позиций и еще две позиции выделяется под знак числа и десятичную точку. Если при выводе формат числа не указывать, то Pascal попытается вывести число наиболее компактным способом. Лучше уяснить действие форматов поможет следующий пример: 0> |