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

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

Основы программирования 2.0 Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее...

Условие задачи 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, поэтому исходный код не вполне соответствует примеру на Паскале.

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


Как стать программистом 2.0 Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее...
Помощь в технических вопросах Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

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