Название: Алгоритмы и программы (Афанасьева Т. В.)

Жанр: Информационные системы и технологии

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


7.1. одномерные массивы

 

В информатике и математике массив называется одномерным, если для получения доступа к его элементам достаточно одной индексной переменной.

Вы можете объявить одномерный массив следующим образом:

 

var

a : array [1..5] of byte;

b : array [1..3] of char;

z : array ['d'..'g'] of integer;

 

Величины, соответствующие начальному и конечному индексам, т. е.

значения, указанные в квадратных скобках, разделяются двумя точками.

 

7.1.1. Ввод элементов одномерного массива

 

1) С клавиатуры for i:=1 to n do read(a[i]);

 

 

const

2) С помощью типизированных констант

a1 : array [1..6] of integer = (–5,8,5,0,7,–8);

a2 : array [1..3] of char = ('a','b','c');

 

3) C помощью датчика случайных чисел

for i:=1 to 10 do

begin a[i]:=random (20);

write(a[i]:5);

end;

 

B этом случае значениями элементов массива a[i] будут произ- вольные значения от 0 до 19. Для того чтобы получились дробные числа, нужно в функции random опустить параметр.

 

 

 

var

4) Из файла

a:array [1..10] of integer ;

i:byte ;

c:integer ;

f: file of integer ; {объявление типизированного файла целых чисел}

begin

assign (f,'mkurs.dat'); {связывание файловой переменной с именем файла}

reset (f);{открытие файла для чтения}

writeln ('Полученный массив ');

for i:=1 to 5 do begin

read( f,a[i]); {чтение из файла}

write (a[i],' ');

end; close(f); end.

 

7.1.2. Вывод элементов одномерного массива

 

1) Вывод элементов массива в таблицу на экране

write('Массив'); writeln('––––––––––––––––––'); writeln('N | значение |');

for i:=1 to 10 do writeln(i,'|',a[i]:9,' |');

2) Вывод в файл

var

a:array [1..5] of integer;

i:byte;

c:integer;

f: file of integer;{объявление типизированного файла целых чисел}

begin

assign (f,'mkurs.dat');{связывание файловой переменной с именем файла}

reset (f);{открытие файла для чтения}

writeln ('Введите массив ');

for i:=1 to 5 do begin

read(a[i]);

write ( f,a[i]);{запись в файл}

end;

close (f);{закрытие файла}

end.

 

7.1.3. Основные алгоритмы работы с одномерными массивами

 

1) Присваивание массива

 

Одномерные массивы могут присваивать свое значение целиком, а не только поэлементно, если их типы эквивалентны:

var

a,b:array[1..7]of real;

i:byte;

begin

write(''Ввод массива''); for i:=1 to 7 do read(a[i]);

b:=a;

for i:=1 to 7 do write(b[i]);

end.

 

Рассмотрим присваивание одномерных массивов, которые являются элементами двумерного массива:

type

a:array[1..2]of real;

var

b:array[1..3]of a; { двумерный массив }

i,j:byte;c:a;

begin

writeln('перестановка строк');

for i:=1 to 3 do for j:=1 to 2 do read(b[i,j]);

c:=b[1];            { перестановка }

b[1]:=b[3];

b[3]:=c;

for i:=1 to 3 do for j:=1 to 2 do write(b[i,j]);

end.

 

Замена  или  перестановка  элементов  мaccива  с  порядковыми  но-

мерами n и m:

var

a:array[1..4]of real;

p:real;

i,n,m:integer; begin read(n,m);

for i:=1 to 4 do read(a[i]);

p:=a[n];            { перестановка }

a[n]:=a[m];

a[m]:=p;

for i:=1 to 4 do write(a[i]);

end.

 

2) Удаление из массива одного элемента с номером k.

Алгоритм:

a) ввод элементов массива;

b) удаление, которое осуществляется следующим образом:

for i:=k to n–1 do         a[i]:=a[i+1];

a[i]:=0; {n – количество элементов массива, k – номер удаляемого элемента};

c) перенос в хвост массива из 10 элементов элемент с k-й позиции.

 

3) Перенос в конец одномерного массива элемента с k-й позиции.

Алгоритм:

a) ввод элементов массива;

b) сохранение элемента с k-й позиции в дополнительной переменной:

2 (3) 4 5 6

р–––––––––¦

c) сдвиг элементов массива следующих за k-м на одну позицию влево;

d) восстановление последнего значения из переменной р. read(k);

{а} for i:=1 to n do read (a[i]);

{b}      p:=a[k];

{c} for i:=k to n–1 do a[i]:=a[i+1];

{d} a[n]:=p;

{вывод a}.

 

4) Перенос в начало одномерного массива элемента с k-й позиции.

Алгоритм:

а) ввод элементов массива;

b) сохранение элемента с k-й позиции в дополнительной переменной p;

с) сдвиг всех элементов до элемента с номером k вправо;

d) записать на первое место значение из переменной p. read(k);

for i:=1 to n do read (a[i]);        2 3 {4} 5 6 p:=a[k];                 |

for i:=k downto 2 do     –––––p a[i]:=a[i–1];     2 2      3 5 6 a[1]:=p;

{вывод a}

 

Пример 7.1. Вычислить сумму элементов массива. program a8;

var

a:array[1..10]of real;

i:integer; c:real; begin c:=0;

writeln('Вычислить сумму элементов массива');

writeln('            Введите 10 элементов массива');

for i:=1 to 10 do begin

write(i,' элемент= ');

readln(a[i]); c:=c+a[i]; end;

writeln('Сумма элементов массива = ',c);

writeln('Для окончания работы нажмите enter');

readln; readln; end.

 

Пример 7.2. В одномерном массиве найти сумму положительных,

произведение отрицательных, количество четных элементов. program a6;

var

a:array[1..10] of integer;

e,i,c,d:integer;

begin

writeln('     В одномерном массиве найти сумму положительных,'); writeln(' произведение отрицательных, кол-во четных элементов'); writeln;

writeln('Введите массив из 10 элементов через пробелы');

d:=0; c:=1; e:=0;

for i:=1 to 10 do begin

read (a[i]);

if a[i]>0 then d:=d+a[i] ;

if a[i]<0 then c:=c*a[i] ;

if a[i] mod 2 =0 then e:=e+1 ;

end; writeln; writeln('Результат:');

if d<>0 then writeln('Сумма положительных элементов d= ',d)

else writeln('Положительных нет.');

if c<>1 then writeln('Произведение отрицательных элементов c= ',c)

else writeln('Отрицательных нет.');

if e<>0 then writeln('Кол–во четных элементов e= ',e)

else writeln('Четных нет.');

readln;

readln;

end.

 

Пример 7.3. Найти минимальное значение элемента массива и его порядковый номер.

program a3;

const

nmax=10; {количество элементов в массиве}

var imin,i:integer; x:array[1..nmax]of integer; begin

writeln('Найти минимальное значение элемента массива');

writeln('и его порядковый номер'); writeln('Введите 10 элементов массива'); imin:=1;      {номер минимального элемента} for i:=1 to nmax do

begin read(x[i]);

if x[i]<x[imin] then imin:=i;

end;

writeln('Минимальное значение=',x[imin]); writeln('Порядковый номер =',imin); writeln('Для окончания работы нажмите enter'); readln;

end.

 

Пример  7.4.  Найти  минимальное  значение  элемента  массива  на нечетной позиции.

program a5;

var

a:array[1..10]of integer;

ind,i,min:integer;

begin

writeln('Найти минимальное значение элемента '); writeln('массива на нечетной позиции'); writeln('Введите 10 чисел');

ind:=1;  {номер минимального элемента}

for i:=1 to 10 do begin

read(a[i]);

if (i mod 2)=1 then

if a[i]<a[ind] then          ind:=i;

end;

writeln('Минимальное значение=',a[ind]); writeln('Для окончания работы нажмите enter'); readln;

end.

Пример 7.5. Найти максимальное значение и его порядковый номер. program a7;

const nmin=10; var imax,i:integer;

x:array[1..nmin]of integer;

begin

writeln('Найти максимальное значение и его порядковый номер');

writeln('Введите 10 элементов массива через пробел');

imax:=1;

for i:=1 to nmin do begin

read(x[i]);

if x[i]>x[imax] then imax:=i;

end;

writeln('Максимальное значение=',x[imax]); writeln('Порядковый номер =',imax); writeln('Для окончания работы нажмите enter');

readln;

end.

 

Пример 7.6. Программа, меняющая в массиве (5 –2 1 13 7) макси-

мальное и минимальное числа. program iv44;

const n=5;

type

mass=array[1..n]of integer;

const

arr:mass=(5,–2,1,13,7);{ввод массива типизированной константой}

var i,x,max,min:integer; begin

writeln('Программа, меняющая в массиве    5 –2 1 13 7');

writeln('максимальное и минимальное числа.');

max:=1;              {номер максимального} min:=1;     {номер минимального} for i:=1 to n do

begin

if arr[i]>arr[max] then max:=i;

if arr[i]<arr[min] then min:=i;

end;

{перестановка} x:=arr[max]; arr[max]:=arr[min]; arr[min]:=x;

writeln ('Измененный массив');

for i:=1 to n do

writeln('            ',arr[i]{:4:2});

readln;

end.

 

Пример 7.7. В одномерном массиве найти третий нечетный элемент. program a4;

var

a:array[1..10] of integer;

k,i:integer;

begin

writeln('В одномерном массиве найти третий нечетный эл-т');

writeln('Введите массив из 10 эл-в через пробелы');

k:=0; {количество нечетных элементов}

for i:=1 to 10 do read(a[i]);

for i:=1 to 10 do begin

if (a[i] mod 2<>0) then begin

k:=k+1;

if k=3 then begin

writeln('Результат ',a[i]) ;

exit ; { выход из программы }

end; end; end;

if k=0 then writeln('нечетных нет');

readln;

end.

 

Пример           7.8.      Поиск  первого           отрицательного,        второго           положи-

тельного и предпоследнего нечетного. program a8;

var

a:array[1..10]of integer;

i:integer;

c,otr,otr1,pol,pol1,n:integer;

begin c:=0; n:=0; otr:=0; otr1:=0; pol:=0; pol1:=0;

writeln('Поиск первого отрицательного, второго '); writeln('положительного и предпоследнего нечетного.'); writeln('Введите 10 элементов целочисленного массива'); for i:=1 to 10 do

begin

write(i,' элемент= ');

readln(a[i]);

if a[i]<0 then begin otr:=otr+1;

if otr=1 then otr1:=a[i];

end;

if a[i]>0 then begin pol:=pol+1;

if pol=2 then

pol1:= a[i];

end;

if a[i] mod 2 =1 then begin

c:=n;

n:=a[i];

end;

end;

if otr = 0 then writeln('Отрицательных элементов массива нет ')

else writeln('Первый отрицательный элемент = ', otr1);

if pol <2 then writeln('Положительных элементов массива нет')

else writeln('Второй положительный элемент массива = ', pol1);

if c = 0 then writeln('В массиве нет двух нечетных элементов')

else writeln('Предпоследний нечетный элемент = ',c);

writeln('Для окончания работы нажмите enter');

readln;

end.

Пример 7.9. В одномерном массиве B найти минимальный элемент и заменить его предпоследним элементом кратным 3, который  находится в массиве А.

program iv55;

var

a,b:array[1..5] of integer; i:byte; p,n,ind,flag:integer;

begin

writeln('В одномерном массиве B найти минимальный элемент и'); writeln(' заменить его предпоследним элементом кратным 3 ,’); writeln(' который находится в массиве А.');

writeln('Измененный массив B вывести на экран .');

write('Ввести эл–ты массива А',' ' ,'Введите эл–ты массива B',' ', 'Результат');

repeat flag:=0;

for i:=1 to 5 do begin

read( a[i]);

if (a[i] mod 3) =0 then   {поиск эл–та по условию кратности}

begin n:=p; flag:=1; p:=i;

end;

end;

if flag=0 then

write('В введенном массиве нет эл–тов, кратных 3.');

until flag<>0;

write(' Предпоследний элемент кратный 3 – ', a[n],' ,его номер ', write( n , {n– номер предпоследнего эл–а} );

ind:=1;

for i:=1 to 5 do begin read(b[i]);

if (b[i])<(b[ind]) then     {цикл поиска эл–та по условию min}

ind:=i;

end;

write('MIN= ' , b[ind] );

b[ind]:=a[n];

for i:=1 to 5 do writeln(b[i]);

readln;

end.

Пример 7.10. В одномерном массиве перенести элемент, стоящий на первом месте в конец массива.

program a7; var p,i:integer;

a:array[1..10] of integer;

begin

writeln('                        В одномерном массиве перенести элемент,'); writeln('      стоящий на первом месте в конец массива,'); writeln('Введите 10 элементов массива через пробелы'); for i:=1 to 10 do

read(a[i]);

p:=a[1]; { перенос } for i:=1 to 9 do a[i]:=a[i+1];

a[10]:=p; writeln('Результат'); for i:=1 to 10 do write(a[i],' ');

readln; readln; end.

 

Пример 7.11. В одномерном массиве найти минимальное значение и удалить его.

program a7; var amin:integer; imin,i:integer;

a:array[1..10]of integer;

begin

writeln('Найти минимальное значение и удалить его '); writeln('Введите 10 элементов массива через пробел'); for i:=1 to 10 do

read(a[i]); amin:=a[1]; imin:=1;

for i:=2 to 10 do begin

if a[i]<amin then begin {поиск min} amin:=a[i];

imin:=i;

end;

end;

for i:=imin to 9 do         { удаление }

a[i]:=a[i+1]; a[10]:=0; writeln('Результат'); for i:=1 to 9 do

write(a[i],' ') ;

readln; readln; end.

 

Пример  7.12.  В  одномерном  массиве  перенести  второй  нулевой элемент в начало массива.

program a1;

var

a:array[1..10] of integer;

k,i,n,p:integer;

begin

writeln('            В одномерном массиве из 10 элементов перенести');

writeln('            второй нулевой элемент в начало массива');

k:=0;

writeln;

writeln('            Введите исходный массив хотя бы с '); writeln(' двумя нулевыми элементами через пробелы'); for i:=1 to 10 do

begin read(a[i]);

if a[i]=0 then begin k:=k+1;

if (k=2) then n:=i ;

end; end; p:=a[n];

for i:=n downto 2 do { цикл переноса в начало }

a[i]:=a[i–1]; a[1]:=p; writeln('Результат'); for i:=1 to 10 do

begin write(a[i]:2);

end;

writeln; readln; readln; end.

 

Пример 7.13. В одномерном массиве найти группу из цифр <5>. program a2;

var

a:array[1..10] of integer;

n1,n2,i,k:integer;

begin writeln;

writeln('В одномерном массиве найти группу из цифр <5> ');

writeln; k:=0; n1:=0;

writeln(' Введите массив из 10 элементов через пробелы');

for i:=1 to 10 do begin

read(a[i]);

if a[i]=5 then begin

if k=0 then n1:=i;

k:=k+1; n2:=n1+(k–1); end;

end;

if k<>0 then begin

writeln('Начало группы:',n1); writeln('Конец группы:',n2); writeln('Кол–во элементов в группе: ',k); end;

if k=0 then

write('Такой группы нет');

readln; readln; end.

 

Пример 7.14. В одномерном массиве найти максимальную группу,

содержащую нули. program a5;

var

a:array[1..10] of integer;

n1,n2,i,k,p:integer;

begin

writeln(' В одномерном массиве найти максимальную ');

writeln(' группу , содержащую нули ');

writeln('            Введите массив из 10 элементов через пробелы');

k:=0; n1:=0; n2:=0; p:=1;

for i:=1 to 10 do begin

read(a[i]);

if a[i]=0 then begin

if k=0 then n1:=i;

k:=k+1;

end else begin

if k>p then begin p:=k; n2:=n1; end;

k:=0;

end;

end;

if n2=0 then

write('Такой группы нет')

else

writeln('Начало максим группы: ',n2); writeln('Кол–во элементов в максим группе: ',p); readln;

readln;

end.

 

Пример 7.15. Записать в файл 10 элементов одномерного массива в следующем порядке:

– пять элементов массива, начиная с десятой позиции;

– пять элементов, начиная с первой позиции массива.

program kr1;

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

i:byte;

c:integer;

f: file of integer;{объявление типизированного файла целых чисел}

begin

assign (f,'mkurs.dat');{связывание файловой переменной с именем файла}

reset (f);{открытие файла для чтения}

for i:=1 to 30 do begin

read(f,c);{чтениеввод данных из файла}

write(c,' ');

end;

writeln ('Полученный массив ');

seek (f,9);{установка на 10 запись в файле}

for i:=1 to 5 do begin

read( f,a[i]);{чтение из файла}

write (a[i],' ');

end;

seek (f,0); {установка на начало файла}

for i:=6 to 10 do begin

read(f,a[i]);{чтение из файла}

write (a[i],' ');

end;

close (f); {завершить работу с файлом – закрыть файл}

readln;

end.

 

Пример  7.16.  Ввод  из  файла  10  чисел  в  одномерный  массив  в следующем порядке:

– сначала все отрицательные числа файла c 12 по 20 позиции;

– затем все, начиная с первой позиции файла. program kr2;

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

i,j:byte;

c:integer;

f: file of integer; {объявление файловой переменной}

begin

assign (f,'mkurs.dat');{связывание файловой переменной с именем файла}

reset (f);           {открытие файла}

writeln(' Исходный файл ');

while not Eof(f) do   {проверка на конец файла}

begin

read(f,c);          {считывание из файла всех чисел}

write(c:4);

end;

seek (f,11);          {установка файла на 12 позицию}

writeln ('полученный массив А ');

for i:=1 to 10 do begin

read(f,c);          {чтение из файла}

if c<=0 then begin a[i]:=c;

write (a[i],' ');

end;

if filepos(f)=20 then begin

j:=i; i:=10; end;

end;

seek(f,0);          {установка в начало файла}

for i:=j–3 to 10 do begin

read (f,a[i]); {чтение из файла}

write (a[i],' ');

end;

readln;

close (f);   {закрытие файла}

end.

 

Задания для самостоятельного выполнения

1.  Дан  массив  целых  чисел  а1,...,аn.  Сформировать массив  В  из  поло-

жительных элементов массива А.

2. Дан массив действителных чисел a1,...,an. Получить количество отрицательных элементов массива и пpоизведение элементов, принад- лежащих отрезку [с,в].

3. Дан массив целых чисел a1,...,an. Найти в нем все пары аi,ai+1, такие, что ai<=3 и ai+1<0. Распечатать их значения, номеpа, если таких паp нет, то выдать сообщение.

4. Дан массив целых чисел a1,...,an. Найти в данной последовательности все пары аi,ai+1, такие, что ai=0 и ai+2 кратно 2.

5. Даны действительные числа а1...а16. Получить мах (а1+а16,a2+a15,..., a8+a9).

6.   Даны   целые   числа   a1,…,an.   Все   члены   массива   a1,...,an,   пред-

шествующие наименьшему числу, домножить на это число.

7. Дан массив символов s1,…,sn. Подсчитать, сколько раз встречается в этой последовательности символ К.

8.  Дан  массив  символов  S1,...,Sn.  Удалить  из  него  все  буквы,  непос-

редственно перед которыми находится буква С.

9. Дан массив символов S1,...,Sn. Напечатать true, если в заданном массиве буква а встречается чаще, чем буква b, и напечатать false в противоположном случае.

10. Даны действительные числа а1,…,a16. Получить min(a1*a9, a2*a10,..., a8*a16).

11. Дан массив действительных чисел a1,...,an. Выяснить, верно ли, что наибольший элемент массива a1,...,an по модулю больше единицы.

12. Дан массив целых чисел a1,...,an. Найти максимальный элемент массива и поменять его местами с первым элементом.

13. Дан массив целых чисел a1,...,an. Найти минимальный элемент массива и поменять его местами с последним элементом.

14. Дан массив действительных чисел а1,...,аn. Выяснить, имеются ли в данном массиве 2 идущих подряд положительных элемента. Подсчитать количество таких пар.

15. Дан массив действительных чисел a1,...,an. Заменить все элементы массива, находящиеся в интервале от с1 до с2 на минимальный. Исходный и скорректированный массивы напечатать.

16. Дан массив действительных чисел a1,...,an. Если среди элементов массива есть хотя бы одно число больше 100, то все элементы массива поделить на 100. Исходный и скорректированный массивы напечатать.

17.  Даны  целые  числа  a1,...,an.  Определить  количество  целых    чисел,

входящих в последовательность a1,...,an по одному разу.

18.       Даны    целые    числа    a1,…,an.    Из    модулей    членов    данной последовательности     выбрать       наибольший.       Получить       новую последовательность из n целых чисел, заменяя ai нулем, если /ai/ не совпадает с выбранным значением, и заменяя ai единицей, если совпадает.

19. Пеpенести в хвост одномеpного массива максимальный элемент.

20.       Даны  действительные  числа  a1,...,an.  Требуется  найти  В  равное среднему арифметическому чисел a1,…,an, и наибольшее отклонение от среднего, т. е. max(/a1–b/,/a2–b/,../an–b/).

21. Даны 2 последовательности действительных чисел x1,…,xn и y1,…,yn. Выяснить, верно ли, что среди точек (xi,y1) есть хотя бы одна, принадлежащая квадрату, стороны которого параллельны координатным осям, центр совпадает с началом координат, а длина стороны равна 2. Вывести координаты точек, удовлетворяющих этому условию.

22. Даны 2 последовательности действительных чисел x1,..,x10, e1,..,e10. Выяснить, верно ли, что все точки (xi,yi) принадлежат кругу радиуса 2 с центром в точке (1,1).

УКАЗАНИЕ:   воспользуйтесь          формулой       R*R=x*x+y*y  для      круга   с центром в точке (0,0).

23. Дан массив целых чисел a1,..,an. Выяснить, какая из трех ситуаций имеет место: все числа a1,..,an равны нулю, в последовательности a1,...,an первое ненулевое число – положительное, первое ненулевое число – отрицательное.

24. Пеpенести в хвост одномеpного массива пеpвый отpицательный элемент.

25. Подсчитать в одномеpном массиве максимальное количество подpяд идущих единиц.

26. Пеpенести в начало одномеpного массива втоpой нулевой элемент.

27.       Подсчитать   в   одномеpном   массиве   количество   сеpий   подpяд идущих единиц.

28.  Исключить  из  массива  А1..AN  пеpвую  сеpию  отpицательных элементов.

29. Пеpенести в хвост одномеpного массива все отpицательные элементы.

30. Пеpенести в начало одномеpного массива все нечетные элементы.

31. Исключить из массива А1..AN пеpвый четный элемент, следующий  за максимальным.

32.       Исключить  из  массива  слов  пеpвое  слово,  заканчивающееся  на букву А.

33. Дан массив действительных чисел a1,...,an. Найти максимальный элемент среди отрицательных элементов и поменять его местами с минимальным положительным.

34. Дан массив слов a1,...,an . Найти пpедпоследнее слово с максимальной длиной и напечатать его значение и индекс.

35. Даны 2 массива целых чисел х1,...,хn, y1,...,yn.

Получить новый массив по cледующему правилу:

xi+yi

zi =

yi

36.       Дан     массив            целых  чисел  а1,...,аn.           Сформировать           массив            В          по следующему правилу:

2(аi+i), если а>p

Bi=       2(ai–i), если а<p

0          , если a=p

Значение константы p задается самостоятельно.