Работа с одномерными массивами. Задача 4. Составить программу сложения двух векторов.
Задача 4. Составить программу сложения двух векторов.
Вектор в программе может быть представлен в виде одномерного массива. Пусть заданы два одномерных массива а и b, состоящие из n элементов (рис. 5). В результате сложения двух векторов получается массив такого же размера, каждый элемент которого равен сi = ai+ bi. В программе должны быть организованы циклы для ввода одномерного массива а, для ввода одномерного массива b, для расчета каждого элемента результирующего массива с и для вывода результата расчета.
Программа:
program slogen;
{Сложение 2-х одномерных массивов}
uses crt;
const n = 10;
var
i,sum : integer;
a,b,c : array [ 1.. n ] of integer;
begin
clrscr;
gotoxy(3,1);
write(‘Введите массив а’);
for i := 1 to n do {Ввод массива аi}
begin
gotoxy(1+5*i,2);
readln(a [i])
end;
gotoxy(3,3);
write(‘Введите массив b’);
for i := 1 to n do {Ввод массива bi}
begin
gotoxy(1+5*i,4);
readln(b [i])
end;
for i := 1 to n do c[i] := a[i] + b[i]; {Расчет элементов массива сi}
gotoxy(3,9);
writeln(‘Суммарный вектор’);
for i := 1 to n do {Вывод массива сi}
begin
gotoxy(1+5*i,10);
write(c[i])
end
end.
Одномерные массивы a, b, c описаны в разделе описания переменных. Для обращения к каждому элементу массива использовался оператор цикла с параметром i , где i – пробегает все значения от 1 до n, определяя тем самым каждый элемент массива. Процедуры clrscr и gotoxy (i,k) описаны в модуле crt, поэтому за заголовком программы следует uses – фраза. Clrscr – процедура гашения экрана. Процедура gotoxy (i,k) перемещает курсор в i-тую позицию k-той строки экрана. Параметры процедуры, i и k – величины типа integer. В этой программе процедура gotoxy (i,k) используется для наглядного ввода и вывода массивов. Элементы массива a и b: a[1], a[2], a[3], a[4], ... , a[10] и b[1], b[2], b[3], b[4], ... , b[10], вводятся в позициях 6, 11, 16, 21, ... , 51 строк 2 и 3 соответственно. Результат – массив с – выводится в позициях 6, 11, 16, 21, ... , 51 строки 10.
Задача 5. Определить, содержит ли заданный массив число, равное s.
Необходимо разработать программу, которая обеспечит ввод с клавиатуры десяти чисел и сохранит их в некотором одномерном массиве. Затем программа должна запросить у пользователя ввод еще одного числа. После ввода данного числа программа осуществит проверку элементов массива на наличие в них числа, равного введенному, и, если такое есть, выдаст соответствующее сообщение на экран. То есть пользователь получит информацию о том, содержится ли последнее введенное число в массиве.
Детализировать ввод одномерного массива и ввод заданного числа s в схеме алгоритма (рис. 6) нет необходимости.
Программа:
program poisk;
{Последовательный поиск}
{в массиве}
const n = 10;
var
i,s,r : integer;
a : array [ 1.. n ] of integer;
begin
for i := 1 to n do
{Ввод одномерного массива а}
begin
write(‘Введите ‘,i,’-й элемент массива ‘);
readln(a [i])
end;
write(‘Введите число для поиска’);
readln(s);
for i := 1 to n do
begin
if a[i] = s then
begin
r := r + 1;
writeln(‘Обнаружено ’,r,‘-е вхождение числа ’,s,
‘ в массив а в позиции ’,i);
end;
end;
if r <> 0
then writeln(‘Число ‘,s,’ встречается в массиве а ‘,r,’ раз’)
else writeln(‘Число ‘,s,’ не встречается в массиве а’)
end.
Перед оператором ввода readln(a[i]) выполняется оператор вывода write(‘Введите ‘,i,’–й элемент массива ‘), который представляет собой подсказку для пользователя при вводе исходной информации. При i = 1 на экране высветится:
Введите 1–й элемент массива,
маркер остановится в конце выведенной строки, ЭВМ приостановит выполнение программы до момента ввода пользователем численной информации.
При i = 2 на экране высветится информация:
Введите 2–й элемент массива,
и так далее до конца выполнения цикла.
Задача 6. Найти минимальный и максимальный члены последовательности а, состоящей из 10 элементов.
Присвоим переменным min и max значение первого элемента и далее будем перебирать все элементы последовательности от 2 до n, сравнивая aic max и c min (рис. 7). Если аiокажется больше, чем max, то max присваивается значение аi. Если аiокажется меньше, чем min, то min присваивается значение аi. По окончании цикла max примет значение наибольшего элемента последовательности, а min – наименьшего.
Программа:
program minmax;
{Поиск минимального и максимального элемента}
const n = 10;
type
list = 1..n;
var
i : list;
min, max : integer;
a : array [list] of integer;
begin
for i := 1 to n do
begin
write(‘Введите ‘,i,’–й элемент массива ‘);
readln(a [i])
end;
min := a[1]; max := min;
for i:= 2 to n do
begin
if a[i] > max then max := a[i];
if a[i] < min then min := a[i];
end;
write (‘Максимальный элемент = ‘, max, ‘ Минимальный элемент = ‘,min)
end.
В программе показано, что заданная в разделе описания типов переменная list может быть использована в качестве граничной пары в описании массива.
Задача 7. Все члены последовательности х из 10 элементов сдвинуть на одну позицию вправо.
Фрагмент схемы (рис. 8) демонстрирует алгоритм смещения элементов массива на одну позицию вправо. Каждому последующему элементу хiприсваивается значение предыдущего хi–1. Для х1такого значения не существует, следовательно, х1= 0.
Программа:
program sdvig;
{Сдвиг массива на одну позицию вправо}
const n = 10;
type
mass = array [1 .. n] of integer; {Определение массивового типа}
var
i : integer;
x : mass;
begin
for i := 1 to n do
begin
write(‘Введите ‘,i,’–й элемент массива ‘);
readln(x[i])
end;
for i:= n downto 2 do x[i] := x[i–1]; x[1] := 0;
writeln(‘Результат’);
for i:= 1 to n do write(x[i] :4);
end.
В программе определен новый тип данных – массивовый, состоящий из десяти компонент целого типа.
Задача 8. Составить программу упорядочивания элементов массива х, состоящего из nd элементов, расположив их в порядке возрастания в том же массиве.
Упорядочивание элементов массива по возрастанию можно выполнить, используя прием нахождения наименьшего элемента. В исходной последовательности найдем наименьший элемент и запомним его порядковый номер к. Элемент х1поменяем местами с элементом хk. После этого наименьший элемент окажется на первом месте. Такую же процедуру необходимо проделать с оставшимися элементами от 2 до nd. В этом случае наименьший элемент хkнужно поменять местами со вторым элементом. На втором месте окажется второй по величине элемент. Процедуру поиска наименьшего элемента нужно повторить nd–1 раз. Последний элемент сам с собой можно не сравнивать. В алгоритм поиска минимального элемента вводим блок для запоминания порядкового номера этого элемента. Такой метод упорядочивания элементов массива называют методом перестановок.
Приведем схему алгоритма решения этой задачи полностью (рис. 9).
Блок 2 – ввод размера массива; блоки 3, 4, 5 – ввод одномерного массива. Блок 6 – цикл для определения порядкового номера элемента, с которого начинается поиск минимального. Блок 7 – начальные значения для xmin и k. xmin – переменная для элемента, имеющего наименьшее значение, к – переменная для порядкового номера этого элемента. Блоки 8, 9, 10 – алгоритм поиска минимального элемента последовательности. Блок 11 – перестановка минимального и i – го (с которого начинали поиск) элементов. Блоки 12, 13 – вывод упорядоченной последовательности.
Программа:
program perestan;
{Упорядочивание элементов массива методом перестановок}
const nmax = 100;
type
mass = array [1 .. nmax] of real;
var
i, j, k, nd : integer;
xmin : real;
x : mass;
begin
read(nd);
for i := 1 to nd do
begin
write(‘Введите ‘,i,’–й
элемент массива ‘);
readln(x[i])
end;
for i := 1 to nd – 1 do
begin
xmin := x[i]; k := i;
for j := i+1 to nd do
if x[j] < xmin then
begin
xmin := x[j];
k := j
end;
x[k] := x[i];
x[i] := xmin
end;
for i:= 1 to nd do write(x[i]:8:2)
end.
В программе под массив х отводится 100 ячеек памяти. Очевидно, что переменная nd не может быть больше 100. Хорошо было бы дополнить программу проверкой nd при вводе. Если введено значение nd большее 100, дать соответствующее сообщение и вернуться на начало ввода.
Задача 9. Составить программу упорядочивания элементов массива х, состоящего из nd элементов, расположив их в порядке возрастания в том же массиве. Использовать пузырьковый метод.
Сортировка множества данных является одной из центральных проблем обработки данных. Задачу упорядочивания элементов массива можно решать разными способами. Пузырьковый метод заключается в том, что последовательно сравниваются между собой два соседних элемента и меняются местами, если хj-1> xj.
Программа:
program puzirok;
{Упорядочивание элементов массива методом сравнения двух
соседних элементов}
const nmax = 100;
type
mass = array [1 .. nmax] of real;
var
i, j, nd : integer;
y : real;
x : mass;
begin
read(nd);
for i := 1 to nd do
begin
write(‘Введите ‘,i,’–й элемент массива ‘);
readln(x[i])
end;
for i := 2 to nd do
begin
for j := nd downto i do
if x[j – 1] > x[j] then
begin
y := x[j – 1];
x[j – 1] := x[j];
x[j] := y
end;
end;
for i:= 1 to nd do write(x[i]:8:2)
end.
При каждом значении i наименьший элемент перемещается к i – 1 позиции в массиве.
Задача 10. Представить в виде диаграммы итоги деятельности четырех агентов фирмы по сбыту n-ой продукции.
Простую диаграмму можно построить, используя средства псевдографики. Для хранения значений объемов сбыта продукции четырех агентов выделим массив из 4–х элементов cap. Тогда cap – объем сбыта i–го агента. Эта исходная информация должна вводиться с клавиатуры. Общий объем сбыта num = capi. Объем сбыта в процентах от общей суммы необходимо представить в виде столбиковой диаграммы, изобразив столбцы, соответствующие каждому агенту, своим особым символом псевдографики, например ASCII-кодами 176, 177, 178 и 218 (это прямоугольники разной степени яркости). Если n – это процентный вклад i-го агента в общий объем сбыта продукции, то символ псевдографики, соответствующий i–му агенту graph(i) должен выводиться на экран n раз.
for j := 1 to n do write (graph(i)).
В виде схемы (рис. 10) представим фрагмент алгоритма – вывод диаграммы на экран.
i – порядковый номер агента.
Вывод cap – вывод численного значения объема сбыта i –го агента.
Функция trunc дает целую часть аргумента. Аргументом является объем сбыта, умноженный на 0.79. Коэффициент 0.79 вводится для учета того обстоятельства, что в строке экрана монитора могут поместиться 79 символов. Превышение предельного значения приводит к автоматическому переводу курсора на следующую строку и к искажению графика. Такая ситуация может произойти в том случае, когда на одного агента приходится более 80% объема сбыта.
Программа:
program grafik;
uses crt;
const
graph : array[1..4] of char =
(#176,#177,#178,#219);
{Типизированные константы символов
для столбцовых диаграмм}
var
cap :array[1..4] of real; {Объем сбыта}
flag : char;
num : real;
i,j,n : integer;
begin
repeat
clrscr; num := 0;
for i := 1 to 4 do cap[i] := 0;
for i := 1 to 4 do
begin
writeln(‘Введите сведения об объеме сбыта ‘,i,’–го агента’);
readln(cap[i]);
num := num + cap[i]
end;
for i := 1 to 4 do cap[i] := cap[i]/num *100;
clrscr;
writeln(‘Объем сбыта агентов в процентах от общего объема’);
writeln(‘Общий объем сбыта ‘,num:12:1,’ руб.’);
for i := 1 to 4 do
begin
writeln(‘Агент ‘,i,’ ‘,cap[i]:5:2,’%’);
n := trunc(cap[i]*0.79);
for j := 1 to n do write(graph[i]);
writeln;
writeln
end;
write(‘Для окончания расчетов нажмите n’);
flag := upcase(readkey);
until (flag = ‘N’);
end.
Все действия в программе выполняются в цикле, организованном с помощью оператора цикла с постусловием repeat ... until. Цикл выполняется до тех пор, пока переменная символьного типа flag станет равной N. Для ввода значения переменной flag используется функция readkey, которая считывает один символ из буфера. Введенный символ на экране не высвечивается. Функция readkey находится в модуле crt, потому в описательную часть программы включена uses-фраза. Функция upcase преобразует строчные символы в прописные.
Так как расчеты могут повторяться многократно, необходимо в начале каждого расчета производить инициализацию переменных
num := 0; for i:= 1 to 4 do cap[i] := 0;
Напомним, что оператор write при выполнении программы оставляет маркер на строке вывода. Оператор writeln переводит маркер на следующую строку.
В этой программе объявляется типизированная константа graph типа array of char, представляющая собой массив символов псевдографики для наглядного вывода диаграмм
Экран вывода представлен на рис. 11.
Рис. 11