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

Даны натуральные числа от 1 до 33

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

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

Задача 2.15
Даны натуральные числа от 1 до 33. Вывести на экран эти числа, кроме тех, которые делятся на три или оканчиваются на три.

Если вы подзабыли, что такое натуральное число, то читайте здесь.

Итак, для решения этой задачи будем использовать цикл, в котором будем выводить числа от 1 до 33, при условии, что число не делится на три и не заканчивается на три.

Напрашивается решение создать функцию, которая проверяет число на соответствие этим условиям, а в цикле вызывать эту функцию. Так и поступим.

Если бы мы писали настоящую программу, то можно было бы также предположить, что эти проверки могут нам пригодиться и по отдельности. То есть более разумно создать не одну, а три функции: одна будет проверять, делится ли число на три, другая - оканчивается ли число на три, а третья будет вызывать эти две функции и проверять, обе ли они возвращают интересующий нас результат.

Также имеет смысл, раз уж мы решили создать универсальные функции, проверять деление и окончание не на три, а на число, передаваемое в функцию.

Также мы понимаем, что на три делится любое число. Поэтому условие задачи является неполным. По идее надо было сформулировать по другому: делится ли число на три без остатка.

Делится ли число на три

Проверить, делится ли одно число на другое без остатка довольно просто - надо выполнить деление по модулю. Если результат будет равен нулю, значит число Х делится на заданное число без остатка. Пример:

var Result : boolean;

Result := (Num mod Divider) = 0;

Здесь Num - проверяемое число, Divider - делитель. Если число Num делится на число Divider без остатка, то в переменной Result будет TRUE.

Заканчивается ли число на три

Здесь будет немного сложнее. Но лишь немного.

Вариантов решения может быть несколько. Например, можно преобразовать число в строку и проверить, чему равен последний символ в этой строке.

Но мы немного поизголяемся и выберем более экзотическое решение, наша функция для проверки этого условия будет выглядеть так:

//******************************************************
// Проверяет, оканчивается ли число на заданную цифру
// ВХОД: Num - проверяемое число
//       Dig - заданная цифра
// ВЫХОД: TRUE - число Num оканчивается на Dig, 
//        FALSE - оканчивается на другую цифру
//******************************************************
function CheckNumberLast(Num, Dig : byte) : boolean;
begin
  Result := FALSE;
  if (Dig < 1) or (Dig > 9) then Exit;
  if Num < 10 then Result := Num = Dig
  else Result := ((Num - Dig) mod 10) = 0;
end;

Сначала мы проверяем заданную цифру (в нашем случае это 3) - она должна быть в пределах от 1 до 9 (на ноль делить нельзя, и последняя цифра в числе не может быть больше 9).

Далее, если число состоит из одной цифры, мы просто проверяем, не равна ли она заданной цифре.

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

Пример: заданное число 12, заданная цифра 3.

12 - 3 = 9
9 mod 10 = 9 <> 0

Следовательно, 12 не заканчивается на 3.

Пример: заданное число 23, заданная цифра 3.

23 - 3 = 20
20 mod 10 = 0

Следовательно, 23 заканчивается на 3.

Как всегда, пример решения будет на двух языках - на Паскале и на С++.

Решение задачи 2.15 на Паскале
program t215;

//****************************************************************
// КОНСТАНТЫ
//****************************************************************
const
  FIRST_NUM = 1;    //Первое число диапазона
  LAST_NUM = 33;    //Последнее число диапазона
  CHECK_NUM = 3;    //Проверочное число

//****************************************************************
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
//****************************************************************
var
  i : byte;

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

//****************************************************************
// Проверяет, делится ли число на заданный делитель
// ВХОД: Num - проверяемое число
//       Divider - делитель
// ВЫХОД: TRUE - число Num делится на Divider без остатка, 
//        FALSE - не делится
//****************************************************************
function CheckNumberDiv(Num, Divider : byte) : boolean;
begin
  Result := (Num mod Divider) = 0;
end;

//****************************************************************
// Проверяет, оканчивается ли число на заданную цифру
// ВХОД: Num - проверяемое число
//       Dig - заданная цифра
// ВЫХОД: TRUE - число Num оканчивается на Dig,
//        FALSE - оканчивается на другую цифру
//****************************************************************
function CheckNumberLast(Num, Dig : byte) : boolean;
begin
  Result := FALSE;
  if (Dig < 1) or (Dig > 9) then Exit;
  if Num < 10 then Result := Num = Dig
  else Result := ((Num - Dig) mod 10) = 0;
end;

//****************************************************************
// Проверяет число на соответствие условиям:
//            - делится ли число на заданную цифру
//            - оканчивается ли число на заданную цифру
// ВХОД: Num - проверяемое число
//       Dig - заданная цифра
// ВЫХОД: TRUE - число соответствует одному из условий,
//        FALSE - не соответствует ни одному
//****************************************************************
function CheckNumber3(Num, Dig : byte) : boolean;
begin
  Result := CheckNumberDiv(Num, Dig) or CheckNumberLast(Num, Dig);
end;

//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
//****************************************************************
begin
  for i := FIRST_NUM to LAST_NUM do
    if not CheckNumber3(i, CHECK_NUM) then Write(i, '  ');
  WriteLn(#10#13'The end. Press ENTER...');
  ReadLn;
end.

Решение задачи 2.15 на С++
#include 
#include 

using namespace std;

//****************************************************************
// КОНСТАНТЫ
//****************************************************************
const int FIRST_NUM = 1;    //Первое число диапазона
const int LAST_NUM = 33;    //Последнее число диапазона
const int CHECK_NUM = 3;    //Проверочное число     

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

//****************************************************************
// Проверяет, делится ли число на заданный делитель
// ВХОД: Num - проверяемое число
//       Divider - делитель
// ВЫХОД: TRUE - число Num делится на Divider без остатка, 
//        FALSE - не делится
//****************************************************************
bool CheckNumberDiv(int Num, int Divider)
{
  return((Num % Divider) == 0);
}

//****************************************************************
// Проверяет, оканчивается ли число на заданную цифру
// ВХОД: Num - проверяемое число
//       Dig - заданная цифра
// ВЫХОД: TRUE - число Num оканчивается на Dig,
//        FALSE - оканчивается на другую цифру
//****************************************************************
bool CheckNumberLast(int Num, int Dig)
{
  bool res = false;
  if ((Dig < 1) || (Dig > 9)) return(res);
  if (Num < 10) res = (Num == Dig);
  else res = (((Num - Dig) % 10) == 0);
  return(res);
}

//****************************************************************
// Проверяет число на соответствие условиям:
//            - делится ли число на заданную цифру
//            - оканчивается ли число на заданную цифру
// ВХОД: Num - проверяемое число
//       Dig - заданная цифра
// ВЫХОД: TRUE - число соответствует одному из условий,
//        FALSE - не соответствует ни одному
//****************************************************************
bool CheckNumber3(int Num, int Dig)
{
  return(CheckNumberDiv(Num, Dig) || CheckNumberLast(Num, Dig));
}               

//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
//****************************************************************
int main(int argc, char *argv[])
{
  for(int i = FIRST_NUM; i <= LAST_NUM; i++)
    if (! CheckNumber3(i, CHECK_NUM)) cout << i << "  ";
  cout << endl;   
  
  system("PAUSE");
  return EXIT_SUCCESS;
}

Ну и в конце приведу список чисел, которые будут выведены на экран при работе этих программ:

1 2 4 5 7 8 10 11 14 16 17 19 20 22 25 26 28 29 31 32

Как видите, среди них нет таких, которые делятся на 3 без остатка и также нет таких, которые заканчиваются на три.


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

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

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

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

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