Программирование на языке Паскаль

Определение компьютерной программы. История и особенности языка программирования Паскаль. Словарь языка Pascal. Битовая арифметика и операции над битами. Структура программы на языке Паскаль. Ввод и вывод данных. Пунктуация в программах на Паскале.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 11.12.2011
Размер файла 60,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Например, число 5 в двоичном представлении (в одном байте) имеет значение 00000101. Операция not инвертирует биты и мы получим 11111010, т.е число 250. Если побитовую операцию or использовать к числам 5 (00000101) и 3 (00000011), то получится число 7 (00000111).

Операции циклического сдвига

В Паскаль определены еще две операции над данными целого типа, имеющие тот же уровень приоритета, что и операции and, *, /, div и mod. Это операции shl и shr, которые сдвигают последовательность битов на заданное число позиций влево или вправо соответственно. При этом биты, которые выходят за разрядную сетку, теряются. При выполнении операции shl освободившиеся справа биты заполняются нулями. При выполнении операции shr освободившиеся слева биты заполняются единицами при сдвиге вправо отрицательных значений и нулями в случае положительных значений.

С помощью операции shl возможна замена операции умножения целых чисел на степени двойки. Следующие пары выражений приводят к одинаковому результату: (a shl 1) = a * 2, (a shl 2) = a * 4, (a shl3) = a * 8.

Пример побитовых операций и циклического сдвига

var

A, B: byte;

begin

A := 11; {00001011}

B := 6; {00000110}

writeln('A=', A);

writeln('B=', B);

writeln('not A = ', not A); {11110100 = 244}

writeln('A and B = ', A and B); {00000010 = 2}

writeln('A or B = ', A or B); {00001111 = 15}

writeln('A xor B = ', A xor B); {00001101 = 13}

writeln('A shl 1 = ', A shl 1); {00010110 = 22}

writeln('B shr 2 = ', B shr 2); {00000001 = 1}

end.

Практическое значение побитовых операций

Операция and практически всегда используется только для достижения одной из двух целей: проверить наличие установленных в единицу битов или осуществить обнуление некоторых битов.

Подобная проверка нужна, если число представляет набор признаков с двумя возможными значениями (набор флагов). Так, многие системные ячейки памяти содержат сведения о конфигурации компьютера или его состоянии. При этом установка бита с конкретным номером в 1 трактуется как включение какого-либо режима, а в 0 -- выключение этого режима.

Пусть переменная a имеет тип byte и является байтом с восемью флагами. Необходимо проверить состояние бита с номером 5 (биты нумеруются справа налево от 0 до 7). Единица в бите 5 -- это пятая степень числа 2, т.е. 32 (00100000). Поэтому, если в пятом бите переменной a стоит единица, то выполняется условие (a and 32) = 32, которое можно проверить в операторе ветвления if. Если необходимо проверить состояние нескольких одновременно установленных в единицу битов, то нужно вычислить соответствующее число как сумму степеней числа 2, где показатели степени равны номерам битов, установленных в 1. Например, для битов 5, 2 и 0 имеем 32+4+1=37. Если a имеет среди прочих единицы в битах 5, 2, 0, то выполнится условие (a and 37) = 37.

Пусть нужно обнулить какой-либо бит в переменной a типа byte (например, бит 3). Определим сначала число, содержащее единицы во всех битах, кроме третьего. Максимальное число, которое можно записать в тип byte, равняется 255. Чтобы в нем обнулить третий бит, вычтем из этого числа третью степень числа 2 (255-8=247). Если это число логически умножить на a, то его единицы никак не скажутся на состоянии переменной a, а нуль в третьем бите независимо от значения третьего бита переменной a даст в результате 0. Итак, имеем a:= a and (255-8). Аналогично можно обнулить несколько битов.

Операция or применяется при установке в единицу отдельных битов двоичного представления целых чисел. Так, чтобы установить бит 4 переменной a в единицу без изменения остальных битов, следует записать a:= a or 16, где 16 -- четвертая степень числа 2. Аналогично устанавливаются в единицу несколько битов.

Операция xor применяется для смены значения бита (или нескольких битов) на противоположное (1 на 0 или 0 на 1). Так, чтобы переключить в противоположное состояние 3-й бит переменной a, следует записать a:= a xor 8, где 8 -- третья степень числа 2.

Условные операторы

Бывает, что в процессе выполнения программы требуется реализовать разный набор команд в зависимости от какого-нибудь условия. В языках программирования это реализуется с помощью специальных конструкций - условных операторов.

Обычными условными операторами являются конструкции "if-else" (или просто "if") и "case". Язык программирования Паскаль не исключение.

if-else

Когда выполнение основной ветки программы доходит до условного оператора if-else, то в зависимости от результата логического выражения в его заголовке выполняются разные блоки кода. Если логическое выражение вернуло true, то выполняется один блок (в Паскале начинается со слова then), если false - то другой (начинается со слова else). После выполнения одного из вложенных блоков кода, ход программы возвращается в основную ветку. Другой вложенный блок не выполняется.

Например, программа должна определять, ввел пользователь четное или нечетное число, и выводить на экран сообщение.

Тогда программный код на языке Pascal может быть таким:

var n: integer;

begin

write ('Введите целое число: ');

readln (n);

if n mod 2 = 0 then

write ('Оно четное.')

else

write ('Оно нечетное.');

readln

end.

Бывают неполные формы условных операторов. В таком случае вложенный блок существует только для случая true. В случае false выполнение программы сразу передается в основной блок. Т.е. отсутствует ветка else.

В примере ниже, если переменная имеет значение меньше нуля, то ее значение изменяется (находится модуль числа). Если же значение переменной изначально больше нуля, то блок кода при операторе if вообще не выполняется, т.к. не соблюдено условие (n<0).

var n: integer;

begin

write ('Введите целое число: ');

readln (n);

if n < 0 then

n := abs (n);

write (n);

readln

end.

Оператор case

Кроме оператора if в языке программирования Паскаль предусмотрен оператор ветвления по ряду условий - case. Данный оператор используется реже из-за существующих ограничений для него.

В заголовке оператора case вместо логического выражения фигурирует переменная, которую называют селектором. До этого в программе ей присваивается какое-либо значение. Эта переменная может иметь только перечисляемый тип (например, она не может быть вещественного типа). По ходу выполнения оператора case, значение переменной-селектора сравнивается с различными, описанными в нем случаями (метками-значениями). Как только совпадение будет найдено, то выполняется блок кода при данной метке и происходит выход в основную ветку программы.

Если совпадений не будет, то выполняется блок else. Если блок else отсутствует, то никакой блок кода в операторе case не выполняется.

var n: integer;

begin

write ('Введите класс школы: ');

eadln (n);

case n of

1..4: writeln ('Младшие классы.');

5..8: writeln ('Средняя школа.');

9,11: writeln ('Старшие классы. Выпускной.');

10: writeln ('Старшие классы.');

else writeln ('Error')

end;

readln

end.

Задачи к данной теме

Найти максимальное число из трех

Оператор case в задаче выбора

Определение четверти на координатной плоскости

Определить возможность существования треугольника по сторонам

Перевод римских чисел в арабские. Пример автоматного распознавателя

Рекурсия. Процедура перевода чисел из десятичной системы счисления в другие

Функции вычисления площади геометрических фигур

Вложенные конструкции if-else

Следует быть внимательными при использовании вложенных операторов if. Предпочтительнее пользоваться схемой else-if (т.е. вкладывать во внешнюю ветку else), а не then-if (т.е не вкладывать во внешнюю ветку if). Так как в последнем случае придется следить за тем, к какой ветке относится соответствующее else. Пренебрежение этим правилом приводит к нагромождению закрывающих else.

Сравните две программы ниже. Они делают одно и то же. Однако предпочтительной является первая.

else-if

var

a: integer;

begin

write('Введите целое число: ');

readln(a);

if a = 0 then

writeln('zero')

else

if a = 1 then

writeln('one')

else

if a = 2 then

writeln('two')

else

writeln('unknown');

readln

end.

then-if

var

a: integer;

begin

write('Введите целое число: ');

readln(a);

if a <> 0 then

if a <> 1 then

if a <> 2 then

writeln('unknown')

else

writeln('two')

else

writeln('one')

else

writeln('zero');

readln

end.

При использовании второго варианта надо помнить следующее общее правило: каждый else относится к ближайшему предшествующему if, еще не имеющему парного else.

При вложении в ветвь else (первый вариант) конструкция получается логически более понятной.

Задачи к данной теме

Вычисление значения функции

Вычисление площадей геометрических фигур

Определить возможность существования треугольника по сторонам

Перевод римских чисел в арабские. Пример автоматного распознавателя

Программа "Угадай число"

Процедура вычисления корней квадратного уравнения. Вложенные конструкции if-else

Следует быть внимательными при использовании вложенных операторов if. Предпочтительнее пользоваться схемой else-if (т.е. вкладывать во внешнюю ветку else), а не then-if (т.е не вкладывать во внешнюю ветку if). Так как в последнем случае придется следить за тем, к какой ветке относится соответствующее else. Пренебрежение этим правилом приводит к нагромождению закрывающих else.

Сравните две программы ниже. Они делают одно и то же. Однако предпочтительной является первая.

else-if

var

a: integer;

begin

write('Введите целое число: ');

readln(a);

if a = 0 then

writeln('zero')

else

if a = 1 then

writeln('one')

else

if a = 2 then

writeln('two')

else

writeln('unknown');

readln

end.

then-if

var

a: integer;

begin

write('Введите целое число: ');

readln(a);

if a <> 0 then

if a <> 1 then

if a <> 2 then

writeln('unknown')

else

writeln('two')

else

writeln('one')

else

writeln('zero');

readln

end.

При использовании второго варианта надо помнить следующее общее правило: каждый else относится к ближайшему предшествующему if, еще не имеющему парного else.

При вложении в ветвь else (первый вариант) конструкция получается логически более понятной.

Определить возможность существования треугольника по сторонам

Перевод римских чисел в арабские. Пример автоматного распознавателя

Программа "Угадай число"

Процедура вычисления корней квадратного уравнения

Циклы в Паскале

В процессе решения множества задач, часто требуется повторять те или иные действия. При этом бывают разные ситуации. Например:

количество итераций (повторений) известно до выполнения тела цикла;

до выполнения тела цикла количество итераций не известно;

тело цикла должно выполниться хотя бы один раз.

Под разные ситуации существуют различные циклические конструкции. В языке программирования Pascal их три, в соответствие с пунктами описанными выше. Самой универсальной и поэтому чаще других используемой конструкцией цикла является второй вариант (цикл while).

Цикл for

Часто цикл for называют циклом со счетчиком. Этот цикл используется, когда число требуемых повторений в программе точно известно до выполнения тела цикла. В заголовке цикла указываются два значения. Первое значение присваивается так называемой переменной-счетчику, от этого значения начинается отсчет количества итераций. В языке программирования Паскаль отсчет идет всегда с шагом равным единице. Второе значение указывает, при каком значении счетчика цикл должен прекратить выполняться. Легко понять, что количество итераций цикла определяется разностью между вторым и первым значением плюс единица. Тело цикла не должно содержать выражений, изменяющих счетчик.

Нужно понимать, что количество итераций цикла for известно именно до его выполнения, но не до выполнения всей программы. Так в примере ниже, количество выполнений цикла определяется пользователем. Значение присваивается переменной, а затем используется в заголовке цикла. Но когда оно используется, циклу уже точно известно, сколько раз надо выполниться.

var

i, n: integer;

begin

write ('Количество знаков: ');

readln (n);

for i := 1 to n do

write ('(*) ');

readln

end.

Цикл while

Цикл while является циклом с предусловием. В заголовке цикла находится логическое выражение. Если оно возвращает true, то тело цикла выполняется, если false - то нет.

Если тело цикла было выполнено, то ход программы снова возвращается в заголовок цикла. Условие выполнения тела снова проверяется (находится значение логического выражения). Тело цикла выполнится столько раз, сколько раз логическое выражение вернет true. Поэтому очень важно в теле цикла предусмотреть изменение переменной, фигурирующей в заголовке цикла, таким образом, чтобы когда-нибудь обязательно наступала ситуация false. Иначе произойдет так называемое зацикливание.

var

i, n: integer;

begin

write ('Количество знаков: ');

readln (n);

i := 1;

while i <= n do begin

write ('(*) ');

i := i + 1

end;

readln

end.

Цикл repeat

Цикл while может не выполниться ни разу, если логическое выражение в заголовке сразу вернуло false. Однако такая ситуация не всегда может быть приемлемой. Бывает, что тело цикла должно выполниться хотя бы один раз не зависимо от того, что вернет логическое выражение. В таком случае используется цикл repeat - цикл с постусловием.

В цикле repeat логическое выражение стоит после тела цикла. Причем, в отличие от цикла while, здесь все наоборот: в случае true происходит выход из цикла, в случае false - его повторение.

var

i, n: integer;

begin

write ('Количество знаков: ');

readln (n);

i := 1;

repeat

write ('(*) ');

i := i + 1

until i > n;

readln

end.

В примере, даже если n будет равно 0, одна звездочка все равно будет напечатана.

Задачи к данной теме

Возведение числа в степень

Вывод на экран таблицы ASCII

Вычисление суммы ряда чисел

Заполнение массива и вычисление суммы элементов

Заполнение массива и его вывод на экран

Перевод римских чисел в арабские. Пример автоматного распознавателя

Программа "Угадай число"

Таблица умножения на Паскале

Фильтр строки

Функции вычисления площади геометрических фигур

Функция, вычисляющая наибольший общий делитель

Операторы goto, break и continue

Оператор безусловного перехода goto

Паскаль является структурным языком программирования. Не смотря на это, в нем присутствует ряд особенностей, которые широко использовались на начальных этапах развития программирования. В те времена идея о том, что программа может рассматриваться как система логически связанных блоков, еще не оформилась. Поэтому, если требовалось изменить линейный ход программы, программисты использовали оператор безусловного перехода goto.

Позже большинство программистов отказались от регулярного использования оператора goto, однако бывают случаи, когда он может быть полезен.

Необходимо знать, что всегда можно обойтись без оператора goto.

label goback;

var num: real;

begin

goback:

write ('Введите число: ');

readln (num);

if num < 0 then

goto goback;

num := sqrt (num);

write ('Квадратный корень: ', num:5:2);

readln

end.

Операторы break и continue

Операторы break и continue используются для того, чтобы прервать ход выполнения цикла. Оператор break выполняет полный выход из цикла, т.е. все возможные итерации цикла прерываются. Оператор continue прерывает только текущую итерацию.

В примере у пользователя несколько раз запрашивается число, только в том случае, если он не вводит ноль.

var

num: real;

i: integer;

begin

for i := 1 to 5 do begin

write ('Введите число: ');

readln (num);

if num = 0 then

break;

writeln (num)

end;

readln

end.

В примере запрашиваются 5 чисел и суммируются только положительные из них.

var

num, sum: real;

i: integer;

begin

sum := 0;

for i := 1 to 5 do begin

write ('Введите число: ');

readln (num);

if num < 0 then

continue;

sum := sum + num

end;

write (sum:10:2);

readln

end.

Генератор псевдослучайных чисел

Бывают ситуации, когда требуется, чтобы результат работы программы был случайным в определенных пределах. Для реализации такой возможности во многих языках программирования присутствуют встроенные функции, код которых выдает случайные числа. На самом деле числа не совсем случайные, а псевдослучайные. Дело в том, что искусственно реализовать случайность невозможно. Обычно берется некоторый коэффициент, и с его помощью вычисляется каждое последующее «случайное» число.

В языке программирования Паскаль для генерации псевдослучайных чисел в заданных диапазонах используется функция random. Перед ее использованием обычно выполняется процедура инициализации датчика случайных чисел - randomize; иначе программа всегда будет выдавать один и тот же результат. Randomize задает начальное значение последовательности, от которого вычисляются все последующие. При каждом запуске программы это значение будет разным, а значит и результат работы функции random будет различным.

Функция random генерирует случайное число в диапазоне от 0 (включительно) до единицы. Если в скобках указан аргумент, то от 0 до значения указанного в скобках (не включая само значение). Так выражение random (10), говорит о том, что будет получено любое число в диапазоне [0, 10). Если требуется получать значения в каком-либо другом диапазоне (не от нуля), то прибегают к математической хитрости. Например, чтобы получить случайное число от -100 до 100 достаточно записать такое выражение: random (200) - 100. В результате, сначала будет получено число из диапазона [0, 199], а затем из него будет вычтена сотня. И если случайное число было меньше 100, то результат выражения будет отрицательным.

В примере программы сначала с помощью процедуры randomize инициализируется датчик случайных чисел. Далее переменной n присваивается случайное значение в диапазоне [5, 12). Значение переменной n используется для определения количества итераций цикла for. В цикле for генерируются случайные числа в диапазоне [0, 50) и выводятся на экран.

var n, i, x: integer;

begin

randomize;

n := random (7) + 5;

for i := 1 to n do begin

x := random (100) - 50;

write (x:5)

end;

readln

end.

Эквивалентность и совместимость типов

Эквивалентность типов

В языке программирования Паскаль строго определено, какие типы описывают идентичные множества значений (т.е эквивалентны). В языке принят принцип именной эквивалентности типов, устанавливающий, что два типа T1 и T2 эквивалентны, если выполняется одно из следующих условий.

T1 и T2 -- одно и то же имя типа.

Тип T2 описан с использованием типа T1 равенством вида type T2=T1; или последовательностью подобного вида равенств. Например:

type

T1=integer;

T3=T1;

T2=T3;

Так, несмотря на абсолютную идентичность, приведенные ниже типы не являются эквивалентными.

type

tp1 = array[1..10] of real;

tp2 = array[1..10] of real;

Если переменные описаны совместно, то они обладают эквивалентными типами. Например:

var

v1, v2: tp1;

Совместимость типов

Одним из требований в языке программирования Pascal является следующее: в выражениях (в том числе при сравнении) должны использоваться операнды с совместимыми типами. Типы совместимы, если выполняется хотя бы одно из условий.

Оба типа эквивалентны.

Оба типа целые.

Оба типа вещественные.

Один из типов имеет интервальный тип, а другой тип является для него базовым:

type

tp1 = integer;

tp2 = -1..1000;

Оба типа являются диапазонами одного и того же базового типа

type

tp1 ='a'..'z';

tp2 = 'a'..'f';

Один тип строковый, а второй -- либо строковый, либо символьный, либо упакованный символьный массив.

Оба типа -- упакованные символьные массивы с одинаковым числом элементов.

Оба типа множественные с совместимыми базовыми типами:

type

tp1 = set of byte;

tp2 = set of 1..100;

Один тип является ссылочным, а второй -- либо ссылочный, либо бестиповый указатель.

Оба типа -- это процедурные типы с одним и тем же числом параметров, причем типы параметров должны быть эквивалентными (в соответствии с их порядком следования), а для функциональных типов также должны быть эквивалентными типы результатов.

Если в выражении типы совместимы, но различны, то тип результата определяется более общим (т.е. тем, который включает в себя все возможные значения другого типа) из типов операндов.

Кроме понятий эквивалентности и совместимости типов в Pascal введено понятие совместимости по присваиванию.

Оператор присваивания корректен, если тип переменной в его левой части совместим по присваиванию с типом выражения в правой части. Для этого должно выполняться хотя бы одно из условий.

Оба типа эквивалентны, но ни один из них не является файловым типом или сложным типом, использующим файловый тип.

Оба типа -- совместимые дискретные типы, и текущее значение типа t2 попадает в диапазон возможных значений типа t1.

Оба типа вещественные, и текущее значение типа t2 попадает в диапазон возможных значений типа t1.

Тип левой части вещественный, а тип правой части -- целый.

Тип t1 является строковым, а t2 -- либо строковый, либо символьный, либо упакованный символьный массив.

Оба типа представляют собой упакованные символьные массивы.

Оба типа -- совместимые множественные типы, причем множество из правой части целиком входит во множество, указанное в левой части.

Оба множества -- совместимые ссылочные типы.

Тип левой части процедурный, а правая часть представляет собой имя процедуры или функции с тем же числом параметров, что и у типа в левой части; типы соответствующих параметров (а также типы результата для функции) должны быть эквивалентными.

Оба типа являются объектными, причем тип t2 является потомком типа t1.

Оба типа - ссылочные типы на совместимые объектные типы.

Размещено на Allbest.ru


Подобные документы

  • Программирование на языке Паскаль: алфавит, решение задач, простейшие программы, разветвляющие программы, циклические программы, ввод-вывод, массивы, подпрограммы, строковые данные, записи, файлы, использование библиотеки CRT, графика в Паскале.

    учебное пособие [211,1 K], добавлен 30.03.2008

  • История и основы структурного программирования в среде Turbo Pascal. Работа с различными типами данных. Операторы языка. Работа с символьными и строковыми переменами, одномерным, двумерным массивами. Классификация компьютерных игр. Игры на языке Паскаль.

    курсовая работа [28,8 K], добавлен 06.05.2014

  • Основные сведения о системе программирования Турбо Паскаль. Структура программы на Паскале и ее компоненты. Особенности и элементы языка Турбо Паскаль. Порядок выполнения операций в арифметическом выражении, стандартные функции и оператор присваивания.

    лекция [55,7 K], добавлен 21.05.2009

  • Международный стандарт на язык программирования Паскаль. Приемы объектно-ориентированного программирования в Турбо Паскале. Символы языка, его алфавит. Этапы разработки программы. Понятие алгоритмов и алгоритмизации. Структура программ на Паскале.

    курсовая работа [29,8 K], добавлен 28.02.2010

  • Особенности программирования на языке Паскаль в среде Турбо Паскаль. Линейные алгоритмы, процедуры и функции. Структура данных: массивы, строки, записи. Модульное программирование, прямая и косвенная рекурсия. Бинарный поиск, организация списков.

    отчет по практике [913,8 K], добавлен 21.07.2012

  • Создание транслятора, обрабатывающего код программы на языке Паскаль и за счет эквивалентных операторов генерирующего программу на Си. Особенности внешней спецификации и работы лексического анализатора. Структура программы, вывод результатов на экран.

    курсовая работа [254,0 K], добавлен 02.07.2011

  • Логические конструкции в системе программирования Паскаль. Команды языка программирования, использование функций, процедур. Постановка и решение задач механики в среде системы Паскаль. Задачи статики, кинематики, динамики решаемые с помощью языка Паскаль.

    курсовая работа [290,9 K], добавлен 05.12.2008

  • Выбор метода проектирования транслятора с языка Паскаль на язык Си, разработка и кодирование алгоритма программы. Использование допустимых операторов в исходном тексте, определение типов переменных и синтаксиса логических и арифметических выражений.

    курсовая работа [1,0 M], добавлен 03.07.2011

  • Общая характеристика языков программирования. Описание языка Паскаль: основные субъекты языка; структура Паскаль-программы; типизация и объявление данных. Операторы присваивания и выражения. Структурные операторы, организация ветвлений и циклов.

    дипломная работа [276,6 K], добавлен 26.01.2011

  • Создание приложения, исполняющего трансляцию программы из языка Паскаль в язык Си: разработка алгоритма реализации задачи, описание необходимых констант, переменных, функций и операторов, представление листинга программы и распечатка результатов.

    курсовая работа [305,9 K], добавлен 03.07.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.