Программирование с использованием массивов




 

Цель: научиться правильно описывать различные массивы, уметь инициализировать массивы, распечатывать содержимое массива; научится решать задачи на использование массивов.

Общие сведения:

Массив - это структурированный тип данных, который используется для описания упорядоченной совокупности фиксированного числа элементов одного типа, имеющих общее имя. Для обозначения элементов массива используются имя переменной-массива и индекс.

Перед выполнением работы необходимо изучить правила описания и использования переменных типа массив, типизированных констант типа массив.

Примеры:

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

Этапы решения задачи:

1. Суть одного из алгоритмов решения данной задачи состоит в том чтобы "просматривать" массив построчно и находить в каждой строке пару (0:число), а затем менять их местами между собой и так до тех пор, пока в строке таких пар не окажется.

2. Напишем программу на псевдо паскале:

program example1;

var

V:array[1..100,1..100] of integer;

m,n, i,j, c: integer;

flag: boolean;

begin

<ввод размерности массива m*n>

<заполнениеячеекмассива>

for i:=1 to m do

repeat

flag:= true;

for j:=1 to n-1 do

if (v[i,j]=0) and (v[i,j+1]<>0) then begin

<поменять их местами>

flag:= false;

end;

untilflag;

<Печатьмассива>

readln;

end.

 

3.Составим блок схему алгоритма

 


 

Детализируем блок

"Упорядочиваем 1-ю строку"

 

 

 

Блок схема алгоритма целиком:

 

 


 

4.Приведем программу на языке Паскаль:

program example1;

var

V:array[1..100,1..100] of integer;

m,n, i,j, c: integer;

flag: boolean;

begin

write('Введитеразмерностьмассиваm-n> '); readln(m,n);

for i:= 1 to m do

for j:= 1 to n do begin

write('V[',i,',',j,']= '); readln(V[i,j]);

end;

for i:=1 to m do

repeat

flag:= true;

for j:=1 to n-1 do

if (v[i,j]=0) and (v[i,j+1]<>0) then begin

c:=v[i,j]; v[i,j]:=v[i,j+1]; v[i,j+1]:=c;

flag:= false;

end;

until flag;

for i:= 1 to m do begin

for j:= 1 to n do write(V[i,j]:2);

writeln

end;

readln;

end.

 

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

1. Каким образом определяются переменные типа массив (одномерный и двумерный)?

2. Как осуществляется доступ к отдельному элементу одномерного и двумерного массива?

3. Каким образом выводятся элементы массива на экран?

4. Приведите пример фрагмента программы, который выводит на экран двумерный массив в виде матрицы.

5. Сколько чисел можно записать в шестимерный массив X:Array[0..1, 0..1, 0..1, 0..1, 0..1, 0..1] ofInteger?

 

Задачи

 

1. Даны целые числа а1, а2, а3 а4. Получить целочисленную матрицу Bij, где i,j=1…4 для которой bij=ai-3aj.

2. Получить Aij, где i=1…10, j=1…12 - целочисленную матрицу, для которой aij=i+2j.

3. Дана действительная квадратная матрица порядка n. Найти наибольшее из значений элементов, расположенных в заштрихованной части матрицы.

4. Дана действительная квадратная матрица порядка n. Найти наибольшее из значений элементов, расположенных в заштрихованной части матрицы.

 

5. Дана действительная квадратная матрица порядка n. Найти наибольшее из значений элементов, расположенных в заштрихованной части матрицы.

6. Дана действительная квадратная матрица порядка n. Найти наибольшее из значений элементов, расположенных в заштрихованной части матрицы.

7. Дана квадратная вещественная матрица размерности n. Найти количество нулевых элементов, стоящих: выше главной диагонали; ниже главной диагонали.

8. Дана вещественная матрица размерности n * m. Сформировать вектор b размерности n, в котором элементы вычисляются как произведение элементов соответствующих строк.

9. Дан двухмерный массив A[1..m,1..n]. Написать программу построения одномерного массива B[1..m], элементы которого равны минимальным элементам строк

10. Дана квадратная вещественная матрица размерности n. Сформировать вектор b размерности n, в котором элементы вычисляются как сумма элементов соответствующих столбцов.

Теория: массивы

Массив - упорядоченные данные одного типа. Возможно создание массива, включающего массив другого типа. Массивом часто обозначают характеристики обьектов одного типа, имеющих одинаковые единицы измерения. Массив состоит из элементов, имеющих порядковые номера, т. е. элементы массива упорядочены. Таким образом, если обьекты одного типа обозначить именем, например "A", то элементы обьекта будут A[1], A[2] и т. д. В квадратных скобках указан номер элемента. Порядковый номер элемента массива, обычно не несет никакой информации о значении элемента, а показывает расположение элемента среди других. К элементам массива можно обращаться только по их номеру (индексу). Значения элементам массива присваиваются также как и другим переменным с учетом типа массива. Если элементы массива имеют один индекс, то массив называется одномерным или линейным, либо массив - вектор. Значения элементов одномерного массива обычно выводят на экран или бумагу в виде столбца или строки. В некоторых случаях удобно элементы массива пронумеровывать двуми независимыми индексами, такие массивы называются двумерными или матрицами. Значения элементов двумерного массива обычно выводят на экран в виде таблицы. Если элементы массива имеют три независимых индекса, то массив называется трехмерным. Значения элементов трехмерного массива обычно выводят на экран в виде набора таблиц.

Линейные массивы

Линейным массивом можно обозначить, например, оценки учеников класса. Каждая оценка является значением элемента массива оценок "A" и имеет порядковый номер (индекс). В Турбо-Паскале значение индекса указывается в квадратных скобках после имени массива. Можно создать массив фамилий "S" учеников класса. Значением элемента массива будет фамилия ученика, а индексом - порядковый номер по списку. Пусть дан список фамилий учеников и их оценки:

Фамилии Оценки
  Иванов  
  Петров  
  Сидоров  
  Титов  
... ... ...
  Якупов  


Описание массивов:

VarA: array[1..30] of byte;S: array[1..30] of string; {или}SO: array[1..30] ofstring[12];

Присвоение значений элементам массива:

"A" - A[1]:= 5; A[2]:= 4; ит. д. "S " - S[1]:= 'Иванов'; S[2]:= 'Петров'; ит. д.

Приведем таблицу обозначений и соответствия элементам массива, их значений и индексов:

Номер элемента индекса            
Элементы массива "S" S[ 1 ] S[ 2 ] S[ 3 ] S[ 4 ] S[ i ] S[ 30 ]
Значения элементов Иванов Петров Сидоров Титов ... Якупов
Элементы массива "A" A[ 1 ] A[ 2 ] A[ 3 ] A[ 4 ] A[ i ] A[ 30 ]
Значения элементов         ...  

 

Если известна зависимость, по которой изменяются значения элементов массива, то присвоение значений удобно проводить в операторах цикла c параметром или с условием. Например, присвоим значения элементам массива "y" по зависимости: y=sin(x), где x= Pi * i/180, 0<= i <=180.

For i:= 0 to 180 Do y[i]:= sin(Pi * i/180);

Присвоим случайные значения в диапазоне от -30 до +40 ста элементам массива "R":

Randomize;for i:= 1 to 100 Do R[i]:= - 30 + Random(71);

Присвоим значения семи элементам массива "A" оператором Readln:

For i:= 1 to 7 DobeginWrite('Введите A[',i,']= '); Readln(A[i]);end;

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

For j:=1 to 66 do Write('-'); Writeln; For j:=1 to 3 do Write('| Фамилия | оценка |'); Writeln; For j:=1 to 66 do Write('-'); Writeln;

- шапка для вывода в три пары колонок значений переменных "S" и "A". Шапка занимает 66 позиций (по ширине экрана в текстовом режиме размещается 79 символов и пробел). Оператор Writeln; переводит курсор на новую строчку.

Вывод значений ста элементов массивов "S" и "A" в три пары колонок, произведем операторами:

For i:= 1 to 100 dobeginWrite('|', s[i]:11,'|', a[i]:8, '|');if (i mod 3) = 0 Then Writeln;if (i mod 60) = 0 then Readln;end;

В этом случае данные таблицы полностью не умещаются на экране и можно задержать прокрутку экрана при выводе данных, применяя оператор Readln после вывода, например, 20 строк.

В цикле удобно определять сумму элементов массива, наибольший (наименьший) элемент и создавать новые массивы, удовлетворяющие некоторому условию, например:

s:= 0;fori:= 1 to 100 do s:= s + a[i]; { s - суммаэлементовмассива}a_max:= a[1];for i:= 1 to 100 do { поискнаибольшегоэлемента a[j] }if a[i] >a_max then begin a_max:= a[i]; j:= i; end; j:= 0; k:= 0; for i:=1 to 100 do {создание новых массивов с элементами: b[j]>=0, c[k]<0} if a[i] >= 0 thenbeginj:= j+1;b[j]:= a[i];endelsebegink:= k+1;c[k]:= a[i]end; j:= 0;k:= 8;fori:= 1 to 100 do {созданиемассиваномеров "M" дляэлементов: a[i] >a[k]} if a[i] > a[k] thenbeginj:= j+1;M[j]:= i;end;

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

Массивы, рассмотренные выше, имеют элементы, упорядоченные по одному индексу и называются одномерными массивами или векторами. Массив может быть двумерным, трехмерным и т. д. Двумерные массивы имеют элементы, упорядоченные по двум индексам и часто называются матрицами. В Турбо-Паскале при описании многомерного массива диа-пазоны изменения индексов перечисляются через запятые, например:

Var A: array[1..30, 1..7] of byte;

Рассмотрим пример работы с двумерными массивами. Обозначим массивом оценки учеников класса по нескольким предметам. Каждая оценка является значением элемента массива оценок "A" и имеет порядковый номер (два индекса). Поставим в соответствие первому индексу номер фамилии в списке учеников, а второму - номер предмета, по которому получена оценка. Тогда двумерный массив оценок можно представить в виде таблицы: каждый элемент a[i, j] находится на пересечении I-ой строки и J-го столбца.
Исходные данные могут быть представлены в виде таблицы оценок:
Годовые оценки по предметам:

             
Фамилия Физика Химия Алгебра Геометрия История Биология
  Иванов            
  Петров            
  Сидоров            
... ... ... ... ... ... ... ...
  Якупов            

 

Можно создать одномерные массивы фамилий "S" учеников класса и наименований предметов "P". Значением элемента массива "Р" будет наименование предмета, а индексом - порядковый номер предмета, например: 1 - физика, 2 - химия, 3 - алгебра, 4 - геометрия, 5 - история, 6 - биология.

Приведенная выше таблица может быть представлена в виде набора элементов (число строк = N, число столбцов = M):

Номер строки "I" Номер столбца "J"         ... J ... M
Массив "S" Массив "P" P[1] P[2] P[3] P[4] ... P[J] ... P[M]
  S[1] Массив "A" a[1, 1] a[1, 2] a[1, 3] a[1, 4] ... a[1, j] ... a[n, m]
  S[2] a[2, 1] a[2, 2] a[2, 3] a[2, 4] ... a[2, j] ... a[2, m]
  S[3] a[3, 1] a[3, 2] a[3, 3] a[3, 4] ... a[3, j] ... a[3, m]
  S[4] a[4, 1] a[4, 2] a[4, 3] a[4, 4] ... a[4, j] ... a[4, m]
... ... ... ... ... ... ... ... ... ...
I S[I] a[i, 1] a[i, 2] a [i, 3] a [i, 4] ... a[i, j] ... a[i, m]
... ... ... ... ... ... ... ... ... ...
N S[N] a[n, 1] a[n, 2] a[n, 3] a[n, 4] ... a[n, j ] ... a[n, m]

 

Массив оценок можно задать с использованием функции Random, например:

for i:= 1 to N dofor j:= 1 to M do A[i, j]:= random(4) + 2;

Для вывода наименований предметов ("шапка" таблицы) можно использовать операторы:

Writeln; Write('Фамилия\\Предметы:|');For i:= 1 to M do write(P[i]:9,' |');

Для вывода элементов массива "A" на экран удобно использовать вложенный цикл:

for i:= 1 to N dobeginwriteln;write(S[i]:19, ' |';for j:= 1 to M do write(A[i,j]:7, ' |') end;

Для расчета массива "SS" - сумм "M" элементов в каждой из "N" строк массива "A" (NxM) можно применить операторы:

for i:= 1 to N dobegin SS[i]:= 0;for j:= 1 to M do SS[i]:= SS[i] + A[i,j];end;

Здесь для каждого индекса "i" от 1 до N происходит суммирование элементов A[i, j] по индексу "j" от 1 до M.

При модификации массива "A" изменяется расположение данных в исходном массиве, например, в случае вставки данных из линейного массива "B" в колонку с номером "M1" необходимо сдвинуть данные в колонках J >= M1 используя операторы:

for i:= 1 to N dobeginfor j:=M+1 downto M1+1 do A[i,j]:=A[i,j-1];A[i,M1]:=B[i];end;

Если порядковый номер предмета изменится, то необходимо изменить расположение оценок в массиве "A", например, перестановку колонок с оценками по физике и химии можно сделать операторами:

for j:= 1 to N dobegin a1:=A[1,j];A[1,j]:=A[2,j];A[2,j]:=a1;end;

Примечание: при модификации массива "A" не забудьте соответственно изменять расположение данных в сопутствующих массивах, например, "P" или "S".

При создании новых массивов согласно некоторым условиям выбираются данные из элементов исходного массива. Например, для создания массива "В" из четных столбцов массива "A" можно использовать операторы:

for j:= 1 to M do If (j Mod 2) = 0 then for i:= 1 to N do B[i,jDiv 2]:= A[i,j];

Для создания массива "В", состоящего из строк массива "A", удовлетворяющих условию A[i, 1] > C, где C - заданное число, можно использовать операторы:

k:= 0; for i:= 1 to N do If A[i,1] > C thenbegink:= k + 1;for j:= 1 to M do B[k,j]:= A[i,j];end;

Для сравнения значений элементов массива удобно строить столбиковые диаграммы (гистограммы). Например, для вывода "N" значений положительных элементов массива "SS" в виде горизонтальной гистограммы можно использовать операторы:

k:= 30/S_max; { k - нормирующий масштабный коэффициент } { S_max - наибольший элемент массива "SS" }for i:=1 to N dobeginwriteln; { переход к новому столбику } yg:= round(k*SS[i]); { yg - длина столбика гистограммы }for j:=1 to yg do write(#220); { выводсимвола '_' скодом 220 }end;

Добавив операторы вывода порядкового номера и значений SS[i] получаем гистограмму в виде:

 

 


 

Содержание отчета

   

В контрольную работу входит четыре контрольных задания. Вариант задания определяется последней цифрой зачетной книжки. Каждое задание должно содержать:

1. Формулировку задачи;

2. Блок-схема решения

3. Текст программы на языке Паскаль

4. Результаты работы программы

Контрольная работа предоставляется для проверки в печатном виде на листах формата А4.


 

Министерство науки и высшего образования Российской Федерации

 

Федеральное государственное бюджетное образовательное учреждение

высшего образования

«Белгородский государственный технологический университет

им. В.Г. Шухова»

Губкинский филиал

 

 

Контрольная работа

 

По дисциплине: «Программирование и основы алгоритмизации»

 

Выполнила:
студентка 3-го курса группы Э-31

Павленко Н.А.

Проверил:

ст. преп. Пронин П. А.

 

 

Губкин 2018



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-03-02 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: