………………………………………………………………………………………………………………..
Написать программу, которая для 10 целочисленных элементов определяет, сколько положительных элементов располагается между максимальным и минимальными элементами.
Запишем алгоритм в самом общем виде:
1. Считать исходные данные в массив.
2. Определить, где расположены его максимальный и минимальный элементы, то есть найти их индексы.
3. Просмотреть все элементы, расположенные между ними. Если элемент массива больше нуля, увеличить счетчик элементов на единицу.
Перед написанием программы полезно составить тестовые примеры, чтобы более наглядно представить себе алгоритм. Ниже представлен массив из 10 чисел и обозначены искомые величины:
6 | -8 | 15 | 9 | -1 | 3 | 5 | -10 | 12 | 2 |
макс | + | + | + | мин |
Для этого примера программа должна вывести число 3.
Порядок расположения элементов в массиве заранее не известен — сначала может следовать как максимальный, так и минимальный элемент, более того, они могут совпадать. Поэтому прежде чем искать количество положительных элементов, требуется определить, какой из этих индексов больше, чтобы просматривать массив от меньшего номера к большему.
Рассмотрим подробно принцип поиска максимального элемента в массиве. Он весьма прост. Очевидно, что для его отыскания нужно сравнить между собой все элементы массива. Поскольку компьютер может сравнивать одновременно только два числа, элементы выбираются попарно.
Например, сначала первый элемент сравнивается со вторым, затем тот из них, который оказался больше — с третьим, тот, который оказался больше — с четвертым, и так далее до последнего элемента.
Иными словами, при каждом сравнении из двух чисел выбирается наибольшее. Поскольку его надо где-то хранить, в программе описывается переменная того же типа, что и элементы массива. После окончания просмотра массива в ней окажется самый большой элемент. Для того чтобы все элементы сравнивались единообразно, перед началом просмотра в эту переменную заносится первый элемент массива.
Сформулируем алгоритм поиска максимума:
1. Принять за максимальный первый элемент массива.
2. Просмотреть массив, начиная со второго элемента.
3. Если очередной элемент оказывается больше максимального, принять его за максимальный.
Для решения поставленной задачи нам требуется знать не значение максимума, а его положение в массиве, то есть индекс:
Как видите, в этой программе в переменной imax запоминается номер максимального из просмотренных элементов. По этому номеру осуществляется выборка элемента из массива.
Запишем уточненный алгоритм решения нашей задачи:
1. Определить, где в массиве расположены его максимальный и минимальный элементы:
o задать начальные значения индексов искомых максимального и минимального элементов;
o просмотреть массив, поочередно сравнивая каждый его элемент с ранее найденными максимумом и минимумом. Если очередной элемент больше ранее найденного максимума, принять этот элемент за максимум (то есть запомнить его индекс). Если очередной элемент меньше ранее найденного минимума, принять этот элемент за минимум.
2. Определить границы просмотра массива для поиска положительных элементов, находящихся между его максимальным и минимальным элементами:
o если максимум расположен в массиве раньше, чем минимум, принять левую границу просмотра равной индексу максимума, иначе — индексу минимума;
o если максимум расположен в массиве раньше, чем минимум, принять правую границу просмотра равной индексу минимума, иначе — индексу максимума.
3. Определить количество положительных элементов в найденном диапазоне:
o обнулить счетчик положительных элементов;
o просмотреть массив в указанном диапазоне. Если очередной элемент больше нуля, увеличить счетчик на единицу.
Для экономии времени значения элементов массива при отладке задаются путем инициализации.
program num_positive_1;
uses crt;
const
n=10;
a:array[1..n] of integer=(1,3,-5,1,-2,1,-1,3,8,4);
var
i:integer; {индекс текущего элемента}
imax:integer; {индекс максимального элемента}
imin:integer; {индекс минимального элемента}
ibeg:integer; {начало интервала}
iend:integer; {конец интервала}
count:integer; {количество положительных элементов}
begin
clrscr;
for i:=1 to n do write(a[i]:3);writeln; {отладочная часть}
imax:=1;imin:=1; {начальные значения номеров макс. и мин. эл-ов}
for i:=1 to n do begin
if a[i]>a[imax] then imax:=i; {новый номер максимума}
if a[i]<a[imin] then imin:=i; {новый номер минимума}
end;
writeln ('max=',a[imax],' min=',a[imin]); {отладочная печать}
if imax<imin then ibeg:=imax else ibeg:=imin; {левая граница}
if imax<imin then iend:=imin else iend:=imax; {правая граница}
writeln('ibeg=',ibeg,' iend=',iend); {отладочная печать}
count:=0;
for i:=ibeg+1 to iend-1 do {подсчет кол-ва положительных}
if a[i]>0 then inc(count);
writeln('Количество положительных: ',count);
readln;
end.
Замечание: inc(x) – увеличивает на 1;
dec(x) – уменьшает на 1.
Лабораторная работа №6. Преобразование массивов.
Цель: Приобретение основных навыков при решение задач на массивы.
…………………………………………………………………………………………………
Задача 6.1. Создать массив случайных чисел из 30 элементов. Произвести сортировку по невозрастанию и неубыванию. Найти минимальный и максимальный элементы, определить номера этих элементов. Если этих элементов несколько, то создать массив минимальных и максимальных чисел. Подсчитать сумму всех элементов массива и найти среднее арифметическое.
Задание: Уметь объяснить работу программы.
uses crt;
const n=30;
var a,mn,mx: array[1..n] of integer;
min,max,imin,imax,i,j,sum,t:integer;
sred:double;
begin
clrscr;
randomize;
writeln;writeln;
writeln('Исходный массив');writeln;
sum:=0;
for i:=1 to n do begin
a[i]:=random(101);
write(a[i],' ');
sum:=sum+a[i];
end;
sred:=sum/n;
writeln;
writeln;
writeln('Сумма элементов массива=',sum,' ','Среднее ариф-ое=',sred);
min:=a[1];max:=a[1];
for i:=2 to n do begin
if a[i]<min then min:=a[i];
if a[i]>max then max:=a[i];
end;
imin:=0; imax:=0;
for i:=1 to n do begin
if a[i]=min then inc(imin);
if a[i]=max then inc(imax);
end;
if imin>1 then begin writeln;writeln('Массив мин-ых эл-ов');
for i:=1 to imin do begin
mn[i]:=min;
write(mn[i],' ');
end;end
else begin for i:=1 to n do if a[i]=min then begin imin:=i; break;end;
writeln;
writeln('Мин-ый=',min,' номер мин-го=',imin);end;
if imax>1 then begin writeln;writeln('Массив максим-ых эл-ов');
for i:=1 to imax do begin
mx[i]:=max;
write(mx[i],' ');
end;end
else begin for i:=1 to n do if a[i]=max then begin imax:=i; break; end;
writeln;
writeln('Макс-ый=',max,' номер макс-го=',imax);end;
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]<a[j] then begin t:=a[i];
a[i]:=a[j];
a[j]:=t;
end;
writeln;
writeln('Сорт-ка1');
for i:=1 to n do write(a[i],' ');
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then begin t:=a[i];
a[i]:=a[j];
a[j]:=t;
end;
writeln;
writeln;
writeln('Сортировка2');
for i:=1 to n do write(a[i],' ');
readln;
end.
Задача 6.2. Написать программу, которая «сжимает» целочисленный массив из 10 элементов, удаляя из него элементы, меньшие заданной величины. Освободившиеся в конце массива элементы заполнить нулями.
…………………………………………………………………………………………………
Исходный массив:
6 | -8 | 15 | 9 | -1 | 3 | 5 | -10 | 12 | 2 |
Допустим, требуется удалить из него все элементы, значение которых меньше 5. Результат должен иметь вид
6 | 15 | 9 | 5 | 12 | 0 | 0 | 0 | 0 | 0 |
Проще всего решать эту задачу с использованием дополнительного массива того же типа, что и исходный. В этом случае при просмотре исходного массива элементы, которые требуется оставить, помещаются один за другим во второй массив, после чего он присваивается исходному. Однако для массивов большой размерности выделение двойного объема памяти может оказаться слишком расточительным. Поэтому, предлагаю решить задачу по следующему алгоритму:
1) Просматривая массив, определить номер самого первого из удаляемых элементов.
2) Если таковой есть, сдвигать каждый последующий элемент массива на первое «свободное» место, обнуляя оставшуюся часть массива.
Индивидуальное задание. (у преподавателя)
Вариант 1
……………………………………………………………………………………………………
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) сумму отрицательных элементов массива;
2) произведение элементов массива, расположенных между максимальным и минимальным элементами.
Упорядочить элементы массива по возрастанию.
Вариант 2
……………………………………………………………………………………………………
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) сумму положительных элементов массива;
2) произведение элементов массива, расположенных между максимальным по модулю и минимальным по модулю элементами.
Упорядочить элементы массива по убыванию.
Вариант 3
……………………………………………………………………………………………………
В одномерном массиве, состоящем из n целочисленных элементов, вычислить:
1) произведение элементов массива с четными номерами;
2) сумму элементов массива, расположенных между первым и последним нулевыми элементами.
Преобразовать массив таким образом, чтобы сначала располагались все положительные элементы, а потом – все отрицательные (элементы, равные нулю, считать положительными).
Вариант 4
……………………………………………………………………………………………………
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) сумму элементов массива с нечетными номерами;
2) сумму элементов массива, расположенных между первым и последним отрицательными элементами.
Сжать массив, удалив из все элементы, модуль которых не превышает единицу. Освободившиеся в конце массива элементы заполнить нулями.
Вариант 5
……………………………………………………………………………………………………
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) максимальный элемент массива;
2) сумму элементов массива, расположенных до последнего положительного элемента.
Сжать массив, удалив из все элементы, модуль которых находится в интервале [a,b]. Освободившиеся в конце массива элементы заполнить нулями.
Вариант 6
……………………………………………………………………………………………………
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) минимальный элемент массива;
сумму элементов массива, расположенных между первым и последним положительными элементами]. Освободившиеся в конце массива элементы заполнить нулями.
Дата: 2019-12-22, просмотров: 781.