программирование тусур. Программирование учебное пособие. Учебное пособие Томск Эль Контент
Скачать 0.93 Mb.
|
Глава 2. Азы языка Паскаль Таблица 2.1 — Продолжение Группа Подгруппа Название Идентификатор Ссылочный Ссылочный Pointer Процедурный Процедура Procedure Функция Function Объектный Объектный Object 2.2 Основные вычислительные структуры в Паскале Это типы: целые, вещественный, символьный, булевский. 2.2.1 Целые типы Целые типы обозначают множества целых чисел в различных диапазонах (табл. 2.2). Тип integer (целый). Диапазон: −32768..32767. Размер памяти: 2 байта (16 двоичных разрядов). Таблица 2.2 – Целые типы в Turbo-Pascal Идентификатор Описание типа Множество допустимых значений Integer 16-битный целый со знаком −32768..32767 Shortint 8-битный целый со знаком −128..127 Longint 32-битный целый со знаком −2147483648..2147483647 Byte 8-битный целый без знака 0..255 Word 16-битный целый без знака 0..65535 Над целыми значениями допустимы следующие операции: 1) арифметические бинарные (два операнда): • сложение (знак операции +); • умножение (знак операции ∗); • вычитание (знак операции −); • деление (знак операции /); • деление нацело с отбрасыванием целой части (знак операции div); • взятие остатка от целочисленного деления (знак операции mod); 2) арифметическая унарная (одноместная) операция: • изменение знака (знак операции −); 3) операции сравнения: • равно (=); • не равно (<>); 2.2 Основные вычислительные структуры в Паскале 31 • больше (>); • больше или равно (>=); • меньше (<); • меньше или равно (<=); 4) стандартные функции (в обычной функциональной записи): • абсолютная величина (пример, abs( − 4) = 4); • квадрат (пример, sqr(6) = 36); 5) функция odd(<целое>) (odd — нечетный) — проверяет аргумент на нечетность. Результат операции деления принадлежит вещественному типу, результаты опе- раций сравнения и функции odd имеют булевский тип, все остальные операции выдают целый тип. Пример 6 div 4 = 1 −7 div −2 = 3 34 div −45 = 0 Операция m mod n применяется только при n > 0: 6 mod 4 = 2 −6 mod 4 = −2 2.2.2 Вещественные типы Вещественные типы обозначают множества вещественных чисел в различных диапазонах (табл. 2.3). Тип real (вещественный). Диапазон значений: 2.9 × 10 −39 ..1.7 × 10 38 Число цифр мантиссы: 11–12. Размер памяти — 6 байт. Вещественные значения могут изображаться в форме с фиксированной точкой и в форме с плавающей точкой. В первом случае целая и дробная части веществен- ного числа отделяются друг от друга символом «.» (точка). 32 Глава 2. Азы языка Паскаль Таблица 2.3 – Вещественные типы в Turbo-Pascal Идентификатор Описание типа Диапазон значений Real 6-байтовый вещественный, 11–12 значащих цифр −1.7 × 10 38 −2.9 × 10 −39 , 2.9 × 10 −39 ..1.7 × 10 38 Single 4-байтовый вещественный с ординарной точностью, 7–8 значащих цифр −3.4 × 10 38 −1.5 × 10 −45 , 1.5 × 10 −45 ..3.4 × 10 38 Double 8-байтовый вещественный с двойной точностью, 15–16 значащих цифр −1.7 × 10 308 −5.0 × 10 −324 , 5.0 × 10 −324 ..1.7 × 10 308 Extended 10-байтовый вещественный с повышенной точностью, 19–20 значащих цифр −1.1 × 10 4932 −1.9 × 10 −4951 , 1.9 × 10 −4951 ..1.1 × 10 4932 Comp 8-байтовый сложный тип −2 63 ..2 63 − 1 (только целые значения) Пример Обе части должны обязательно присутствовать, например 17.384 0.5 Следующие примеры демонстрируют неправильные формы записи чисел: .3 (правильно 0.3) 10. (правильно 10.0) Вещественное число в форме с плавающей точкой записывается как пара вида <мантисса> E <порядок>. Такое обозначение понимается как «мантисса, умноженная на 10 в степени, равной порядку». Например, 7E −2 означает 7×10 −2 , 12.25E+6 или 12.25E6 оба обо- значают 12.25 ×10 6 . Мантисса представляется в виде целого числа или как веще- ственное с фиксированной точкой. Порядок обозначается целым числом; допуска- ются как положительные, так и отрицательные значения порядка. Над вещественными значениями допустимы следующие операции: 1) арифметические операции: • сложение, умножение, вычитание, деление, изменение знака — операн- ды могут быть или оба вещественные или один из них целый; резуль- тат всегда вещественный; 2) операции сравнения — результат булевский; 3) стандартные функции: • sqrt(x) (квадратный корень); • sin(x) (синус); 2.2 Основные вычислительные структуры в Паскале 33 • cos(x) (косинус); • arctan(x) (арктангенс); • ln(x) (натуральный логарифм); • exp(x) (экспонента). Для вышеперечисленных функций аргумент может быть вещественным или целым, результат — всегда вещественный; • abs(x) (абсолютная величина числа); • sqr(x) (квадрат) — тип результата совпадает с типом аргумента; 4) операции округления: • trunc(x) (x — вещественное, результат — целая часть числа x, дробная часть отбрасывается и не округляется, trunc (5.2) = 5, trunc(−5.8) = = −5); • round(x) (x — вещественное, результат — округленное целое, round(x) = trunc (x + 0.5) при x ⩾ 0, round(x) = trunc(x − − 0.5) при x < 0). 2.2.3 Символьный (литерный) тип Стандартное имя типа char (character). Значениями этого типа являются элементы набора литер, определяемого реали- зацией языка. В Турбо-Паскале символы составляют множество ASCII (American Standard Code for Information Interchange) — 256 символов. Множество ASCII со- держит заглавные и строчные латинские буквы, цифры; может содержать русские буквы. Некоторые символы не имеют изображения (например, «конец строки»). Размер памяти, занятый символом, — 1 байт. Множество символов упорядочено. Функция ord(c) (0 ⩽ ord(c) ⩽ 255) дает порядковый номер литеры c. Функция chr(i) дает литеру (значение типа char) с порядковым номером 0 ⩽ i ⩽ 255. Функции ord и char взаимно обратны. Имеем свойства: ord (chr(i)) = i и chr(ord(c)) = c. Функция pred(c) (ord(c) > 0) дает предыдущую литеру. Функция succ(c) (ord(c) < 255) дает последующую литеру. Имеем свойства pred(c) = = chr (ord(c) − 1) и succ(c) = chr(ord(c) + 1). Графическое представление символа (имеющего его) — соответствующий знак в кавычках (апострофах) '+', 'y', '.', 'л', '"'. Символ, не имеющий графического представления, можно задать с помощью записи #<порядковый номер символа>, например #7 — гудок. Цифры '0', '1',. . ., '9' имеют подряд идущие порядковые номе- ра. Малые латинские буквы 'a', 'b',. . ., 'z' имеют подряд идущие номера. Большие латинские буквы 'A', 'B',. . ., 'Z' имеют подряд идущие порядковые номера. Для русских букв подобное свойство не выполняется. 34 Глава 2. Азы языка Паскаль Операции сравнения над символами такие же, как для чисел. Результат — бу- левский (логический) тип. Эти операции над символами эквивалентны сравнениям порядковых номеров символов. 2.2.4 Булевский (логический) тип Стандартное имя типа — boolean. Используется для представлений значений двузначной логики — всего два зна- чения: true (истина), false (ложь). Размер памяти для значений — 1 байт. Логический тип упорядочен. Выполняются следующие свойства: true > false, ord(false) = 0, ord(true) = 1, pred(true) = false, succ(false) = true. Логические операции Аргументы (операнды) и результат имеют булевский тип. Для обозначения операций используются служебные слова: and, or, not. Операции and и or — бинарные коммутативные и ассоциативные ∶ • x and y — логическое умножение (логическое «и») или конъюнкция имеет значение true тогда и только тогда, когда оба операнда — true; • x or y — логическое сложение (логическое «или») или дизъюнкция имеет значение false тогда и только тогда, когда оба операнда false; • операция not x — унарная операция — логическое отрицание: not true = = false , not false = true. 2.3 Выражения и основные операторы 2.3.1 Выражения Выражение представляет собой формальное правило для вычис- ления некоторого (нового) значения. Понятие выражения присут- ствует практически в любом достаточно развитом языке про- граммирования, а синтаксические правила для построения выра- жений очень похожи в различных языках. В самом общем случае можно сказать, что выражения строятся из операндов, знаков операций и круглых скобок. Переменные и константы сами по себе являются частным случаем выражений. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Выражения и основные операторы 35 Операнды представляют собой «элементарные» значения; ими могут быть переменные, константы, вызовы функций. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пример Примеры выражений: a+b+c*2 a/b/c 7-a*(sin(x)+2) a=b (2>3)=(7<>10) pred( 'x') true<=false Значение выражения вычисляется во время вычисления. Мы говорим о вы- ражениях целого, вещественного, булевского и других типов, имея в виду тип значения, вычисляемого данным выражением. Тип выражения определяется син- таксически исходя из типов операндов и операций. Поэтому выражения должны быть синтаксически правильны. Пример Примеры неправильных выражений: 2**3 e==3 (2+1) true+false not(a) — недопустимо, если a не булевского типа. Синтаксис выражений предусматривает определенное старшинство операций (приоритеты); приоритеты задают очередность выполнения операций, указанных в выражении. Круглые скобки предназначены для указания порядка (очередности) вычислений, если необходимо изменить тот порядок действий, который определен приоритетами операций. Перечень операций в порядке убывания приоритета: 4) not 3) *, /, div, mod, and 36 Глава 2. Азы языка Паскаль 2) +, − , or 1) =, <>, <,>, <=, >= Выражение ничего не говорит, что делать с полученным результа- том (значением). 2.3.2 Оператор присваивания В результате выполнения оператора присваивания переменная получает какое- то значение в результате вычисления выражения. Синтаксис оператора присваива- ния в БНФ: <оператор присваивания> ::= <переменная> := <выражение> Выражение в правой части должно получать тот же тип, что и пе- ременная. Арифметический оператор присваивания Тип выражения — integer или real. Разрешается вещественной переменной присваивать целое значение. Пример const pi=3.14159; var x,a,b,c,r:real; i:integer; begin x:=0; {пример использования предыдущего значения переменной} i:=i+1; c:=sqrt(a*a+b*b); x:=2*pi*r; {следующие присваивания — неправильны} 3:=i+2; x=2*pi*r; i:=5/4; 2.3 Выражения и основные операторы 37 x:=a* − b/2; {два знака операции не допускаются подряд} end. Логический оператор присваивания В левой части переменная типа boolean. Пример var d,b,c:boolean; x,y:real; k:integer; begin d:=x<2*y; d:=true; d:=odd(k); d:=not not b; d:=not(not(b)); c:=d and (x<>y) and b; c:=(b or d) and not b; c:=(d or b) < not c; {неправильно:} c:=d or x>y; {правильно} c:=d or (x>y); end. Литерный оператор присваивания В левой части переменная типа char. Справа может быть только константа, переменная или функция. Пример var sym,alpha,beta:char; begin 38 Глава 2. Азы языка Паскаль sym:= '+'; alpha:=sym; beta:=succ(sym); alpha:=chr(40); end. 2.3.3 Ввод-вывод Для выполнения операций ввода-вывода служат четыре процедуры: read, readln , write, writeln. Процедура чтения read обеспечивает ввод числовых данных, символов и неко- торых других типов данных с клавиатуры, в результате чего эти данные становятся значениями переменных. Вызов процедуры: read(X1,X2, . . ., XN); где X1, X2,. . ., XN — переменные допустимых типов данных. Значения X1, X2,. . ., XN набираются минимум через один пробел на клавиатуре и высвечиваются на экране. После набора данных для одной процедуры read нажимается клавиша ввода Если в программе имеется несколько подряд идущих процедур read, данные для них вводятся потоком, т. е. после набора значений переменных для одной про- цедуры read можно, не нажимая клавишу Процедура чтения readln аналогична процедуре read, единственное отличие заключается в том, что после считывания последней переменной в списке значений для одной процедуры readln данные для следующей процедуры ввода будут считываться с начала новой строки (т. е. ввод потоком невозможен). Процедура записи write производит вывод на экран числовых данных, сим- волов, булевских значений и строк. Вызов процедуры write(Y1, Y2, . . ., YN); где Y1, Y2,. . ., YN — выражения вида integer, real, char, boolean и строки (об этом типе будет сказано позже). Процедура записи writeln аналогична процедуре write, но после вывода последнего в списке значения для текущей процедуры writeln происходит пе- ревод курсора к началу следующей строки. Процедура writeln, записанная без параметров, вызывает перевод строки. 2.3 Выражения и основные операторы 39 В процедурах вывода write и writeln имеется возможность записи выра- жения, определяющего ширину поля вывода. Если x и i — целочисленные выражения, а y — вещественное выражение, то вызов write(x:i, y:i) печатает значения x и y каждое в крайние правые позиции полей шириной i. Write(y:i:k) — в крайние правые позиции поля шириной i символов вы- водится десятичное представление значения y в формате с фиксированной точкой, причем после десятичной точки выводится k цифр, представляющих дробную часть числа. 2.3.4 Последовательное выполнение и составной оператор Для того чтобы указать в программе последовательное выполнение операторов S1, S2,. . ., SN (т. е. после оператора S1 должен выполняться оператор S2 и т. д.), операторы отделяются символом «;» S1; S2; SN Используя служебные слова begin и end, можно из последовательности опе- раторов сделать составной оператор: begin S1; S2; SN end Составной оператор применяется в тех случаях, когда синтаксис языка допускает использование только одного оператора, в то вре- мя как семантика программы требует задание последовательности действий. 2.3.5 Условный оператор Условный оператор применяется для задания разветвления в программе, т. е. выбора действий в зависимости от истинности или ложности какого-либо условия. Пример Для того, чтобы z стало равным наибольшему из двух чисел x и y, необходимо выполнить присвоение z := x либо z := y. 40 Глава 2. Азы языка Паскаль Имеется две формы условного оператора: полная и сокращенная. <полный условный оператор> ::= if <логическое выражение> then <оператор> else <оператор> Пример if x>y then z:=x else z:=y; if x<0 then begin x:=x+h; y:=y −h; d:= not d end else begin x:=0; y:=0 end; if x>0 then sgn:=1 else if x=0 then sgn:=0 else sgn:= −1; <сокращенный условный оператор> ::= if <логическое выражение> then <оператор>; Пример Оператор x:=abs(x) эквивалентен if x<0 then x:= −x. Пример Поменять местами значения переменных x и y так, чтобы в x было большее значение: if y>x then begin t:=x; x:=y; y:=t end; 2.3 Выражения и основные операторы 41 Пример Ветви then и else могут снова содержать условные операторы: if x>0 then sgn:=1 else if x=0 then sgn:=0 else sgn:= −1; Неоднозначность в условном операторе следующего вида! if B1 then if B2 then S1 else S2 Различное выполнение вложенного условного оператора можно явно уточнить, применяя служебные слова (операторные скобки) begin и end: a) if B1 then begin if B2 then S1 else S2 end; b) if B1 then begin if B2 then S1 end else S2; В Паскале используется вариант a). Если if следует после then, то всегда помещайте внутренний условный оператор между begin и end. 2.3.6 Оператор цикла с предусловием Циклы с предусловием (циклы while) используются в случае, когда циклически- ми действиями управляет логическое условие и, как правило, к моменту выпол- нения цикла не ясно, сколько нужно повторить циклические действия. Последова- тельность действий данного оператора цикла заключается в следующем: сначала вычисляется логическое выражение — предусловие. Если оно истинно, то выпол- няется тело цикла до тех пор, пока условие не примет значение ложь. while <логическое выражение> do | заголовок цикла <оператор> | тело цикла Если по условию задачи тело цикла содержит более одного оператора, то при- меняют составной оператор. Приведем несколько фрагментов программ с циклом while. 42 Глава 2. Азы языка Паскаль Пример {s = сумма целых чисел от 1 до n, n > 0} s:=0;i:=1; while i<=n do begin s:=s+i; i:=i+1 end Пример {x1=наибольший общий делитель x и y} x1:=x;y1:=y; while x1<>y1 do if x1>y1 then x1:=x1 −y1 else y1:=y1 −x1; Пример {Для данного M>0 требуется найти наименьшее целое число k>=0 такое, что 3 ∧ k > M} y:=1;k:=0; while y<=M do begin k:=k+1; y:=y*3; end; 2.3.7 Оператор цикла с постусловием В этом случае, как правило, число повторений заранее неизвестно, но известно условие, при выполнении которого цикл должен завершиться. Последовательность действий данного оператора цикла заключается в следующем: выполняется те- ло цикла до тех пор, пока постусловие — логическое выражение (постусловие) не примет значение истина. repeat <оператор> until <логическое выражение> 2.3 Выражения и основные операторы 43 Пример {s = сумма целых чисел от 1 до n, n > 0} s:=0;i:=0; repeat i:=i+1; s:=s+i; until i=n; Пример Вычислить наименьшее n, для которого y = 1+1/2+1/3+. . .+1/n ⩾5. y:=0;n:=0; repeat n:=n+1; y:=y+1/n; until y>=5; Между операторами цикла while и repeat существует три от- личия: 1. Тело цикла repeat выполняется всегда хотя бы один раз. 2. Выход из цикла repeat происходит при истинности усло- вия, а из цикла while — по ложности условия. 3. Тело цикла repeat может состоять более чем из одного оператора и не содержать операторных скобок. 2.3.8 Оператор цикла с параметром Такие операторы обычно используются, когда число повторений цикла мо- жет быть определено перед его выполнением. Кроме того, циклы с параметром позволяют задать автоматическое изменение значения некоторой переменной и ис- пользовать эти значения в последовательных итерациях. Более конкретно, данный вариант оператора цикла определяет: • диапазон изменения значений управляющей переменной и, одновременно, число повторений оператора, содержащегося в теле цикла; • направление изменения значения переменной (возрастание или убывание); |