Сделай Сам Свою Работу на 5

ТЕМА 2 Как включить в работу числовые данные





Мы рассмотрели простейшие действия — вывод на экран информации, причем всегда одной и той же. Однако компьютеры были придуманы для автоматизации сложных вычислений, для быстрого выполнения математических операций (иначе говоря — для работы с числами). И до сих пор эта их функция остается главной: ведь вся компьютерная информация хранится в форме чисел. Цель нашей второй темы — научиться работать с различными видами чисел.

2.1. Начнем с простого: целые числа

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

Понятие переменной

Данные нашей программы принято называть величинами. Величины, которые меняются, называют переменными, а те, которые не меняются — постоянными.

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



ЗАПОМНИТЕ!

Идентификатор (имя) всегда должен начинаться с латинской буквы, после которой может следовать некоторое число латинских букв, цифр или символов подчеркивания (—). В имени не должно быть пробелов, запятых или других непредусмотренных знаков. В Turbo Pascal 7.1 учитываются лишь первые 63 символа.

Тип Integer. Оператор присваивания. Вывод на экран

Теперь рассмотрим работу с самыми простыми переменными. В них можно хранить только целые числа. Для хранения целых чисел в Паскале используется специальный тип данных — Integer.

Внимательно читайте комментарии к программе в следующем примере!

Пример 2.1.Работа с целочисленными переменными

Program Product;

{ Далее идет раздел описания переменных. Он всегда начинается со слова var (от variable - переменная) }



var

А,В,С: integer; { Имена в списке - через запятую; в конце списка через двоеточие указывается тип данных: integer - целый }

Begin { Началось тело программы }

 

А:=5; { Это оператор присваивания. В данном случае запись означает, что в переменную (ячейку) А записали число 5. Не путайте с записью А=5 !!! }

writeln(A); { Выводим на экран содержимое переменной А. Имя А не заключено в апострофы! }

writeln('А'); { Вывод на экран символа А }

А:=А+1; { Запишем в переменную А число, которое до этого в ней было, но увеличенное на 1 }

В:=7:

С:=А*В; { * это операция умножения }

 

Writeln ('Product=',С) { Вывод содержимого ячейки С с пояснительным текстом }

 

end. { Здесь кончается тело программы }

При запуске программа выведет на экран следующее:

5

А

Product=42

ЗАПОМНИТЕ!

В результате выполнения оператора присваивания в ячейку помещается новое число. Старое содержимое ячейки при этом пропадает.

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

Тип результата выражения справа от оператора присваивания должен быть таким, чтобы помещаться в переменную слева от «:=».

Операции с типом Integer

Рассмотрим операции, которые можно выполнять с целыми числами и целочисленными переменными.

Пример 2.2.Операции с переменными целого типа

Program Action;

var

А,В.С: integer;

begin

n А:=17; В:=3;

{ Операция умножения: }

С:=А*В;

writeln('17 * 3=',С);

{ Деление нацело: }



С:=А div В;

wnte1n('17 div 3=',С);

{ Вычисление остатка от деления: }

С:=А mod В;

writeln('17 mod 3=’,С);

{ Сложение: }

С:=А+В;

writeln('17 + 3=',С);

{ Вычитание: }

С:=А-В;

writeln('17 - 3=',С)

end.

При запуске программа выведет на экран следующее:

17 * 3=51 17 div 3=5 17 mod 3=2 17 + 3=20 17 - 3=14

Рассмотрим еще несколько примеров операций div и mod. Для успешного понимания результатов этих операций нужно вспомнить 2-й класс и деление столбиком (рис. 2.2).

 

Рис. 2.2. Пример целочисленного деления столбиком

 

Частая ошибка: не забудьте, что все действия мы производим только с целыми числами! Не нужно продолжать деление, когда делимое (это то, что мы делим) оказывается меньше делителя (это то, на что мы делим). То, что осталось от делимого, называется остатком. Это и есть результат операции mod. Целое число, которое получилось в результате деления, называется целочисленным частным. Это результат операции div.

Проверим себя, вспомнив 2-й класс:

5 div 2=2; 5 mod 2=1;

6 div 2=3; 6 mod 2=0;

40 div 6=5; 40 mod 6=4;

3 div 5=0; 3 mod 5=3.

Результат вычисления операций div и mod для отрицательных чисел оказывается не совсем таким, как положено в математике (когда остаток всегда неотрицателен). Зато он более понятен. Другими словами, результат нужно посчитать отдельно от знаков, а потом добавить знак в соответствии с правилами математики:

(-10) div 3=-3; (-10) mod 3—1; (-3) div 5=0; (-3) mod 5=-3.

Задание 2.1. Даны 3 целых числа A, В, С. Вычислить их сумму и произведение.

Продумаем алгоритм решения данной задачи (рис. 2.3). Представьте каждый шаг алгоритма на языке Паскаль.

Задание 2.2. Дана длина ребра куба (целое число). Найти объем куба и площадь его боковой поверхности.

Рис. 2.3.Блок-схема алгоритма решения задания 2.1

Стандартные функции типа Integer

Многие стандартные действия с числовыми данными выполняют­ся путем вызова функций из библиотеки Паскаля. Такие функции называются стандартными функциями.

Пример 2.3. Демонстрация стандартных функций

Program Infunct;

var

А,В,С: integer;

begin

А:=-2;

{ Функция Abs (X) вычисляет абсолютное значение аргумента X, то есть модуль X }

B:=Abs(A);

write!n('Abs(-2)=',В);

{ Функция Sqr (X) возводит в квадрат аргумент X }

C:= Sqr(B);

writeln('Sqr(B)='.С);

C:=Sqr(B+B); writeln('Sqr(B+B)=',C);

end.

При запуске программы вывод на экран:

Abs(-2)=2

Sqr(B)=4

Sqr(B+B)=16

Задание 2.3. Вычислите значение выражения |39 • 54 - 842|.

Задание 2.4. В переменные А и В записаны целые числа (оператором присваивания, например, А:=20; В:=13). Поменяйте числа в этих переменных местами.

Будьте внимательны! Если записать А:=В, вы потеряете число 20 и получите в двух переменных число 13! Воспользуйтесь третьей переменной — С (рис. 2.4).

Рис. 2.4.Схема обмена значений двух переменных через третью ячейку. В кружках указан порядок операторов присваивания

Задание 2.5. Выполните задание 4 без использования третьей переменной. Используйте действия сложения и вычитания.

Как представляются переменные целого типа в памяти компьютера

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

Стандартная длина ячейки — 8 бит, что равно 1 байт. В такую ячейку можно записать двоичный код длиной 8 бит.

Для переменной типа integer выделяется ячейка длиной в 2 байта =16 бит. Такая ячейка получает символьное имя — имя переменной, и вы обращаетесь к ней не по адресу, а по имени.

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

v 0 — число положительно;

v 1 — число отрицательно.

Остальные 15 позиций выделяются для записи самого числа в двоичном виде (рис. 2.5).

Рис. 2.5.Распределение двоичных разрядов (бит) при хранении числа типа integer

На 15 позициях можно получить 215 двоичных кодов. Самое маленькое число состоит из 15 нулей, самое большое — из 15 единиц. Поскольку счет начинается с нуля, получаем всего (215 - 1) положительных двоичных чисел. С учетом знака числа (+ или -) получаем, что числа типа integer имеют диапазон представления -215...+215 - 1, или -32768 ... +32 767.

Тип integer является основой для нескольких производных типов — со знаком и без знака (табл. 2.1).

Задание 2.6. Считая, что операция умножения и операция возведения в квадрат имеют одинаковую сложность, запишите оптимальным образом выражения:

а) х5;
б) х6
в) х8:
г) х9
д) х10

Таблица 2.1. Целочисленные типы данных среды Turbo Pascal

Наличие знака Тип переменной Формат (длина) в байтах Диапазон
Запись с порядком Обычная запись
Без знака byte 0 ... 28 - 1 0... 255
word 0 ... 216 - 1 0... 65 535
Со знаком   shortint -27... 27 - 1 -128... 127
integer -215...215-1 -32 768 ... 32 767
longint -231... 231 - 1 -2 147 483 648 ... 2 147 483 647

2.2. Включаем в работу вещественные числа

Что делать, если число не целое, то есть имеет десятичную точку?

Описание вещественного типа данных (real)

Опишем в программе переменные для хранения не целых чисел. Такие переменные имеют тип real — вещественный тип.

Пример 2.4.Работа с типом real

Program Optel;

var

А.В.С: real;

Begin

A:=3.5;

B:=7.6;

C:=A+B;

writeln('Сумма=',C)

end.

При запуске программы вывод на экран:

Сумма=1.1100000000Е+01

Форматы записи вещественных переменных

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

1. Обычная форма.

Примеры:

v 0,7 может быть записано как 0.7 или .7

v -2,1 может быть записано как -2.1

2. Запись с экспонентой: число представляется в виде мантиссы, то есть дробной части числа, умноженной на 10 в некоторой степени.

Примеры:

v 2700 = 2,7 • 103. Число 10 записывается в виде буквы Е, а за ней идет величина степени: 2.7ЕЗ;

v 0,002 = 2 • 10~3 соответствует запись 2Е-3.

Вещественные операции

Пример 2.5.Операции с переменными вещественного типа

program Operation;

var

А,В,С: real;

Begin

А-17.3;

В:=3.4;

С:=А*В;

Writeln ('А*В=',С);

{ / - это операция деления }

С:=А/В;

Writeln ('А/В-'.С):

С:=А+В;

Writeln ('А+В=',С);

С:=А-В;

Writeln ('А-В=',С)

end.

При запуске программа выведет на экран следующее:

А*В= 5.8820000000Е+01 А/В- 5.0882352941Е+00

А+В= 2.0700000000Е+01 А-В= 1.3900000000Е+01

ЗАМАЧАНИЕ

Для вещественных чисел нет таких проблем с операцией деления, как для целых чисел. Операция «/» — это обычное деление.

Задание 2.7. Вычислите выражение: .

Стандартные функции типа real

Пример 2.6.Стандартные функции с вещественными переменными

Program AllFunc;

var

А,В: real;

Begin

А:=2.0;

B:=Sqr(A);

Writeln ('Sqr(2.0)='.В);

B:=Abs(-A);

Writeln ('Abs(-2.0)=',B);

B:=Sqrt (A); { Вычисление квадратного корня }

Writeln (Sqrt(2)='.В);

B:=Sin (A); { Вычисление синуса }

{ Зададим вывод вещественного числа не в экспоненциальной, а в обычной форме. На экране под значение переменной "В" закажем 6 позиций. Из них 3 позиции выделим для цифр справа от десятичной точки }

Writeln ('Sin(2)=',В:6:3);

B:=Cos (А); { Вычисление косинуса }

Writeln ('Cos(2)=',В:6:3);

B:=Arctan (А); { Вычисление арктангенса }

Writeln ('Arctan(2)=',В);

B:=Ln (А); { Вычисление натурального логарифма }

Writeln (,Ln(2)=',В);

В:=Ехр (А); { Возведение числа е в степень А }

Writeln ('Exp(2)='.В);

B:=Pi; { Вычисление числа Пи }

Writeln ('Pi=’,В)

end.

При запуске программы выведет на экран следующее:

Sqr(2.0)= 4.0000000000Е+00

Abs(-2.0)= 2.0000000000Е+00

Sqrt(2)« 1.4142135624Е+00

Sin(2)= 0.909 Cos(2)=-0.416

Arctan(2)= 1.1071487178E+00

Ln(2)- 6.9314718056E-01

Exp(2)= 7.3890560989E+00

Pi- 3.1415926536E+00

ЗАМЕЧАНИЕ

Вы, вероятно, заметили, что Паскаль содержит мало функций. Он не умеет вычислять даже те функции, которые вычисляет обычный инженерный калькулятор! Уто же это за язык программирования, скажете вы! Ответ на это прост: Паскаль разрабатывался не для вычислений (как, например, Фортран), а для обучения.

Запись математических выражений

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

Например, чтобы вычислить (2x + 3)1+cos x, мы напишем на Паскале:

ехр((1+cos(x)) * ln(2*x+3) )

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

Например, выражение , записанное в виде х+1/2х, содержит сразу три ошибки. Во-первых, приоритет операции деления выше, чем у сложения, поэтому, для правильного вычисления числителя его надо взять в скобки: (х+1). Во-вторых, Паскаль не понимает, что означает 2х. Это мы привыкли, что в математике операцию умножения в таких случаях опускают. Паскалю требуется, чтобы она была указана явно: (х+1)/2*х. Но даже это выражение все еще содержит ошибку. Дело в том, что умножение и деление имеют одинаковый приоритет и выполняются слева направо. Значит, при такой записи сначала выполнится деление, а потом результат будет умножен на х. Нужно либо поставить знаменатель в скобки и написать (х+1)/(2*х), либо, для ленивых, поставить вместо умножения деление: (х+1)/2/х. Порядок вычисления в этом случае будет не такой, как требует условие. Однако результат будет таким же: ведь поделить на 2х — это все равно, что поделить на 2, а потом результат — на х!

ЗАПОМНИТЕ!

Аргументы функции всегда пишутся в скобках. То есть если у функции нет аргументов (как у Pi, например), то скобки после ее имени не нужны. Если же аргументы есть, то после имени функции вы должны обязательно открыть скобку, перечислить аргументы и не забыть закрыть скобку. '(Например, sin 2х в Паскале нужно записывать как sin(2*x).

Задание 2.8. Напишите программу для вычисления дискри­минанты квадратного уравнения. Коэффициенты задайте в про­грамме через оператор присваивания.

Продумаем алгоритм решения данной задачи (рис. 2.6.).

Запишите каждый шаг алгоритма на языке Паскаль.

Задание 2.9. Вычислите выражение: .

Рис. 2.6.Алгоритм выполнения задания 2.8

Как представляются переменные вещественного типа в памяти компьютера

Рис. 2.7.Распределение двоичных разрядов (бит) при хранении числа типа real

Вы познакомились с экспоненциальной формой представления числа. В ней можно выделить две части: мантиссу, то есть значащие цифры числа, и порядок — степень десятки (в общем случае это степень основания системы счисления, в которой записано данное число). Ячейка памяти, выделенная для переменной вещественного типа, должна содержать следующие элементы: знак числа, знак порядка, значение порядка и значение мантиссы — естественно, все в двоичном представлении (рис. 2.7)

Порядок и знак порядка занимают вместе 8 бит и хранятся, вообще говоря, немного хитрее. Но это нам сейчас не важно. Главное — понять принцип хранения чисел с плавающей точкой.

Таблица 2.2.Вещественные типы данных среды Turbo Pascal

Тип переменной Формат (длина) в байтах Примерный диапазон абсолютных значений Количество значащих десятичных цифр
Одинарный (singlе) 10 - 45... 1038 7 или 8
Вещественный (real) 10 - 39... 1038 11 или 12
Двойной (double) 10 - 324... 10308 15 или 16
Расширенный (extended) JQ-4932 j;Q4932 19 или 20

Как совместить переменные целого и вещественного типа

В программе могут одновременно встречаться переменные разных типов. Как их совместить?

Преобразование типов

Пример 2.7.Одновременное использование вещественных и целых типов

Program Mix;

var

N,K: integer;

А,В; real;

Begin

N:=4;

A;=3.6;

B;=N; { В переменную типа real можно записать целое число }

writeln('B=',В);

{ В переменную типа integer нельзя записать вещественное число! Чтобы все-таки поместить число типа real в переменную типа integer, нужно явно указать, что делать с дробной частью числа. Есть два варианта: }

N:=Trunc(A); {Функция Тrunс(Х) возвращает целую часть числа X, то есть, отбрасывает дробную часть }

writeln('Trunc(3.6)=',N):

K:=Round(A); { Функция Round(X) - округляет до ближайшего целого }

writeln('Round(3.6)=',К)

End.

При запуске программа выведет на экран следующее:

В:= 4.0000000000Е+00

Trunc(3.6)=3

Round(3.6)=4

Еще раз уточним правила преобразования типов: для хранения данных типа integer используется 2 байта, а для real необходимо 6 байт. Это значит, что число типа integer можно поместить в ячейку типа real (целая часть будет равна этому числу, а дробная будет равна нулю). А вот число типа real в ячейку типа integer никак не поместится. Чтобы все-таки поместить его туда, нужно явно указать, что делать с дробной частью числа. Для этого предусмо­трены 2 функции: trunc и round. Обе они возвращают результат типа integer.

Что делать, если в программе нужно записать сложное математическое выражение? В каком порядке будут выполняться действия?

Правила приоритета в выполняемых действиях

1.Действия над переменными, стоящими в скобках, выполняются в первую очередь.

2.После вычисления значений всех скобок вычисляются все функции.

3.После функций выполняются умножение и деление. Они имеют одинаковый приоритет.

4.Следующие по приоритету — сложение и вычитание.

5.Операции одинакового приоритета выполняются слева направо.

Действия над данными разных типов

Сведем воедино операции и функции по работе с вещественными и целыми величинами.

Таблица 2.3.Операции и функции для типов integer и real

Операция/функция Тип данных 1-го аргумента Тип данных 2-го аргумента Тип результата
+ , -. * Integer Integer Integer
  Integer Real Real
Real Integer Real
Real Real Real
/ He важен Real
Div, mod Только Integer Integer
Abs, Sqr Integer - Integer
Real   Real
Sqrt, Sin, Cos, Arctan, Ln, Exp, Pi He важен   Real
Trunc, Round He важен   Integer

Поясним написанное в таблице. Мы разделили все функции/ операции на 6 категорий.

1. Результат операций +, - и * зависит от типа аргументов. Если хоть один из них имеет тип real, то и результат будет иметь тип real. Это объясняется тем, что у данных типа real есть дробная часть, а у integer — нет. Даже если в вещественной переменной хранится целое число, оно все равно имеет дробную часть, только она равна нулю. То есть, если хотя бы у одного из аргументов есть дробная часть, то в результате выполнения операции она никуда не исчезает. Поэтому результат тоже имеет дробную часть (real).

2.Результат операции вещественного деления по определению всегда имеет дробную часть.

3.Операции целочисленного деления определены только для целых чисел. Поэтому результат тоже всегда целый.

4.Функции Abs и Sqr определены для обоих типов данных. Поэтому тип их результата зависит от типа аргумента. Для целого аргумента результат имеет целый тип, для вещественного — вещественный.

5.Функции Sqrt, Sin, Cos, Arctan, Ln, Exp, Pi по определению являются вещественными. (На самом деле это связано с особенностями вычисления Паскалем этих функций. Он вычисляет их прибли­женно путем разложения в ряд. Такой метод не предполагает целого результата. Более того, значения этих функций всегда вычисляются приближенно.)

6.Функции Trunc и Round предназначены для преобразования ти­пов. Они явно указывают на то, что сделать с дробной частью числа.Поэтому это единственный способ получить на Паскале из дробного числа целое.

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

Задание 2.10. Вычислите выражение и укажите тип результата:

Abs(12 mod 7*4/2-350 div 15)+2

Сначала расставим операции в соответствии с их приоритетами (табл. 2.4).

Таблица 2.4.Расстановка операций в примере 2.8

№ пп Операция Пояснение
12 mod 7 Сначала выполняются действия в скобках. Скобки в данном случае ограничивают аргу­мент функции Abs. В скобках сначала выпол­няются операции типа «умножение-деление», а потом — «сложение-вычитание». Операции mod и div осуществляют целочисленное деле­ние. Их приоритет такой же, как у операций «*» и «/». В первой группе таких операций три. Выполняем их слева направо. Поэтому сначала выполняем mod, затем будет «*», а потом «/»
(12 mod 7) * 4  
(12 mod 7*4) / 2  
350 div 15 Теперь выполняем вторую группу операций типа «умножение-деление». В данном случае это одинокая операция div
(12 mod 7*4/2) - (350 div 15) Теперь пришла пора объединить результаты первых двух групп операцией «-». Она вы­полняется последней в скобках, так как имеет наименьший приоритет
Abs(..,) Теперь пора посчитать результат функции
Abs(...) + 2 Последний оператор — сложение

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

Рис. 2.8.Порядок выполнения операций в задании 2.10

Таблица 2.5 (продолжение)

№ пп Операция Результат и его тип Пояснение
12 mod 7 5 Integer Остаток от деления 12 на 7 равен 5. Результат операции mod всегда целый
5*4 20 Integer Результат умножения двух целых — целое число
20 / 2 10.0 Real Результат вещественного деления всегда вещественный. Хотя 20 делится нацело на 2, мы специально приписали «.0» к результату, чтобы подчеркнуть и не забыть, что результат вещественный и имеет дробную часть
350 div 15 23 Integer При целочисленном делении нас интересует только целая часть частного. Результат операции div всегда целый
10.0 - 23 -13.0 Real При вычитании одно из чисел имеет дробную часть. Команды от нее избавиться не было, поэтому результат тоже имеет дробную часть. Значит, результат имеет тип Real
Abs(-13.0) 13.0 Real Abs меняет отрицательный знак аргумента на положительный. Так как аргумент имеет дробную часть, а команды от нее избавиться не было, результат тоже содержит дробную часть
13.0 + 2 15.0 Real Те же соображения, что и в 5-м пункте. Результат имеет дробную часть
Ответ: 15.0. Real

Задние 2.11. Дано действительное число X. Напишите программу для вычисления:

v целой части числа X;

v числа X, округленного до ближайшего целого;

v числа X без дробных цифр.

2.4. Ввод и вывод данных

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

Вводим переменные с клавиатуры

Пример 2.8.Ввод с клавиатуры значения переменной N

program Inp;

uses Crt;

var

N: integer;

Begin

ClrScr;

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

readln(N); {Здесь программа приостановится и будет ожидать ввод с клавиатуры. Наберите на клавиатуре число, например 153, и нажмите клавишу Enter}

writelп ('Вы ввели число ', N);

readln { Это оператор пустого ввода. Здесь программа опять приостановится и будет ожидать нажатия клавиши Enter. За это время вы успеете просмотреть вывод на экране. Этот прием мы рекомендуем использовать, чтобы не нажимать AU+F5 после окончания работы программы}

end.

Красивый вывод на экран

Рассмотрим еще одну задачу: задать с клавиатуры цвет фона (экра­на), символов и координат для вывода текста, а затем вывести текст в окно с заданными координатами.

Продумаем алгоритм решения данной задачи (рис. 2.9).

Рис. 2,9.Алгоритм решения задачи примера 2.9

Пример 2.9.Красивый вывод текста

program Inp_CoVor;

uses

Crt; { Подключение библиотечного модуля Crt }

var

{ Опишем переменные, где будут храниться цвет экрана – Сl1 и цвет выдаваемых символов - Сl2 }

Сl1.Сl2: 0..15; {0..15 - этот тип для переменных называется интервальным. В данном случае значения переменных могут меняться в интервале от 0 до 15. Здесь мы имеем отрезок (интервал) базового типа integer. Палитра цветов лежит именно в этом интервале }

X,Y: integer; { Для хранения координат }

begin

{ Блок 1:}

ClrScr;

{Ниже следует вызов процедуры Window(X1,Y1.X2.Y2) из модуля Crt, которая определяет на экране текстовое окно. (X1,Y1) - координаты верхнего левого угла окна. (X2,Y2) - координаты нижнего правого угла }

Window(20,5,60,20);

{Блок 2:}

write('Введите цвет для экрана:');

readln(Cl1); { Здесь работа программы приостанавливается и ожидается ввод номера цвета экрана в переменную СИ. Во время работы программы следует ввести число и нажать Enter }

{Блок 3:}

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

readln(Cl2);

{Ожидается ввод номера цвета символов в переменную Сl2. Во время работы программы следует ввести число и нажать Enter }

{Блок 4:}

TextBackGraund (Cl1) {Выбор фонового цвета}

{Блок 5:}

TextColor (Cl2) {Выбор цвета выводимых символов}

{Блок 6:}

Writeln (‘Введите координаты X и Y’);

Readln(X,Y) {Ожидается ввод координат для выводимого текста. Необходимо ввести два числа (координаты) через пробел и нажать Enter. Помните, что координаты внутри текстового окна отсчитываются от его левого верхнего угла. В нашем окне 16 строк и 41 столбец}

{Блок 7:}

ClrScr;

{ Функция очистки экрана в данном случае очистит не весь экран, а только заданное текстовое окно }

{Блок 8:}

GoToXYCX,Y); { Позиционирование курсора в точку с координатами X.Y }

{Блок 9:}

writelnC (‘Мы отлично вводим с клавиатуры!');

readln{ Этот "пустой" оператор readln задерживает нас в экране пользователя. Возврат в среду Turbo Pascal происходит после нажатия Enter }

end.

Задание значений переменных датчиком случайных чисел

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

Зададим этим способом цвет экрана. Вместо второго блока в программе поставим вызов датчика случайных чисел Random(X). Но перед этим обязательно нужно выполнить процедуру инициализации датчика, иначе он будет выдавать нам неслучайные числа:

Randomize; { Инициализация датчика случайных чисел проводится один раз в программе }

Cl1:=Random(16); { В результате переменной Сl1 присваивается целое случайное число из диапазона 0..15. Результат функции Random(N) случайное число из диапазона 0..N-1}

ЗАМЕЧАНИЕ

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

Рассмотрим еще несколько примеров использования функции Random.

Пусть нам необходимо получить случайное двузначное число, то есть число от 10 до 99. Логика проста: нам нужно одно случайное число из 90 (именно столько всего двузначных чисел). Значит, будем использовать функцию Random, которая выдаст одно число из 90, то есть Random(90). Но результат тогда будет лежать в диапазоне 0..89, а нам требуется 10..99! Значит, нужно сдвинуть полученный диапазон вправо на 10. Это делает операция +10. В итоге получаем следующее: Random(90)+10.

Задание 2.12. Напишите программу, которая выдает сообщение в текстовое окно. Координаты окна и координаты для сообщения должны вводиться с клавиатуры. Цвет экрана и цвет символов задайте с помощью датчика случайных чисел.

Задание 2.13. Напишите программу, которая выдает сообщение на полный экран (без текстового окна). Координаты сообщения, цвет экрана и цвет символов задайте с помощью датчика случай­ных чисел.

ЗАПОМНИТЕ!

Заливка экрана или текстового окна выполняется вызовом двух процедур: установка цвета экрана — процедурой TextBackGround(...), а очистка экрана — процедурой ClrScr.

Зачем нужны константы в программе?

Бывают случаи, когда некоторые величины не меняются по ходу выполнения программы. Для удобства работы с такими величинами в Паскале предусмотрена отдельная категория — константы.

Для начала простой пример:

Пример 2.10.Расчет скорости тела при падении с башни

Program Piza;

var

G.V.H: real;

begin

G:=9.8; { Эта переменная всегда имеет одно значение и не изменяет его по ходу выполнения программы }

Write('Введите высоту башни:');

readln(H);

V:=Sqrt(2*G*H);

Writeln ('Скорость падения':20,V:7:3);

{ На выводимый текст выделяется 20 позиций }

readln

end.

Для наглядности в формуле вычисления скорости падения мы использовали переменную G, которая, однако, в действительности не менялась. И это неудивительно: она представляет ускорение сводного падения, которое, как известно, есть величина постоянная. Для того чтобы явно указать в программе, что величина G не может измениться, перенесем ее описание в отдельный раздел — раздел описания постоянных величин, или констант (см. следующий пример). Тем самым мы покажем Паскалю и человеку, который будет читать нашу программу, что эту величину нельзя менять по ходу выполнения программы. Она получает свое значение один раз и не может быть изменена.

Пример 2.11. Программа при использовании констант — более логична и читабельна

Program Piza2;

Const { Это раздел описания констант. Он находится перед разделом var}

G=9.8; { Тип константы определяется автоматически, по форме записи числа. В данном случае из-за наличия десятичной точки это тип real }

var V,H: real; begin

write('Введите высоту башни:');

readln(H);

V:=Sqrt(2*G*H);

writeln('Скорость падения’, V:6:3); { Чтобы текст и число не "слиплись", после текста внутри апострофов добавлен пробел }

readln

end.

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

Во-вторых, константы оказываются нужны при объявлении новых типов данных — массивов. Об этом мы поговорим в теме 8.

Задание 2.14. Вычислите длину окружности и площадь круга. Радиус должен вводиться с клавиатуры.

Выводы

1.Данные, с которыми работает программа, хранятся в ячейках. Каждая ячейка имеет имя и тип данных. Изменяемые ячейки называются переменными, неизменяемые — постоянными.

2.Ячейки, используемые в программе, описываются в разделах const и var.

3.Для хранения целых чисел используется тип данных integer, а для хранения вещественных — real.

4.Каждый тип данных имеет свои операции и функции. Особенно это важно для типа integer, который имеет две операции деления — div и mod.

5.Для преобразования значений типа real к типу integer используются специальные функции — trunc и round.

6.При записи арифметических выражений нужно помнить о приоритете операций и о типе данных, который получается в результате.

7.Начальные значения переменных можно задавать путем ввода с клавиатуре или с помощью датчика случайных чисел.

Контрольные вопросы

1.Где хранятся все данные, с которыми работает программа?

2.Чем различаются между собой понятия имя ячейки, адрес ячейки и значение ячейки?

3.Какой тип данных используется для хранения целых чисел? А для дробных?

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

5.В чем различие между операциями mod, div и /?

6.Зачем нужны функции trunc и round? В чем между ними разница?

7.Какое максимальное значение может принимать переменная типа integer? Что делать, если необходимо сохранить целое число, в 10 раз большее этого значения?

8.Как записать на Паскале «2,5 в степени 16,7»?

9.Что означает запись «1Е5», «ЗЕ-4», «.2Е7»?

10.Что нужно использовать, чтобы изменить приоритет выполнения математических операций?

11.Чему равно и какой тип данных имеет выражение

Trunk (sqrt (2+52 div 8))-sqr (15 mod 4/3)?

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.