Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Философия программирования на C++ Выпуск 17. Решение и инкремент


Добрый день!

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

#include <iostream>
using namespace std;
int main() {
    // Сначала просим пользователя ввести число
    int num = 0;
    cout << "Please, enter a number: ";
    cin >> num;
    // А теперь смотрим, является ли введенное число - простым!
    if (num <= 1) {  // Числа 0 и 1 не являются простыми по определению
        cout << "Not prime" << endl;
        return 0;
    }
    // Перебираем все числа от 2 до (num / 2), числа больше проверять нет смысла - num никогда не будет на них делиться
    for (int i = 2; i <= num / 2; i++) {
        int div = num / i;  // Делим число на i без остатка
        if (div * i == num) {
 // Если результат умножим на i и получим снова то же число, то значит оно делится на i
            // А значит, если оно делится на что-то от 2 до num/2 - то число num не простое
            cout << "Not prime" << endl;
            return 0;  // Выходим из программы - мы уже поняли, что число не является простым
        }
    }
    // Если мы дошли до этой части программы - то число очевидно простое, выводим данные об этом:
    cout << "It is prime!" << endl;
}

В комментариях я попытался объяснить каждую ключевую строчку.

А теперь - о фигурных скобочках {} и операторе инкремента (как и обещал в прошлом выпуске).

Я все опишу в одной программе.

#include <iostream>
using namespace std;
int main() {
    int i = 0;  // Мы будем экспериментировать с этим числом
    {
        // Здесь - блок кода, заключенный в фигурных скобках
        cout << "i++: " << i++ << endl;
        cout << "++i: " << ++i << endl;
    }
    // Поскольку переменная для цикла уже есть - первую часть цикла for можно оставить пустой
    for (; i < 10; i++) {  // Это - тот же самый отдельный блок кода, только
он используется для цикла
        cout << "for: ++++i: " << ++++i;  // Да-да, мы можем
менять содержимое переменной и внутри цикла
    }
    for (;;)
        if (i++ > 20)
            break;
    cout << "i aftre for(;;): " << i << endl;
}

Итак, здесь мы в начале объявляем переменную, а в следующей строке начинаем отдельный блок кода внутри текущего. Он напоминает тело цикла или условия. Так можно делать для отделения участка кода. По сути этот участок кода ничем не отличается от того, если бы мы писали без этих скобочек. Но тут есть свои хитрости, которые мы рассмотрим в следующем выпуске, посвященном области видимости переменных. Здесь я просто хотел показать, что такое сделать возможно.

Теперь перейдем к оператору инкремента ++. Он может быть префиксным (++i) и постфиксным (i++). Оба варианта увеличивают значение переменной i на единицу, но имеют он одно существенное отличие. Это - то, какое значение они возвращают. Префиксный вариант ++i просто увеличивает значение на единицу и возвращает уже увеличенное число. А постфиксный вариант возвращает предыдущее значение, а потом увеличивает значение i на единицу. Поэтому сначала будет выведено значение 0 (потому что когда мы вызвали i++ - его значение было равно нулю), а потом 2 (потому что значение было равно уже единице, а затем оно увеличилось еще на единицу - и этот результат мы и вывели).

Пусть i равно нулю. Тогда выводом на экран результата (++i) будет 1, и значение i будет равно тоже 1. А если мы выведем результат i++ - то будет выведено 0, а значение i будет равно единице.

Вот и все. А еще мы здесь привели пример, что в цикле for можно пропускать часть кода внутри скобок - инициализации, условия и счетчика, и даже писать пустой цикл (он будет выполняться бесконечно!): for (;;)

Как же остановить выполнение цикла, не может же программа работать бесконечно? Тогда для этого было придумано ключевое слово break. Оно позволяет выйти из цикла немедленно, не проверяя никаких условий.

На сегодня все, всем спасибо - до следующего выпуска! 

 


В избранное