Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Развилка



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

Пример 3. Вычислить значение функции

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

1. Ввести . 2. Если , то 3. Иначе, если , то 4. Иначе 5. Вывести 6. Конец

Пример 4. Дано натуральное число . Если число нечётное и его удвоение не приведет к выходу за 32767 (двухбайтовое целое число со знаком), удвоить его, иначе — оставить без изменения.

Пояснения. Чтобы удовлетворить условию удвоения, число должно быть нечетным и меньше 16384.

1. Ввести число 2. Если число нечетное и меньше 16384, то 3. Вывод 4. Конец

Рассмотренный пример иллюстрирует неполную развилку. Также следует отметить, здесь логическое выражение, являющееся условием, содержит 2 операнда.

Циклы

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

Пример 5. Подсчитать количество нечетных цифр в записи натурального числа .

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

блок-схема 1 блок-схема 2
Пояснения по блок-схеме 1:   1. Ввести число 2. {подготавливаем счётчик нечётных цифр} 3. Если , переход к пункту 7 4. Если , то 5. 6. Переход к пункту 3 7. Вывод 8. Конец Пояснения по блок-схеме 2:   1. Ввести число 2. {подготавливаем счётчик нечётных цифр} 3. Если , то 4. 5. Если , переход к пункту 3 6. Вывод 7. Конец

Задача решена двумя способами. Слева решение оформлено с использованием цикла с предусловием, справа — с постусловием.

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

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

1. Ввод 2. {накапливаем произведение} 3. {переменная для хранения чисел, кратных 3} 4. 5. Если , переход к пункту 10 6. 7. 8. 9. Перейти к пункту 5 10. Вывод 11. Конец

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

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

1. Ввести 2. 3. 4. 5. Сравнить с . Если , переход к пункту 10 6. 7. 8. 9. Переход к пункту 5 10. Вывод 11. Конец

В примере 5 и в примере 7 количество повторений заранее неизвестно. В первом оно зависит от количества цифр в записи натурального числа, во втором — от числа . В примере 6 количество шагов известно из условия задачи, поэтому проще и предпочтительней использовать цикл с параметром.

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

• Разработка блок-схемы занимает много времени.

• Блок-схемы имеют большие размеры. Блок-схема даже простой программы может достичь размера в несколько страниц.

• В блок-схеме не отражаются специфические программные конструкции, реали­зующие, например, цикл или структуру принятия решения.

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

Как видно из названия, псевдокод представляет собой "ненастоящий" код. Он состо­ит из смеси операторов языка высокого уровня и фраз на английском (или русском) язы­ке. Каждый программист пользуется собственными псевдокодами, поэтому никаких стандартов на составление псевдокодов не существует.

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

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

3. Консольные приложения в Delphi. Введение в язык Object Pascal. Общая структура программы. Идентификаторы, комментарии, пробелы. Раздел описаний и раздел операторов

Для реализации программ, написанных на языке программирования Object Pascal, можно использовать различные системы программирования. Turbo Pascal и Borland Pascal ориентированы на работу с дисковыми операционными системами DOS (такими как MS DOS компании Microsoft или PC DOS компании IBM). Среда программирования Delphi предназначена для разработки программ (или приложений), работающих под управлением операционной системы Windows. Мы рассмотрим возможность создания приложений для DOS в среде Delphi. Это позволит подготовиться к использованию графического интерфейса пользователя (GUI – Graphical User Interface).Такие программы называются консольными приложениями.

Создадим простое консольное приложение. Для этого выполним ряд действий.

1. Выберем команду File New Other (Файл Новый Другое), выделим пиктограмму Console Appli­cation (Консольное приложение) и щелкнем на кнопке ОК. При этом на экране появится окно редактора кода.

2. В окне редактора кода введем следующий текст (некоторые строки вам набирать не придется, они уже будут присутствовать):

program ConsoleExample;

{$APPTYPE CONSOLE}

uses SysUtils;

begin

Writeln ('Hello, World from Delphi!!!');

Writeln ('This is the console application.');

Writeln;

Writeln ('Press <ENTER> to quit.');

Readln;

end.

3. Сохраним программу, выбрав последовательно команды File Save Project As… Затем нажмем клавишу <F9> - программа выполнится. При этом на экране появляется такое ок­но DOS:

 
 

Нажав клавишу <Enter>, завершим работу консольного приложения.

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

program ConsoleExample;

{$APPTYPE CONSOLE}

uses SysUtils;

begin

Writeln (‘Привет, Мир!!!');

Writeln ('Это консольное приложение.');

Readln;

end.

на экране увидим следующее

Появление такой «абракадабры» связано с тем, что в компиляторе Delphi используется кодовая страница Windows-1251, а запущенное приложение использует кодовую страницу DOS. В результате этого несоответствия русские буквы отображаются некорректно. Воспользуемся следующим способом для устранения проблемы - используем функцию, которая будет перекодировать кириллицу Windows в DOS перед отображением на экран. Важно отметить, что при наборе фрагментов 'А'..’п' и 'р'..'я' обязательно (!) включать русскую раскладку клавиатуры.

program test;

{$APPTYPE CONSOLE}

function Rus(mes: string):string;

var i: integer;

begin

for i:=1 to length(mes) do

case mes[i] of

'А'..’п': mes[i]:= Chr(Ord(mes[i]) - 64);

'р'..'я': mes[i]:= Chr(Ord(mes[i]) - 16);

end;

rus:= mes;

end;

begin

Writeln (Rus('Привет, Мир!!!'));

Writeln (Rus('Это консольное приложение.'));

Readln;

end.

Результат работы программы выглядит гораздо привлекательнее:

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

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

begin

writeln('Hello!!!');

Readln;

end.

Если вам удастся откомпилировать и запус­тить эту программу, она выведет на экран сообщение: " Hello!!!". Получения того же сообщения на экране можно добиться, записав программу так:

const Message=' Hello!!!';

begin

writeln(Message); Readln;

end.

и так:

var Message: String[10];

begin Message:=' Hello!!!'; writeln(Message); Readln;

end.

и еще множеством различных способов, но в каждой программе обязательно бу­дет слово begin, и в конце программы всегда будет стоять end.- признак кон­ца программы. Перед BEGIN может что-то быть (как правило, это так), или может не быть ничего. То, что находится перед BEGIN, называется разделом описаний, то, что находится между BEGIN и END., называется разделом опе­раторов. Слова BEGIN, END, а также WRITELN,READLN яв­ляются ключевыми словами языка Object Pascal, а слово Message - это идентификатор пользователя, т.е. имя, данное нами некоторому объекту - константе, перемен­ной, или чему-то еще. Все ключевые слова и идентификаторы пользователя есть последовательности букв и цифр, начинающиеся с буквы. Буквами языка явля­ются все латинские буквы и символ подчеркивания. Компилятор не различает большие и малые латинские буквы, поэтому вы можете записывать идентифика­торы как захотите: Begin, BEGIN, begin, BeGiN и т.д. – компилятор будет воспринимать их одинаково. Вы можете выбирать любые идентификаторы пользователя, лишь бы они не совпадали с ключевыми словами; так, в нашем примере вместо Message вы можете написать Q или __t123, или Y56_ert и т.д. Однако все эти идентификаторы не несут в себе никакого смысла, затрудняют чтение и отладку программы и делают ее неряшливой; идентифика­тор Message имеет то достоинство что из него уже ясно его назначение - содер­жать некоторое сообщение. Старайтесь всегда использовать в программе осмыс­ленные идентификаторы! Язык Object Pascal допускает идентификаторы длиной до 63 символов (точнее, компилятор различает первые 63 символа имени), поэтому не экономьте на именах переменных и функций, пусть лучше имена будут длин­ными, но понятными. Кроме ключевых слов и идентификаторов всякая про­грамма содержит также пробелы и (в идеале) комментарии. Комментарии могут быть запи­саны в фигурных скобках и могут стоять в любом месте программы, пробе­лы являются разделителями, там, где допустим один пробел, можно поставить любое количество пробелов. Комментарии и пробелы следует использовать для аккуратного оформления текста программы. Хорошая программа обязательно должна быть документирована, т.е. содержать комментарии поясняющие, как она работает.

4. Арифметические типы данных. Числовые константы и переменные. Оператор присваивания. Выражения

В языке Object Pascal определены следующие арифметические типы данных: це­лочисленные типы - Byte, ShortInt, Word, Integer и LongInt; вещественные типы - Real, Single, Double и Extended; и не совсем вещественный тип Comp. Характеристики этих типов приведены в таблице 1 (запись 1.5e-45 означает 1.5 умноженное на 10 в степени -45, это общепринятое в языках программирования обозначение для вещественных чисел - константа с плавающей точкой).

Арифметические типы данных Таблица 1

Название типа Диапазон допустимых значений Количество верных цифр Размер в байтах
Byte 0...255 -  
ShortInt -128...127 -  
Word 0..65535 -  
Integer -32768...32767 -  
LongInt -2147483648...2147483647 -  
Single ±1.5e-45... ±3.4e+38 7-8  
Real ±2.9e-39... ±1.7e+38 11-12  
Double ±5.0e-324... ±1.7e+308 15-16  
Extended ±3.4e-4932... ±1.1e+4932 19-20  
Comp -9.2e18...9.2e18    

Типы Byte и Word используются для целых величин без знака, типы ShortInt, Integer и LongInt - для целых со знаком, типы Single, Real, Double и Extended - для вещественных величин. Тип Comp может содержать только целые числа от -2 63 +1 до +263-1, но эти числа хранятся в вещественном формате, поэтому тип Comp считается вещественным. С данными типа Comp можно обращаться так же, как с данными других вещественных типов, но дробная часть числа при этом автоматически отбрасывается.

Целые числовые константы записываются в языке Object Pascal в десятичном виде или в 16-ричном виде, 16-ричная константа начинается с символа $ и содержит 16-ричные цифры: 0 - 9, A - F. Например, число 255 можно записать как $FF. Числовые константы по умолчанию имеют тип Integer или LongInt. Вещественные константы записываются либо с фиксированной точкой, например, -1.234, либо с плавающей точкой, например, -1.234E-5 или 555е12.

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

VAR имя_1,..., имя_n: тип;

имя_a1,..., имя_am: тип;...

Здесь имя - имена разных переменных (идентификаторы), тип - типы переменных, VAR - ключевое слово, означающее, что после него следуют описания переменных. Переменные одного типа можно описать совместно, разделив их имена запятыми, а можно описывать и каждую переменную отдельно. Точка с запятой означает окончание описания переменных данного типа. Слово VAR может повторяться в программе сколько угодно раз. Выбор типа для той или иной переменной определяется назначением этой переменной. Пусть, например, переменная i служит счетчиком (индексом) элементов некоторой последовательности, причем известно, что количество элементов не может превосходить 100. Мы можем описать переменную i любым целочисленным типом, но правильный выбор - Byte или ShortInt, любой другой тип будет избыточным. Всегда следует выбирать типы переменных осознанно; если вы не понимаете, какой тип должна иметь ваша переменная, вероятнее всего, эта переменная в программе не нужна. Но при этом важно быть уверенным, что значение переменной не выйдет за рамки диапазона данного типа переменных. Для вещественных переменных чаще всего используется тип Single или Extended.

Пусть в программе нам необходимы переменные b1,b2,b3,b4 типа Byte, переменные i,j,k типа Integer и переменные r1,r2 типа Single. Их можно описать, например, двумя эквивалентными способами:

var b1,b2,b3,b4: Byte;

i,j,k: Integer;

r1,r2: Single;

или так:

var b: Byte;

i,j,k Integer;

var r1: Single;

var b2,b3,b4: Byte;

r2: Single;

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

Каким же образом определить значение переменной? Для этого используется оператор присваивания:

имя:= выражение;

Здесь мы встречаемся с двумя новыми понятиями - оператор и выражение. Оператор - это минимальная осмысленная конструкция в языке Object Pascal, вся программа - это последовательность операторов. Оператор всегда заканчивается символом "; ", кроме одного единственного оператора END. Допускаются пустые операторы "; ", не выполняющие никаких действий. Выражение - это конструкция, состоящая из одного или нескольких операндов и, возможно, знаков операций, и имеющая некоторое значение. Операндами могут быть константы, переменные и другие выражения, т.е. можно строить сколь угодно сложные выражения. Мы не знаем пока никаких знаков операций, но предположим, что знак + означает операцию сложения (это так и есть). Запишем несколько выражений:

1 (константа есть частный случай выражения);

b1 (переменная есть частный случай выражения);

25+1E3 b1+4.25+r2

Теперь мы можем присвоить переменной ее значение:

i:=-11; j:=22+i; k:=i+j+177;

Наряду с переменными в Паскале есть и другие именованные объекты - это константы (отличайте их от числовых констант, которые не имеют имени, а лишь значение). Константы бывают двух видов - нетипизированные и типизированные. Нетипизированные константы описываются, так же, как и переменные в разделе описаний, в виде:

const имя=значение; имя=значение;...

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

const c=-155;

d=c+100;

const f=d+1;

const g=c+f;

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

const имя:тип=значение; имя:тип=значение;...

С этим классом констант мы работать не будем, поэтому подробное описание опускаем.

5. Ввод-вывод данных в Паскале

Для ввода-вывода данных в Паскале используются стандартные процедуры ввода-вывода, которые иногда не совсем верно называют операторами ввода-вывода. Понятие процедур и функции будет рассмотрено позднее, пока же мы просто познакомимся с особенностями их организации.

Простейшая процедура ввода в Паскале - процедура READ, она записывается в виде:

read (имя_1,имя_2,...);

где имя - имена переменных или типизированных констант. Вводимые значения задаются в виде допустимых в Паскале констант и разделяются любым количеством пробелов. Для окончания ввода следует нажать клавишу Enter. Процедуру ввода можно записать и как READLN, при вводе числовых переменных они эквивалентны. Кроме того, READLN без списка в скобках можно использовать для организации задержки в работе программы - программа будет переходить в режим ожидания нажатия любой клавиши.

Простейшая процедура вывода записывается в виде:

write (выражение_1, выражение_2,...);

или

writeln (выражение_1, выражение_2,...);

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

var i: integer;

w: word;

r: single;

begin

writeln; { ------------- ввод ------------- }

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

read(i);

writeln;

write('Введите натуральное число ');

read(w);

writeln;

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

read(r);

writeln; { ------------- вывод ------------- }

writeln('Вы ввели: ',i,' ',w,' ',r,' их сумма=',i+w+r); writeln('Нажмите Enter для выхода');

readln;

readln;

end.

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

1. Организация диалога с пользователем. Прежде чем записать оператор READ, вы обязаны записать хотя бы один WRITE, который выведет на экран приглашение " Введите...", причем из этого приглашения пользователь должен понять, какие именно данные ему следует ввести. Так, в нашем примере операторы write('Введите i '); read(i); были бы неуместны, так как пользователю неизвестно, что такое i, и он мог бы ввести, например, вещественное число, что привело бы к аварийному завершению программы.

2. Оформление текста программы. Хорошо оформленная программа легко читается и быстрее отлаживается, следует стремиться к "прозрачности" текста, но не к некоторой, вполне субъективной, "красоте". Так, скажем, операторы, выполняющиеся последовательно, следует и записывать строго друг под другом, но не "елочкой" или какой-либо другой фигурой. Средства, используемые для оформления текста, крайне просты и доступны всякому - это пробелы, пустые строки и комментарии.

3. При выводе чисел можно их форматировать, т.е. управлять формой их представления. Для этого в списке вывода после выводимого выражения можно указывать модификаторы: “: L: d “ - для вещественных значений и “: L ” для вещественных и целых. L и d - целочисленные выражения, первое из них определяет, сколько всего позиций отводится для выводимого числа на экране, а второе - сколько выводится цифр после десятичной точки. Если при выводе вещественного числа задан модификатор “: L: d “, то оно выводится с фиксированной точкой, если же задан модификатор “: L ” или он отсутствует - то с плавающей точкой. Пусть значение переменной X равно 123.45678, тогда оператор

write(x); выведет " 1.2345678000E+02"

write(x:8:2); выведет " 123.46"

write(x:10:5); выведет " 1.235E+02"

write(x:10); выведет " 1.235E+02"

write(x:8); выведет " 1.2E+02"

write(x:1); выведет " 1.2E+02"

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

6. Арифметические операции. Стандартные математические функции

Для арифметических данных, т.е. для числовых констант, переменных и числовых функций определены шесть арифметических операций:

+ сложение

- вычитание

* умножение

/ вещественное деление

div целая часть от деления

mod остаток от деления

Первые четыре операции определены для любых операндов - как целых, так и вещественных, причем результат операции "/" всегда вещественное число, даже если оба операнда целые. Операции DIV и MOD определены только для целых операндов. Кроме того, выделяют унарную операцию " - ", которая применяется не к двум, а к одному операнду, например: -x.

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

Правила преобразования типов Таблица 2
Операнды Byte ShortInt Word Integer LongInt
Byte ShortInt Word Integer LongInt Integer Integer Word Integer LongInt Integer Integer LongInt Integer LongInt Word LongInt Word LongInt LongInt Integer Integer LongInt Integer LongInt LongInt LongInt LongInt LongInt LongInt

Если один операнд выражения имеет целочисленный тип, а второй - вещественный, то первый автоматически приводится к вещественному типу и значение выражения будет вещественным. Целые значения можно присваивать вещественной переменной, но вещественные значения присвоить целой переменной нельзя! Присваивая значение целочисленной переменной и константе, вы должны следить, чтобы это значение не выходило за пределы диапазона допустимых значений переменной. В языке Object Pascal есть возможность явно преобразовать целочисленное значение к любому из целочисленных типов, для этого используются стандартные функции с именами Byte, ShortInt, Word, Integer и LongInt. Например, преобразуем переменную типа Word к типу Integer:

var x: word;

begin

x:=300;writeln(x,' ',integer(x));

x:=65535;writeln(x,' ',integer(x));

end.

Программа выведет:

300 300

65535 -1

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

Арифметическое выражение может содержать любое количество операндов и, соответственно, любое количество операций, которые выполняются в последовательности, определенной их приоритетом; приоритет операций *, /, DIV, MOD выше, чем операций + и -. Операции одного приоритета выполняются слева направо. Чтобы изменить порядок выполнения операций, вы можете использовать в выражении круглые скобки. Вычислим, например, частное от деления X на сумму A,B и C: X/(A+B+C);

Набор встроенных математических функций в языке Object Pascal невелик, он включает:

1. Abs (x) - абсолютная величина числа.

2. Int (x) - целая часть вещественного числа.

3. Frac (x) - дробная часть вещественного числа.

4. Trunc (x) - целая часть вещественного числа, преобразованная к типу LongInt.

5. Round (x) - округленное до целого вещественное число, преобразованное к типу LongInt.

6. Sqr (x) - квадрат числа.

7. Sqrt (x) - квадратный корень.

8. Exp (x) - экспонента.

9. Ln (x) - натуральный логарифм.

10. Pi - число пи.

11. Sin (x) - синус.

12. Cos (x) - косинус.

13. Arctan (x) - арктангенс.

Все остальные математические функции можно получить, пользуясь этим основным набором; например: десятичный логарифм - Ln (x)/ Ln (10), тангенс - Sin (x)/ Cos (x) и т.д. Аргументы функций могут быть любыми арифметическими выражениями и задаются в круглых скобках после имени функции, аргументы функций Sin и Cos выражаются в радианах. Вычислим квадрат синуса 70 градусов: Sqr(Sin(Pi/180*70))

Кроме перечисленных выше математических функций Object Pascal предоставляет еще несколько полезных числовых функций и процедур разного назначения:

14. High (целый тип) - возвращает наибольшее возможное значение данного типа.

15. Low (целый тип) - возвращает наименьшее возможное значение данного типа.

16. SizeOf (тип)

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

17. Random (Range: Word) - возвращает целое случайное число в диапазоне от 0 до Range -1.

18. Random - возвращает вещественное случайное число в из отрезка [0, 1].

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

Выведем несколько случайных чисел в диапазоне от 0 до 99:

begin

randomize;

writeln(random(100));

writeln(random(100));

writeln(random(100));

end.

При первом запуске программы она вывела числа 13, 38, 48, при втором запуске - 63, 99, 6, при третьем запуске - 23, 87, 92. Это действие процедуры Randomize - поскольку при каждом запуске системное время, которое отсчитывает операционная система, было различным, мы каждый раз получали различные последовательности случайных чисел. Теперь исключим из программы оператор Randomize; и запустим ее несколько раз - каждый раз мы будем получать тройку чисел 0, 3, 86.

Обратите внимание, что процедура используется в операторе вызова, а функция используется в выражении. Запись Random(100); неверна, поскольку Random - это функция, но также неверна и запись WRITELN(Randomize);. Можно считать, что различие между процедурой и функцией состоит в том, что процедура выполняет некоторую последовательность действий, а функция вычисляет некоторое значение. Заметим, что READ и WRITE - это тоже процедуры.

Для работы с внутренним двоичным представлением двухбайтовых целых чисел (типа Word или Integer) существуют функции:

20. Lo (x) - возвращает младший байт аргумента.

21. Hi (x) - возвращает старший байт аргумента.

22. Swap (x) - меняет местами младший и старший байты.

Сделаем отступление о двоичной системе счисления. Все данные в памяти компьютера хранятся закодированными в двоичной системе. Любая переменная занимает целое число байтов, а каждый байт есть последовательность из 8 двоичных цифр - битов. Например, значение переменной типа Byte, равное 11, хранится как последовательность битов 0000 1011, а если переменная имеет тип Word, то ее значение кодируется как 0000 0000 0000 1101. 1024 байта (или 2 в 10-й степени) имеют свое название - 1Кбайт, иногда эту величину также называют килобайт; 1024 К байт называют мегабайт. Пусть переменная t типа Word имеет значение 40000, или 1001 1100 0100 0000 в двоичной системе, тогда функция Lo(t) возвратит 64 (= 0100 0000), функция Hi(t) возвратит 156 (= 1001 1100) и функция Swap(t) возвратит 16540 (= 0100 0000 1001 1100).

Для целочисленных переменных определены процедуры:

23. Inc (x) Inc (x, d)

24. Dec (x) Dec (x, d).

Здесь x - имя переменной, d - любое целочисленное выражение. Процедура Inc увеличивает значение переменной на d, а процедура Dec - уменьшает на d; второй аргумент этих процедур можно не задавать, тогда он будет принят равным 1. Например, вместо операторов a:=a+3; b:=b-1; c:=c+a+b; мы могли бы написать Inc(a,3); Dec(b); Inc(c,a+b);, и такой способ записи был бы предпочтительней.

7. Пример выполнения задания

Задача. Вычислить при х = 2.1; у = 0.59; z = -4.8 значения a и b, используя формулы:

; .

Вывести результаты, сопровождая их вывод именами выводимых переменных. Задание выпол­нить в виде консольного приложения. Повторить задание 1, используя функции из модуля math

Блок-схема алгоритма имеет вид:

Создадим простое консольное приложение. Для этого запустим Delphi и выполним ряд действий. Выберем команду File New Other (Файл Новый Другое), выделим пиктограмму Console Appli­cation (Консольное приложение) и щелкнем на кнопке ОК. При этом на экране появляется окно редактора кода, в котором введем следующий текст:

program Project1;

{$APPTYPE CONSOLE}

uses SysUtils;

var a,b,c,x,y,z: single;

proba:integer;

function Rus(mes: string):string;

var i: integer;

begin

for i:=1 to length(mes) do

case mes[i] of

'А'..'п': mes[i]:= Chr(Ord(mes[i]) - 64);

'р'..'я': mes[i]:= Chr(Ord(mes[i]) - 16);

end;

rus:= mes;

end; { Rus }

begin { program }

writeln(Rus('Введите x, y, z'));

readln (x,y,z);

c:=sin(x*x)/cos(x*x);

a:=y*c*sqr(c)+sqrt(z*z/(y*y+x*x));

b:=ln(y+x*x)+sqr(sin(z/y));

writeln('a=',a:8:3,' b=',b:8:3);

readln;

end. { program}

Сохраним программу, выбрав последовательно команды File Save Project As… Нажав клавишу <F9>, выполните программу. При этом на экране появляется такое ок­но работающего приложения.

Перейдем к следующему заданию. В листинг добавляем ссылку на модуль math, что позволяет использовать прямо функцию tan (аргумент) и функцию возведения в степень роwеr (основание, степень).

program Project1;

{$APPTYPE CONSOLE}

uses SysUtils, math;

var a,b,c,x,y,z: single;

proba:integer;

function Rus(mes: string):string;

var i: integer;

begin

for i:=1 to length(mes) do

case mes[i] of

'А'..'п': mes[i]:= Chr(Ord(mes[i]) - 64);

'р'..'я': mes[i]:= Chr(Ord(mes[i]) - 16);

end;

rus:= mes;

end; { Rus }

begin { program }

writeln(Rus('Введите x, y, z'));

readln (x,y,z);

c:=tan(x*x);

a:=y*power(c,3)+sqrt(z*z/(y*y+x*x));

b:=ln(y+x*x)+sqr(sin(z/y));

writeln('a=',a:8:3,' b=',b:8:3);

readln;

end. { program}

8. Символьный тип данных

Для хранения символьной информации в Паскале предусмотрен специальный тип данных Char. Допустимы переменные, нетипизированные и типизированные константы такого типа. Данные типа Char занимают 1 байт памяти. Неименованные символьные константы записываются в программе либо в виде ' символ ', либо в виде # номер. Все имеющиеся символы пронумерованы от 0 до 255, символы с 0-го по 31-й - невидимые, как правило, они не отображаются на экране, 32-й символ - это пробел.

Некоторые из невидимых символов могут оказаться полезны: символ #8 – клавиша BackSpace; символ #10 - "конец строки", при выводе он перемещает текущую позицию вывода на одну строку вниз; символ #13 -"возврат каретки" - перемещает текущую позицию вывода в начало текущей строки. Клавиша Enter генерирует два символа - #10 и #13.

Символьные данные можно вводить и выводить процедурами READ и WRITE при вводе и выводе символьные значения изображаются без апострофов. Для символьных величин определены функции:

25. Ord (c) - возвращает номер символа.

26. Pred (c) - возвращает символ с номером, меньшим на 1.

27. Succ (c) - возвращает символ с номером, большим на 1.

Эти функции определены не только для символов, но для любого порядкового типа данных. Порядковым типом называется такой тип, все допустимые значения которого можно пронумеровать от 0 до некоторого N (в математике к этому понятию близко понятие счетного множества). Из известных нам типов порядковыми являются все целочисленные типы: Byte, ShortInt, Word, Integer, LongInt. И не являются порядковыми все вещественные типы. Значение функции Ord от числового аргумента равно самому этому аргументу, Pred (x) дает значение x -1, а Succ (x) - значение x +1. Функция

28. Chr (n) - в некотором смысле обратная функции Ord: для заданного числового аргумента n она возвращает символ с соответствующим номером. Для символьных переменных (так же, как и для любых переменных порядкового типа) определены процедуры Inc и Dec. Еще одна специфически символьная функция:

29. UpCase (c) - преобразует значение аргумента, если это маленькая латинская буква, в соответствующую заглавную букву. К сожалению, функция не работает для русских букв.

Напишем простую программу, обрабатывающую символьные величины.

var c: char; n: byte;

const space =' ';

begin write('введите какой-нибудь символ '); read(c);

writeln('вы ввели символ',space,c,space,'его номер=',ord(c)); writeln('соседние с ним символы:',space,pred(c),space,

'и',space,succ(c));

writeln('upcase(',c,')=',upcase(c));

writeln;

write('теперь введите число от 33 до 255 '); read(n); writeln('символ с номером ',n,' - это ',space,chr(n),space); writeln;

readln

end.

9. Логический тип данных. Операции сравнения. Логические операции. Битовые операции

Логические, или булевские, данные предназначены для хранения логических значений "истина" или "ложь". Логические переменные и константы имеют тип Boolean и занимают в памяти 1 байт. Существует всего две логические константы - TRUE и FALSE, истина и ложь. Тип Boolean - это порядковый тип, поэтому для него определены функции Ord, Pred, Succ и процедуры Inc и Dec, причем Ord(FALSE) =0, Ord(TRUE) =1. Прежде чем перейти к логическим операциям, рассмотрим операции сравнения, которых в Паскале существует шесть:

=равно; <>не равно;
<меньше; <=меньше или равно;
>больше; >=больше или равно.

Операции сравнения определены для любых однотипных операндов (числовых, символьных, логических); для числовых данных, так же, как и в случае арифметических операций, сделано исключение - вы можете сравнивать два числовых выражения любых типов, но сравнивать число и символ, число и логическую величину, символ и логическую величину нельзя! Результат операции сравнения есть TRUE или FALSE, в зависимости от того, выполнено или не выполнено условие. Числа сравниваются между собой естественным образом, символы - в соответствии с их номерами, а для логических величин справедливо неравенство FALSE < TRUE. Логических, или булевских, операций в Паскале четыре:

NOT - логическое отрицание;

AND - логическое "и";

OR - логическое "или";

XOR - логическое исключающее "или".

Правила выполнения этих операций таковы:

NOT - унарная (т.е. применимая к одному операнду) операция:

NOT FALSE = TRUE, NOT TRUE = FALSE.

Правила выполнения бинарных операций AND, OR и XOR приведены в таблице 3.

Правила выполнения бинарных операций Таблица 3

Операнд Результат операции
a b a AND b a OR b a XOR b
false false true true false true false true false false false true false true true true false true true false

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

30. Odd (x). Она возвращает TRUE, если значение x нечетное, и FALSE, если оно четное.

Логические значения можно выводить процедурой WRITE, но вводить логические переменные процедурой READ нельзя. Теперь попробуем записать программу, использующую логические данные.

var a,b,c,d: integer;

begin writeln('введите 4 целых числа, a,b,c и d, среди ',

'которых должно быть 2 и только 2 одинаковых!'); write('a='); read(a); writeln;

write('b='); read(b); writeln;

write('c='); read(c); writeln;

write('d='); read(d); writeln;

writeln('вашу понятливость можно оценить как ',

(a=b)and(a<>c)and(a<>d)and(c<>d)or

(a=c)and(a<>b)and(a<>d)and(b<>d)or

(a=d)and(a<>b)and(a<>c)and(b<>c)or

(b=c)and(b<>a)and(b<>d)and(a<>d)or

(b=d)and(b<>a)and(b<>c)and(a<>c)or

(c=d)and(c<>a)and(c<>b)and(a<>b));

readln;

end.

Программа выведет TRUE, если введенные данные удовлетворили условию, и FALSE - в противном случае.

10. Условный оператор. Блок. Оператор выбора

Условный оператор в Паскале записывается в виде:

IF логическое выражение

THEN оператор / блок

[ ELSE оператор / блок ]

логическое выражение - это любое выражение, значение которого имеет тип Boolean, блок - это последовательность операторов, заключенная в логические скобки: BEGIN операторы END;. В условном операторе перед ELSE никогда не ставится "; "! Перед END в большинстве случаев можно не ставить "; ". Если значение логического выражения TRUE, то выполняется оператор или блок, стоящий после THEN, в противном случае - оператор или блок, стоящий после ELSE. Конструкция ELSE необязательна, условный оператор можно использовать и в усеченном виде, тогда при значении логического выражения FALSE не выполняется никаких действий. Операторы, входящие в условный оператор, сами могут быть условными, т.е. допускается любая вложенность условных операторов. Запишем теперь предыдущую задачу о четырех числах, используя оператор IF:

var a,b,c,d: integer;

begin writeln('Введите 4 целых числа, a,b,c и d, среди ',

'которых должно быть 2 и только 2 одинаковых!');

write('a='); read(a); writeln; write('b='); read(b); writeln;

write('c='); read(c); writeln; write('d='); read(d); writeln;

if (a=b)and(a<>c)and(a<>d)and(c<>d)

or(a=c)and(a<>b)and(a<>d)and(b<>d)or

(a=d)and(a<>b)and(a<>c)and(b<>c)or

(b=c)and(b<>a)and(b<>d)and(a<>d)or

(b=d)and(b<>a)and(b<>c)and(a<>c)or

(c=d)and(c<>a)and(c<>b)and(a<>b)

then

writeln('вы довольно понятливы')

else

writeln('вы ошиблись!!!');

readln;

end.

Можно решить эту задачу и другим способом:

var a,b,c,d: integer;

const num: byte = 0;

begin writeln('введите 4 целых числа, a,b,c и d, среди ',

'которых должно быть 2 и только 2 одинаковых!');

write('a='); read(a); writeln; write('b='); read(b); writeln;

write('c='); read(c); writeln; write('d='); read(d); writeln;

if a=b then inc(num);

if a=c then inc(num);

if a=d then inc(num);

if b=c then inc(num);

if b=d then inc(num);

if c=d then inc(num);

if num=1

then writeln('вы довольно понятливы')

else writeln('вы ошиблись!!!');

readln;

end.

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

var d,m: byte;

y: word;

valid: boolean;

begin write('введите дату '); read(d,m,y);

if (m=1)or(m=3)or(m=5)or(m=7)

or(m=8)or(m=10)or(m=12)

then

if (d>=1)and(d<=31)

then valid:=true

else valid:=false

else

if (m=4)or(m=6)or(m=9)or(m=11)

then

if (d>=1)and(d<=30)

then valid:=true

else valid:=false

else

if m=2

then

if (d>=1)and(d<=28)

then valid:=true

else

if d=29

then

if (y mod 4=0)and

(y mod 100>0) or

(y mod 400=0)

then valid:=true

else valid:=false

else valid:=false

else valid:=false;

if valid

then writeln('дата верна')

else writeln('дата неверна');

end.

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





Дата публикования: 2014-11-04; Прочитано: 509 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.125 с)...