Согласие на обработку персональных данных.

08.04.2019
Новый выпуск журнала Автоматизация и программирование.

27.04.2019
Новые видео и статья Процедура Dispose.

23.04.2019
Новые видео и статья Как передать массив в функцию.

19.04.2019
Новая задача Как преобразовать секунды в часы-минуты-секунды.

07.03.2019
Новый выпуск журнала Автоматизация и программирование.



Раздел: Задачи / Простейшие /

Найти количество четных чисел в массиве

Условие задачи 2.74

Задача 2.74
Дан одномерный массив А неупорядоченных целых чисел. Вывести на экран количество чётных чисел, расположенных от начала массива до положения первого наибольшего элемента.

Сегодня я покажу вам, как из простой задачи сделать сложную )))

На самом деле, конечно, усложнение будет кажущимся. Ну да, я буду использовать константы, пользовательские типы данных и функции, хотя для такой задачи можно было бы обойтись и без них.

Но моя цель - не только показать решение, но и приблизить новичка к тому, как создаются настоящие программы.

Само решение я описывать не буду. Опытные и так поймут, а новичкам будет полезно разобраться самим (если что - в примерах программ есть комментарии). А расскажу только о том, для чего я использовал те или иные ходы. Итак…

Для чего используются константы, я уже говорил не раз. Но не грех и повторить. Если одно и то же постоянное значение имеется в программе в нескольких местах, то в случае его замены на другое, вам придётся менять это значение во всех участках программы. А это, во-первых, займёт больше времени, а во-вторых, где-то это значение можно просто пропустить. Если же вы используете константу, то при замене значения вам надо будет изменить его только в одном месте программы. Кроме того, давая константам осмысленные имена, вы будет понимать, для чего используется это значение, найдя имя константы в вашей программе из миллиона строк.

Зачем использовать пользовательский тип данных?

Тоже две причины.

Во-первых, в Паскале вы не можете в объявлении функции в качестве параметра использовать массив. То есть вот так:

function GetIndexMaxValue(M : array[1..MAX_INDEX] of WORD) : WORD;

не проканает. Компилятор будет шибко ругаться, однако. Поэтому сначала надо определить новый тип данных, например, вот так:

type TMas = array[1..MAX_INDEX] of WORD;

а потом уже можно объявить функцию, например, вот так:

function GetIndexMaxValue(M : TMas) : WORD;

Ну а почему бы тогда не использовать массив как глобальную переменную и не париться?

Дело в том, что использовать в подпрограммах глобальные переменные без крайней необходимости считается дурным тоном. И это не спроста.

Представьте, что у вас объявлен массив с элементами типа BYTE, и вы работаете с ним в нескольких функциях. Да так работаете, что приходится в функциях создавать локальные переменные - массивы с элементами типа BYTE. Это уже сильно неудобно. Но ещё веселее будет, если вам вдруг потребуется изменить тип элементов (например, WORD вместо BYTE). Надеюсь, вы понимаете, к чему я клоню. И это вторая причина применять пользовательский тип данных для массива.

Осталось рассказать, для чего используются функции в такой простой программе. Ну здесь ничего необычно - чтобы упростить исходный код основной программы.

Да, в этой учебной программе можно было обойтись и без лишних заморочек. Но если бы вы разрабатывали большую сложную программу, то одни и те же действия могли бы выполняться в ней несколько раз. И такие действия, конечно, удобно выполнять в виде функций.

Ну вот как-то так. А теперь примеры программ на Паскале и С++.

Решение задачи 2.74 на Паскале
 
program mytask;

//****************************************************************
// КОНСТАНТЫ
//****************************************************************
const
  MAX_INDEX = 20;
  MAX_VALUE = 500;

//****************************************************************
// ТИПЫ ДАННЫХ
//****************************************************************
type TMas = array[1..MAX_INDEX] of WORD;

//****************************************************************
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
//****************************************************************
var
  i      : WORD;
  MaxA   : WORD;
  A      : TMas;

//****************************************************************
// ФУНКЦИИ И ПРОЦЕДУРЫ
//****************************************************************

//****************************************************************
// Функция ищет наибольший элемент массива.
// ВХОД  : массив для поиска
// ВЫХОД : индекс элемента с наибольшим значением
//****************************************************************
function GetIndexMaxValue(M : TMas) : WORD;
var i, MaxWord, MaxM : WORD;
begin
  MaxM := 0;
  MaxWord := Low(MaxWord);
  //Найти наибольший элемент в массиве
  for i := 1 to MAX_INDEX do
    if M[i] > MaxWord then
      begin
        MaxWord := M[i];
        MaxM := i;
      end;
  Result := MaxM;
end;

//****************************************************************
// Функция подсчитывает количество чётных чисел в массиве до 
// указанного элемента.
// ВХОД  : М - массив для поиска,
//         N - индекс элемента, до которого выполняется поиск
// ВЫХОД : количество чётных чисел до элемента с индексом N
//****************************************************************
function GetNumOdd(M : TMas; N : WORD) : WORD;
var i, NumOdd : WORD;
begin
  Result := 0;
  //Если просматривать массив не далее 1-го элемента
  if N < 2 then
    begin
      if (not Odd(M[1])) then Result := 1;
      Exit;
    end;
  NumOdd := 0;
  for i := 1 to N-1 do
    if (not Odd(M[i])) then Inc(NumOdd);
  Result := NumOdd;
end;

//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
//****************************************************************
begin
  Randomize;
// Заполнить массив случайными числами
  for i := 1 to MAX_INDEX do
    A[i] := Random(MAX_VALUE);

// Вывести массив на экран (значения с индексами)
  for i := 1 to MAX_INDEX do
    Write('[', i, ']', A[i], ' ');

// Вычислить и вывести результат
  MaxA := GetIndexMaxValue(A);
  WriteLn(#10#13, 'The index of the largest element: ', MaxA);
  WriteLn('Number of even numbers: ', GetNumOdd(A, MaxA));

  WriteLn('The end. Press ENTER...');
  ReadLn;
end.  
Решение задачи 2.74 на С++
#include <cstdlib>
#include <iostream>

//****************************************************************
// КОНСТАНТЫ
//****************************************************************
const int MAX_INDEX = 20;
const int MAX_VALUE = 500;

//****************************************************************
// ТИПЫ ДАННЫХ
//****************************************************************
typedef unsigned short int TMas[MAX_INDEX-1];    

using namespace std;

unsigned short int i;
unsigned short int MaxA;
TMas A; 

//****************************************************************
// ФУНКЦИИ И ПРОЦЕДУРЫ
//****************************************************************

//****************************************************************
// Функция ищет наибольший элемент массива.
// ВХОД  : массив для поиска
// ВЫХОД : индекс элемента с наибольшим значением
//****************************************************************
unsigned short int GetIndexMaxValue(TMas M)
{
  unsigned short int i, MaxWord, MaxM;

  MaxM = 0;
  MaxWord = 0;
  //Найти наибольший элемент в массиве
  for (i = 0; i < MAX_INDEX; i++)
    if (M[i] > MaxWord)
    {
      MaxWord = M[i];
      MaxM = i;
    }
  return(MaxM);
} 

//****************************************************************
// Функция подсчитывает количество чётных чисел в массиве до 
// указанного элемента.
// ВХОД  : М - массив для поиска,
//         N - индекс элемента, до которого выполняется поиск
// ВЫХОД : количество чётных чисел до элемента с индексом N
//****************************************************************
unsigned short int GetNumOdd(TMas M, unsigned short int N)
{
  unsigned short int i, NumOdd;
  NumOdd = 0;
  //Если просматривать массив не далее 1-го элемента
  if (N < 1)
  {
    if ((M[0] % 2) == 0) return(1);
    else return(0);
  }
  
  for (i = 0; i < N; i++)
    if ((M[i] % 2) == 0) NumOdd++;
  
  return(NumOdd);    
}       

//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
//****************************************************************
int main(int argc, char *argv[])
{
  srand(time(0));      //Запустить генератор случайных чисел
  
// Заполнить массив случайными числами
  for (i = 0; i < MAX_INDEX; i++)
    A[i] = rand() % MAX_VALUE;

// Вывести массив на экран (значения с индексами)
  for (i = 0; i < MAX_INDEX; i++)
    cout << "[" << i << "]" << A[i] << " ";

// Вычислить и вывести результат
  MaxA = GetIndexMaxValue(A);
  cout << endl << "The index of the largest element: " << MaxA << endl;
  cout << "Number of even numbers: " << GetNumOdd(A, MaxA) << endl; 
  
  system("PAUSE");
  return EXIT_SUCCESS;
}

Найти количество четных чисел в массиве

ПРИМЕЧАНИЕ
Небольшое пояснение всё-таки дам. В функции GetNumOdd на первый взгляд слишком много лишнего. Но это связано с тем, что по условию задачи нам надо вывести чётные элементы до положения первого наибольшего элемента. То есть если наибольший элемент будет также чётным, то его учитывать не надо. Решение, которое я применил, не является самым изящным и самым простым. Можно было добиться того же итога более красиво. Если хотите - попробуйте. Можете считать это домашним заданием )))

ПРИМЕЧАНИЕ
Обратите внимание, что в примере на С++ индексация массива начинается с 0, поэтому исходный код не вполне соответствует примеру на Паскале.

ВНИМАНИЕ!
Если вам что-то осталось непонятно, то советую почитать книги “Основы программирования” и “Основы С++”.


Основы C++ Основы C++

C++ - это один из самых популярных языков программирования. Не важно, на каком языке программируете лично вы. Но, если вы хотя бы в общих чертах не знаете С++, то это большой пробел в вашем образовании, который надо восполнить как можно быстрее... Подробнее...
Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

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