Работа с одномерными массивами. Задача 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

Наши рекомендации