- •Программирование Методические указания по выполнению лабораторных работ (для студентов заочной формы обучения, обучающихся по направлению «Информатика и вт»)
- •Оглавление
- •1. Программа дисциплины
- •Требования к уровню освоения содержания дисциплины
- •Перечень лабораторных работ Таблица 2
- •Рекомендуемая литература
- •2. Методика выполнения лабораторных работ и задания к ним
- •2.1. Лабораторная работа 1. Разветвляющийся вычислительный процесс
- •2.1.1. Пример выполнения лабораторной работы
- •Р ис. 1. Блок-схема алгоритма
- •2.1.2. Варианты заданий к лабораторной работе
- •2.1.3. Контрольные вопросы и задания
- •2.2. Лабораторная работа 2. Циклический вычислительный процесс
- •2.2.1. Теоретические сведения, необходимые для выполнения работы
- •2.2.2 Варианты заданий к лабораторной работе
- •2.2.3. Контрольные вопросы и задания
- •2.3. Лабораторная работа 3. Работа с массивами и матрицами
- •2.3.1. Теоретические сведения, необходимые для выполнения работы
- •Объявление массива в Паскале.
- •Примеры работы с одномерными массивами
- •Работа с матрицами
- •2.3.2. Варианты заданий к лабораторной работе Задания на «Одномерные массивы»
- •Задания на «Матрицы»
- •2.3.3. Контрольные вопросы и задания
- •2.4. Лабораторная работа 4. Обработка текстовой информации
- •2.4.1. Теоретические сведения, необходимые для выполнения работы Тип данных String
- •Сравнение строк
- •Стандартные процедуры и функции для обработки строк
- •2.4.2. Задания к лабораторной работе Общая постановка задачи для всех вариантов
- •Индивидуальные задания на строки
- •2.4.3. Контрольные вопросы и задания
- •2.5. Лабораторная работа 5. Использование процедур и функций
- •2.5.1. Теоретические сведения, необходимые для выполнения работы Модульное программирование
- •Нисходящее проектирование
- •Общая структура подпрограммы
- •Процедуры и функции
- •Локальные и глобальные определения данных
- •Параметры подпрограмм
- •Программирование и отладка модульных программ
- •Пример применения модульного программирования
- •2.5.2. Задания к лабораторной работе
- •Индивидуальные задания на процедуры и функции
- •2.5.3. Контрольные вопросы и задания
- •Библиографический список
- •Приложение 1
- •Отчет о лабораторной работе № ___ (вариант №__)
- •«Программирование»
- •Иркутск 20__
Объявление массива в Паскале.
В языке Паскаль существует два способа описания типов: сокращенный и полный. Первый способ имеет место, когда тип переменной определяется при описании переменной в разделе VAR.
При использовании второго способа в разделе описаний типов отдельно описывается тип данных и определяется его имя. Описание типа с помощью TYPE используется, когда нет стандартного типа, например, типа массив. Полное описание массива имеет вид:
TYPE
Имя типа = array [тип индекса1, тип индекса2,.,тип индексаn] of
< тип элемента > ;
Тип индекса – имя порядкового типа или отрезок порядкового типа, то есть значениями индекса может быть интервал любого скалярного порядкового типа. Типом элементов может быть любой тип данных (скалярных или структурированных) за исключением файлового.
Пример описания массивов:
TYPE
vector = array [1..10] of real;
matric=array[1..5,1..4) of byte;
VAR
x :vector;
y :matric;
В результате этого описания в оперативной памяти будут выделены 60 байт под вектор x[10] и область длиной в 20 байт под матрицу y[5,4].
Доступ к отдельному элементу массива указывается с помощью имени массива и индексов. Обращение к элементу массива имеет вид:
имя массива [список индексов].
Количество индексов должно соответствовать числу измерений массива. Если число измерений массива больше 1, индексы указываются через запятую. Индекс может быть задан константой, переменной или выражением, значения которого должны лежать в интервале, определенном типом данного индекса. В памяти элементы массивов располагаются по возрастанию индексов, причем более правый индекс изменяется быстрее (в лексикографическом порядке).
Примеры работы с одномерными массивами
В
Рис. 5.
Цикл For
Пример 1. Демонстрация приемов ввода и вывода одномерного массива.
program nomer_1;
USES CRT;
TYPE
vector = array [1..100] of real;
VAR
X : vector;
N,i: integer; { N текущая длина массива от 1 до 100 }
BEGIN
{ 1. ВВОД МАССИВА }
Repeat
Write (' введите число элементов N от 1 до 100 ');
Readln (N);
until (N> =1) and (N < = 100);
Writeln('в массиве ', N', элементов');
for i = 1 to N do
begin
write('X[', i,'] =');
ReadLn(X[i]);
end;
WriteLn ('конец ввода');
Readln;
{ 2. ВЫВОД МАССИВА на ЭКРАН }
clrscr;
writeln(' Массив X[N] ');
for i:=1 to n do
write(x[i]:12:3);
writeln;
END.
Пример 2. Последовательный поиск компоненты вектора.
Заданы вектор A(n) целого типа и X. Если в векторе А есть элемент, равный Х, то переменной Х присвоить значение True, а переменной K присвоить индекс найденного элемента. В противном случае присвоить переменной P значение False.
В задачах поиска последовательный перебор элементов массива сочетается с проверкой некоторого условия, поэтому в программах использован оператор цикла итерационного типа Repeat.
Программа решения этой задачи методом простейшего линейного поиска приведена ниже. Поиск закончится при выполнении одного из двух условий: a[i]=x (искомый элемент найден) или i>n (все элементы отличаются от Х).
program lin_poisk;
const n=10;
TYPE
vector=array[1..n] of integer;
VAR
a:vector; { массив }
x:integer; { искомое значение }
p:boolean; { признак поиска }
i:integer; { параметр цикла и индекс найденного элемента }
BEGIN
I:=0;
Repeat
I:=i+1;
Until (i>n) or (a[i]=x);
If i>n then p:=false { не нашли } Else p:=true; {нашли a[i] = x }
If p then writeln('индекс найденного элемента ', i)
END.
Чтобы избежать многократной проверки условия и тем самым ускорить поиск (за счет дополнительной памяти), применяют следующий прием: в конец вектора А добавляется вспомогательный элемент, которому присваивается значение Х, что гарантирует выполнение условия a[i] = x.
program Uskor_poisk;
const n=10;
TYPE
vector=array[1..n+1] of integer;{ на один элемент больше }
VAR
a:vector; { массив }
x:integer;{искомое значение}
p:boolean; { признак поиска }
i:integer; { параметр цикла и индекс найденного элемента }
BEGIN
Writeln('ввод массива из ',N, ' чисел ');
For i:=1 to n do Readln(a[i]);
Write('Введите искомое значение:');readln(x);
A[n+1]:=x; { n+1 -й элемент равен X }
{ поиск }
I:=0;
Repeat
I:=i+1;
Until (a[i]=x);
If i>n then p:=false { не нашли }
Else p:=true; {нашли a[i]=x }
If p then writeln('индекс найденного элемента ',i)
END.
Пример 3. Часто встречаются задачи, решение которых требует форми-рования новых массивов из элементов исходных массивов. Пусть дан массив А[N] вещественных чисел, где N не больше 20. Положительные элементы массива нужно занести в массив В, а отрицательные возвести в квадрат и занести в массив С. Составим списки входных и выходных данных для данной задачи.
Дано: N – число элементов [1..20], массив А[1..N] of single.
Найти: массивы B и С, KB и KC – количество элементов в массивах В и C. (0 KC и KB N).
Ниже дается словесное описание алгоритма решения.
1. Ввод массива А из N элементов.
2. Положить количество элементов в новых массивах КВ = 0; KC = 0/
3. Цикл по i = 1, N, 1
3.1 Если а[i] < 0, то КС := КС + 1 и C[КС] := A[i] * A[i],
иначе КВ := KB + 1, B[KB] := A[i]
4. Вывод на экран элементов массива В.
5. Вывод на экран элементов массива С.
Текст программы:
program form_mas;
uses crt;
Type
Vector=array[1..20] of single;
Var
N:byte;
A,b,c:vector; { массивы предельно допустимого размера }
Kb,kc:byte;
Begin
Repeat
Write (' введите число элементов N от 1 до 20 ');
Readln (N);
Until (N> =1) and (N < = 20);
for i = 1 to N do
begin
write('A[', i,'] ='); ReadLn(A[i] ) ;
end;
WriteLn ('Массив А введен');
{ Формирование массивов B и C }
kc:=0; kb:=0;
For i:=1 to n do
If a[i]<0 then begin Kc:=kc+1; c[kc]:=a[i]*a[i] end
Else begin Kb:=kb+1; b[kb]:=a[i] end;
{ Вывод массивов B и C }
if kb=0 then writeln('В исходном массиве нет положительных элементов')
else begin
writeln('Массив В');
for i:=1 to kb do write(b[i]:8:3);
writeln;
end;
if kс=0 then writeln('В массиве A нет отрицательных элементов')
else begin
writeln('Массив С');
for i:=1 to kс do write(с[i]:8:3);
writeln;
end;
readln;
end.
Пример 4. Алгоритм поиска максимального элемента.
Текст соответствующей программы на Паскале:
program MAXM;
Uses CRT;
Const n=10;
TYPE
vector=array[1..n] of longint;
VAR
a:vector; { массив }
MAXD:longint; { наибольший элемент }
k:integer; { параметр цикла }
BEGIN
ClrScr; { опустим операторы ввода массива }
{ поиск максимума, вариант с оператором For }
X:=A[1]; { k:=2;x:=A[1]; }
For k:=2 to n do { repeat }
if X< A[k] then X=A[k];{ if x < A[k] then x:=A[k]; }
Writeln('max=',X); { k:=k+1; }
Readln { until k>n; }
end.
Рассмотрим задачу, решение которой является продолжением примера 4:
Максимальный элемент массива А[n] поменять местами с последним элементом. Пусть n=5 и массив a[1..5]={0, 7, - 2, 4, 6}
Обозначим max – наибольший элемент, k – его позиция в массиве. Решение задачи состоит из двух этапов:
найти max и его номер k;
поменять местами A[n] и A[k].
Программа имеет вид:
Program Obmen;
Const
n=5;
Var
a: array [1..n] of real;
i,k : byte
max: real;
Begin
{ пропустим операторы ввода массива }
max: = a[1];
K=1:
for i=2 to n do
if a [i] > max then
begin
max: = a[i]; K: = i; { индекс заносится в К}
end;
{ выполним перестановку элементов }
A[K]: = A[n]; A[n]: = max;
{ вывод массива А }
end.
Пример 5. Операция сдвига элементов массива и примеры применения.
Пусть в массиве А[20] заполнены первые К мест, где 1 <= K < 20.
а) Требуется ввести новое значение в поле переменной B и вставить его в начало массива.
Решение задачи будет состоять из двух этапов: сдвиг и вставка. Вначале сдвигаем массив А на 1 позицию вправо. «Формула» сдвига вправо запишется следующим оператором присвоения: A[i + 1] := A[i], где i меняется от k до 1 с шагом -1. После сдвига массива элемент A1 будет равен элементу A2, необходимо выполнить вставку значения B в первую позицию массива. На Паскале алгоритм запишется в виде:
for i := K downto 1 do
a[i + 1] := a[i];
A[1] := B; { после сдвига массива элемент a[1] получит значение в }
Если необходимо вставить новый элемент в позицию с некоторым номером J, где 0 < j < k + 1, то запись на Паскале будет следующей:
for i := K downto j do a[i + 1] := a[i];
a[j]:= b;
б) Пусть первые K элементов массива А[N] упорядочены по возрастанию (1 <= K < N). Вставить новый элемент в массив А, не нарушая его упоря-доченности.
Решение задачи состоит из трех этапов:
1. Поиск позиции J <= K в массиве, чтобы выполнилось условие A[J] > B. Просмотр элементов с начала массива.
2. Cдвиг вправо на 1 позицию части массива, начиная с элемента A[k] по элемент A[J].
3. Вставка нового элемента в позицию с номером J и увеличение K – длины отсортированной части массива на 1.
program Vstavka;
const n=15;
var
a:array[1..n] of real;
i,j,k:integer;
b:real;begin
{….. в массиве заполнены первые К позиций}
{Ввод значения В}
write('B=');readln(b);
{ Поиск J- места для вставки нового элемента }
{ Сдвиг вправо на 1 позицию }
j:=0;
repeat
j:=j+1;
until (j>k) or (a[j]> b);
for i:=k downto j do a[i+1]:=a[i];
{ Вставка } a[j]:=b;
{ увеличение K } k:=k+1;
end.
Правильность работы программы вставки можно проверить на следующих тестах:
N = 5, k = 3, A = (2,7,10)
a)B = 1
Промежуточные результаты: J = 1, после сдвига A = (2,2,7,10)
Результаты: k=4, A=(1,2,7,10).
2) B = 12
Промежуточные результаты: J = 4, k = 3, A = (2,7,10). Цикл по сдвигу не выполнится.
Результаты: k = 4, A = (1,2,7,12).
3)B = 6
Промежуточные результаты: J = 3, после сдвига A = (2,7,7,10)
Результаты: k = 4, A = (2,6,7,10).
Пример 6. Сортировка массива.
Дана последовательность чисел a1, a2, a3, ..., an и значение n. Переставить элементы этого вектора таким образом, чтобы они следовали в порядке возрастания, то есть удовлетворялось условие a1 a2 a3 ... an. Простейший обменный метод сортировки (или метод пузырька) заключается в том, что просматриваются пары соседних элементов. Если элементы расположены не по возрастанию, то они обмениваются местами. В результате просмотра максимальный элемент окажется на своем последнем месте, даже если он находился на первой позиции. Работа внешнего цикла управляется параметром Р. Параметр Р – признак упорядоченности: если элементы вектора упорядочены, параметр Р = 1, в противном случае Р = 0, то есть необходима перестановка соседних элементов. Количество повторений внешнего цикла заранее не определено и зависит от того, насколько упорядочен исходный вектор. Во внутреннем цикле происходит сравнение смежных пар элементов: если ai больше ai+1., то элементы меняются местами. Внутренний цикл выполняется N-1 раз, то есть это цикл арифметического типа. Параметром цикла является i – индекс элемента массива. Вектор считается упорядоченным в том случае, если за один последовательный просмотр всех его элементов не нарушилось условие ai <= ai+1 ни для одной пары элементов.
Текст программы :
Program Sort_pusirek;
{ Дано целое число N и массив A[1..N] чисел вещественного типа Переставить элементы A[i] таким образом, чтобы они следовали в порядке возрастания их значений. }
USES CRT;
CONST
n = 10;
TYPE
vector= array [1..N] of real;
VAR
A :vector;
p:integer; { признак перестановки элементов }
i:integer; { параметр цикла (индекс) }
s:real; { вспомогательная переменная }
BEGIN
ClrScr;
writeln('ввод данных ');
For i:=1 to N do
begin
write('A[',i,']=');
readln(A[i] )
end;
{ сортировка --- методом обмена }
p:=0; {массив Не упорядочен }
While p=0 do
begin
p:=1; { Предположим, массив уже упорядочен }
For i:=1 to n-1 do
if A[i]>A[i+1} then
begin {перестановка}
s:=A[i];
A[i]:=A[i+1];
A[i+1]:= s;
p:=0{ массив не был упорядочен }
end;
end; сортировка завершена ------------}
{ вывод массива }
clrscr;
writeln(' Массив A ');
for i:=1 to n do
write(A[i]:8:3);
writeln;
readln;
END.
Можно рекомендовать следующие контрольные примеры для тестирования: Массив A: а) упорядочен по возрастанию элементов; б) упорядочен по убыванию элементов. в) не упорядочен; г) состоит из равных элементов.
