Раздел: Задачи / Простейшие /
Найти количество четных чисел в массиве
Основы программирования Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее... |
Условие задачи 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). Надеюсь, вы понимаете, к чему я клоню. И это вторая причина применять пользовательский тип данных для массива.
Осталось рассказать, для чего используются функции в такой простой программе. Ну здесь ничего необычно - чтобы упростить исходный код основной программы.
Да, в этой учебной программе можно было обойтись и без лишних заморочек. Но если бы вы разрабатывали большую сложную программу, то одни и те же действия могли бы выполняться в ней несколько раз. И такие действия, конечно, удобно выполнять в виде функций.
Ну вот как-то так. А теперь примеры программ на Паскале и С++.
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.
#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
Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее... |
Помощь в технических вопросах
Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее... |