Суббота, 27.04.2024, 10:37
Информатика и математика в Плесской школе
Приветствую Вас Гость | RSS
Меню сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа

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

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

При изучении темы советую скачать презентацию "Двумерные массивы" с "Учительского портала" http://www.uchportal.ru/load/18-1-0-27361

 

Заполнение двумерного массива по правилу

Самые простые задачи из этой серии, когда массив заполняется номерами строк, столбцов, их суммой или произведением. В этих задачах не используется ветвление, поэтому программирование здесь не представляет  особой сложности.
Задание А. Заполнить произвольный массив размером N x N (N<10) по следующему правилу:
                               11111
                               22222
                               33333
                               44444
                               55555

Program n1;
Uses Crt;
var a:array[1..10,1..10] of integer;
    i,j,n: integer;
begin
  ClrScr;
  Write('ВВеди N = ');Readln(n);
  For i:=1 to n do begin
   For j:=1 to n do begin
                    a[i,j]:=i;
                    write(a[i,j]);
                    end;
   writeln;
   end;
end.

Для решения следующей группы задач, нужно  знать, как определяется главная  и побочная диагонали, и уметь применять оператор ветвления. Задания могут содержать как один, так и несколько условных операторов.
Задание В. Заполнить произвольный массив размером N x N (N<10) по следующему правилу:
                               00001
                               00010
                               00100
                               01000
                               10000
Program n2;
Uses Crt;
var a:array[1..10,1..10] of integer;
    i,j,n: integer;
begin
  ClrScr;
  Write('ВВеди N = ');Readln(n);
  For i:=1 to n do begin
   For j:=1 to n do begin
                    if (i+j = n+1) then a[i,j]:=1;
                    write(a[i,j]);
                    end;
   writeln;
   end;
end.

Для решения задач С, необходимо в одном цикле поделить массив на две части используя операцию целочисленного деления DIV. Можно решать подобные задачи, используя два цикла, программа будет работать и задача будет решена, но такое решение нельзя назвать рациональным. 
Задание С. Заполнить произвольный массив размером N x N (N<10) по следующему правилу:
                            00001
                            00011
                            00111
                            00011
                            00001

Program n3;
Uses Crt;
var a:array[1..10,1..10] of integer;
    i,j,n: integer;
begin
  ClrScr;
  Write('ВВеди N = ');Readln(n);
  For i:=1 to n do begin
   For j:=1 to n do begin
                    if (i<= n div 2) and (i+j >= n+1) then a[i,j]:=1;
                    if (i> n div 2) and (i<=j) then a[i,j]:=1;
                    write(a[i,j]);
                    end;
   writeln;
   end;
end.

Сумма и произведение элементов двумерного массива

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

Задание А. Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и найти сумму элементов  массива лежащих  на главной диагонали. 
Program n4;
Uses Crt;
var a:array[1..10,1..10] of integer;
    i,j,n,s: integer;
begin
  ClrScr;
  Write('ВВеди N = ');Readln(n);
  s:=0;
  For i:=1 to n do begin
   For j:=1 to n do begin
                    a[i,j]:=random(20)-10;
                    write(a[i,j]:4);
                    if (i=j) then s:=s+ a[i,j];
                    end;
   writeln;
   end;
   writeln('Сумма элементов лежащих на главной диагонали =',s:5);
end.

В заданиях В, необходимо выполнить более сложные действия в нутрии цикла, осуществляющего перебор строк. Нужно правильно расположить обнуление суммы и вывод суммы элементов строки. Для этого необходимо четкое понимание, что обработка элементов массива осуществляется построчно. Можно придумать задачи, когда необходимо будет находить сумму элементов в каждом столбце. Такие задания потребуют еще более глубокого понимания алгоритма обработки двумерного массива.    
Задание В.  Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и найти сумму элементов в каждой строке.
Program n5;
Uses Crt;
var a:array[1..10,1..10] of integer;
    i,j,n,s: integer;
begin
  ClrScr;
  Write('ВВеди N = ');Readln(n);
  For i:=1 to n do begin
   s:=0;
   For j:=1 to n do begin
                    a[i,j]:=random(20)-10;
                    write(a[i,j]:4);
                    s:=s+ a[i,j];
                    end;
   write('  Сумма = ',s:5);
   writeln;
   end;
end.

К заданиям С, я отношу задачи, когда найденную величину необходимо с чем ни будь сравнивать. 
Задание С.  Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и определить сколько элементов в данном массиве, больших среднего арифметического элементов массива лежащих под главной диагональю.
Program n6;
Uses Crt;
var a:array[1..10,1..10] of integer;
    i,j,k,s,n: integer; sr:real;
begin
  ClrScr;
  Write('ВВеди N = ');Readln(n);
  s:=0;
  k:=0;
  For i:=1 to n do begin
   For j:=1 to n do begin
                    a[i,j]:=random(20)-10;
                    write(a[i,j]:4);
                    if (i>j) then begin
                                  s:=s+ a[i,j];
                                  k:=k+1;
                                  end;
                    end;
   writeln;
   end;
   sr:=s/k;
   writeln(' Среднее арифметическое элементов под главной диагональю = ',sr:10:5);
   k:=0;
   For i:=1 to n do
      For j:=1 to n do if (sr<a[i,j]) then k:=k+1;
   writeln(' Ответ  = ',k:5);
end.

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

 

Поиск максимального (минимального) элемента в двумерном массиве

Эти задачи так же можно классифицировать по усложнению алгоритма.  При решении всех предлагаемых задач, нужно хорошо понимать, что элемент двумерного массива определяется двумя индексами, номером строки и столбца. По этому, когда определяется положение максимального или минимального элемента необходимо определять две переменные одну под номер строки, другую под номер столбца. Решать  эти задачи можно, так же как и предыдущие, в один цикл. Но необходимо знать какое минимальное или максимальное значение может принимать элемент массива стоящий в первой строке  первого столбца. Точно это можно сделать, только если массив заполняется  случайными числами из интервала, (точно известна левая и правая границы). А если массив заполняется с клавиатуры, то лучше использовать два цикла, в одном происходит заполнение, в другом поиск элемента. Такое решение будет проще и нагляднее. 
Задание А. Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и найти минимальный элемент лежащий на главной диагонали.
Program n7;
Uses Crt;
var a:array[1..10,1..10] of integer;
    i,j,n,m: integer;
begin
  ClrScr;
  Write('ВВеди N = ');Readln(n);
  For i:=1 to n do begin
   For j:=1 to n do begin
                    a[i,j]:=random(20)-10;
                    write(a[i,j]:4);
                    end;
   Writeln;
   end;
  m:=a[1,1];
  For i:=1 to n do
    For j:=1 to n do if (a[i,j]<m) and (i=j) then m:=a[i,j];
  writeln(' Минимальный элемент лежащий на главной диагонали =',m:5);
end.

В заданиях В, как и в задачах на нахождение суммы и произведения элементов массива, необходимо найти наибольший (наименьший) элемент в строке (реже в столбце). 
Задание В.  Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и найти максимальный элемент в каждой строке.
Program n8;
Uses Crt;
var a:array[1..10,1..10] of integer;
    i,j,n,max: integer;
begin
  ClrScr;
  Write('ВВеди N = ');Readln(n);
  For i:=1 to n do begin
   max:=-10;
   For j:=1 to n do begin
                    a[i,j]:=random(20)-10;
                    write(a[i,j]:4);
                    if (a[i,j]>max) then max:= a[i,j];
                    end;
   write('  MAx  = ',max:5);
   writeln;
   end;
end.

В заданиях С, усложняется  задание В, добавляя необходимость среди минимальных найти наибольший или наоборот самый маленький. Подобную задачу можно решить с использованием  дополнительного массива, размер которого равен количеству строк двумерного массива, но возможно решение без использования дополнительного массива. 
Задание С.  Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и найти максимальный элемент среди минимальных элементов ее строк.
Program n9;
Uses Crt;
var a:array[1..10,1..10] of integer;
    i,j,n,min,max: integer;
begin
  ClrScr;
  Write('ВВеди N = ');Readln(n);
  max:=-10;
  For i:=1 to n do begin
   min:=10;
   For j:=1 to n do begin
                    a[i,j]:=random(20)-10;
                    write(a[i,j]:4);
                    if (a[i,j]<min) then min:= a[i,j];
                    end;
   if (min>max) then max:=min;
   write('  Min  = ',min:5);
   writeln;
   end;
   writeln('Максимальный среди минимальных =',max:5);
end.

Поиск
Календарь
«  Апрель 2024  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930
Архив записей
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Учительский портал
    Copyright MyCorp © 2024