Файл: Массивы и их роль в написании программного обеспечения..pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 01.04.2023

Просмотров: 288

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

«Простой массив является одномерным. Он представляет собой линейную структуру. Основные действия с массивами единственное действие, которое можно выполнять над массивами целиком, причем только при условии, что массивы однотипны, – это присваивание.»[1,498]

Если в программе описаны две переменные одного типа, например, Var a , b : array [1..10] of real; то можно переменной a присвоить значение переменной b (a:=b). При этом каждому элементу массива a будет присвоено соответствующее значение из массива b.

«Все остальные действия над массивами Паскаля производятся поэлементно (это важно!). Ввод массива Для того чтобы ввести значения элементов массива, необходимо последовательно изменять значение индекса, начиная с первого до последнего, и вводить соответствующий элемент. Для реализации этих действий удобно использовать цикл с заданным числом повторений, где параметром цикла будет выступать переменная – индекс массива. Значения элементов могут быть введены с клавиатуры или определены с помощью оператора присваивания.»[3,256] Пример фрагмента программы ввода массива с клавиатуры:

Var A : array [1..10] of integer; i : byte; {переменная i как индекс массива}

Begin For i:=1 to 10 do Read (a[i]); { ввод i- го элемента производится с клавиатуры }

Рассмотрим теперь случай, когда массив заполняется автоматически случайными числами. Для этого будем использовать генератор случайных чисел – random ( N ).

Пример фрагмента программы заполнения массива случайными числами:

83 Var A: array [1..10] of integer;

i : byte ;

Begin For i :=1 to 10 do A [ i ]:= random (50)-25; {i-му элементу массива присваивается «случайное» целое число в диапазоне от 0 до 49 с вычетом 25, т.е. окончательный диапазон от -25 до 24} .

«Вывод массива в Паскале осуществляется также поэлементно, в цикле, где параметром выступает индекс массива, принимая последовательно все значения от первого до последнего.

Пример фрагмента программы вывода массива:

Var A: array [1..10] of integer;

i : byte ; {переменная i как индекс массива} Begin Writeln(‘Массив А’);

For i :=1 to 10 do Write ( a [ i ]:5); {вывод массива осуществляется в строку, под каждый элемент выделяется 5 позиций, иначе элементы массива будут выведены слитно} .

Writeln; (Для перевода курсора на следующую строку)

На экране мы увидим, к примеру, следующие значения: Массив А _ _ _ _ 5_ _ _ - 2_ _ 1 1 5 и т.д. Вывод можно осуществить и в столбик (использовать оператор Writeln).»[5,283]

Но в таком случае нужно учитывать, что при большой размерности массива все элементы могут не поместиться на экране и будет происходить скроллинг, т.е. при заполнении всех строк экрана будет печататься очередной элемент, а верхний смещаться за пределы экрана. Пример программы вывода массива в столбик:


Var A: array [1..10] of integer;

i : byte ;

Begin For i:=1 to 10 do Writeln (‘a[‘, i,’]=’, a[i]); {вывод элементов массива в столбик} .

На экране мы увидим, к примеру, следующие значения: a [1]=2 a [2]=4 a [3]=1 и т.д.

«Алгоритмы обработки:

Поиск минимального элемента:

min:=a[1];

For i:=2 to 10 do If a[i]< min then min:= a[i];

Замена наибольшего элемента массива на 0:

max:=a[1];

imax:=1;

For i:=2 to 10 do If a[i] > max then begin max:= a[i]; imax:=i;

end; a[imax]:=0;

В переменной max получаем наибольший элемент массива, а в переменной imax – индекс наибольшего элемента.»[1,525]

«Поиск суммы четных элементов массива:

S:=0;

For i:=1 to 10 do If a[i] mod 2 = 0 then S:=S+ a[i];

Рассмотрим пример программы целиком. Задача: Сформировать массив b из нечетных элементов массива a, состоящим из n элементов.

Program massiv;

Const n=10;

Var a, b: array [1..n] of integer;

i, k: byte; {i – индекс массива a, k – индекс массива b}

Begin For i:=1 to n do {Заполнение массива числами в диапазоне от -25 до 24 случайным образом}

a[i]:= random (50)-25;

writeln(‘Массив A’);

For i:=1 to k-1 do write (a[i]:5); { вывод массива a в строку}

writeln;

k:=1;

For i:=1 to n do If a[i] mod 2 <> 0 then begin {Проверка на нечетность} b[k]:=a[i]; {Запись нечетного элемента в массив b} k:=k+1; {Подготовка индекса для следующего элемента}

end;

writeln(‘Массив B’);

For i:=1 to k-1 do write (b[i]:5); {вывод массива b в строку} end.»[5,289]

«В С++ основная форма объявления массива размерности N имеет следующий формат: тип < имя массива> [размер 1][размер2]... [размер N ]; тип - базовый тип элементов массива, [размер1][размер2]... [ размер N] - количество элементов одномерных массивов, входящих в многомерный массив.»[10,85]

Чаще всего используются одномерные массивы, форма объявления которых будет иметь вид Тип [размер]. Например, оператор int A[10]; объявляет массив с именем А, содержащий 10 целых чисел. Доступ к элементам массива осуществляется выражением А[i] , где i - индекс элементов массива, который начинается с нуля и в данном примере заканчивается цифрой 9. Поэтому элемент А[0] характеризует значение первого элемента массива, А[1] - второго, А[9] - последнего.

Объявление массива можно совмещать с заданием элементам массива начальных значений. Эти значения перечисляются в списке инициализации после знака равенства, разделяются запятыми и заключаются в фигурные скобки, например: int A[10] = {1,2,3,4,5,6,7,8,9,10};

«Элементы массива могут иметь любой тип. Так, например, оператор char S[10]; объявляет массив из символов. Массив символов - это фактически строка, и число символов, помещаемых в строку, должно быть на единицу меньше объявленного размера массива. Это обусловлено тем, что строка кончается нулевым символом и будет, к примеру, иметь вид char S[10] = {"abcdefghi\0"};. Нулевой символ в конце можно не указывать, поэтому нормально будет воспринято такое объявление: char S[10] = {"abcdefghi"};.»[3,280]


Двумерный массив может быть объявлен таким образом: int A2[10][3];. Этот оператор описывает двумерный массив, который можно представить себе как таблицу, состоящую из 10 строк и 3 столбцов. Доступ к значениям элементов многомерного массива обеспечивается через индексы, каждый из которых заключается в квадратные скобки. Например, A2[3][2] - значение элемента, лежащего на пересечении четвёртой строки и третьего столбца (напоминаем, что индексы начинаются с 0). Если многомерный массив инициализируется при его объявлении, список значений по каждой размерности заключается в фигурные скобки. Приведённый ниже оператор объявляет и инициализирует двумерный массив A2 размерностью 3 на 5:

int A2[3][5] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};, однако допустим и упрощенный способ инициализации:

int A2[3][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};.

Так как массив является структурным типом, то основные операции с ним необходимо проводить с помощью оператора цикла.

«С помощью оператора цикла осуществляется присвоение начальных нулевых значений элементам массива n[5], содержащего пять целых чисел. Печать массива осуществляется в табулированном формате. Первый оператор вывода печатает на экране заголовки столбцов, а второй выводит эле- 90 менты массива и их значения. Функция setw() указывает ширину поля, в котором будет выведено следующее значение.»[8,95]

#include

#include main( ) { clrscr(); // очистка экрана

int n[5];

for(int i=0;i<<"элемент"«setw(13)<<"значение\n"; // вывод заголовков for(i=0;i<<setw(7)<<i<<setw(13)<<n[i]<<"\n"; // вывод элементов cout<<"\nНажмите любую клавишу…";

getch();

return 0;

Результаты работы программы: элемент значение 0 0 1 0 2 0 3 0 4 0

«При копировании элементам массива mcopy последовательно (в цикле) присваиваются значения элементов массива mes. При этом для доступа к элементам массива используются индексы.»[1,523]

Вывод элементов массива также осуществляется в цикле.

#include

#include main()

{ clrscr(); int i; 91 int mes[12]={31,28,31,30,31,30,31,31,30,31,30,31}; // инициализация массива int mcopy[12];

for(i=0;i<<"Исходный массив "<<setw(29)<<" Скопированный массив"; //вывод //заголовков for(i=0;i<<"\nmes="<<mes[i]<<"\t\t\tmcopy="<<<"\nНажмите любую клавишу…";

getch();

return 0;

}

Результаты работы программы: Исходный массив, скопированный массив mes= 31 mcopy =31 mes =28 mcopy =28 … … mes = 31 mcopy =31.

Приведен пример программы, в которой вычисляется количество положительных, отрицательных и нулевых элементов одномерного массива.

Количество положительных элементов суммируется в переменной p, отрицательных - в переменной n, а нулевых - в переменной zero.


#include

#include main() { float a[10]; int i=0, n=0, p=0, zero=0; // обнуление переменных

clrscr();

cout<<"\nОпределить количество положительных и отрицательных элементов массива a[10]\n";

for( i=0; i<<i+1<<"] : "; cin>>a[i]; }

for( i=0; i 0) p += 1; // определение количества положительных элементов

if( a[i] < 0) n += 1; // определение количества отрицательных элементов

if( a[i] == 0) zero += 1; // определение количества нулевых элементов }

cout<<"\n\n"; cout<<"\nЧисло положительных элементов ="<<<"\nЧисло отрицательных элементов ="<<<"\nЧисло нулевых элементов ="<<<"\n\n";

cout<<"\nНажмите любую клавишу…";

getch(); }

«В Java для создания массива вы можете пользоваться квадратными скобками, расположив их справа от имени массива или от типа объектов, из которых составлен массив, например:

int nNumbers[];

int[] nAnotherNumbers;

Допустимы оба варианта, поэтому вы можете выбрать тот, который вам больше нравится.

При определении массивов в языке Java нельзя указывать их размер. Приведенные выше две строки не вызывают резервирования памяти для массива. Здесь просто создаются ссылки на массивы, которые без инициализации использовать нельзя.»[9,159]

Для того чтобы заказать память для массива, вы должны создать соответствующие объекты с помощью ключевого слова new, например:

int[] nAnotherNumbers;

nAnotherNumbers = new int[15];

Как выполнить инициализацию ячеек таблицы?

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

int[] nColorRed = {255, 255, 100, 0, 10};

Динамическая инициализация выполняется с использованием индекса массива, например, в цикле:

int nInitialValue = 7;

int[] nAnotherNumbers;

nAnotherNumbers = new int[15];

for(int i = 0; i < 15; i++)

{

  nAnotherNumbers[i] = nInitialValue;

}

Вы можете создавать массивы не только из переменных базовых типов, но и из произвольных объектов. Каждый элемент такого массива должен инициализироваться оператором new.»[9,180]

Массивы могут быть многомерными и, что интересно, несимметричными.

Ниже создается массив массивов. В нулевом и первом элементе создается массив из четырех чисел, а во втором - из восьми:

int[][] nDim = new int[5][10];

nDim[0] = new int [4];

nDim[1] = new int [4];

nDim[2] = new int [8];

Заметим, что во время выполнения приложения виртуальная машина Java проверяет выход за границы массива. Если приложение пытается выйти за границы массива, происходит исключение.

Массивы в языке Java являются объектами некоторого встроенного класса. Для этого класса существует возможность определить размер массива, обратившись к элементу данных класса с именем length, например:


int[] nAnotherNumbers;

nAnotherNumbers = new int[15];

for(int i = 0; i < nAnotherNumbers.length; i++)

{

  nAnotherNumbers[i] = nInitialValue;

}

Для определения размера массива вам не нужен такой оператор, как sizeof из языка программирования С, потому что существует другой способ определения этого размера.

«Массивы и коллекции тоже получили выражение в синтаксисе обоих языков, благодаря особой разновидности цикла for (цикл по коллекции, известный также как цикл foreach). В обоих языках массив является объектом класса Array, но в Java он не реализует какие-либо интерфейсы коллекций, хотя по массивам возможна итерация циклом for(:). Оба языка имеют в стандартной библиотеке классы типичных коллекций.»[5,301]

«В Java могут быть объявлены, строго говоря, только одномерные массивы. Многомерный массив в Java — массив массивов. В C# есть как настоящие многомерные массивы, так и массивы массивов, которые в C# обычно называются «неровными», или «ступенчатыми» (jagged). Многомерные массивы всегда «прямоугольные» (говоря в двумерной терминологии), в то время как массивы массивов могут хранить строки разной длины (опять-таки в двумерном случае, в многомерном аналогично).»[3,286]

Многомерные массивы ускоряют доступ к памяти (для них указатель разыменовывается только один раз), а неровные массивы работают медленнее, но экономят память, когда не все строки заполнены. Многомерные массивы требуют для своего создания лишь один вызов оператора new, а ступенчатые требуют явно выделять память в цикле для каждой строки.

2.2 Примеры использования массивов при разработке программ

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

Очень часто при решении практических задач возникает потребность в использовании таблиц, матриц и т. д. В таком случае нам может пригодится отличная модификации массива — двухмерные (и более) массивы.

«В данном примере мы реализуем хранилище данных на языке С++, человек сможет с помощью массива и инструментов его обработки, записывать и извлекать данные в программе.»[7,78]

#include <iostream>

#include <stdlib.h>

using namespace std;

int main() {

    int data[500][500] = {0}; // массив

    string type; // тип запроса