Поиск по этому блогу

понедельник, 16 января 2017 г.

Работа с массивами на примере заданий С25 ЕГЭ



Рассмотрим две задачи.

1.Дан мас­сив, со­дер­жа­щий 2016 по­ло­жи­тель­ных целых чисел, не пре­вы­ша­ю­щих 1000. Не­об­хо­ди­мо найти и вы­ве­сти мак­си­маль­ный из тех эле­мен­тов этого мас­си­ва, чётность ко­то­рых сов­па­да­ет с чётно­стью про­из­ве­де­ния всех эле­мен­тов.
На­при­мер, в мас­си­ве из шести эле­мен­тов, рав­ных со­от­вет­ствен­но 2, 3, 1, 5, 6, 4, про­из­ве­де­ние всех эле­мен­тов чётно, зна­чит, от­ве­том будет мак­си­маль­ный чётный эле­мент, то есть 6.

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

const
    N=2016;
var
    a: array [1..N] of integer;
    i, m, k: integer;
begin
    for i:=1 to N do
        readln(a[i]);
    …
end.

РЕШЕНИЕ:

  • Анализируем условие задачи и данный фрагмент программы. Если решать на прямую, т.е. искать произведение всех элементов чтобы определить его четность, мы столкнемся с проблемой сохранения результата этого произведения. Все переменные целого типа, а он как вы понимаете очень ограничен (-32568..32567). Предварительная оценка произведения элементов массива, даже если все они будут равны 2 составит два в 2016-й степени, а они могут доходить и до 1000. Следовательно, находить произведение элементов массива невозможно ("За­пре­ща­ет­ся ис­поль­зо­вать пе­ре­мен­ные, не опи­сан­ные ниже, но раз­ре­ша­ет­ся не ис­поль­зо­вать часть из опи­сан­ных"). Но можно догадаться что, если хотя бы один элемент массива будет четным, то и все произведение будет четным. Это и будем проверять.
randomize; k:=1;
    for i:=1 to N do
     begin
        a[i]:=random(1000)+1;
        if a[i] mod 2 =0 then k:=0;
     end;
  • В этом фрагменте мы используем генератор случайных чисел для заполнения массива (randomize; ... a[i]:=random(1000)+1;) и определяем четность каждого элемента массива ( if a[i] mod 2 =0 then k:=0;) В начале фрагмента мы переменной k присваиваем  1 (k:=1;) и т.к. нам достаточно хотя бы одного четного элемента. то при выполнении условия  a[i] mod 2 =0 мы меняем значение k на равное 0. Если этого ни разу не произойдет, т.е. все элементы массива будут нечетными, то k останется равным 1.
  • Теперь в зависимости от значения k  мы будем искать максимальный четный элемент (если k=0) или максимальный нечетный элемент в противном случае.
 if k=0 then begin
     { поиск максимального четного элемента} end;     
     else begin
      f{ поиск максимального нечетного элемента} end;

  • Поиск максимального осуществляется классическим способом. Переменную m делаем равной нулю. и перебирая все элементы массива сперва определяем их четность ( if a[i] mod 2=0 then или  if a[i] mod 2=1 then ), затем сравниваем с максимальным m, при необходимости меняем максимальный (m:=a[i];). Остается вывести результат ( write(m);).

const
    N=2016;
var
    a: array [1..N] of integer;
    i, m, k: integer;
begin
randomize; k:=1;
    for i:=1 to N do
     begin
        a[i]:=random(1000)+1;
        if a[i] mod 2 =0 then k:=0;
     end;
     m:=0;
     if k=0 then begin
      for i:=1 to n do
       if a[i] mod 2=0 then
         if a[i]>m then m:=a[i]end
     else begin
      for i:=1 to n do
       if a[i] mod 2=1 then
         if a[i]>m then m:=a[i];end;
    write(m);
   end.
2. Опи­ши­те на рус­ском языке или одном из язы­ков про­грам­ми­ро­ва­ния ал­го­ритм вы­чис­ле­ния раз­но­сти между сред­ним ариф­ме­ти­че­ским мак­си­маль­но­го и ми­ни­маль­но­го зна­че­ний эле­мен­тов за­дан­но­го це­ло­чис­лен­но­го мас­си­ва из 30 эле­мен­тов и сред­ним ариф­ме­ти­че­ским всех эле­мен­тов этого мас­си­ва.
РЕШЕНИЕ:

  • Описываем константу n - количество элементов массива
  • Описываем переменные:  а - целочисленный массив, i, sum, max, min -переменные целого типа
  • При заполнения массива  с клавиатуры сразу находим сумму элементов массива (sum).
  • В следующем цикле ищем максимальный и минимальный элементы, выбрав для начального их значения первый элемент массива (max:=a[1];min:=a[1];).
  • Выводим результат - разность между средним арифметическим мак­си­маль­но­го и ми­ни­маль­но­го зна­че­ний эле­мен­тов ((max+min)/2) и сред­ним ариф­ме­ти­че­ским всех эле­мен­тов этого мас­си­ва (sum/n), задав формат вывода результата :3:2 

const
  n=30;
var
   a: array [1..n] of integer;
   i, max,min, sum: integer;
begin
  sum:=0;
  for i:=1 to n do
     begin
             readln(a[i]);
             sum:=sum+a[i];
     end;
  max:=a[1];min:=a[1];
  for i:=2 to n do
    begin
         if a[i] > max then max:=a[i];
         if a[i] < min then min:=a[i];
    end;
  write((max+min)/2-(sum/n):3:2);
end.

Также можно прочитать эту запись 

Комментариев нет:

Отправить комментарий