^Back To Top
foto1 foto2 foto3 foto4 foto5 foto6 foto7 foto8 foto9 foto10 foto11 foto12 foto13 foto14 foto15 foto16 foto17 foto18 foto19 foto20 foto19

 

C++  для   Ch--

 

 

Циклы и условные операторы.
Чем дальше в дремучий лес, тем больше дремучих дров

 

..... Задача. Написать программу на языке С++ для нахождения всех делителей целого числа n.

..... Решение. Очень важно в самом начале составить план программы (алгоритм). Для данной задачи он состоит из двух шагов.
...............1-й шаг: находим остатки от деления n на все числа от 2 до n-1.
...............2-й шаг: проверяем равенство остатков нулю и выводим информацию на экран.

..... Создадим новый проект divi от английского divider - делитель с файлом divi.cpp. Шапка у этой программы такая же, как у программы «calc». Строка объявления переменных обычно формируется при составлении тела программы в зависимости от использованных переменных.

 

Тело программы

.....  Оператор цикла. 1-й шаг. Воспользуемся оператором цикла for, который зависит от трех параметров в круглых скобках и выполняет то, что записано в фигурных скобках:

..... Первый параметр задает начальное значение счетчика цикла i=2 (i у нас - делитель, деление начинаем с числа 2). Второй - ограничивает его изменение: i должно быть меньше n (перебираем возможные делители от 2 до n-1). i++ задает единичный шаг цикла (каждый следующий делитель больше предыдущего на 1).

..... Статус int переменной i можно объявить «не отходя от кассы» внутри цикла. Однако тогда в силу «близорукости» языка С++ она не будет видна вне цикла. Если необходимо чтобы переменная была видна во всей программе, её следует внести в строку объявления переменных!

..... А компьютеру мы говорим: запомни начало и конец цикла, дружище (информация передается точками с запятой!), а шаг цикла сам запомнится (точка с запятой отсутствует!).

..... Внутрь фигурных скобок помещаем оператор double z = fmod (n, i), который вычисляет остаток z от деления n на i. Стандартная функция fmod из математической библиотеки требует, чтобы переменные z и n имели статус double. Вне цикла переменная z не понадобится, поэтому объявляем её «не отходя от кассы», и оператор цикла примет вид:

..... Итак, внутри оператора цикла вычисляем все остатки от деления n на i = 2, 3, ... , n-1. Числа i, при которых остаток z равен нулю, будут искомыми делителями числа n, поэтому вместо многоточия надо будет поместить команду, которая фильтрует остатки и выдаёт делители на экран. Это делается на 2-ом шаге при помощи условного оператора.

 

..... Условный оператор. 2-й шаг. Проверку равенства z нулю проведем при помощи условного оператора if, который зависит от одного параметра (условия):

..... При выполнении условия в круглых скобках выполняются команды в фигурных скобках оператора if. Если условие в круглых скобках не выполнено, то фигурные скобки игнорируются, и управление передаётся следующему оператору. Понукать компьютер не нужно, информация об условии «сама запомнится» (точка с запятой отсутствует!).

..... Условный оператор if будет использован дважды.

..... В первом случае записываем в круглые скобки условие: z==(два знака равенства в С++ означают сравнение, в данном случае с нулем). Если условие выполнено, то n делится на и управление передается в фигурные скобки.

..... Как только мы попали в фигурные скобки оператора if, выдаем сообщение на экран о наличии у числа n делителя. Одновременно начинаем их подсчет при помощи счетчика делителей t (со статусом int). Заносим его в строку объявления переменных, присвоив значение 1, а после выдачи информации увеличиваем t на 1 при помощи команды t++. Итак, вместо многоточия в оператор цикла подставляем оператор:

..... Если у n нет делителей, то-есть это число простое, то управление внутрь фигурных скобок не попадёт, команда t++ ни разу не сработает, и после выхода из цикла параметр t сохранит значение 1.

..... При вторичном использовании условного оператора в круглые скобки записываем условие t==1:

который выводит на экран сообщение, что n число простое.

..... Итак, тело программы выглядит следующим образом:

 

Строка объявления переменных

..... При создании программы были задействованы переменные int i, double z, double n и int t. Поскольку i и z используются только внутри цикла (являются «локальными»), их статус можно объявить там же. А вот n и t необходимы во всей программе (являются «глобальными»), и их надо поместить в строку объявления переменных. Дадим n значение 2015-го года, а счетчику делителей присвоим 1, тогда строка объявления переменных примет вид:

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

 

Составляем программу

..... Собираем операторы по «простейшей схеме» (как в программе «calc»), записываем их в файл divi.cpp и получаем программу «divi».

 

Программа «divi» - «делитель»

нумерует и выдаёт на дисплей список делителей числа n


   #include "stdafx.h"
   #include <iostream>
   using namespace std;
   #include <cmath>

 

double n=2015.0; int t=1;

void main ()
  {
    setlocale(LC_ALL,"Rus");
          for (int i=2; i<n; i++)
     {
                double z=fmod(n,i);
                if(z==0){cout <<t<<". "<< n <<" имеет делитель "<< i << endl; t++;}
     }
 if(t==1){cout <<"Число "<< n <<" простое!"<< endl;}
 cin.get();
  }


Нажимаем F5 и получаем результат. Используем три значения n = 2015, 2016 и 2017:

Итак, 2015-й год имеет 6 делителей.
2016-й имеет 34 делителя (все не поместились)!
А 2017-й год - «простой».

Любопытная информация. Используя данную программу можно получить такие результаты.
2019-й год имеет делители 3 и 673.  2020-й год имеет десять делителей.
Два делителя 43 и 47 имеет 2021-й год.  А следующим простым годом будет 2027-й.