Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Spisok_voprosov (1).docx
Скачиваний:
7
Добавлен:
22.09.2019
Размер:
3.9 Mб
Скачать
  1. Одномерные массивы (объявление, индексация, хранение в памяти, сортировка). Пример: поиск второго наибольшего по величине значения в массиве.

Общая форма объявления одномерного массива имеет следующий вид:

тип имя_переменной [размер];

Как и другие переменные, массив должен быть объявлен явно, чтобы компилятор выделил для него определенную область памяти (т.е. разместил массив). Здесь тип обозначает базовый тип массива, являющийся типом каждого элемента. Размер задает количество элементов массива. Например, следующий оператор объявляет массив из 100 элементов типа double под именем balance:

double balance[100];

Согласно стандарту С89 размер массива должен быть указан явно с помощью выражения-константы. Таким образом, в программе на С89 размер массива определяется во время компиляции и впоследствии остается неизменным. (В С99 определены массивы, размер которых определяется во время выполнения. О них еще будет идти речь далее в этой главе, а также более подробно в части II).

Доступ к элементу массива осуществляется с помощью имени массива и индекса. Индекс элемента массива помещается в квадратных скобках после имени. Например, оператор balance[3] = 12.23;присваивает 3-му элементу массива balance значение 12.23. Индекс первого элемента любого массива в языке С равен нулю. Поэтому оператор char p[10];объявляет массив символов из 10 элементов — от р[0] до р[9]. В следующей программе вычисляются значения элементов массива целого типа с индексами от 0 до 99:

#include <stdio.h>

int main(void)

{

int x[100]; /* объявление массива 100 целых */

int t;

/* присваение массиву значений от 0 до 99 */

for(t=0; t<100; ++t) x[t] = t;

/* вывод на экран содержимого x */

for(t=0; t<100; ++t) printf("%d ", x[t]);

return 0;

}

Объем памяти, необходимый для хранения массива, непосредственно определяется его типом и размером. Для одномерного массива количество байтов памяти вычисляется следующим образом:

количество_байтов = sizeof(базовый_тип) × длина_массива

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

int count[10], i;

/* здесь нарушена граница массива count */

for(i=0; i<100; i++) count[i] = i;

Можно сказать, что одномерный массив — это список, хранящийся в непрерывной области памяти в порядке индексации. На рис. 4.1 показано, как хранится в памяти массив а, начинающийся по адресу 1000 и объявленный как

char a[7];

Рис. 4.1. Массив из семи символов, начинающийся по адресу 1000

Элемент a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7]

Адрес 1000 1001 1002 1003 1004 1005 1006 100

  1. Типовые алгоритмы обработки массивов.

1. Сортировка массива выбором.

Метод основан на поиске наименьшего элемента. Номер этого элемента запоминается, затем его меняют

местами с первым элементом. Далее, ищется наименьший элемент среди оставшихся и меняется

местами со вторым и т.д

Программный код:

procedure TForm1.Button1Click(Sender: TObject);

const n=5;

var a:array[1..n] of integer;

i,j,n_min,t:integer;

begin

for i:=1 to n do a[i]:=strtoint(memo1.Lines[i-1]);

for i:=1 to n do begin

n_min:=i;

for j:=i+1 to n do

if a[j]<a[n_min] then n_min:=j;

t:=a[i];

a[i]:=a[n_min];

a[n_min]:=t;

end;

memo1.Lines.add('отсортированный массив:');

for i:=1 to n do memo1.Lines.Add(inttostr(i)+'-й = '+inttostr(a[i]));

end;

end.

2. Сортировка перестановками

Метод основан на принципе сравнения и обмена пары соседних элементов до тех пор, пока не будут

рассортированы все элементы. Этот метод широко известен как сортировка методом пузырька.

Программный код:

procedure TForm1.Button1Click(Sender: TObject);

const n=5;

var a:array[1..n] of integer;

i,j,t:integer;

begin

for i:=1 to n do a[i]:=strtoint(memo1.Lines[i-1]);

for i:=2 to n do

for j:=n downto i do

if a[j-1]>a[j] then begin

t:=a[j-1];

a[j-1]:=a[j];

a[j]:=t;

end;

memo1.Lines.add('отсортированный массив:');

for i:=1 to n do memo1.Lines.Add(inttostr(i)+'-й = '+inttostr(a[i]));

end;

end.

3. Инвертирование массива

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

поменять местами 1-ый элемент с последним, 2-ой – с предпоследним и т.д.

Программа:

procedure TForm1.Button1Click(Sender: TObject);

const n=5;Тимошина О.В. Массивы. Страница 3

var a:array[1..n] of integer;

i,j,t:integer;

begin

for i:=1 to n do a[i]:=strtoint(memo1.Lines[i-1]);

for i:=1 to (n div 2) do begin

t:=a[i];

a[i]:=a[n-i+1];

a[n-i+1]:=t;

end;

memo1.Lines.add('инвертированный массив:');

for i:=1 to n do memo1.Lines.Add(inttostr(i)+'-й = '+inttostr(a[i]));

end;

end.

4. Формирование нового массива из элементов исходного

А) Формирование нового массива из элементов исходного, которые меньше заданного числа К

Программный код:

procedure TForm1.Button1Click(Sender: TObject);

const n=5;

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

i,j,t,k:integer;

begin

for i:=1 to n do a[i]:=strtoint(memo1.Lines[i-1]);

k:=strtoint(edit1.Text);

j:=0;

for i:=1 to n do

if a[i]<K then begin

j:=j+1;

b[j]:=a[i];

end;

memo1.Lines.add('Новый массив b:');

for i:=1 to j do memo1.Lines.Add(inttostr(i)+'-й = '+inttostr(b[i]));

end;

end.

Б) Слияние двух упорядоченных массивов в один упорядоченный

Программный код:

procedure TForm1.Button1Click(Sender: TObject);

const n=5; m=4;

var a:array[1..n] of integer;

b:array[1..m] of integer;

c:array[1..n+m] of integer;

i,j,t,k:integer;

begin

for i:=1 to n do a[i]:=strtoint(memo1.Lines[i-1]);

for i:=1 to m do b[i]:=strtoint(memo2.Lines[i-1]);

i:=1;j:=1;

for k:=1 to n+m do

if i>n then begin

c[k]:=b[j];

j:=j+1

end

else if j>m then begin

c[k]:=a[i];

i:=i+1

end

else

if a[i]<b[j] then begin

c[k]:=a[i];

i:=i+1

end

else begin

c[k]:=b[j];

j:=j+1;

end;

for i:=1 to n +m do memo3.Lines.Add(inttostr(i)+'-й = '+inttostr(c[i]));

end;

end. 74. Двумерные массивы

Кроме одномерных массивов встречаются двумерные. Синтаксис объявления:

<тип> < имя>[кол-во строк][кол-во столбцов]; пример: int mas[10][10];

Обращение к элементам массива по их индексам:

<имя массива>[номер строки][номер столбца] пример: mas[3][5] \\ 3 строка 5 столбец

Массив обрабатывается в 2-ух циклах с параметрами(индексами элементов массива).

Пример обработки массива mas размером [n][m] – обнуление элементов:

for (int I; i<n;i++) \\ цикл с индексом строки - i

for(int j;j<m;j++) \\ цикл с индексом столбца (каждого элемента в i-ой строке) - j

mas[i][j]=0;

75. Представление двумерного массива в виде одномерного. Соответствие индексов двумерного и одномерного.

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

т.е. его индексы остаются те же «номер строки» «номер столбца» (далее i и j). Вся суть в занесении особой формулы в параметр одномерного массива при обработки

mas[ i*m+j]=0; где i –индекс строки j индекс элемента в строке m- кол-во символов в строке.

Выражение i*m распиливает весь одномерный массив на одинаковые части (см. рисунок) а операция «+j» непосредственно находит элемент в i-ом куске одномерного массива.

Размер этого массива должен вычисляться по формуле кол-во=кол-во строк *кол-столбцов (далее n*m).

Пример объявления и обработки массива 3 на 5:

int mas[15]; \\ определение размерности 3*5=15

for (int I; i<n;i++) \\ цикл с индексом строки - i

for(int j;j<m;j++) \\ цикл с индексом элемента в i-ой строке - j

mas[ i*m+j]=0;

76. Многомерные массивы (объявление, индексация, хранение в памяти, сортировка). Пример.

Можно объявлять не только двумерные массивы, но и массивы с большим количеством измерений. Например, объявление int A[n][m][l] создает трехмерный массив из n*m*l элементов. Для обращения к каждому элементу такого массива необходимо указать три индекса: A[i][j][k], при этом 0<=i, i<n, 0<=j, j<m, 0<=k, k<l(т.е. индекс не может превышать размерность массива). Количество измерений в массиве может быть практически бесконечным.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]