Одномерные массивы
Тема программирование одномерных массивов, так же достаточно обширна с точки зрения количества и выбора задач. Эту тему можно разделить на несколько блоков, которые тесно связаны между собой. В своей работе я приведу в качестве примера только три, на мой взгляд самых основных блока из этой темы:
1. Заполнение и обработка элементов массива.
2. Нахождение суммы и произведения элементов массива.
3. Нахождение наибольшего и наименьшего элемента в массиве
Для изучения данной темы скачайте презентацию "Одномерные массивы" с "Учительского портала" http://www.uchportal.ru/load/18-1-0-34113
Заполнение и обработка элементов массива
В задачах этого уровня предлагается конкретный способ заполнения (с клавиатуры, случайными числами, или при помощи прогрессии). Такая программа чаще всего представляет последовательное соединение двух или трех циклов:
заполнение=>вывод,
заполнение =>обработка=>вывод,
заполнение=>(обработка + вывод).
Усложнение задания идет за счет усложнения алгоритмической части.
К первой группе заданий я отношу задачи, когда требуется заполнить массив одним из предложенных способов обработать все элементы массива и вывести их на экран в строку или столбик.
Задание А. Заполнить массив целыми положительными и отрицательными числами из интервала [-10, 10] и вывести его в строчку. Поменять знаки элементов массива на противоположные и повторно вывести массив на экран в строчку.
Program n1;
Uses Crt;
var a:array[1..10] of integer;
i:integer;
begin
ClrScr;
For i:=1 to 10 do begin
a[i]:=Random(20)-10;
write (a[i]:10);
end;
Writeln;
For i:=1 to 10 do begin
a[i]:=-a[i];
write(a[i]:10);
end;
end.
Во второй группе задач в цикл обработки добавляется условие. Требуется составить программу обрабатывающую не все элементы массива подряд, а согласно поставленного условия.
Задание В Заполнить массив из 10 элементов с клавиатуры целыми положительными и отрицательными числами и вывести на экран в строчку только отрицательные числа.
Program n2;
Uses Crt;
var a:array[1..10] of integer;
i:integer;
begin
ClrScr;
For i:=1 to 10 do begin
Write('ВВеди ',i,'-е число');
Readln(a[i]);
end;
For i:=1 to 10 do
if (a[i]<0) then write(a[i]:10);
end.
В третьей группе можно еще усложнить алгоритм. Например, проверить является ли массив арифметической или геометрической прогрессией, расположены ли его элементы по возрастанию или убыванию и т.д. В этих задачах добавляется вычислительная часть и проверка условий вне цикла.
Задание С. Дан массив из 10 целых, положительных не повторяющихся чисел. Проверить образуют ли его элементы арифметическую прогрессию. Если образуют, то вывести разность прогрессии.
Program n3;
Uses Crt;
var a:array[1..10] of integer;
i,r,f:integer;
begin
ClrScr;
For i:=1 to 10 do begin
Write('ВВеди ',i,'-е число');
Readln(a[i]);
end;
r:= a[2]-a[1];
f:=1;
For i:=1 to 9 do if (a[i+1]-a[i]<>r) then f:=0;
If (f=0) then Writeln('Не арифметическая прогрессия');
If (f=1) then Begin
Writeln('Арифметическая прогрессия');
Writeln('Разность = ',r:8);
End;
end.
В подобных задачах условие, как правило, находится как внутри цикла обработки, так и после него. Переменную f которая хранит 1 если это арифметическая прогрессия и 0 если это не арифметическая прогрессия можно сделать типа Boolean. Но это потребует от ученика дополнительных знаний, но программа получится красивее. Изменение сложности алгоритма также можно просмотреть на блок-схемах:
Нахождение суммы и произведения элементов массива
Следующим шагом при рассмотрении темы одномерные массивы идет изучение алгоритмов нахождения суммы и произведения элементов массива.
К задачам первой группы можно отнести задачи на нахождение суммы всех элементов массива. Задача может состоять как из одного, так и из двух циклов. Задача может решаться как в один так и в два прохода по массиву.
Задание А. Дан массив из 40 случайных чисел из интервала [-10; 10]. Вывести его в строку и найти
Program n4;
Uses Crt;
var a:array[1..40] of real;
s:real;
i:integer;
begin
ClrScr;
For i:=1 to 40 do begin
a[i]:=Random(20)-10;
write (a[i]:10:5);
end;
Writeln;
S:=0;
For i:=1 to 40 do S:=S+sin(a[i]);
writeln ('S=',S:10:5);
end.
Эту формулировку задачи я подсмотрел в методичке для студентов одного из Ивановских ВУЗов. Эти задачи решаются по одному образцу и требуют внести лишь небольшие изменения.
К задачам второй группы можно отнести задачи на нахождение суммы элементов массива удовлетворяющих условию. В этих задачах требуется заполнить массив указанным способом и организовать цикл с вложенным условием для нахождения суммы элементов массива. Эту задачу также можно решить в один цикл. Когда идет заполнение и в этом же цикле проверяется, соответствует ли этот элемент условию.
Задание В. Заполнить массив из 10 целых чисел с клавиатуры положительными и отрицательными числами. Найти сумму положительных элементов массива.
Program n5;
Uses Crt;
var a:array[1..10] of integer;
s,i:integer;
begin
ClrScr;
For i:=1 to 10 do begin
Write('ВВеди ',i,'-е число');
Readln(a[i]);
end;
S:=0;
For i:=1 to 10 do if (a[i]>0) then S:=S+ a[i];
writeln ('S=',S:8);
end.
В заданиях группы С, я включаю задачи когда найденную сумму необходимо с чем ни будь сравнить. Требуется организовать еще один цикл, в который необходимо вставить условие.
Задание С. Дан массив из 15 целых чисел заполненный случайными числами из интервала [0; 20]. Выведите этот массив в строку и найдите количество четных элементов массива, которые меньше среднего арифметического его элементов.
Program n6;
Uses Crt;
var a:array[1..15] of integer;
s:real;
i,k:integer;
begin
ClrScr;
s:=0;
For i:=1 to 15 do begin
a[i]:=Random(20);
write (a[i]:10);
S:=S+a[i];
end;
Writeln;
s:=s/15;
Writeln('Среднее арифметическое = ',s:10:5);
k:=0;
For i:=1 to 15 do if (a[i] Mod 2 = 0) and (a[i]<s) then k:=k+1;
Writeln('Четных чисел меньших среднего арифметического= ',k:8);
End.
Эта задача состоит из двух частей в первой необходимо заполнить массив и найти сумму всех элементов для нахождения среднего арифметического, во второй идет поиск элементов четных, меньших среднего арифметического.
Нахождение наибольшего (наименьшего) элемента в массиве
Задачи на нахождение наибольшего или наименьшего элемента тоже отличаются усложнением алгоритма. К первой группе задач можно отнести задачи на нахождение наибольшего или наименьшего элемента не во всем массиве, а на определенном интервале. Требуется заполнить массив и правильно изменить параметры в стандартном алгоритме поиска. Эту задачу невозможно решить, если не понимаешь, как работает алгоритм поиска. Разобравшись в нем, ученику не составит труда решить подобную задачу.
Задание А. Дан массив из 20 элементов заполненный случайными целыми числами из интервала [-10, 10]. Выведите этот массив в строку и найдите наибольший элемент лежащий между 5 и 15 элементами данного массива.
Program n7;
Uses Crt;
var a:array[1..20] of integer;
i,max:integer;
begin
ClrScr;
For i:=1 to 20 do begin
a[i]:=Random(20)-10;
write (a[i]:10);
end;
Writeln;
max:=a[5];
for i:=6 to 15 do if (a[i]>max) then max:=a[i];
writeln('Максимальное число из интервала =',max:8);
end.
В эти задачи можно добавлять вопрос поиска номера максимального или минимального элемента. Это лишь немного усложнит алгоритм.
Ко второй группе задач я отношу задачи, где не просто нужно найти максимальное или минимальное число, а что ни будь при помощи найденного числа еще проверить. В данных задачах необходимо добавить еще один цикл в котором найденный элемент с чем ни будь сравнивается. Получается, что к уже изученным алгоритмам поиска и обработки массива, необходимо добавить алгоритм нахождения максимального или минимального элемента.
Задание В. Дан массив из 20 элементов заполненный случайными целыми числами из интервала [-10, 10]. Выведите этот массив в строку и найдите сколько раз в данном массиве встречается максимальный по величине элемент.
Program n8;
Uses Crt;
var a:array[1..20] of integer;
i,max,k:integer;
begin
ClrScr;
For i:=1 to 20 do begin
a[i]:=Random(20)-10;
write (a[i]:10);
end;
Writeln;
max:=a[1];
for i:=2 to 20 do if (a[i]>max) then max:=a[i];
k:=0;
for i:=1 to 20 do if (a[i]=max) then k:=K+1;
writeln('Максимальное число из интервала =',max:8);
writeln('Оно встречается =',k:8,' раз');
end.
В заданиях С нужно найти максимальный элемент и произвести замену или другие изменения в массиве и повторно вывести массив на экран.
Задание С. Дан массив из 10 целых положительных чисел, заполненный с клавиатуры. Найти максимальный и минимальный элемент в массиве и поменять их местами.
Program n9;
Uses Crt;
var a:array[1..10] of integer;
i,min,max,n1,n2,t:integer;
begin
ClrScr;
For i:=1 to 10 do begin
Write('ВВеди ',i,'-е число');
Readln(a[i]);
end;
min:=a[1];n1:=1;
max:=a[1];n2:=1;
for i:=1 to 10 do begin
if (a[i]>max) then begin
max:=a[i]; n2:=i;
end;
if (a[i]<min) then begin
min:=a[i]; n1:=i;
end;
end;
t:=a[n1]; a[n1]:=a[n2]; a[n2]:=t;
for i:=1 to 10 do write (a[i]:8);
end.
В этой задаче ученику необходимо в одном цикле организовать поиск максимального и минимального элемента и номеров, под которыми они стоят. Затем, используя эти номера через вспомогательную переменную обменять максимальное и минимальное значение местами и повторно вывести массив на экран. |