Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка по программироваю 2 семестр.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.26 Mб
Скачать

Отчет по лабораторной работе

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

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

1. Какие действия выполняются оператором перехода?

2. Зачем необходимо при отладке программы тестировать все ветви алгоритма?

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

4. Указать назначение и правила организации цикла.

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

6. Указать отличия в организации циклов с заданным числом повторении и итерационных.

7. Какие средства языка целесообразно использовать для организации циклов с заданным числом повторений?

8. Указать, какие операторы составляют тело цикла.

9 В чем состоят преимущества использования операторов цикла в программах?

Лабораторная работа № 3 Обработка одномерных и многомерных массивов

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

ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Объявление массива

Массив, как и любая переменная программы, перед использованием должен быть объявлен в разделе объявления переменных.

В общем виде инструкция объявления одномерного массива выглядит следующим образом:

Имя: array [нижний_индекс. .верхний_индекс] of тип

имя – имя массива;

array – зарезервированное слово языка Delphi, обозначающее, что объявляемое имя является именем массива;

нижний_индекс и верхний_индекс – целые константы, определяющие диапазон изменения индекса элементов массива и, неявно, количество элементов (размер) массива;

тип – тип элементов массива.

 

Пример:

temper:array[1..31] of real;

коef:array[0. .2] of integer;

name:array[1..30] of string[25];

В общем виде инструкция объявления двумерного массива выглядит так:

Имя: array[НижняяГраница1..ВерхняяГраница1, НижняяГраница2..ВерхняяГраница2] of Тип

Имя – имя массива;

array – слово языка Delphi, указывающее, что объявляемый элемент данных является массивом;

НижняяГраница1, ВерхняяГраница1, НижпяяГраница2, ВерхняяГраница2 – целые константы, определяющие диапазон изменения индексов и, следовательно, число элементов массива;

Тип – тип элементов массива.

 

Пример:

itog: array [1..12, 1..6] of integer

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

Пример:

const

NT = 18;

team: array[1..NT] of string[SN];

 

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

team [ 1] := 'Зенит';

d := koef[l]*koef[l]-4*koef[2]*koef[1];

ShowMessage(name[n+1]);

temper[i] := StrToFloat(Edit1.text);

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

Имя:array [нижний_индекс..верхний_индекс] of тип = (список);

список – разделенные запятыми значения элементов массива.

Пример:

a: array[10] of integer = (0,0,0,0,0,0,0,0,0,0);

Team: array[1..5] of String[10]=('Зенит','Динамо','Спартак','Ротор','СКА');

Операции с массивами

Ввод (вывод) массива

Под выводом массива понимается вывод на экран монитора (в диалоговое окно) значений элементов массива.

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

Пример:

const

NT = 5;

var

team: array[1..NT] of string[10] =('Зенит','Динамо','Ротор','Спартак','СКА'

procedure TForml.ButtonlClick(Sender: TObject);

var

st:string;

i:integer;

begin

for i:=l to NT do

st := st + IntToStr(i)+ ' '+ team[i] + #13;

end;

 

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

Любая обработка элементов массива также - в цикле, поэлементно.

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

Существует несколько способов объявления двумерного массива в Pascal.

Мы уже умеем описывать одномерные массивы, элементы которых могут иметь любой тип, а, следовательно, и сами элементы могут быть массивами. Рассмотрим следующее описание типов и переменных:

Пример описания двумерного массива

Type  Vector = array [1..5] of <тип_элементов>;  Matrix= array [1..10] of vector;  Var m: matrix;

Мы объявили двумерный массив m, состоящий из 10 строк, в каждой из которых 5 столбцов. При этом к каждой i -й строке можно обращаться m [ i ], а каждому j -му элементу внутри i -й строки – m [ i , j ].

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

Type  Matrix= array [1..5] of array [1..10] of < тип элементов >;  или еще проще:  type  matrix = array [1..5, 1..10] of <тип элементов>;

Обращение к элементам двумерного массива имеет вид: M [ i , j ]. Это означает, что мы хотим получить элемент, расположенный в i -й строке и j -м столбце. Тут главное не перепутать строки со столбцами, а то мы можем снова получить обращение к несуществующему элементу. Например, обращение к элементу M [10, 5] имеет правильную форму записи, но может вызвать ошибку в работе программы.

Основные действия с двумерными массивами Паскаля

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

type  matrix= array [1..5, 1..10] of integer;  var     a , b : matrix ;

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

Ввод двумерного массива.

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

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

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

type     matrix= array [1..5, 1..10] of integer;  var     a, : matrix;     i, j: integer; { индексы массива }  begin     for i :=1 to 5 do {цикл для перебора всех строк}        for j :=1 to 10 do {перебор всех элементов строки по столбцам}           readln ( a [ i , j ]); {ввод с клавиатуры элемента, стоящего в i -й строке и j -м столбце}

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

Вывод двумерного массива на экран.

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

Пример программы вывода двумерного массива

for i :=1 to 5 do {цикл для перебора всех строк}  begin     for j :=1 to 10 do {перебор всех элементов строки по столбцам}        write ( a [ i , j ]:4); {печать элементов, стоящих в i -й строке матрицы в одной экранной строке, при этом для вывода каждого элемента отводится 4 позиции}     writeln ; {прежде, чем сменить номер строки в матрице, нужно перевести курсор на начало новой экранной строки}  end ;

Динамические массивы.

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

Например

SetLength(dynArray,5);  устанавливает размер одномерного массива dynArray в 5 элементов. При этом будет распределена динамическая память под массив.  Все динамические массивы начинаются с индекса = 0

Далее обработка элементов динамического массива программируется также как для статического массива.

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

Задание для самостоятельной подготовки