72395

Программирование алгоритмов линейной структуры в интегрированной среде языка Turbo Pascal

Лабораторная работа

Информатика, кибернетика и программирование

Знакомство со средой программирования Turbo Pascal. Изучение структуры программы, стандартных функций, оператора присваивания и процедур ввода-вывода. Задачи работы Научиться создавать программы на языке Turbo Pascal с использованием стандартных функций.

Русский

2014-11-21

388 KB

11 чел.

Лабораторная работа № 1

Тема: Программирование алгоритмов линейной структуры в интегрированной среде языка Turbo Pascal.

1 Цель работы

Знакомство со средой программирования Turbo Pascal. Изучение структуры программы, стандартных функций, оператора присваивания и процедур ввода-вывода.

2 Задачи работы

Научиться создавать программы на языке Turbo Pascal с использованием стандартных функций.

 3 Порядок выполнения работы

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

3.2 Составить и отладить программу, включающую в себя:

-    сообщение о вводе двух чисел;

-    ввод значений двух вещественных чисел;

-    вывод в виде таблицы суммы, разности, произведения и среднеарифметического  значения 1-го и 2-го числа с разным числом знаков в дробной части.

3.3 Составить и отладить программу вычисления функции y=f(x) c использованием стандартных функций языка Turbo Pascal в соответствии с заданным преподавателем вариантом (см. приложение А).

3.4  Провести расчеты для х=0.1, х=0.2, х=0.3, х=0.4 и х=0.5.

3.5  Записать полученные значения в отчете в виде таблицы.

4 Требование к отчету

Отчет о проделанной работе должен содержать:

–     название и цель работы;

–     номер варианта для выполнения задания и условие своего варианта;

–     блок-схемы решения задач;

–     тексты программ;

–     полученные при расчетах численные результаты;

–     письменные ответы на контрольные вопросы п.7 по указанию преподавателя.

5 Теоретические положения

5.1 Элементы языка

5.1.1 Алфавит языка

При записи программ разрешены символы:

-     буквы латинского алфавита А-Z (в любом регистре), а также знак подчеркивания _;

-     буквы русского алфавита А-Я;

-     цифры 0-9;

-     специальные символы  >  <  =  +  -  /  *  [  ]  (  )  { }  .  ,  :  ;  ^  @  ’ $  #    

-     пары символов (их нельзя разделять пробелами)   < >    <=     >=     :=      (*     *)     (.      .)

-     пробелы (рассматриваются как ограничители идентификаторов, констант, чисел, зарезервированных слов).

5.1.2 Идентификаторы

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

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

name 

WorkPhone 

_SUM1

5.1.3. Константы

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

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

Вещественные числа записываются со знаком или без него с использованием десятичной точки и/или экспоненциальной части. Экспоненциальная часть начинается символом е или Е, за которым могут следовать знаки «+» или «-» и десятичный порядок. Символ е (Е) означает десятичный порядок и смысл «умножить на 10 в степени». Например, запись  3.14Е5 означает  3,14 × 105 ,а запись -17е-2    –  это  -17× 10-2.

Логическая константа – это либо слово FALSE (ложь) либо слово TRUE (истина). 

Символьная константа – это любой символ, заключенный в апострофы:

'z' – символ z;

'ф' – символ ф.

Строковая константа – последовательность символов, заключенная в апострофы. Если в строке нужно указать сам символ апострофа, он удваивается, например:

' Это - строка символов ';

' That''s string'.

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

5.1.4  Выражения

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

Действия в выражении выполняются слева направо с соблюдением старшинства (в порядке убывания):

1)  Not  (логическое отрицание);

2)  * (умножение), / (деление), div (целочисленное деление), mod (целочисленное деление с остатком по модулю), and (логическая операция “И”);

3)  + (сложение), - (вычитание), or (логическая операция “ИЛИ”);

4)  операции отношений:  = (равно), <> (не равно), < (меньше), > (больше), < = (меньше или равно) , > = (больше или равно).

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

Все составные части выражения записываются в одну строку, например, выражение       запишется в виде    (a+b*x)/(c+d)     .

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

ABS(x) – модуль   х    ( | x | );

SQR(x) – квадрат числа  x    (x 2) ;

SQRT(x)  – квадратный корень из  x   ( );

LN(x) – натуральный логарифм  от    х   (  ln x ); 

EXP(x) – е    в    степени   х    (ех );

SIN(x)  – синус   х   (sin x);

COS(x) – косинус    х   (cos x);

ARCTAN(x)  – арктангенс   х   (arctg x).

Аргумент этих функций может быть как вещественным, так и целым. Результат – всегда вещественный. 

5.2  Типы данных

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

К простым (скалярным) типам относятся, например:

INTEGER - данные этого типа могут принимать только целые значения (положительные, отрицательные, 0) в диапазоне от –32768 до +32767;

REAL - величины этого типа могут принимать только вещественные значения (числа с дробной частью, целая часть от дробной отделяется точкой);

BOOLEAN - логический тип, принимает два значения TRUE (истина) и FALSE (ложь);

CHAR – символ.

Примером составного (структурированного типа) может служить тип STRING - строка символов. Этот тип широко используется для обработки текстов.

5.3 Структура программы

Структура программы должна быть такой:

<Заголовок программы>

{Блок описаний}

BEGIN

{Раздел исполняемых операторов}

END.

5.3.1 Заголовок программы

В заголовке указывается имя программы. Общий вид заголовка:

program n;

здесь n –имя программы.

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

5.3.2 Блок описаний

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

1)  раздел меток (label);

2)       раздел констант (const);

3)       раздел типов (type);

4)       раздел переменных (var);

5)       раздел процедур и функций.

5.3.2.1 Раздел меток (label)

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

label l1, l2, l3…;

здесь l1, l2, l3… - метки.

Пример.

label 20;

Пусть оператор а:=b; имеет метку 20. Тогда этот оператор выглядит так:

20: а:=b ;

5.3.2.2      Раздел констант (const)

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

Общий вид:

const а1 = с1;  а2 = с2; …

Здесь  а1, а2, … – имя константы,   с1, с2, … – значение константы.

 

Пример.

сonst pi=3.14; c=2.7531;

5.3.2.3      Раздел типов (type)

Если в программе вводится тип, отличный от стандартного, то этот тип описывается в разделе type:

type t1=<вид типа>;

       t2=<вид типа>;

.   .   .   .   .   .   .

где t1 и t2 – идентификаторы вводимых типов.

Пример.

Type color=(red, yellow, green, blue);

Здесь описан тип color, задаваемый перечислением значений.

5.3.2.4      Раздел переменных (var)

В разделе var вводится имя каждой переменной и указывается, к какому типу эта переменная принадлежит:

var v11, v12, …: type1;

           v21, v22, …: type2; …

Здесь v11, v12, …- имена переменных;  type1 –  тип переменных  v11, v12, …;  type2 - тип переменных v21, v22, …

Пример.

var k,i,j:integer;   a,b:real;

5.3.2.5      Раздел процедур и функций

Те алгоритмы, которые оформляются как подпрограммы (процедуры и функции) помещаются в главной программе после раздела var и перед begin программы.

5.3.3    Раздел действий (операторов).

Эта часть программы начинается с ключевого слова begin и заканчивается словом end, после которого должна стоять точка (end.). Раздел действий - это выполняемая часть программы, состоящая из операторов.

5.4  Комментарии

Комментарий – это произвольная последовательность любых символов, поясняющая текст программы. Комментарий разрешается вставлять в любое место программы, где по смыслу может стоять пробел. В качестве ограничителей комментария  используются фигурные скобки « { » и« } », а также пары символов: « (* » - слева от комментария и  « *) » - справа от него:

{ Это комментарий }

(*  Это тоже комментарий *)

5.5  Оператор присваивания

Под операторами в языке Паскаль подразумевают описание действий. Операторы отделяются друг от друга  точкой с запятой. Если оператор стоит перед  end, until или else, то в этом случае точка с запятой не ставятся.

Общий вид оператора присваивания:

 

v:=a;

здесь v – переменная, а – выражение, := - операция присваивания. Выражение а может содержать константы, переменные, названия функций, знаки операций и скобки. В операторе v:=a переменная v и выражение а должны иметь один и тот тип.

Примеры.

f:=3*c+2*sin(x);

х:=х+1;

Замечание. Разрешается присваивать переменной типа real выражение типа integer. Но нельзя присваивать переменной типа integer выражение типа real.

 

5.6  Процедура ввода информации

Общий вид:

Read (v1, v2, …,vn);

или

Readln (v1, v2, …,vn);

здесь v1, v2, …,vn – идентификаторы переменных.

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

5.7  Процедура вывода информации на печать

Общий вид оператора:

   write(p1, p2, …, pn);

или

writeln(p1, p2, …, pn);

Здесь p1, p2, …, pn - список выражений, значения которых выводятся на печать.

Оператор write оставляет курсор в конце выведенной строки текста.

В случае использования процедуры writeln, после печати происходит переход на следующую строку.

Кроме значений выражений, на печать можно выводить и произвольный набор символов, заключенный в апострофы, например

writeln(’p=’,p);

Этот оператор выполняется так: сначала выводятся символы, заключенные в апострофы. Затем выводится значение переменной р, например 13.5. На экране в результате работы оператора появится:

р=13.5

Пример 1.  Вычислить длину окружности радиуса 5,785.

program t10;

(* Программа вычисления длины окружности*)

const r=5.785;

var l:real;

begin

l:=2*3.1416*r;

writeln(' l=',l);

end.

либо

program t11;

var r:real;

begin

readln(r);

writeln(' l=',2*3.1416*r);

end.

Имеется возможность задать ширину поля (число позиций) М для выводимой величины Р:

Write (P1:M1, P2:M2, …PN:MN);

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

Например,

Write (P:10:2);

Здесь под Р отводится 10 позиций, 2 из них под дробную часть.

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

Program Input_Output;

{Программа вводит два целых числа

   и выводит частное от деления 1-го на 2-е}

Var 

n1,n2:Integer;   {n1 и n2 - вводимые целые}

x:real;          {x - результат}

Begin 

Write('n1=');     {Сообщение о вводе n1}

ReadLn(n1);      {Ввод n1}

Write('n2=');     {Сообщение о вводе n2}

ReadLn(n2);      {Ввод n2}

Х:=n1/n2;        {Вычисление результата}

WriteLn('---------------------------');   {Печать таблицы}

WriteLn('|    n1 |    n2 | Частное |');

WriteLn('---------------------------');

WriteLn(n1:8,n2:8,x:8:4);{Вывод n1, n2 и x}

WriteLn('-------------------------');

End.

6  Методические рекомендации

6.1 Запуск программы Turbo Pascal выполняется любым из стандартных способов запуска,  предусмотренных в OC Windows (например, с помощью ярлыка на рабочем столе).

Для перехода к выбору команд главного меню используется клавиша F10. Для возврата в режим редактирования нужно нажать клавишу ESC.

Для получения справки используются клавиши:

F1 – получение контекстно-зависимой справки;

SHIFT+F1 – выбор справки из списка доступных справочных сообщений;

CTRL+F1 – получение справки о нужной стандартной процедуре, функции, о стандартной константе или переменной.

6.2 При решении задач можно воспользоваться примерами программ из п.5.7. Текст программы набирается в текстовом редакторе среды Turbo Pascal

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

Наиболее часто используемые команды редактора Turbo Pascal:

- смещение курсора

Page Up – на страницу вверх;

Page Down – на страницу вниз;

Home – в начало текущей строки;

End – в конец текущей строки;

Сtrl+ Page Up – в начало текста;

Сtrl+ Page Down – в конец текста.

- команды редактирования

Backspase – стирает символ слева от курсора;

Delete - стирает символ, на который указывает курсор;

Ctrl+Y – стирает строку, в которой расположен курсор;

Enter – вставляет новую строку, разрезает старую;

Сtrl+Q L – восстанавливает измененную строку (действует, если курсор не покидал строку после ее изменения).

- работа с блоками

Ctrl+K B – начинает выделение блока;

Ctrl+K K  – заканчивает выделение блока (кроме того, блок можно выделить с помощью мыши);

Ctrl+K Y – уничтожает выделенный блок;

Ctrl+K С – копирует блок;

Ctrl+K V – перемещает блок на новое место;

Ctrl+K W – записывает блок в файл;

Ctrl+K R – читает блок из файла;

Ctrl+K P – печатает блок.

Набранный текст программы запишите в файл. Клавишей F2 вызывается окно диалога, в котором следует задать имя файла.

После подготовки текста программы нужно попытаться исполнить ее, т.е. откомпилировать  программу, связать ее (если это необходимо) с библиотекой стандартных программ и функций, загрузить в оперативную память и передать ей управление. Эта последовательность действий – прогон программы – осуществляется после нажатия клавиш CTRL+F9.

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

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

По оператору read (или readln) вызывается встроенная процедура ввода данных и программа останавливается в ожидании ввода. Необходимо набрать на клавиатуре нужные данные и нажать клавишу ENTER.  

С помощью клавиш ALT+F5 в любой момент можно просмотреть данные, выданные на экран в результате прогона программы.

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

7.1  Как в программе на языке Turbo Pascal описываются переменные?

7.2  Какие бывают типы переменных?

7.3  Какой вид имеет оператор присваивания?

7.4  Каким символом отделяются друг от друга операторы в программе?

7.5  В каких случаях после оператора не ставятся точка с запятой?

7.6  Какая процедура служит для вывода информации на печать?

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

7.8  Какие функции служат для вычисления квадрата, квадратного корня, модуля, экспоненты числа или числового выражения?

7.9             Какие стандартные тригонометрические функции существуют в языке Turbo Pascal?

7.10        Как в среде Turbo Pascal запустить программу на выполнение? 

 

ПРИЛОЖЕНИЕ А

 

Номер варианта

Функция

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

 

 

ПРИЛОЖЕНИЕ Б

 Задание 2

 

     

Даны x, y, z . Вычислить a, b, если:

1.

     

2.

     

3.

     

4.

     

5.

     

6.

     

7.

     

8.

     

9.

     

10.

     

11.

     

12.

     

13.

     

14.

     

15.

     

Сообщения об ошибках.

2 Identifier expected  (Не указан идентификатор).

В этом месте должен находится идентификатор.

3 Unknown identifier (Неизвестный идентификатор)

Этот идентификатор не был описан.

4   Duplicate identifier (Двойной идентификатор).

Попытка дважды описать один и тот же идентификатор.

5             Syntax error (Синтаксическая ошибка).

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

10  Unexpected end of file (Не найден конец файла).

Причины этого сообщения могут быть следующие:

§исходный файл закончился перед последним END основного раздела операторов; вероятно в программе неодинаковое количество операторов BEGIN и END;

§не закончен комментарий.

11 Line too long (Слишком длинная строка).

Максимальная длина строки, обрабатываемая компилятором, равна 126 символам.

12 Type identifier expected (Здесь нужен идентификатор типа).

Не указан тип идентификатора.

16         Disk full (Диск заполнен).

Нужно удалить некоторые файлы или воспользоваться новым диском..

20 Variable identifier expected (Отсутствует идентификатор переменной).

На этом месте должен быть идентификатор переменной.

21 Error in type (Ошибка в объявлении типа).

Объявление типа не может начинаться с этого символа.

26 Type mismatch (Несоответствие типа).

Это сообщение может быть вызвано следующими причинами:

§    несовместимые типы переменной и выражения в операторе присваивания;

§    тип выражения не совместим с типом индекса при объявлении массива;

§    несовместимые типы операндов в выражении.

33 Labеl identifier expected (Нужен идентификатор метки)

Метка не обозначена с помощью идентификатора, как это требуется из контекста программы.

36 BEGIN expected (Нужен BEGIN)

37 END expected (Нужен END)

38 Integer expression expected (Нужно выражение типа Integer).

41 Operand types do not match operator (Типы операндов не соответствуют операции).

Данная операция не может быть применена  к указанным операндам.

42 Error in expression (Ошибка в выражении)

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

50 DO expected (Нужен оператор DO)

57 THEN expected (Требуется THEN)

58 TO or DOWNTO expected (Требуется TO или DOWNTO)

62 Division by zero (Деление на ноль)

Предшествующая операция пытается выполнить деление на ноль.

64 Cannot Read or Write variables of this type (Нет возможности считать или записать переменные данного типа).

Нарушены следующие ограничения: 

§    процедуры READ и READLN могут считывать переменные символьного, целого, действительного и строкового типов;

§    процедуры WRITE и WRITELN могут выводить переменные символьного, целого, действительного, логического и строкового типов.

76 Constant out of range (Константа нарушает границы).

Возможные причины сообщения:

§          попытка указать индекс массива, выходящий за его границы;

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

79 Integer or real expression expected (Нужно выражение вещественного или целого типа).

81 Label  already defined (Метка уже определена).

Данная метка уже помечает оператор.

85 «;» expected (Нужно указать «;»).

97 Invalid FOR control variable (Неправильный параметр цикла оператора FOR).

98 Integer variable expected (Нужна переменная целого типа).

Предшествующая переменная должна иметь целый тип.

103 Integer or real variable expected (Нужна переменная типа INTEGER or REAL).

113 Error in statement (Ошибка в операторе).

Данный символ не может быть первым символом в операторе.

207 Invalid floating point operation (Недопустимая операция с плавающей запятой) .

Возможные причины сообщения:

§        отрицательный аргумент функции SQRT;

§        аргумент функции LN равен нулю или имеет отрицательное значение.

 

Библиография

1.  Информатика. Базовый курс / Симонович С.В. и др.- СПб: Питер, 2000. - 640 с.

2.  Семашко Г.Л., Салтыков А.И. Программирование на языке Паскаль - М.: Наука, 1998. - 128 с.

3. Фаронов В.В. Турбо Паскаль 7.0 - М.: Нолидж, 2000. - 576 с.


Лабораторная работа № 2

Тема: Программирование алгоритмов разветвляющейся структуры в интегрированной среде языка Turbo Pascal.

Цель: изучить операторы условного и безусловного перехода языка Turbo Pascal, научиться составлять программы решения задач с использованием базовой структуры развилка и множественный выбор.

порядок выполнения лабораторных работ

Ознакомиться с теоретическим материалом и инструкцией на лабораторную работу.

Выполнить приведенное в инструкции задание. Вариант задания соответствует порядковому номеру в списке группы.

Сохранить результаты проделанной работы на диске.

Предъявить результаты выполненной работы преподавателю.

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

Выполнение лабораторных работ является обязательным в процессе изучения дисциплины и необходимым условием для аттестации знаний студента.

Теоретические сведения

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

Рис. 1. Блок-схема алгоритма ветвления

 

Логические выражения

Логические выражения могут принимать одно из двух значений TRUE (истина) и FALSE (ложь). Простейшими логическими выражениями являются выражения отношения: A1 OP A2. Здесь А1 и А2 – выражения, а ОР – операция отношения.

Операции отношений в Turbo Pascal обозначаются так: = (равно), <> (не равно), < (меньше), > (больше), < = (меньше или равно) , > = (больше или равно).

Примеры логических выражений: 3<5; 18>=2; A=B.

В одном выражении может потребоваться проверка нескольких подобных условий. Условия могут быть связаны с помощью логических операций, из них наиболее часто используемые – это AND (И) и OR (ИЛИ).

Выражение А AND B дает значение TRUE (истина), только в том случае, если А и B имеют значение TRUE. Во всех остальных случаях значение выражения А AND B - FALSE (ложь):

<TRUE> AND <TRUE> = <TRUE>;

<TRUE> AND <FALSE> = <FALSE>;

<FALSE> AND <FALSE> = <FALSE>.

Например, определить, попадает ли значение переменной Х в интервал от 0 до 10, можно с помощью условия: (x=>0) and (x<=10).

Выражение А OR B дает значение FALSE (ложь), только в том случае, если А и B имеют значение FALSE. Во всех остальных случаях результат – TRUE (истина):

<TRUE> OR <TRUE> = <TRUE>;

<TRUE> OR <FALSE> = <TRUE>;

<FALSE> OR <FALSE> = <FALSE>.

Составной оператор

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

Составной оператор начинается ключевым словом BEGIN и заканчивается словом END. Между этими словами помещаются составляющие операторы, которые выполняются в порядке их следования. После END ставится точка с запятой.

Пример:

Слова BEGIN  и END играют роль операторных скобок, Тело самой программы также имеет вид составного оператора. После последнего END программы ставится точка.

Оператор IF

Общий вид оператора IF:

IF  A  THEN  ST1  ELSE  ST2;

Здесь IF, THEN, ELSE – зарезервированные слова (если, то, иначе);  А – логическое выражение, ST1, ST2– операторы (простые либо составные).

Условный оператор работает по следующему алгоритму. Вначале вычисляется условное выражение А. Если результат TRUE (истина), то выполняется оператор ST1, а оператор ST2 пропускается; если результат FALSE (ложь), наоборот, оператор ST1 пропускается и выполняется оператор ST2. Затем, в обоих случаях управление передается к следующему оператору.

Например:

При выполнении этого фрагмента переменная Y получит значение переменной Х, если это значение не превышает Z, в противном случае Y станет равно Z.

Часть ELSE ST2 может быть опущена. Тогда при значении TRUE условного выражения выполняется оператор ST1, в противном случае этот оператор пропускается:

В этом примере переменная Y всегда будет иметь значение переменной Х, а в MAX запоминается максимальное значение Х. Такую форму оператора IF называют сокращенной.

Пример 1. Значения переменных a, b и с - целые числа. Определить наибольшее из них. 

Рассмотрим три способа решения этой задачи.

1 способ.

Если a>b, то max будет найдено среди а и с, в противном случае - среди b и с (см. рис. 2).

Рис. 2. Блок-схема алгоритма решения задачи 1-м способом

2 способ. 

Предварительно за max принимается большее из а и b, но если окажется, что с превышает принятую величину max, то последняя заменяется на с (рис. 3).  

Рис. 3. Блок-схема алгоритма решения задачи 2-м способом

3 способ.

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

Рис. 4. Блок-схема алгоритма решения задачи 3-м способом.

Оператор выбора варианта CASE

Оператор выбора (или оператор варианта) является обобщением случая условного оператора if и позволяет сделать выбор из произвольного числа имеющихся вариантов.

Формат:

сase <выражение-селектор> of

<список 1>:<оператор N>;

<список 2>: <оператор 2>;

……………..

<список N>: <оператор N>

[else <оператор>]

end;

где сase, of, end, - ключевые слова, соответственно выбор, из, конец;

<выражение-селектор> - выражение скалярного типа, кроме вещественного;

<оператор 1>, … <оператор N> - любые операторы, в том числе и составные;

<список 1>, … <список N> - список разделенных запятыми значений выражения-селектора или их диапазон.

Границы диапазона записываются между двумя константами через разграничитель “..”.

<список> - это константы, тип которых должен совпадать с типом селектора. Их называют метками варианта.

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

Пример.

case nomer of

1: y:= A;

2: y:= g*x;

3: y:= 2*exp(x);

4: y:=g*sqrt(x)+h;

10: y:=2*sqr(x)+exp(h)

end.

Создание сложных разветвлений алгоритма

Операторы, включаемые в условный оператор, в свою очередь также могут быть условными:

IF Логическое выражение THEN Оператор 1 ELSE Оператор 2 ;

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

IF <условие 1> THEN IF <условие 2> THEN <оператор> 1 ELSE <оператор 2>;

можно истолковать двояко:

1) IF <условие 1> THEN

   begin

                               IF <условие 2> THEN <оператор 1>

   end

                                                           ELSE <оператор 2>;

2) IF <условие 1> THEN

   begin

                               IF <условие 2> THEN <оператор 1>

                                                           ELSE <оператор 2>

   end;

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

IF j<>0 THEN

begin IF x<0 THEN x:=x-1 end

             ELSE

begin IF x<y THEN x:=x+0.5 

                      ELSE y:=y+0.5 end; 

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

Program Primer1; 

Uses Crt; 

Var x,y,z:Real; 

Begin

        TextColor(Yellow); TextBackGround(Blue);

        ClrScr;

        Write('x= '); Readln(x);

        Write('y= '); Readln(y);

        IF x<0 THEN

                IF x>y THEN z:=x ELSE z:=y 

        ELSE 

                IF x<y THEN z:=x ELSE z:=y; 

        Writeln('z= ',z:6:2);

        Readln

End. 

Примеры решения задач на языке turbo pascal:

Задача 1.

Даны координаты концов отрезка АВ: (х1,у1), (х2,у2) и координаты точки С: (х3,у3). Проверить принадлежит ли эта точка отрезку АВ.

Решение. Если точка С не принадлежит отрезку АВ, то

                                       АС + СВ АВ.

Длины отрезков АС = d2, СВ = d3, АВ = d1 вычисляются как расстояния между точками с заданными координатами. Формула для вычисления расстояния d между точками р1(х1,у1) и р2(х2,у2):

.

uses

 crt;

var

 x1,y1,x2,y2,x3,y3,d1,d2,d3:real;

begin

 clrscr;

 writeln('enter six number');

 readln(x1,y1,x2,y2,x3,y3);

 d1:=sqrt(sqr(x2-x1)+sqr(y2-y1));

 d2:=sqrt(sqr(x3-x1)+sqr(y3-y1));

 d3:=sqrt(sqr(x2-x3)+sqr(y2-y3));

if d2+d3<>d1 then writeln('tochka C ne prinadlegit otrezky')

            else writeln('tochka C prinadlegit otrezky');

end.

Задача 2.

Определить, поместится ли треугольная прямая призма (стороны основания a, b, c; высота Hp) внутри прямого цилиндра (радиус основания R; высота Hc) так, чтобы их высоты были параллельны.

Решение. Треугольную прямую призму можно поместить внутри прямого цилиндра, соблюдая параллельность их высот, если выполняются два условия:

1. Высота призмы Hp не превышает высоту цилиндра Hc.

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

Проверить второе условие можно, используя известные метрические соотношения в треугольнике и круге:

Радиус описанной окружности равен отношению произведения трех сторон треугольника к его учетверенной площади.

В алгоритме предусмотрен контроль корректности ввода сторон треугольника (сумма длин двух сторон должна быть больше третьей).

uses

 crt;

label 11;

var

 a,b,c,Hp,R,Hc,p,S:real;

begin

 clrscr;

 11: writeln('enter six number');

 readln(a,b,c,Hp,R,Hc);

if ((a<=Hc then p:=(a+b+c)/2;

                     S:=sqrt(p*(p-a)*(p-b)*(p-c));

    end

                                    else

         begin

         writeln('prizma ne treygolnaya');

         goto 11;

         end;

if R>=a*b*c/4*S then writeln('pomestitsya')

               else writeln('ne pomestitsya');

end.

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

  1.  Что понимают под алгоритмом ветвления?
  2.  Привести примеры случаев ветвления.
  3.  Как обозначается ветвление в блок-схемах?
  4.  Какие операторы ветвления существуют в языке Turbo Pascal?
  5.  Какой формат имеет оператор IF?
  6.  Какие различия между полной и сокращенной формой оператора IF?
  7.  Какой формат имеет оператор CASE?

Варианты индивидуальных заданий

1. Определить, может ли кирпич, имеющий форму прямоугольного параллелепипеда с ребрами a, b, и c, пройти через прямоугольное отверстие со сторонами X и Y.

2. Определить, находится ли точка М(х,у) внутри единичного круга с центром в начале координат.

3. Определить, находится ли точка М(х,у) внутренней области треугольника с вершинами А(0,0), В(а,0) и С(0,b), где a и b – положительные числа.

4. Определить, имеются ли среди целых чисел А, В и С хотя бы одно четное.

5. Вычислить значение величины

                2u+1, если u < 0,

F(u) =

                cosu, если u 0

при условии, что:

          lg(-x), если x < 0,

u =    

          x, если x  0.

6. Найти среди чисел a, b и c наименьшее и заменить им число, большее из них.

7. Каждое из чисел a и b отлично от нуля. Если они одинаковых знаков, то заменить меньшее из них большим; если они имеют разные знаки, присвоить каждому из них знак числа, меньшего по абсолютной величине.

8. Шар массой М с радиусом А, постоянной плотностью p притягивает материальную точку массой m, находящуюся на расстоянии r от центра шара. Вычислить силу притяжения по формуле:

             gA3/r2, если r  A,

U =

             g2, если r < A,

где g = 4/3fpm,

f = 6,67*10-11 – гравитационная постоянная.

9. A, B, r1 и r2 – заданные целые положительные числа. Выяснить, является ли хотя бы одно из чисел r1 и r2 остатком от деления A на B.

10. Вычислить значение величины

T = b/(ax)-2(ax+1)+2lnax,  ax>1;

величины

H = (a-x)(a+2x)+ln(a+2x+1), ax<1;

величины

S = (1/3)x+(1/2)(ax+2), ax=1.

11. Задана тройка чисел a, b, c. Вывести на печать:

1) max(a,b), abc<0;

2) max(a,c), abc>0;

3) max(b,c), abc=0.

12. Квадраты для игры в крестики-нолики (3х3) занумерованы слева направо и сверху вниз. Заданы номера трех квадратов N1, N2, N3, причем N1<N2<N3. Определить, лежат ли квадраты на одной прямой.

13. Найти остаток от деления целой части значения функции Z=ln(x+ab) на 7 и в зависимости от его величины напечатать сообщение об одном из дней недели, пронумеровав их от 0 до 6.

14. Составьте программу, определяющую номер минимального элемента из трех х1, х2, х3.

15. Расположить три числа a, b, c в порядке возрастания их значений.

16. Составьте программу нахождения двух наибольших чисел из трех чисел x, y, z.

17. Даны числа x, y, z. Найти:

а) max(x+y+z,xyz)+3;

б) min((x+y)x,(y+z)y)-4.

18. Даны положительные числа a, b, c и d. Выяснить, можно ли прямоугольник со сторонами a, b уместить внутри прямоугольника со сторонами c, d так, чтобы каждая из сторон одного прямоугольника была параллельна или перпендикулярна каждой стороне второго прямоугольника. Ответ получите в текстовой форме: ‘можно’ или ‘нельзя’.

19. Даны положительные числа a, b, c, x. Выяснить пройдет ли кирпич с ребрами a, b и c в квадратное отверстие со стороной x. Просовывать кирпич в отверстие разрешается только так, чтобы каждое из его ребер было параллельно или перпендикулярно каждой из сторон отверстия. Ответ получите в текстовой форме: ‘можно’ или ‘нельзя’.

20. Если сумма трех различных чисел x, y, z меньше 1, то меньшее из x, y заменить полусуммой y и z, иначе большее из x, z заменить на y.

21. По номеру y (y>0) некоторого года определить С – номер его столетия. Учесть, что, к примеру, началом ХХ столетия был 1901, а не 1900 год.

22. Даны действительные числа a, b, c, d. Если a<b<c<d, то каждое число заменить наибольшим из них. Если a>b>c>d, то числа оставить без изменения, в противном случае все числа заменяются их квадратами.


Лабораторная работа № 3

Тема: Программирование алгоритмов циклической структуры в интегрированной среде языка Turbo Pascal.

Цель: изучить операторы повтора (цикла) языка Turbo Pascal, получить навыки в использовании операторов повтора при программировании циклических вычислений.

порядок выполнения лабораторных работ

Ознакомиться с теоретическим материалом и инструкцией на лабораторную работу.

Выполнить приведенное в инструкции задание. Вариант задания соответствует порядковому номеру в списке группы.

Сохранить результаты проделанной работы на диске.

Предъявить результаты выполненной работы преподавателю.

Заготовить дома отчет по лабораторной работе, в который включить название темы; цель работы; текст программы на языке Turbo Pascal вашего варианта задания с использованием операторов трех циклов; численные результаты проделанной работы; ответы на контрольные вопросы, приведенные в конце лабораторной работы.

Выполнение лабораторных работ является обязательным в процессе изучения дисциплины и необходимым условием для аттестации знаний студента.

Теоретические сведения

Оператор перехода. Пустой оператор

В Паскале принят естественный порядок выполнения операторов, т.е. операторы обычно выполняются в порядке их следования в тексте программы. Между тем ОПЕРАТОР ПЕРЕХОДА позволяет задавать любой желаемый порядок выполнения вычислений.

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

GOTO Метка ;

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

МЕТКА : ОПЕРАТОР ;

Метка может иметь произвольное имя, в качестве меток также допускается использовать целые числа без знака. Используемая в программе метка должна быть описана в блоке LABEL раздела описаний. Если в программе несколько меток, то в блоке LABEL они приводятся в виде списка, отделяясь друг от друга запятыми:

LABEL 25, 0, Loop, 21, lab1;

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

Следует помнить, что частое использование оператора перехода ухудшает наглядность программы, затрудняет ее понимание и отладку. Использование оператора перехода обосновано лишь в отдельных случаях, например для досрочного выхода из цикла или перехода в конец программы для окончания ее работы:


Program
Primer; 

LABEL 25; 

VAR N,S:Real;

Begin

       Readln(S);

      Readln(N);

      IF N<0 THEN

      begin

           S:=N+2;

           GOTO 25 

      end;

       25: Writeln('S= ',S:6:2)

End. 

Пустой оператор

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

Наиболее часто пустой оператор используется для того, чтобы поместить в программе "точку", на которую должен осуществляться переход по оператору перехода, но при этом не надо выполнять никаких дополнительных действий; например, надо просто выйти из программы - для этого ставим пустой оператор с меткой перед словом end:

GOTO 5;

5:; 

End.

Пустой оператор может быть полезен еще в одном: в Паскале оператор может быть помечен только одной меткой, но если перед некоторым помеченным оператором дополнительно поставить помеченный пустой оператор, то на это место программы можно будет ссылаться по любой из 2-х меток:

1:; 2: A:=B+C;

Оператор цикла

Понятие о цикле

При разработке алгоритмов решения большинства задач возникает необходимость многократного повторения однотипных команд. Такой повтор может быть реализован с помощью оператора перехода и условного оператора. Предположим, что требуется пять раз вывести на экран слово "ЦИКЛ". Составим соответствующую программу:

Program Primer; 

Uses Crt;

Label Loop;

Var i:Integer; {Эта переменная будет использоваться в качестве}

                       {счетчика повторов}

Begin

TextColor(Yellow); TextBackGround(Blue);

ClrScr; {Настроили цвет, очистили экран}

i:=1; {Установили начальное значение счетчика}

                    Loop: IF i<=5 THEN

             Begin

             Writeln('ЦИКЛ');

             i:=i+1; { Значение переменной- счетчика увеличиваем на единицу }

             GOTO Loop {Повторяем алгоритм от метки LOOP до тех пор,}

                                     {пока значение счетчика не превысит 5}

             End; 

Readln 

End. 

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

Оператор цикла с параметром

Общий вид оператора цикла с параметром:

FOR i:= A TO B DO <оператор>;

где i - параметр цикла (счетчик повторов)- переменная целого типа (integer);

A и B - начальное и конечное значения параметра цикла- выражения того же типа, что и параметр цикла;

<оператор> - любой простой или составной оператор, который требуется повторить несколько раз.

Оператор цикла типа FOR...TO...DO предусматривает последовательное увеличение на единицу параметра цикла "i" от начального значения "A" до конечного значения "B" и выполнение входящего в цикл алгоритма при каждом значении параметра цикла.

В качестве иллюстрации применения оператора цикла FOR...TO...DO рассмотрим решение с его помощью предыдущей задачи, где на экран несколько раз выводится слово "ЦИКЛ".

Program Primer;

Uses Crt;

Var i:integer;

Begin

      TextColor(Yellow); TextBackGround(Blue);

      ClrScr;

      FOR i:=1 TO 5 DO Writeln('ЦИКЛ'); 

      Readln

End.

Приведем еще один пример использования оператора цикла с параметром. В этом примере с клавиатуры вводится целое число N, после чего вычисляется сумма всех целых чисел от 1 до N.

Program Primer;

Uses Crt;

Var i,N,S:integer;

Begin

       TextColor(Green); TextBackGround(Cyan);

       ClrScr;

       Write('N= ');

       Readln(N); {C клавиатуры ввели целое число в переменную “N”} 

        S:=0; {Задали начальное значение суммы}

       FOR i:=1 TO N DO S:=S+i; { Во время каждого из повторов }

                                                      { значение суммы "S" увеличивается }

                                                      { на новую величину счетчика "i" }

       Writeln('S= ',S:6);

       Readln

End.

В этой программе оператор "S:=S+i" выполняется "N" раз, при различных значениях параметра цикла "i".

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

FOR i:=B DOWNTO A DO <оператор>;

где i, A и B имеют прежний смысл.

Отличие от предыдущего варианта цикла в том, что в операторе цикла типа FOR...DOWNTO...DO шаг наращивания параметра равен -1, при этом начальное значение счетчика повторов "B" больше конечного значения "A".

Проследим, как изменится предыдущий пример при нисходящем изменении значения параметра цикла:

Program Primer;

Uses Crt;

Var i,N,S:integer;

Begin

     TextColor(Red); TextBackGround(White);

     ClrScr;

     Write('N= ');

     Readln(N);

     S:=0; {начальное значение суммы}

     FOR i:=N DOWNTO 1 DO S:=S+i;

     Writeln('S= ',S:6);

     Readln

End. 

Для операторов цикла с параметром существуют некоторые ограничения:

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

Оператор цикла с предусловием

Если число повторений, выполняемых в цикле, заранее не известно или шаг приращения счетчика (параметра) цикла отличен от единицы, то необходимо использовать оператор цикла с предусловием. Оператор цикла этого вида имеет вид:

WHILE <условие> DO <оператор> ;

где <условие> - это логическое выражение, от значения которого зависит- продолжать повторы или завершить цикл;

<оператор> - любой простой или составной оператор.

Выполнение оператора начинается с вычисления значения логического выражения. Если оно имеет значение "True" (истина), то выполняется оператор (операторы), входящий в цикл. Выполнение цикла продолжается до тех пор, пока логическое выражение в его заголовке не примет значение "False" (ложно). Если выражение равно "False" при первом же витке цикла, то работа цикла завершится, а входящие в него операторы не выполнятся ни разу. Поскольку в цикле типа WHILE...DO условие завершения его работы проверяется до выполнения входящего в него оператора, такой цикл называется "оператор цикла с предусловием".

Пример использования оператора цикла с предусловием:

Program Primer;

Var K:integer;

Begin

    K:=0;

    WHILE K<=10 DO

    begin K:=K+2; 

        Write('K= ',K:3)

    end; 

   Readln

End. 

Оператор цикла с постусловием

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

REPEAT

<оператор 1>;

<оператор 2>;

……………….

<оператор N>

UNTIL <условие>;

где <оператор1>, <оператор 2>, ... , <оператор N> - операторы тела цикла;

<условие> - логическое выражение, диктующее завершение повторов.

Оператор цикла с постусловием начинается с выполнения операторов внутри цикла. Затем проверяется истинность логического условия, стоящего после слова UNTIL.

Если это условие справедливо (True), то осуществляется выход из цикла. Если же значение логического выражения ложно (False), то выполнение операторов тела цикла повторяется, после чего снова проверяется истинность логического условия.

Пример программы, использующей оператор цикла с постусловием:

Program Primer;

Var K:Integer;

Begin

      K:=0;

      REPEAT

      K:=K+2; Write('K= ',K:3)

      UNTIL K>10;

Readln 

End. 

Правила использования операторов цикла

При использовании операторов цикла следует учитывать следующие особенности:

Операторы, входящие в цикл Repeat...Until, всегда выполняются хотя бы один раз, поскольку истинность логического выражения в цикле этого типа проверяется после операторов, входящих в тело цикла. При использовании цикла типа WHILE...DO могут быть ситуации, когда операторы, входящие в цикл, не будут выполнены ни разу, если логическое выражение изначально имеет значение "FALSE".

Цикл Repeat...Until выполняется, пока логическое выражение имеет значение "FALSE".

Цикл While...Do выполняется, пока логическое выражение имеет значение "TRUE".

Этот нюанс следует учитывать при замене цикла одного типа другим.

Program Whl;

Var i:integer;

Begin 

      i:=1;

      WHILE i<=10 DO

      begin 

              Writeln('Привет');

               i:=i+1

      end;

      Readln

End. 

Program Rep;

Var i:integer;

Begin 

     i:=1;

     REPEAT 

              Writeln('Привет');

               i:=i+1

              UNTIL i>10;

     Readln

End. 

Если тело цикла "WHILE...DO" состоит из нескольких операторов, их следует обрамлять операторными скобками "begin...end", образующими составной оператор. В цикле типа "REPEAT...UNTIL" операторные скобки не нужны.

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

k1:=1;WHILE k1<5 DO Writeln('Бесконечный цикл');

Если в программе встретится такой фрагмент, то экран заполнится строками с фразой "Бесконечный цикл", выдача которой в режиме прокрутки (Scrolling) будет длиться до тех пор, пока программистом не будут приняты действия по принудительному завершению работы программы. Вывести программу из бесконечного цикла можно, дважды нажав сочетание клавиш Ctrl+Break, после чего надо нажать клавишу ESC.

Зацикливания не произойдет, если операторы, входящие в тело цикла, будут влиять на условие, определяющее завершение цикла:

k1:=1;

WHILE k1<5 DO

Begin

     Writeln('Цикл');

      k1:=k1+1

end; 

В этом фрагменте цикл выполнится ровно 4 раза и компьютер перейдет к следующим командам.

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

REPEAT 

UNTIL X=B;

где X, B: Real, будет неправильным, хотя с математической точки зрения он верен.

Условие "X=B" скорее всего никогда не выполнится, в результате произойдет "зацикливание" программы. Не следует управлять циклом с помощью логического выражения, в котором вещественные переменные проверяются на строгое равенство.


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

  1.  Что такое циклический вычислительный процесс?
  2.  Основные составные части алгоритма циклической структуры?
  3.  С помощью каких операторов языка Turbo Pascal может быть организован циклический вычислительный процесс?
  4.  Допускается ли изменять шаг переменной цикла в операторе FOR во время выполнения цикла?
  5.  Какие существуют ограничения для оператора цикла FOR?
  6.  При каком значении условия в операторе цикла с предусловием осуществляется выход из тела цикла?
  7.  Каковы особенности использования операторов WHILE и REPEAT?

Варианты индивидуальных заданий

Составить программу вычисления значений функции f(x) на отрезке [a, b] в точках Xi = a+ih, где

h = (b-a)/m,

m – заданное целое число.

Вычисления выполнить в трех вариантах:

1) с использованием оператора for;

2) с использованием оператора while;

3) с использованием оператора repeat.

Варианты заданий представлены в таблице 1.

Таблица 1

Варианты заданий

Номер

варианта

Функция f(x)

Параметры

a

b

m

1

(2sinx)/x+1

-1

1

10

2

2-2cosx

0

1

10

3

5cosx-x/

-

10

4

sin3x-0,2x

-/2

/2

10

5

tgx-0,5

45

45

15

6

2cos(x/3)-x(x+1)

-2

2

15

7

x-3,1cos(x/e)

-3

3

15

8

2x/(x+1)-cos(0,5/x)

0

2

20

9

1/x-2ln(x+3,75)

1

10

20

10

tg2x-3/(x+1)

-

20

11

2e2/(2 cos(x/3))

-2

2

15

12

3 xsin(1/x)+1,57

-/2

/2

15

13

tg(x/2)+ cosx

/2

20

14

ctg(x/3)+sin2x

/4

/2

10

15

sin2x+0,53x

0

1

20

16

cos2x+e2/x

0,5

1

10

17

x2-2 sin(x/4)

0

/2

10

18

3 sinx+cos23x

/4

V/2

15

19

3,7ctg(2x/3)-2(x/)2

/4

/2

15

20

7 tgx+2x2

0,2

0,7

15

21

2e2cos2x+ctg2x

/4

/2

20

22

2x2ln(x+0,1)+xe2

-3

3

15

23

3,75sin2x/2

-/3

/3

20

24

ln2x+2-/(sin2(x-2)+1)

-1

2

20

25

x/sin2(x/)+lnx+1

-/2

2

15


Лабораторная работа № 4

Тема: Структурированные типы данных. Массивы (Array)

Цель: изучить основные правила работы с переменными типа массив (array), получить практические навыки в решении задач, содержащих типы данных массив, получить навыки отладки программ в интегрированной среде Turbo Pascal.

порядок выполнения лабораторных работ

Ознакомиться с теоретическим материалом и инструкцией на лабораторную работу.

Выполнить приведенное в инструкции задание.

Сохранить результаты проделанной работы на диске.

Предъявить результаты выполненной работы преподавателю.

Заготовить дома отчет по лабораторной работе, в который включить название темы; цель работы; текст программы на языке Turbo Pascal вашего варианта задания численные результаты проделанной работы; ответы на контрольные вопросы, приведенные в конце лабораторной работы.

Выполнение лабораторных работ является обязательным в процессе изучения дисциплины и необходимым условием для аттестации знаний студента.

Теоретические сведения

Массивы

Одномерные массивы

Понятие о массиве

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

Массив - упорядоченная группа фиксированного количества переменных одного типа, имеющая общее имя.

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

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

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

Одного типа - означает, что переменные, входящие в массив, должны хранить данные одного типа (Real, Integer, Char, Boolean и т.д.), который называется типом элементов массива.

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

Над переменными, составляющими массив (над элементами массива) можно выполнять те же действия, что и над обычными переменными - присваивать и считывать значения, преобразовывать значения и сравнивать их.

Каждый элемент массива имеет свое имя, представляющее собой имя массива и стоящие за ним квадратные скобки, в которых указывается индекс элемента - целое число, равное порядковому номеру этого элемента в массиве. Таким образом, для ссылки на отдельный элемент массива используется запись вида: имя массива[индекс]. Например: A[1], D[24], Massiv[5], Mas[12].

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

В этой программе для хранения в памяти количества киловатт- часов ежедневного потребления энергии можно было бы предусмотреть отдельные переменные:

KWatt1 KWatt2 KWatt3 ... KWatt30 KWatt31

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

Массив KWatt: KWatt[1] KWatt[2] KWatt[3] ... KWatt[31]

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

.................. {начальное значение счетчика цикла равно 1}

i:=1; {начальное значение переменной Max, предназначенной}

Max:=0; {для хранения максимального значения массива, равно 0}

REPEAT {начинаем цикл}

IF KWatt[i]>Max {если значение очередного элемента массива}

THEN {превышает текущее значение переменной Max,}

Max:=KWatt[i]; {то переменная Max меняет свое значение на}

{значение элемента массива}

i:=i+1  {увеличиваем значение счетчика на единицу}

UNTIL i>31; {цикл заканчивается, если значение счетчика цикла превысит число 31}

..................

мы без труда догадаемся, что здесь идет поиск максимального числа (Max) из набора однотипных данных (KWatt[i]).

Описание массивов

Основными характеристиками массива являются:

  1.  имя;
  2.  размерность (число элементов массива);
  3.  тип элементов;
  4.  тип индексов.

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

Формат:

Type 

<имя типа>=array[<тип индекса>] of <тип элементов>;

Var

<идентификатор 1>, …, <идентификатор N>: <имя типа>;

Массив может быть описан и без представления типа в разделе описания типов данных:

Var

<идентификатор 1, …, идентификатор N>: array [<тип индекса>] of <тип элементов>;

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

VAR <имя массива>: ARRAY[размерность] OF <тип элементов>;

К имени массива предъявляются те же требования, что и к имени переменной.

Размерность - это диапазон целых чисел, каждое из которых является порядковым номером (индексом) одной из ячеек массива. Обычно диапазон индексов задают, начиная от единицы: [1..100]. Это удобно, но не обязательно. Важно лишь, чтобы правая граница диапазона была больше или равна левой границе.

Program Primer;

Const Max=100;

Var A:Array[1..50] of Real; {массив "А" состоит из 50-ти вещественных чисел}

B:Array[1..Max] of integer; {массив "В" состоит из ста целых чисел}

Mas:Array[1999..2000] of integer; {массив "Mas" состоит из 2-х целых чисел}

Mas2:Array[-700..-1] of Real; {массив "Mas2" состоит из 700 вещественных чисел}

...................................

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

Использование значений массивов, ввод и вывод значений массивов

Как уже отмечалось, для ссылки на отдельные элементы массива используется переменная с индексом: Имя массива[индекс]. Чтобы получить доступ к конкретному элементу массива, в качестве индекса можно использовать не только целое число, соответствующее порядковому номеру этого элемента в массиве, но и выражение, значение которого равно упомянутому целому числу. Например, при обращении к элементам некоторого массива A: Array[1..100] of Real, в качестве индекса можно использовать любое арифметическое выражение, значением которого будет целое число из диапазона 1..100:

A[56]; A[i+7]; A[i div j] .

Вводить и выводить значения из массивов целесообразно поэлементно, используя в цикле операторы Readln, Write, Writeln и оператор присваивания.

Program Vvod_Vivod;

Var i:integer;

A:Array[1..20] of Real;

B:Char;

Begin 

    Writeln('Введите числа в массив: ');

     FOR i:=1 TO 20 DO 

     begin Write('A[',i,']= '); Readln(A[i]) end;

     Writeln('Массив заполнен, будете выводить');  

     Write('значения на экран? ("Y"-да, "N"-нет)=>');

     Readln(B);

     IF UpCase(B)="Y" THEN {если прописной вариант введенной}

        FOR i:=1 TO 20 DO Writeln('A[',i,']=',A[i]:6:2); {буквы является "Y", то}

Readln

End.

Приведем другие примеры использования массивов.

  1.  Попарное суммирование элементов массивов А и В.

Program Prim1;

Const N=10;

Var i:integer;

A,B,C:Array[1..N] of Real;

Begin

        FOR i:=1 TO N DO

        begin

                 Write('A[',i,']= '); Readln(A[i]);

                 Write('B[',i,']= '); Readln(B[i])

        end;

        FOR i:=1 TO N DO C[i]:=A[i]+B[i];

        Writeln('----------------------------------');

        FOR i:=1 TO N DO Writeln('C[',i,']=',C[i]:6:1);

        Readln

End.

  1.  Объединим в массиве С массивы А и В так, чтобы их элементы чередовались: элементы из массива А занимали нечетные ячейки, а элементы массива В - четные.

Program Prim2;

Const N=10;

Var i:integer;

A,B:Array[1..N] of Real;

C:Array[1..N*2] of Real;

Begin

         FOR i:=1 TO N DO

         begin

                 Write('A[',i,']= '); Readln(A[i]);

                 Write('B[',i,']= '); Readln(B[i])

         end;

         FOR i:=1 TO N DO

         begin

                 C[2*i-1]:=A[i];

                 C[2*i]:=B[i]

         end;

         Writeln('------------------------------');

         FOR i:=1 TO 2*N DO Writeln('C[',i,']=',C[i]:6:1);

          Readln

End.

Двумерные массивы

Одномерный массив (вектор) имеет вид таблицы из одной строки, ячейки которой заполнены значениями. Рассматривая ДВУМЕРНЫЙ массив, можно провести аналогию с таблицей, имеющей несколько строк и столбцов. Если отдельный элемент одномерного массива мы обозначали именем массива с индексом (А[i]), то для обозначения элемента двумерного массива (матрицы) потребуются два индекса: один - для указания номера строки, другой - для указания номера столбца, на пересечении которых находится нужный элемент: А[i,j]. Двумерные массивы описываются сходно с массивами одномерными:

Const Str=4;

Stolb=5;

Var A:Array[1..Str,1..Stolb] of Real;

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

FOR i:=1 TO Str DO

         FOR j:=1 TO Stlb DO Readln(A[i,j]);

...............

FOR i:=1 TO Str DO

         FOR j:=1 TO Stlb DO Writeln('A[',i,',',j,']=',A[i]:6:2);

здесь Str- число строк, Stlb- число столбцов.

Полная переменная

Массив можно рассматривать не только как группу однотипных переменных, но и как единое целое, как одну переменную. Значением этой особой переменной является весь массив. Такую переменную называют ПОЛНОЙ.

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

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

Нельзя использовать полные переменные в качестве аргументов арифметических операций.

Над значениями полных переменных в Паскале не выполняются операции сравнения.

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

VAR X:Real;

                Y:Array[1..1] of Real;

недопустимы операторы присваивания

X:=Y; Y:=X; X:=Y+0.5; Y:=3.14159

Пример 1.

Type

  Z=array[1..10] of char;

  A = array[1..5] of real;

Var

  C: Z;

  M1, M2: A;

  Mas: array[1..4] of byte;

  Mat: array[1..5,1..8] of byte;

  S: array[(red, green, blue)] of  boolean;

 

Пример 2.

(Задание массивов в виде типизированных констант)

Const

W: array[1..3, 1..4] of byte=

   ((1, 3, 5, 6),

     (1, 0, 2, 2),

     (1, 1, 2, 4));

E array[1..6] of integer =(1, 3, 5, -270, 7, 4);

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

  1.  Дайте определение типа данных массив (array).
  2.  Назовите основные характеристики массива.
  3.  Каким образом осуществляется задание типа данных массив?
  4.  Какие действия могут выполняться над массивами в целом и над элементами массива?
  5.  Каким образом осуществляется ввод и вывод элементов массива?

 

Задачи для самостоятельного решения

Варианты заданий на тему «Одномерные массивы»

1)       Найти среднее арифметическое всех элементов массива.

2)       Найти наименьший элемент в массиве.

3)       Найти количество положительных элементов массива.

4)       Найти количество отрицательных элементов массива.

5)       Определить, сколько раз встречается число 7 среди элементов массива.

6)       Определить, сколько элементов массива меньше, чем число 6.

7)       Определить, сколько элементов массива больше, чем число 3.

8)       Найти сумму всех неотрицательных элементов массива.

9)       Найти наименьшее из чисел  а1, 2а2, 3а3,…, 8а8.

10)  Найти наибольшее из чисел 2а1, 3а2, 4а3,…, 9а8.

11)  Найти сумму  а1+2а2+3а3+…+8а8.

12)  Найти наименьший по модулю элемент массива.

13)  Найти разность между наибольшим и наименьшим элементами массива.

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

15)  Найти произведение отрицательных элементов массива.

16)  Найти сумму всех элементов массива, имеющих четные индексы.

17)  Найти наибольший из элементов массива, имеющих нечетные индексы.

18)  Найти среднее арифметическое всех положительных элементов массива.

19)  Найти среднее арифметическое всех отрицательных элементов массива.

20)  Найти сумму элементов массива, превышающих число 5.

 

Библиография

1. Вальвачев А.Н., Крисевич В.С. Программирование на языке Паскаль для персональных ЭВМ: Справочное пособие.-Минск: Вышейш. шк., 1989.-223с.

2. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. – М.: Нолидж, 2000. – 576с.

PAGE   \* MERGEFORMAT1


 

А также другие работы, которые могут Вас заинтересовать

14849. Арифметикалық және геометриялық прогрессия 29 KB
  Арифметикалық және геометриялық прогрессия Ежелгі замандардан бастап адамзат арифметикалық және геометриялық прогрессиялардың заңдылықтарын қолдана білген.Мәселен Біздің заманымызға дейінгі ежелгі вавилондықтардың сына жазу клинопись кестелерінде ежелгі мысы...
14850. КВАДРАТ ТЕҢДЕУЛЕРДІ ШЕШУ ЖОЛДАРЫНЫҢ ӘР ТҮРЛІ ӘДІСТЕРІ 150.5 KB
  КВАДРАТ ТЕҢДЕУЛЕРДІ ШЕШУ ЖОЛДАРЫНЫҢ ӘР ТҮРЛІ ӘДІСТЕРІ З.Е.Темірғали Б.А.Қадырбаева І.Жансүгіров атындағы Жетісу мемлекеттік университеті Талдықорған қ. Білім өркениеттіліктің әрі өлшемі әрі тетігі болып табылатындықтан кез келген мемлекеттің рухани және ә...
14851. Өлшеулер теориясының негізгі түсініктері 326 KB
  1 тақырып Өлшеулер теориясының негізгі түсініктері Дәрістер жоспары 1. Физикалық қасиеттері мен шамалар 2. Өлшеу және негізгі операциялар Қоршаған ортаның барлық объектілері өз қасиеттерімен сипатталады. Қасиет – бұл объектінің құбылыстың процестің бір жағы о...
14852. Сызықтық функция 199 KB
  Сызықтық функция y = kx l мұндағы x тәуелсіз айнымалы k мен l – нақты сандар түріндегі формуламен берілетін фуннкцияны сызықтық функция деп атайды. у = kx l функциясының анықталу аймағы барлық нақты сандар жиыны. Егер у = kx l сызықтық функциясындағы l = 0 бол
14853. Үшбұрыштың ішкі бұрыштарының қосындысы 46.5 KB
  Үшбұрыштың ішкі бұрыштарының қосындысы. Сабақтың мақсаты: Білімділігі: Үшбұрыштың ішкі бұрыштарының қосындысы туралы теореманы қарастыру Үшбұрыштың сыртқы бұрыштары жөнінде түсінік енгізу. Дамытушылық: Творчестволық және логикалық ойлауқабі
14854. Ортағасырлық мәдениет және мемлекет қайраткерлері: Асан қайғы, Қазтуған, Шалкиіз және Жиембет жыраулар 94.5 KB
  Тақырыбы: Ортағасырлық мәдениет және мемлекет қайраткерлері: Асан қайғы Қазтуған Шалкиіз және Жиембет жыраулар Жоспар: Кіріспе Негізгі бөлім. а Жерұйық іздеген желмаяды ә Қызыл тілдің шешені б Тебінгіден ала балта суырысып... Қорытынды. ...
14855. АДАМЗАТ ҚОҒАМЫНЫҢ ЭВОЛЮЦИЯСЫ 160 KB
  АДАМЗАТ ҚОҒАМЫНЫҢ ЭВОЛЮЦИЯСЫ 5.1. Қоғамның қалыптасу кезеңдері Адам эволюциясына байланысты палеолит жоғарғы және төменгі болып екіге бөлінеді. Төменгі палеолит – архантроптар мен палеонтроптардың тіршілік ету кезеңі болып табылады. Бұл кезеңнің өзінде бірнеше а...
14856. Жердегі сұлулықтың мекені 38 KB
  Жердегі сұлулықтың мекені Айша Ғарифқызы Ғалымбаева Қазақстанның халық суретшісі ҚР Ш.Уәлиханов атындағы Мемлекеттік сыйлығының лауреаты Құрмет белгісі Еңбек Қызыл ту ордендерінің иегері. Оның есімі Республиканың құрметті Алтын кітабына жазылған. Қазақстан ...
14857. БЕЙНЕЛЕУ ӨНЕРІ АРҚЫЛЫ ЖАСТАРДЫҢ ПАТРИОТТЫҚ СЕЗІМДЕРІН ҚАЛЫПТАСТЫРУ 40 KB
  БЕЙНЕЛЕУ ӨНЕРІ АРҚЫЛЫ ЖАСТАРДЫҢ ПАТРИОТТЫҚ СЕЗІМДЕРІН ҚАЛЫПТАСТЫРУ Амандық Талғат Л.Н.Гумилев атындағы Еуразиялық Ұлттық Университеті Астана қ. Жалпы адам баласында рухани және материалды байлық деген бар. Соның ішінде адамды адам етіп ұлтты ұлт етет...