Главная страница

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


Скачать 0.68 Mb.
НазваниеСборник методических указаний по выполнению практических работ по учебной дисциплине основы алгоритмизации и программирования структурное программирование
Анкорпрограммирование
Дата01.10.2021
Размер0.68 Mb.
Формат файлаpdf
Имя файлаm_prog.pdf
ТипСборник
#239861
страница3 из 6
1   2   3   4   5   6
ТЕМА: ОБРАБОТКА ОДНОМЕРНЫХ МАССИВОВ
Цель работы
Изучить принципы работы с одномерными массивами на языке программирования Pascal.
Получение навыков применения основных алгоритмов для решения задач с использованием массивов.
Оборудование: ПК, ИСР Pascal ABC
ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Нахождение суммы элементов массива
Задача 1. В автопарке, имеющем 18 машин марки КАМАЗ, каждый из КАМАЗов перевез за день определенный объем груза. Определить суммарный объем перевозок грузов за день. При решении задачи будем использовать тип массива KAMAZ для описания всех КАМАЗов автопарка; переменную P[i] для описания объема груза, перевезенного i-той машиной за день (I меняется от 1 до 18). Блок-схема алгоритма для решения данной задачи будет выглядеть следующим образом (см. Рис. 1): Текст следующий вид:

31
Program Pr1;
Uses wincrt;
Type KAMAZ=array [1..18] of real;
Var
i:integer; p:KAMAZ;
S:real;
Begin
S:=0;
For i:=1 to 18 do
Begin
Writeln(‘Введите объем перевозок’,I,‘-ой машины, т’);
Readln(p[i]);
S:=S+p[i]; End;
Writeln(‘Суммарный объем перевозок S=’,S:8:2,‘т’);
End.
Накопление суммы в данном примере будет проводиться по шагам, при вводе значения объема перевозок для очередной машины сумма будет увеличиваться на данную величину.
Аналогично реализуется и алгоритм нахождения произведения элементов массива (с заменой начального значения суммы S:=0 на начальное значение произведения S:=1 и с заменой операции сложения элементов массива «+» на операцию умножения «*»).

32
Нахождение количества элементов массива, удовлетворяющих заданному
условию
Задача 2. Известны результаты экзамена по информатике одной группы из 22 студентов.
Определить, сколько студентов сдали экзамен на 4 и 5. Один из вариантов решения этой задачи следующий:
На Рис. 2 представлена блок-схема алгоритма поставленной задачи.
Текст программы:
Program pr3;
Uses wincrt;
Label 1;
Type INF=array[1..22] of integer;
Var
stud:INF; i,p:integer;
begin
p:=0;
for i:=1 to 22 do
begin
1: writeln(‘Введите оценку ’,i,’-го студента’);
readln(stud[i]);
if (stud[i]<1) or (stud[i]>5) then goto 1;
if stud[i]>3 then p:=p+1; end;
writeln(‘На 4 и 5 сдали экзамен ’,p:2,’ студентов’);
end.
В данной программе для обозначения списка оценок по информатике использовался тип массива INF, для обозначения оценок конкретных студентов – переменная stud. Программа предусматривает проверку корректности вводимых данных: при попытке ввода несуществующей по пятибалльной системе оценки, программа повторяет ее ввод. Для этого используется оператор перехода GOTO, где имя метки, к которой осуществляется переход (в данном случае 1), описывается в разделе описания меток LABEL.
Рис. 2. Блок-схема программы

33
Сортировка массива по возрастанию
Задача 3. Предположим, известны результаты соревнований по стрельбе, в которых принимали участие 9 человек. Расположить данные результаты в порядке возрастания набранных при стрельбе очков. Алгоритм решения данной задачи является наиболее сложным из приведенных выше примеров и требует использования вложенных циклов.
Один из способов сортировки массивов заключается в следующем. Сначала первый элемент массива в цикле сравнивается по очереди со всеми оставшимися элементами.
Если очередной элемент массива меньше по величине, чем первый, то эти элементы переставляются местами. Сравнение продолжается далее уже для обновленного первого элемента. В результате окончания данного цикла будет найден и установлен на первое место самый наименьший элемент массива. Далее продолжается аналогичный процесс уже для оставшихся элементов массива, т.е. второй элемент сравнивается со всеми остальными и, при необходимости, переставляется с ними местами. После определения и установки второго элемента массива, данный процесс продолжается для третьего элемента, четвертого элемента и т.д. Алгоритм завершается, когда сравниваются и упорядочиваются предпоследний и последний из оставшихся элементов массива.
Блок-схема представлена на Рис. 3
Программа реализации изложенного алгоритма может иметь следующий вид:
Program pr4;
Uses crt;
Type STREL=array[1..9]of integer;
Var
rez:strel; i,j,s:integer;
Begin
For i:=1 to 9 do
begin
writeln(‘Введите результаты ’,i,’-го участника’);
readln(rez[i]);
end;
for i:=1 to 8 do
for j:=i+1 to 9 do
if rez[i]>rez[j] then
begin
s:=rez[j]; rez[j]:=rez[i]; rez[i]:=s; end;
writeln(‘Отсортированные по возрастанию результаты:’);
for i:=1 to 9 do write (rez[i]:5,’ ‘);
end.
Здесь STREL – тип массива результатов стрельбы участников, rez[i] – переменная для описания результатов i-го участника (i рис. 3. Блок-схема меняется от 1 до 9).

34
Вспомогательная переменная s используется для перестановки местами элементов массива.
ВАРИАНТЫ ЗАДАНИЙ
Исходные данные необходимо оформить в виде массива. При выполнении задания ввод исходных данных и вывод результатов сопровождать комментариями (какие данные нужно ввести и что получается в результате). Составить блок-схему программы. Оформить отчет
1.
Подсчитать среднемесячную зарплату сотрудника предприятия.
2.
Дан объем продукции, выпущенной заводом за год (помесячно). Найти наименьший объем. В качестве результата вывести номер месяца и объем выпущенной продукции.
3.
Курс доллара в течение года менялся в диапазоне от 28руб. до 30руб. Найти наибольшее значение курса доллара. В качестве результата вывести номер месяца и значение курса доллара.
4.
Известен месячный план выпуска некоторой продукции и объемы выпущенной этой продукции заводом за год (помесячно). Определить, когда завод не выполнил план.
Результат получить в виде: номер месяца и объем выпущенной продукции.
5.
Даны результаты сдачи экзамена по информатике группы студентов (в группе 20 студентов). Подсчитать количество студентов, не сдавших экзамен.
6.
Известна среднемесячная зарплата 10 сотрудников отдела. Расположить данные в порядке убывания.
7.
Известен годовой процент на вклад с капитализацией (начисление процентов ежемесячно). Определить, сколько денег получит вкладчик в конце года, если на 1 января сумма вклада составляла 1500руб. в качестве результата вывести сумму вклада на конец каждого месяца.
8.
Известны данные по продаже компьютеров в течение недели. Найти общее количество проданных компьютеров.
9.
Известны данные по продаже компьютеров в течение недели. Расположить эти данные в порядке возрастания.
10.
Известен месячный план выпуска некоторой продукции и объемы выпущенной продукции заводом за год (помесячно). Определить месяц, в котором было максимальное отклонение от плана. В качестве результата вывести номер месяца и отклонение.
11.
Известен месячный план выпуска некоторой продукции и объемы выпущенной продукции заводом за год (помесячно). Определить, был ли выполнен годовой план.
12.
Даны результаты сдачи экзамена по информатике группы студентов (в группе 20 студентов). Подсчитать количество студентов, сдавших экзамен без троек.
13.
Известен месячный план выпуска некоторой продукции и объемы выпущенной этой продукции заводом за год (помесячно). Определить, когда завод перевыполнил план.
Результат получить в виде: номер месяца и объем продукции, выпущенной сверх плана.
14.
Подсчитать среднемесячную зарплату сотрудника предприятия и найти зарплату, которая наиболее близка к средней. В качестве результата вывести среднюю зарплату, наиболее близкую и ее номер в массиве.
15.
Даны результаты сдачи экзамена по информатике группы из 15 студентов.
Подсчитать количество студентов, не сдавших экзамен, в численном и в процентном соотношении.

35
ПРАКТИЧЕСКАЯ РАБОТА 8
ТЕМА: ОБРАБОТКА МНОГОМЕРНЫХ МАССИВОВ
Цель работы:
Изучить принципы работы с многомерными массивами на языке программирования Pascal.
Получение навыков применения основных алгоритмов для решения задач с использованием массивов.
Оборудование: ПК, ИСР Pascal ABC
ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Исходные данные для решения многих задач удобно представить в виде таблицы.
Например, результат производственной деятельности заводов некоторой фирмы можно представить в виде таблицы (см.Таблица 1)
Колонки и строки таблицы, как правило, содержат однородную информацию, если использовать терминологию Pascal – данные одинакового типа. Поэтому в программе для хранения и обработки табличных данных можно использовать совокупность одномерных массивов. Так, приведенная выше таблица может быть представлена как совокупность одномерных массивов следующим образом:
Zavod1:array[1..4] of integer;
Zavod2:array[1..4] of integer;
Zavod3:array[1..4] of integer;
Каждый из приведенных массивов может хранить информацию о количестве продукции, выпущенной одним заводом.
Возможно и такое представление: product1:array[1..3] of integer; product2:array[1..3] of integer; product3:array[1..3] of integer; product4:array[1..3] of integer;
Таблица 1
Продукт1 Продукт2 Продукт3
Продукт4
Завод1 1500 14000 15 125
Завод2 1380 15600 25 140
Завод3 2500 13000 8
165
В этом случае массив предназначен для хранения информации о количестве продукции одного наименования, произведенной каждым заводом. Помимо совокупности одномерных массивов, таблица может быть представлена как двумерный массив. В общем виде описание двумерного массива выглядит следующим образом:
Имя:array[нижняя_граница_индекса1..верхняя_граница_индекса1,нижняя_граница_индекса
2..верхняя_граница_индекса2] of тип
где Имя – имя массива;
array – ключевое слово, показывающее, что объявляемый элемент данных является массивом;

36
нижняя_граница_индекса1,
верхняя_граница_индекса1,
нижняя_граница_индекса2,
верхняя_граница_индекса2 – целые константы, определяющие диапазоны изменения индексов и, следовательно, число элементов массива;
тип – тип элементов массива.
Приведенная выше таблица (см. Таблица 1) может быть представлена в виде двумерного массива следующим образом:
Product:array[1..3,1..4] of integer;
Чтобы использовать элемент массива, нужно указать имя массива и индексы элемента. Первый индекс обычно соответствует номеру строки таблицы, второй – номеру колонки. Так, элемент product[2,3] содержит число продуктов третьего наименования, выпущенных вторым заводом.
Двумерные массивы, в которых диапазоны индексов начинаются с 1, также называются иногда матрицами. Размерность матрицы определяется как M*N, где M – число строк в матрице, N – число столбцов. Если число строк матрицы равняется числу столбцов, то матрицы такого вида называются квадратными.
Элементы квадратной матрицы вида B[1,1], B[2,2]< B[3,3] составляют главную диагональ матрицы. Иногда вводят понятие побочной диагонали квадратной матрицы, которую составляют элементы B[1,N], B[2,N-1], B[3,N-2], .. B[N,1], где N – число строк
(столбцов) матрицы.
Приведем еще примеры описания двумерных массивов в Pascal-программах:
Type MATR=array[1..4,1..5] of integer;
Type B= array[2..9,0..6] of real;
Type C= array[-1..4,-1..4] of char.
Также допускается указание имени другого типа массива в качестве типа элементов массива, например:
Type VEC= array[1..4] of real;
MAS= array[1..5] of vec.
В результате приведенного выше описания тип массива MAS будет объявлен как тип двумерного массива, первый индекс которого будет меняться от 1 до 5, а второй индекс – от
1 до 4, т.е. размерность массива составит 5*4 элементов.
При вводе и выводе значений элементов двумерных массивов используются вложенные циклы, в которых внешний оператор цикла, как правило, задает изменение строк массива, внутренний оператор цикла – изменение столбцов.
ПРИМЕРЫ ЗАДАЧ
1.
Нахождение наибольшего элемента в заданной строке.

37
Рис. 1. Блок-схема программы
Пусть задана матрица А из действительных чисел размера 3х4. Найти наибольший элемент во второй строке данной матрицы. Блок-схема алгоритма решения данной задачи представлена на
Рис. 1
Program Max_str;
Uses crt;
Type Matr=array[1..3,1..4] of real;
Var max:real; a:Matr; i,j:integer;
begin
for i:=1 to 3 do
for j:=1 to 4 do
begin
writeln(‘Введите элемент а[‘,i,’,’,j,’]’);
readln(a[i,j]);
end; max:=a[2,1];
for j:=2 to 4 do
if maxthen max:=a[2,j];
writeln(‘Наибольший элемент второй строки=’,max:8:2);
end.
Данная программа представляет собой реализацию алгоритма нахождения наибольшего элемента вектора, полученного путем фиксирования одного из индексов двумерного массива.

38
2. Нахождение элементов массива, удовлетворяющих заданному
условию.
Известны результаты 5 студентов по итогам экзаменов по химии и информатике. Найти фамилии студентов, сдавших оба экзамена на отлично. Для решения поставленной задачи может быть использована следующая программа (ее блок-схема представлена на рис. 2.
Рис. 2. Блок-схема программы
Program Sessia;
type PR=array [1..5,1..2]of integer;
Fam=array[1..5]of string[10];
var r:pr; st:fam; i,j:integer;
begin
for i:=1 to 5 do
begin
writeln('Введите фамилию ',i,'-го студента');
readln(st[i]);
writeln('Введите оценку данного студента по химии (от 2 до 5)');
readln(r[i,1]);
writeln('Введите оценку данного студента по информатике (от 2 до 5)');
readln(r[i,2]);
end;
for i:=1 to 5 do
if (r[i,1]=5) and (r[i,2]=5) then
writeln('Студент-отличник - ',st[i]);
end.
В данной программе для хранения фамилий студентов используется одномерный строковый массив st типа Fam, для хранения оценок студентов – двумерный целочисленный массив r типа PR, причем первый столбец матрицы r используется для хранения результатов экзамена по химии, второй столбец – экзамена по информатике. Если у некоторого студента оценки за оба экзамена составили 5 баллов, то его фамилия будет выведена на экран с сообщением «Студент- отличник».

39
3. Нахождение
сумм элементов строк матриц
Рассмотрим задачу нахождения сумм элементов строк матрицы на примере задачи подсчета итогов футбольного чемпионата. Пусть задана таблица результатов игр 5 команд футбольного чемпионата размером 5х5. На диагонали таблицы стоят значения 0, другие элементы таблицы равны 0, 1 или 2, где 0 баллов соответствует проигрышу команды в игре,
1 балл – ничьей, 2 балла – выигрышу. Определить сумму баллов каждой команды по результатам чемпионата.
Легко заметить, что для построения матрицы R результатов игр достаточно ввести лишь стоящую выше (или ниже) главной диагонали половину матрицы, т.к. результаты остальных игр могут быть рассчитаны из известного соотношения: если, например, первая команда обыграла вторую, то элемент R[1,2]=2, а элемент R[2,1]=2-R[1,2]=0; аналогично, если вторая команда сыграла в ничью с третьей, то R[2,3]=1, R[3,2]=2-R[2,3]=1. Таким образом, нетрудно получить вид взаимосвязи элементов матрицы: R[i,j]+R[j,i]=2, где i и j меняются от 1 до 5 (кроме элементов главной диагонали). На главной диагонали матрицы R по условию задачи всегда стоят числа 0.
Program foot;
Type tab=array[1..5,1..5] of integer;
Var r:tab; i,j,s:integer;
begin
{ввод стоящих выше диагонали элементов матрицы}
for i:=1 to 4 do
for j:=i+1 to 5 do
begin
writeln (‘Введите результат игры ‘,i,’–й команды с ’,j,’ –й: 0, 1 или 2 балла’);
readln(r[i,j]);
end;
{заполнение стоящих на диагонали элементов нулями}
for i:=1 to 5 do r[i,i]:=0;
{вычисление стоящих ниже диагонали элементов матрицы}
for i:=2 to 5 do
for j:=1 to i-1 do r[i,j]:=2-r[j,i];
{вывод на экран матрицы результатов игр}
writeln(‘Таблица чемпионата’);
for i:=1 to 5 do
begin
for j:=1 to 5 do write(r[i,j]:4);
writeln;
end;
{вычисление сумм элементов строк матрицы}
for i:=1 to 5 do
begin
s:=0;
for j:=1 to 5 do s:=s+r[i,j];
writeln(i,‘-ая команда набрала ’,s:3,’ очков’);
end;
end.

40
ЗАДАНИЯ
Исходные данные необходимо оформить в виде двумерного массива, в части заданий использовать дополнительно и одномерные массивы. При выполнении задания ввод исходных данных и вывод результатов сопровождать комментариями (какие данные нужно ввести и что получается в результате).
1.
Известен план выпуска компьютеров и количество выпущенных компьютеров тремя фирмами за шесть месяцев. Определить для каждой фирмы, был ли выполнен план по итогам шести месяцев.
2.
Известно количество сделанных столов тремя фабриками за два квартала. Определить максимальное количество выпущенных столов. В качестве результата вывести месяц, в котором это было, и название фабрики.
3.
Известен план выпуска компьютеров и количество выпущенных компьютеров тремя фирмами за три месяца. Определить, в каком месяце не был выполнен план третьей фирмой.
4.
Известен план выпуска компьютеров и количество выпущенных компьютеров тремя фирмами за шесть месяцев. Определить для каждой фирмы количество месяцев, когда план был перевыполнен.
5.
Известна заработная плата, полученная 5 сотрудниками отдела в течение года. Определить максимальную заработную плату. В качестве результата вывести фамилию и размер заработной платы.
6.
Известно количество выпущенной продукции тремя заводами за первый квартал
(помесячно). Найти среднемесячное количество выпущенной продукции для каждого завода.
7.
Известно количество выпущенной продукции тремя заводами за первый квартал
(помесячно). Найти среднемесячное количество выпущенной продукции по всем заводам.
8.
Известны результаты сдачи трех экзаменов пятью студентами. Найти фамилии студентов, не сдавших оба экзамена.
9.
Известно количество сделанных столов тремя фабриками за два квартала. Определить, какая фабрика выпустила максимальное количество столов по итогам шести месяцев.
10.
Известна заработная плата, полученная 10 сотрудниками отдела в течение года. Определить среднемесячную зарплату по отделу.
11.
Известны результаты сдачи двух экзаменов семью студентами. Найти фамилии студентов, не сдавших хотя бы один экзамен.
12.
Известно количество сделанных столов тремя фабриками за два квартала. Определить, какая фабрика выпустила минимальное количество столов по итогам первых трех месяцев.
13.
Известны результаты сдачи трех экзаменов десятью студентами. Найти средний балл каждого студента и общий средний балл. Точность среднего балла – два знака после запятой.
14.
Известно количество сделанных столов тремя фабриками за два квартала. Определить, какая фабрика выпустила максимальное количество столов по итогам второго квартала.
15.
Известны результаты сдачи двух экзаменов десятью студентами. Определить фамилии студентов, сдавших экзамены без троек.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1.
Что понимают под массивом данных?
2.
Что называют размерностью массива?
3.
Что понимают под индексом элемента массива?
4.
Какой массив называется одномерным?

41 5.
Приведите примеры одномерных массивов.
6.
Как описываются одномерные массивы на языке PASCAL?
7.
Как задается диапазон изменения индексов массива?
8.
Как обозначаются индексы массивов на языке PASCAL?
9.
Какие стандартные алгоритмы по работе с одномерными массивами Вы
10.
знаете?
11.
Поясните понятия двумерного массива, матрицы.
12.
Что обозначают индексы матрицы?
13.
Сколько элементов в матрице из 7 строк и 9 столбцов?
14.
Дайте понятие квадратной матрицы, диагоналей квадратной матрицы.
15.
Приведите пример описания двумерных массивов на языке PASCAL.
16.
Поясните порядок использования вложенных циклов при вводе элементов
17.
двумерного массива.

42
ПРАКТИЧЕСКАЯ РАБОТА 9
1   2   3   4   5   6


написать администратору сайта