ВВЕРХ
ВНИЗ
  • Home
  • Array
  • Array 40 - 44

Array 40 - 44

Здесь представлены следующие задачи из задачника Абрамяна:

Array40 - находим наиболее близкий к данному числу элемент массива.

Array41 - находим максимальную сумму соседних элементов массива.

Array42 - находим наиболее близкую к данному числу сумму соседних элементов массива.

Array43 - находим количество различных чисел в упорядоченном массиве.

Array44 - находим номера двух одинаковых элементов массива.

Array40. Дано число R и массив A размера N. Найти элемент массива, который наиболее близок к числу R (т. е. такой элемент AK, для которого величина |AK - R| является минимальной).

Последовательность действий при решении задачи Array40:

1)Сначала вводим элементы массива с помощью цикла for.

2)По умолчанию ставим K := 1 (K - номер числа, наиболее близкое к R).

3)Находим min := |a[i] - R| - начальная разность (по модулю) между a[1] и R.

4)Заходим в цикл и вводим следующее a[i] (начиная с i = 2, поскольку a[1] мы уже ввели).

5)Проверяем условие |a[i] - R| < min. Если оно выполняется, то новым min становится |a[i] - R|, а номер K := i.

6)После выхода из цикла выводим a[K], которое и будет наиболее близким к R.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
var
  R, min: real;
  N, K, i: integer;
  A: array[1..100] of real;
  
begin
  write('R = ');
  readln(R);
  write('N = ');
  readln(N);
  writeln('Введите массив размера ', N, ':');
  for i := 1 to N do read(a[i]); //вводим элементы массива
  K := 1; //начальное значение номера нужного элемента
  min := abs(a[1] - R); //начальное значение минимальной величины
 { Проверяем остальные значения: }
  for i := 2 to N do
    if abs(a[i] - R) < min then begin //мы нашли меньшую разницу
      min := abs(a[i] - R); //присваиваем минимуму min это число
      k := i //запоминаем номер
    end;
  writeln;
  writeln('A[', K, '] = ', A[K])
end.

*   *   *

Второй вариант решения Array40 отличается тем, что ввод чисел и проверка условий выполняются в одном цикле, кроме первого числа a[1], которое вводится перед вхождением в цикл.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
var
  R, min: real;
  N, K, i: integer;
  A: array[1..100] of real;
  
begin
  write('R = ');
  readln(R);
  write('N = ');
  readln(N);
  writeln('Введите массив размера ', N, ':');
  read(a[1]);//вводим 1-й элемент массива
  K := 1; //начальное значение номера
  min := abs(a[1] - R); //начальное значение минимальной величины
 { Проверяем остальные значения: }
  for i := 2 to N do begin
    read(a[i]);
    if abs(a[i] - R) < min then begin //мы нашли меньшую разницу
      min := abs(a[i] - R); //присваиваем минимуму min это число
      k := i //запоминаем номер
    end
  end;
  writeln;
  writeln('A[', K, '] = ', A[K])
end.

*   *   *

Третий вариант решения задачи Array40 - все данные и проверку условий выполняем в одном цикле, используя логическую переменную first (индикатор ввода первого числа).

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
var
  R, min: real;
  N, K, i: integer;
  A: array[1..100] of real;
  first: boolean;
  
begin
  write('R = ');
  readln(R);
  write('N = ');
  readln(N);
  first := false;
  writeln('Введите массив размера ', N, ':');
  for i := 1 to N do begin
    read(a[i]); //вводим элементы массива
    if not first then begin //начальные значения не призначены
      K := 1; //начальное значение номера нужного элемента
      min := abs(a[1] - R); //1-е значение минимальной величины
      first := true
    end
    elseelse{ Проверяем остальные значения: }
    if abs(a[i] - R) < min then begin //мы нашли меньшую разницу
      min := abs(a[i] - R); //присваиваем минимуму min это число
      k := i //запоминаем номер
    end;
  end;
  writeln;
  writeln('A[', K, '] = ', A[K])
end.

Array41. Дан массив размера N. Найти два соседних элемента, сумма которых максимальна, и вывести эти элементы в порядке возрастания их индексов.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
var
  N, i, k: integer;
  max: real;
  A: array[1..100] of real;
  
begin
  write('N = ');
  readln(N);
  writeln('Введите массив ', N, ' элементов:');
  for i := 1 to N do read(a[i]); //вводим элементы массива
  k := 1; //начальный индекс
  max := a[k] + a[k + 1]; //начальная сумма соседних элементов
  for i := 3 to N do
    if max < a[i - 1] + a[i] then //находим большую сумму
    begin
      max := a[i - 1] + a[i];//запоминаем сумму
      k := i - 1 //запоминаем первый индекс
    end;
  writeln;
  writeln('a[', k, '] + a[', k + 1, '] = ', max)
end.

Array42. Дано число R и массив размера N. Найти два соседних элемента массива, сумма которых наиболее близка к числу R, и вывести эти элементы в порядке возрастания их индексов (определение наиболее близких чисел дано в задании Array40).

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
var
  N, i, K: integer;
  R, min: real;
  A: array[1..100] of real;
  
begin
  write('R = ');
  readln(R);
  write('N = ');
  readln(N);
  writeln('Введите массив размера ', N, ':');
  for i := 1 to N do read(a[i]); //вводим элементы массива
  K := 2; //начальное значение номера нужного элемента
  min := abs(a[K - 1] + a[K] - R); //начальное значение минимума
 { Проверяем остальные значения: }
  for i := 3 to N do
    if abs(a[i - 1] + a[i] - R) < min then begin //мы нашли меньшую разницу
      min := abs(a[i - 1] + a[i] - R); //находим новый min
      k := i //запоминаем номер
    end;
  writeln;
  writeln('A[', K - 1, '] = ', A[K - 1], ', A[', K, '] = ', A[K])
end.

*   *   *

А вот так задачу Array42 можно решить без использования массива:

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
var
  N, i, K: integer;
  a, b, a1, b1, R, min: real;
  
begin
  write('R = ');
  readln(R);
  write('N = ');
  readln(N);
  writeln('Введите ', N, ' элементов:');
  for i := 1 to N do
    if i = 1 then read(a) //вводим а - первое число
    else
    if i = 2 then begin
      read(b); //вводим b - второе число
      min := abs(a + b - R); //начальное значение min
      a1 := a; b1 := b; //запоминаем a и b
      K := 2; //запоминаем индекс числа b
      a := b //второе число делаем первым
    end
    else begin
      read(b); //вводим второе число
      if abs(a + b - R) < min then begin
        min := abs(a + b - R); //находим новый min
        a1 := a; b1 := b; //запоминаем a и b
        K := i; //запоминаем индекс второго числа
      end;
      a := b //второе число делаем первым
    end;
  writeln;
  writeln(' a[', K - 1, '] = ', a1, ', a[', K, '] = ', b1)
end.

Array43. Дан целочисленный массив размера N, все элементы которого упорядочены (по возрастанию или по убыванию). Найти количество различных элементов в данном массиве.

Чтобы найти количество различных чисел в упорядоченном (!) массиве, достаточно сравнивать соседние элементы. Поэтому последовательность наших действий проста: если вводимый i-й элемент не равен предыдущему (i-1)-му, то количество Q различных чисел увеличивается на 1, начиная со второго элемента (i > 1). И здесь не важно, какая упорядоченность - по возрастанию или по убыванию.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
var
  i, N, Q: integer;
  A: array[1..100] of integer;
  
begin
  write('N = ');
  readln(N);
  Q := 1; //количество различных чисел равно как минимум 1
  writeln('Введите ', N, ' целых чисел:');
  for i := 1 to N do begin
    read(a[i]); //вводим число
   { Если i-й элемент не совпадает с предыдущим, то 
   для всех i > 1 будем увеличивать количество Q: }
    if (i > 1) and (a[i] <> a[i - 1]) then inc(Q)
  end;
  writeln;
  writeln('Различных чисел: ', Q)
end.

*   *   *

А если массив не упорядоченный? Тогда последовательность действий усложняется: нужно вводимый i-й элемент сравнивать со всеми введенными ранее - 1-м, 2-м, 3-м, ..., (i - 1)-м. Если не находим ни одного совпадения, то увеличиваем число Q на 1.

Вводить числа будем случайным образом при помощи функции random(N) - случайное целое число от 0 до N-1. В таком случае программа для определения количества различных чисел в неупорядоченном массиве запишется следующим образом.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
var
  i, j, N, Q: integer;
  A: array[1..100] of integer;
  bln: boolean;
  
begin
  write('N = ');
  readln(N);
  Q := 1; //количество различных чисел равно как минимум 1
  randomize;
  writeln('Введите ', N, ' целых чисел:');
  for i := 1 to N do begin
   ///вводим числа:
    a[i] := random(10); //находим случайное число от 0 до 9
    write(a[i]:4); //выводим его на экран, выделяя ему 4 позиции
    bln := false; //число a[i] отличное от предыдущих   
   { Дальше сравниваем i-е число a[i] со всеми предыдущими 
   числами a[j] с индексами 1, 2, ..., i - 1: }
    for j := 1 to i - 1 do
      if a[i] = a[j] then begin //если i-е и j-е числа равны
        bln := true; //число a[i] совпадает с предыдущим a[j]
        break //и сразу выходим (не имеет смысла продолжать)
      end;
   { Если равных элементов нет (bln = false), то 
   увеличиваем количество Q разных чисел на 1: }
    if (bln = false) and (i > 1) then inc(Q)
  end;
  writeln;
  writeln('Различных чисел: ', Q)
end.

Array44. Дан целочисленный массив размера N, содержащий ровно два одинаковых элемента. Найти номера одинаковых элементов и вывести эти номера в порядке возрастания.

Последовательность действий следующая: сначала ставим по умолчанию количество совпадений (одинаковых элементов) равным 0 (Q := 0). Потом в цикле будем вводить элементы a[i], а также сравнивать введенный i-й элемент со всеми введенными ранее (смотрите выше Array43, второй вариант решения). Если совпадение есть (a[i] = a[j], j < i), то запоминаем номера j и i (i1 := j, i2 := i), а также увеличиваем Q на 1. Все это проверяем в том случае, если Q = 0, то есть до того момента, пока ещё не было совпадений.


Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
var
  i, j, N, Q, i1, i2: integer;
  A: array[1..100] of integer;
  
begin
  write('N = ');
  readln(N);
  Q := 0; //количество совпадений сначала равно 0
  writeln('Введите ', N, ' целых чисел:');
  for i := 1 to N do begin
    read(a[i]); //вводим числа
   { Дальше сравниваем i-е число a[i] со всеми предыдущими 
   числами a[j] с индексами 1, 2, ..., i - 1 при том условии, 
   что совпадений ещё нет (Q = 0): }
    if Q = 0 then
      for j := 1 to i - 1 do
        if a[i] = a[j] then begin //если i-е и j-е числа равны
          i1 := j; i2 := i; //находим номера i1 и i2
          inc(Q); //увеличиваем количество совпадений на 1
          break //и сразу выходим (не имеет смысла продолжать)
        end
  end;
  writeln;
  writeln('Номера одинаковых элементов: ', i1:3, i2:3)
end.

В последних двух примерах мы воспользовались оператором выхода break – он предназначен для досрочного выхода из цикла. Рекомендую детально с ним ознакомится. На этом все, пишите в комментариях, если есть вопрорсы.


Яндекс.Метрика