">
Информатика Программирование
Информация о работе

Тема: Программа, массивы и данные

Описание: Рекурсия вызывает сама себя. Недостатки рекурсии. Условия останова прекращения рекурсивных вызовов. Пользовательские типы определения множества допустимых значений. Передача массивов в подпрограммы. арифметические операции, процедуры ввода-вывода. Сортировка.
Предмет: Информатика.
Дисциплина: Программирование.
Тип: Лекции и учебные материалы
Дата: 10.07.2012 г.
Язык: Русский
Скачиваний: 3
Поднять уникальность

Похожие работы:

8) Рекурсия – способ организации вычислительного процесса, при котором процедура или функция вызывает сама себя.

Пример: n!

function fact(i:integer):longint;

begin

if i=1 then fact:=1

else fact:=i*fact(i-1);

end; var n:integer;

begin

write(’Введите число n:’); readln(n);

writeln(’Факториал n!=’, fact(n));

end.

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

Преимущества:

процедура или функция может сама себя вызывать в одной и той же строчке   процедуры и функции невозм из-за ограниченности операт. памяти. Поэтому главное требование к рекурсивным подпрограммам заключается в том, что вызов рекурсивной подпрограммы должен вып. по условию, которое на каком-то уровне рекурсии станет ложным. 9) Рекурсивное определение позволяет с помощью конечного выражения определить бесконечное множество объектов. А с помощью рекурсивного алгоритма можно определить бесконечное вычисление, причем алгоритм не будет содержать повторений фрагментов кода Рекурсивные подпрограммы, не содержащие условия останова прекращения рекурсивных вызовов, – приводят к бесконечным процессам.

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

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

procedure rec; begin

Операторы;

if Условие then rec;

end.

2) Выполнение действий на рекурсионном возврате. procedure rec; begin

if Условие then rec;

Операторы;

end;

3) Выполнение действий как на рекурсивном спуске, так и на рекурсивном возврате

procedure rec; begin



Оператор1;

if Условие then rec;

Оператор2;

End; 10) Множество типов данных языка Pascal можно разделить на две группы: стандартные и пользовательские.

Стандартные типы (например, integer, real, boolean, char, string, array) предопределены и действуют в любой точке программы.  Пользовательские типы – это дополнительные типы, которые программист-пользователь может задавать самостоятельно.

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

Перечисляемый тип.

Каждое значение перечисляемого типа программист задает сам (т.е. «перечисляет» все возможные значения). Описание перечисляемого типа состоит из списка его элементов (через запятую), заключенного в круглые скобки. Пример:

type

season = (spring, summer, autumn, winter);

weekday = (Mon, Tue, Wed, Thu, Fri, Sat, Sun);

var s1, s2 : season;

today : weekday;

Идентификаторы всех элементов перечисляемого типа интерпретируются как константы. В примере идентификаторы spring, summer, autumn, winter – это константы типа season./  Перечисление элементов типа определяет упорядоченные наборы констант. Порядковый номер константы определяется ее позицией в списке, причем первая константа имеет порядковый номер 0. К значениям перечисляемых типов не применимы ни стандартные арифметические операции, ни стандартные процедуры ввода-вывода (write /writeln, read/readln).

Интервальный тип.

Интервальный тип данных – это диапазон (интервал) значений какого-либо порядкового типа, называемого базовым. При описании интервального типа указывается наибольшее и наименьшее значения диапазона, разделенные лексемой «..». Пример:

const

min=1;

max=31;

type

month = 1..12; date = min..max;

var

m1 : month;

m2 : 1..12;

today : date;

Тип-массив.

Предварительное описание типа-массива считается более строгим описанием массива.

Пример:  

Type

ИмяТипа = array[НижнГран ..ВерхГран] of ТипЭлементов;

Var

ИмяМассива : ИмяТипа; Файловый тип данных.

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

логический файл (т.е. сущ. в нашем логическом пр-ии) – это одна из многих структур данных, используемых в программировании.

В языке Pascal имеются три типа файлов:

1)типизированные (file of Тип),

2)текстовые (text),

3)нетипизированные (file).

Например:

var f1,f2 : file of integer;

list : text;

ftmp : file;

Общая схема работы с файлами.

Последовательность действий

1.Описать переменную файлового типа.

 2.Файловую переменную поставить в соответствие конкретному физическому файлу.

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

4.Обработать файл.

5.Закрыть файловую переменную, т.е. сохранить данные на внешнем устройстве после окончания работы с файлом.

assign(ФайлПерем,ИмяФайла)- ставит в соответствие физический файл

reset(ФайлПерем); - открыт.

close(ФайлПерем) -закрыть

12)Типизированные файлы

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

Объявление типизированных файлов:

Var

ФайлПерем : file of Тип;

Процедуры:

read(ФайлПерем,x1,x2,...,xN)- чтение

  write(ФайлПерем,x1,x2,...,xN);- Запись в файл.

seek(ФайлПерем,НомерПозиции); - Перемещает указатель обработки с текущей позиции к позиции с указанным номером, не выполняя чтение или запись.

truncate(ФайлПерем); - Усекает размер файла до его

текущей позиции.

Текстовые файлы

Текстовый файл состоит из последовательности символьных строк произвольной длины. Каждая строка в текстовом файле оканчивается составным символом конца строки (eoln – end of line), В конце последней строки ставится символ конца файла (eof).

Объявление текстовых файлов:

type

ИмяТипа = text;

var

ФайлПерем:ИмяТипа;

Процедуры:

append(ФайлПерем) -

Открыв. существующий

файл для дозаписи в конец.

read(ФайлПерем,x1,x2,...,xN) -

чтение из файла

write(ФайлПерем,x1,x2,...,xN)

запись в файл

 13)Одномерный массив.

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

однородность означает, что все элементы массива одного типа;

элементы массива упорядочены (пронумерованы), и

обратиться к каждому из них можно по индексу элемента.

Одномерный массив (вектор) – это массив, в котором элементы нумеруются одним индексом (т.е. ранг равен единице).

Type ИмяТипа = array [НижнГран..ВерхГран] of ТипЭлементов; Обращение к эл-ам массива.

Индекс элемента массива указывается в квадратных скобках:

a[1]:=12.34;

a[5]:=0;

writeln(a[10]);

Пример заполнения массива целыми числами от 20 до 1 и вывода на печать:

var

i: integer;

m: array[1..20] of real;  begin

for i:=1 to 20 do m[i]:=21-i;

for i:=1 to 20 do writeln(i:2,’ - ’,m[i]:3);

end.   14) Передача массивов в подпрограммы.

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

Пример.

const n=10;

type TVector=array[1..n] of integer;

procedure init(var a:TVector);

var i:integer;

begin

for i:=1 to n do a[i]:=0;

end; procedure print(a:TVector);

var i:integer;

begin

for i:=1 to n do write(a[i]:6,’ ’);

writeln;

end;

var v: TVector;

begin

init(v);

v[3]:=123; v[5]:=2345; v[n]:=34; print(v); end.

Открытые параметры-массивы

Для передачи в процедуры и функции массивов различной размерности (и с различным количеством элементов) используются открытые параметры-массивы. В этом случае, при описании параметра-массива в заголовке процедуры или функции, индексы массива не указываются.l

const n=10;

m=15;

type TVector1=array[1..n] of integer;

TVector2=array[1..m] of integer;

procedure init(var a:array of  integer);

var i:integer;

begin

for i:=low(a) to high(a) do a[i]:=0;

end;

procedure print(a:array of integer);

var i:integer;

begin

for i:=low(a) to high(a) do write(a[i]:6,’ ’);

writeln;

end;

var v1: TVector1;

v2: TVector2;

begin

init(v1);

init(v2);

end.    

15,16,17) Сортировка – процесс упорядочивания однородного набора данных по возрастанию (или убыванию) значения какого-либо признака.

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

При решении задачи сортировки

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

Метод вставки

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

Алгоритм

Для массива из n элементов алгоритм метода вставки состоит из (n–1)-го прохода, каждый из которых  содержит четыре последовательных действия:

1) взятие очередного i-го элемента массива из неотсортированной части и сохранение его в дополнительной переменной;

2)поиск позиции j в отсортированной части массива, для которой вставка сохраненного элемента не нарушит упорядоченности;

3)сдвиг элементов массива от (i–1)-го до j-го вправо, чтобы освободить найденную позицию вставки;

4)вставка сохраненного элемента в найденную j-ю позицию. Модификация метода.

На момент вставки элемента A[i] элементы массива A[1], …, A[i–1] уже отсортированы. Нужно выбрать средний элемент и сравнить его с A[i]. Если A[i] меньше этого элемента, то поиск места вставки следует продолжать в левой половине упорядоченной части массива, иначе – в правой.

Метод выбора

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

На втором шаге находим элемент с минимальным значением на интервале от 2-го до n-го элемента и меняем его местами со вторым элементом.

И так далее для всех элементов до (n–1)-го. Всего потребуется (n–1) проход.

Модификация метода.

Если в неупорядоченной части массива найти первый максимальный элемент A[k], то среди следующих за ним элементов A[k], …, A[n] могут содержаться много равных A[k]. Их следует сразу помещать в отсортированную часть массива, следом за A[k].

Метод обмена.

Слева направо поочередно сравниваются два соседних элемента, и если их взаиморасположение не соответствует заданному условию упорядоченности, то они меняются местами. Далее берутся два следующих соседних элемента и так далее до конца массива.

После одного такого прохода на последней n-й позиции массива будет стоять максимальный элемент. Поскольку максимальный элемент уже стоит на своей последней позиции, то второй проход обменов выполняется до  (n–1)-го элемента. И так далее. Всего потребуется (n–1) проход.

Модификация метода.

Во-первых, нужно исключить лишние просмотры элементов массива, если они есть. Например, для сортировки по возрастанию массива 12,3,5,7,9,10 достаточно одного просмотра.

Во-вторых, требуется устранить несимметричность метода по отношению к различным исходным данным, меняя поочередно направления просмотров, слева направо и справа на лево. Например, массив 5,7,9,10,12,3 должен быть упорядочен по возрастанию за два просмотра.  19) Многомерный массив.

Массив, размерность (ранг, количество индексов) которого больше единицы (r >1) называется r-мерным массивом.

Описать многомерный массив можно двумя способами. Первый способ – описание массива, состоящего из одномерных массивов:

var

ОдномернМасс:array[НижнГран1..ВерхГран1] of ТипЭлементов;

ДвухмернМасс:array[НижнГран2..ВерхГран2]of ОдномернМасс;

Второй способ описания многомерных массивов:

var

ДвухмернМасс:array[НГ1..ВГ1,НГ2..ВГ2]of ТипЭлементов;

ТрехмернМасс:array[НГ1..ВГ1,НГ2..ВГ2,НГ3..ВГ3] of ТипЭлементов;

Обращение к эл-ам

For i:=1 to 10 do for j:=1 to 15 writeln(B[I,j]) – вывод значений.  const n=10;

m=4;

p=3;

var arr2 : array[1..m,1..n] of integer;

arr3 : array[1..p,1..m,1..n] of real;

begin

arr2[1,1]:=100;

arr2[4,10]:=200;

arr3[3,4,10]:=3.14;

end. 19) Матрицы

Массив размерностью 2 называется матрицей.

Описание матрицы

const n=10;

m=6;

type TMatrix=array[1..m,1..n] of integer;

var mtr: TMatrix;

Обход элементов матрицы

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

var mtr: TMatrix; {матрица m*n}

i:integer; {счетчик по строкам от 1 до m}

j:integer; {счетчик по столбцам от 1 до n}

begin

for i:=1 to m do

for j:=1 to n do

mtr[i,j]:=i*j;

end. Операция перемножения матриц.

const m=3;

n=4;

type TnVector=array[1..n] of integer;

TMatrix=array[1..m,1..n] of integer;

TmVector=array[1..m] of integer;

procedure Mult(mtr:TMatrix; v:TnVector; var res:TmVector);

var i:integer; {счетчик по строкам}

j:integer; {счетчик по столбцам}

begin  for i:=1 to m do res[j]:=0; {обнуление вектора-результата}

for i:=1 to m do

for j:=1 to n do

res[i]:= res[i]+mtr[i,j]*v[j];

end; 20) Комбинированный тип.

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

type

ИмяТипа = record

ИмяПоля1 : ТипПоля1;

ИмяПоля2 : ТипПоля2;  ...

ИмяПоляN : ТипПоляN;

end;

var

ИмяПеременной : ИмяТипа;

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

stud1, stud2: TStudentCard;

begin

stud1.Name:=’Сергей’;

stud1.BirthYear:=1990;

stud1.Marks.Inform:=5;

stud2.Marks:=stud1.Marks;

stud2:=stud1;

...

end.

Можно использовать массив записей.  type

TGroup = array[1..25] of TStudentCard;

var

group1, group2: TGroup;

begin

group1[1].SurName:= ’Иванов’;

group1[1].Marks.MathAnal:=5;

group2[2].Marks:=group1[1].Marks;

End. 21) Указатели.

Указатели – это особый тип данных (pointer) для хранения адресов ячеек памяти, в которых находятся другие переменные. Адресом переменной является адрес первого байта ячейки памяти, которая под нее отводится.

Типизированный указатель – это указатель на переменную определенного типа (например, целого, строкового или тапа массива)

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

p1,p2: ^integer; {указатели на переменные целого типа}

p3: ^string; {указатель на строку}

p: pointer; {нетипизированный указатель}

Операции с указателями.

Присваивание (p1:=p2) - Указателю допускается присвоить значения только того же типа или типа pointer

Получение адреса (px:=@x ), результат -

указатель типа pointer, который можно присвоить любому указателю.

Разыменование (p1^:=5) - доступ к переменной, на которую ссылается указатель. Нетипизированные указатели разыменовывать нельзя.

Отношение ( p1<>p2, p1=nil ) - Проверка равенства = и неравенства <> адресов.

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

 Для типизированных указателей:

new(p); - Выделяется столько байтов памяти, сколько требуется для хранения переменной заданного типа.

dispose(p); - Освобождается выделенная память, на которую указывает p.

Для нетипизированных указателей:

getmem(p,size); - Выделяется столько байтов памяти, сколько указано в параметре size.

freemem(p,size);- Освобождается size байтов, начиная с адреса p. 22) Организация связных динамических структур.

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

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

В простейшем случае элемент динамической структуры данных должен состоять из двух полей: информационного (inf) и указательного (link).

type

TPtr = ^TElem; {TPtr - тип указателя на элемент}

TElem = record {TElem - тип элемента (запись) }

inf : integer; { inf - информационное поле } link : TPtr; { link - указательное поле}

end;

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

Очередь (queue) – частный случай линейного односвязного списка, организованного по принципу “first in, first out” (FIFO, «первым пришел, первым ушел»).

Для создания очереди (queue) и работы с ней необходимо иметь как минимум два указателя:

на начало очереди (назовем его BegQ, от begin of queue)  на конец очереди (назовем EndQ – end of queue).

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

Создание очереди

1. Исходное состояние.

BegQ:=nil;

EndQ:=nil;

2. Выделение памяти под первый элемент очереди.

new(p); 3. Занесение данных в первый элемент очереди.

p^.inf:=3;

p^.link:=nil;

4. Установка указателей BegQ и EndQ на созданный первый элемент.

BegQ:=p;

EndQ:=p;

Стек (stack) – частный случай линейного односвязного списка, организованного по принципу “last in, first out” (LIFO, «последним пришел, первым ушел»)

Для работы со стеком (stack) необходимо иметь один  указатель на вершину стека (назовем его Top). Также потребуется один дополнительный указатель (p), который используется для выделения и освобождения памяти элементов стека.

Создание стека

1. Исходное состояние.

Top:=nil;

2. Выделение памяти под первый элемент стека.

new(p);

3. Занесение данных в первый элемент стека. p^.inf:=5; p^.link:=nil;

4. Установка указателя Top на созданный первый элемент.

Top:=p;  1) Тип данных определяет множество значений, которые может принимать переменная, и совокупность операций, допустимых над этими значениями. Т.е. тип определяет форму внутреннего (машинного) представления данных и размер отводимой для них памяти. Каждый тип данных имеет ограниченный диапазон значений.

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

Целочисленные типы данных Название типа Диапазон память  byte 0…255 1  shortint – 128 ... 127 1  integer – 32 768 ... 32 767 2  word 0 ... 65 535 2  longint – 2 млрд ... 2 млрд 4  Операции : сложение(+), вычитание, умножение,

частное от целочисленного деления (div), остаток от целочисленного деления (mod),=,>,<,<=,=>.  Формы записи.

фиксированная точка 7.32 и тп.

Плавающая точка mE+(-)p

Символьный тип.

Char;

В программе записывается в апострофы.

Строковой тип

String

Var

Идентификатор : string [max длинна строки] 2) Логический (булевский) тип

Логический тип имеет всего два значения: true (истина, 1) и false (ложь, 0). Переменные данного типа занимают в памяти один байт

Операции отношения выполняют сравнение двух операндов (например, целочисленных). Результат – истина (true) или ложь (false).

  = равно  <> не равно (?)  > больше  < меньше  >= больше или равно  <= меньше или равно  in принадлежность   Not (не), and (и), or (или), xor (исключ или).

Приоритет. Знак операции Приоритет Вид операции  Унарный минус, not, @ первый унарная  *, /, div, mod, and второй Типа умнож.  +, -, or, xor третий Типа сложен.  =,>,<,<=,=>, in четвёртый Типа отнош.    Условный оператор

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

Условный оператор if имеет две синтаксических формы записи:

полная форма:

if Условие then ОператорИст else ОператорЛож; сокращенная форма:

if Условие then ОператорИст;  3)Оператор цикла

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

Цикл с предусловием while

Синтаксис оператора с предусловием содержит ключевые слова while и do, что означает «пока» и «выполнить»:

while Условие do Оператор; Оператор цикла while (так же, как оператор if) вначале проверяет значение Условия. Если оно истинно (равно true), то выполняется тело цикла, содержащее один Оператор. Затем проверка Условия повторяется еще раз. Так продолжается до тех пор, пока Условие не станет ложным (равно false).

В теле цикла можно использовать несколько операторов.

Для завершения цикла в его теле обязательно должны содержаться операторы, оказывающие  влияние на истинность Условия.

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

Цикл с постусловием repeat

Синтаксис оператора с постусловием содержит ключевые слова repeat и until, что означает «повторить» и «до»:

repeat

Оператор1; Оператор2;

...

ОператорN;

until УсловиеВыхода;

Оператор repeat вначале выполняет тело цикла, а затем проверяет значение УсловияВыхода. Если УсловияВыхода равно false (ложь), т.е. не выполняется, то тело цикла повторяется еще раз. Так продолжается до тех пор, пока УсловияВыхода не станет равно true (истина).  Цикл со счетчиком for

В операторе цикла for всегда используется переменная-параметр (Счетчик), которая на каждом шаге цикла автоматически изменяет свое значение ровно на единицу.

Синтаксис оператора с предусловием содержит ключевые слова for и do, что означает «для» и «выполнить»:

for Счетчик:=НачЗнач to КонЗнач do Оператор;

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

Если в теле цикла нужно выполнить несколько операций то используется do begin … end;

Переменная Счетчик должна иметь порядковый тип (например, целочисленный) и быть описана в разделе описания переменных.  4) Вложенные циклы

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

for Счетчик1:=НачЗнач1 to КонЗнач1 do

begin

Оператор;

Оператор;

for Счетчик2:=НачЗнач2 to КонЗнач2 do Begin

Оператор;

Оператор;

Оператор;

end;

Оператор;

Оператор;

end;

Пример:   var

i, j: integer; {счетчики}

begin

for i:=1 to 9 do {внешний цикл}

begin

for j:=1 to 9 do {внутренний цикл}

write(i,’ * ’,j,’ = ’,i*j:2);

writeln; {перевод строки - во внешнем цикле}

end; end.

Старинная задача о покупке скота. Сколько можно купить быков, коров и телят (бык стоит 10 рублей, корова – 5 рублей, теленок – 0,5 рубля), если на 100 рублей надо купить 100 голов скота.

Обозначим: b – количество быков, k – количество коров, t– количество телят. Тогда условие задачи можно записать в виде системы из двух уравнений: 10b+5k+0,5t=100 и b+k+t=100. Преобразуем первое: 20b+10k+t=200.  Запишем ограничения. На 100 рублей можно купить:

- не более 10 быков, 0 ? b ? 10;

- не более 20 коров, 0 ? k ? 20;

- не более 200 телят, 0 ? t ? 200.

Но если известно количество быков и коров, то количество телят можно вычислить по формуле t=100–(b+k).

var

b, k, t: integer; begin

for b:=0 to 10 do

for k:=0 to 20 do

begin

t:=100-(b+k);

if (20*b+10*k+t=200) then

writeln(’быков ’,b,’ коров ’,k,’ телят ’,t);

end;

end.  5)Подпрограммы

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

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

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

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

Процедура

procedure ИмяПроцедуры(ФормальныеПараметры);

const

...  var

Begin

End;

Пример

procedure hline(len:integer; symb:char);

var i:integer;

begin

for i:=1 to len do write(symb);

writeln; hline(10,-);

hline(15,#);

hline(20,*);

end.

Функция

function ИмяФункции(ФормальныеПараметры):ТипРезультата;

var

begin  ...

...

ИмяФункции := Результат;

end;

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

Пример function power(x:real; n:byte):real;

var i:integer;

res:integer;

begin

res:=1;

for i:=1 to n do res:=res*x;

power:=res;

end;

var a,b,c :integer

begin writeln (‘введите а и b’); readln(a,b);  c:=power(a,b);

end. 6)Способы передачи параметров в подпрограммы.

Параметры-значения

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

Пример:

procedure summ(x, y :integer; s :longint);

begin  s := x + y;

writeln(Сумма = , s); (будет выв. Сум)

end;

var a, b :integer;

c :longint;

begin

c := 0;

write(Введите a:); Readln(a);

write(Введите b:); Readln(b);

summ(a,b,c); writeln(Сумма = ,c); (Сумма = 0)

end.

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

Параметры-переменные

Параметры-переменные используются для передачи данных в подпрограмму и возврата результатов работы. В списке формальных параметров перед ними ставится ключевое слово var.  procedure summ(x, y :integer; var s :longint);

begin

s := x + y;

end;

var a, b :integer;

c :longint;

begin

c := 0;

write(Введите a:); Readln(a); write(Введите b:); Readln(b);

summ(a,b,c);

writeln(Сумма = ,c); {на экран будет выведено значение суммы}

end.

В данном случае подпрограмме передается адрес фактического параметра в памяти. При работе с формальным параметром используется память фактического параметра. Поэтому изменение значений формальных параметров приводит к изменению значений фактических параметров.   Формальные параметры – это параметры, которые описываются в заголовке подпрограммы. Фактические параметры – это параметры, которые передаются подпрограмме при ее вызове. 7) Формальные параметры – это параметры, которые описываются в заголовке подпрограммы.

Фактические параметры – это параметры, которые передаются подпрограмме при ее вызове.

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

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

Время жизни.

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

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

    

Интернет-ресурсы:

http://эссе.рф - сборник не проиндексированных рефератов. Поиск по рубрикам и теме. Большинство текстов бесплатные. Магазин готовых работ.

http://www.maxdiplom.ru - Курсовая работа скачать бесплатно банк рефератов 10 Гигабайт.