Смекни!
smekni.com

Методические указания к выполнению лабораторных работ Фрейз И. И (стр. 7 из 11)

j:=last; { правая граница массива — последний элемент }

x:=m[ (first+last) div 2]; ( определить середину массива }

repeat

while m[i]>x do i:=i+l;

while x>m[j] do j:=j-l;

{ увеличить число итераций обмена элементов }

а:=а+1; if i<=j then

begin { обменять местами элементы }

buf:=Tti[i]; m[i]:=m[j]; m[j]:=buf;

i:=i+l; j:=j-l;

for 1:=1 to n do write (' ',in[l]);

writeln{'; итерация # ',a);

end;

until i>j;

{рекурсивый вызов процедуры quicks }

if first<j then quicks (first, j) ;

{ рекурсивный вызов процедуры quicks }

if i<last then quicks(i,last);

end; {конец сортировки }

begin { начало основной программы }

clrscr; { очистка экрана }

writeln('Исходный массив:');

for i:=l to n do write (' ',in[i]);

writeln; readln;

a:=0;

quicks (1, count) ; { вызов процедуры сортировки quicks }

writeln; writeln('Отсортированный массив:');

for i:=l to n do write (' ',m[i]);

writeln; readln;

end.

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

Лабораторная работа №10. Двумерные массивы.

Цель: освоение двумерных массивов.

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

Const n=4;m=3;

Type mas = array[1..n] of integer;

Mas2 = array[1..m] of mas;

Обычно это записывается так:

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

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

Задача 7.1. Минимальный по модулю элемент

……………………………………………………………………………………………………

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

8 и его координаты.

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

Алгоритм

1. Ввести матрицу.

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

3. Поочередно просмотреть все элементы матрицы; если модуль очередного эле­мента оказывается меньше сохраненного, принять этот элемент за искомый (то есть запомнить его модуль, номер строки и номер столбца).

4. Вывести результаты.

Программа:

program min_abs_1;

uses crt;

const m=5;n=8;

var

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

i,j:integer; {текущие значения индексов строки и столбца }

im,jm:integer; {значения индексов минимального элемента}

minmod:real; {буфер для хранения минимального модуля}

begin clrscr; randomize;

for i:=1 to m do

for j:=1 to n do a[i,j]:=random(101); {ввод элементов массива}

writeln;writeln('Исходный массив');

for i:=1 to m do begin

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

minmod:=abs(a[1,1]); {начальные установки}

im:=1;jm:=1;

for i:=1 to m do {цикл перебора всех строк}

for j:=1 to n do {цикл просмотра строки (меняется номер столбца)}

if abs(a[i,j])<minmod then begin

minmod:=abs(a[i,j]);im:=i;jm:=j; {обновление минимума} end;

writeln ('Минимальный по модулю элемент : ',minmod:6:1,' Его координаты: ',im:3,jm:3);

readln; end.

Размеры массива заданы именованными константами m и n, что позволяет легко их изменять.

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

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

Алгоритм ее работы будет выглядеть так:

1. Ввести матрицу.

2. Для каждой строки матрицы:

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

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

- вывести результаты.

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

Лабораторная работа №11: Подпрограммы.

Цель: Решение задач в виде отдельных подпрограмм, для упрощения отладки и возможной модификации программ.

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

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

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

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

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

Структура процедуры аналогична структуре основной программы: в ней есть заголовок, разделы описаний и операторов:

procedure имя (список параметров): { заголовок }

разделы описаний

begin

раздел операторов

end;

Задача. Даны два массива целых чисел. Оформить ввод и вывод элементов в виде процедуры и найти максимальный элемент каждого массива с помощью функции.

uses crt;

type mas=array[1..35] of integer;

var a,b:mas;

maxA,maxB,i:integer;

procedure WWOD(var d:mas;n:byte);

begin for i:=1 to n do

d[i]:=random(100);

end;

procedure WIWOD(var d:mas;n:byte);

begin writeln ('Massiv');

for i:=1 to n do

write(d[i]:5);

end;

function Max(var d:mas;n:byte):integer;

var p:integer;

begin p:=d[1];

for i:=2 to n do

if d[i]>p then p:=d[i];

max:=p;

end;

begin clrscr;

randomize;

WWOD(a,20);

WWOD(b,35);

writeln;

WIWOD(a,20);

maxA:=Max(a,20);

writeln('Maksimal A=',maxA);

writeln;

WIWOD(b,35);

maxB:=Max(b,35);

writeln('Maksimal B=',maxB);

readln;

end.

В отчете по лабораторным работам написать комментарии к отдельным блокам программы.

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

Даны два массива из 10 целых чисел каждый. Определить, в каком из них больше положительных элементов.

Дана целочисленная прямоугольная матрица. Определить:

1. количество строк, не содержащих ни одного нулевого элемента (оформить в виде функции);

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

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

Лабораторная работа №12. Использование подпрограмм в Паскале.

Цель работы:

1) Получить необходимые навыки при использовании операторов в среде Turbo Pascal;

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

!!! Выучите формальные и фактические параметры.

Задача 1. Составьте программу, в которой при помощи функции находится max(2x, 3x-10,max(x

при заданных с терминала x,a.

uses crt;

type mas=array[1..4] of real;

function Max(d:mas;n:integer):real;

var i:integer;mx:real;

begin mx:=d[1]; for i:=2 to n do

if d[i]>mx then mx:=d[i];

max:=mx;

end;

var x,t:integer;

mx:real;

a,b,c:mas;

begin clrscr;

write('ВВедите x,t');

readln(x,t);

a[1]:=sqr(x)-x;

a[2]:=exp(3*ln(x))-sqr(x)-3*x;

c[3]:=Max(a,2);

writeln('Max(x^2-x,x^3-x^2-3x)=',c[3]:6:2);

b[1]:=t-x;

b[2]:=x-t;

c[4]:=Max(b,2);

writeln('Max(a-x,x-a)=',c[4]:6:2);

c[1]:=2*x;

c[2]:=3*x-10;

mx:=Max(c,4);

writeln('Max(2x,3x-10,max(x^2-x,x^3-x^2-3x),max(a-x,x-a))=',mx:6:2);

readln;

end.

Задача 2. Составьте программу, в которой при помощи функции находится максимальный элемент для массивов А(22), Р(12), Т(33), затем общий максимальный элемент, затем при помощи процедуры все отрицательные элементы каждого из трех массивов замените на модуль первого элемента соответствующего массива для массивов А(22), Р(12), Т(33). Предусмотреть вывод на экран исходных и измененных массивов.

uses crt;

type mas=array[1..33] of integer;

var a,p,t,m:mas;

i,maxi:integer;

procedure WWOD(var d:mas;n:byte);

begin for i:=1 to n do

d[i]:=random(101)-50;

end;

procedure WIWOD(var d:mas;n:byte);

begin

for i:=1 to n do

write(d[i]:5);

end;

function Max(var d:mas;n:byte):integer;

var mx:integer;

begin mx:=d[1];

for i:=2 to n do

if d[i]>mx then mx:=d[i];

max:=mx;

end;

procedure zamena(var d:mas;k:byte);

begin

for i:=1 to k do if d[i]<0 then d[i]:=abs(d[1])

end;

begin clrscr;

randomize;

WWOD(a,22); WWOD(p,12); WWOD(t,33);

writeln;

writeln ('Massiv A');

WIWOD(a,22);

m[1]:=Max(a,22);writeln;

writeln('Maksimal A=',m[1]);

writeln;

writeln ('Massiv P');