Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
42
Добавлен:
16.02.2016
Размер:
558.59 Кб
Скачать

Int main ()

{

bool dev = false;

for(int i=2; i<50; i++)

{

for(int j=2; j<i; j++)

{

if (i%j)

continue;

else

{

dev = true;

break;

}

}

if(!dev)

cout « i « " ";

dev = false;

}

return 0;

}

Программа организована в виде двух вложенных циклов таким образом, что осуществляется перебор и проверка остатка от деления пары чисел, первое из которых изменяется от 2 до 50, а второе - от 2 до значения первого числа. Если остаток от деления ненулевой, осуществляется продолжение внутреннего цикла по оператору continue. Если остаток от деления составил 0, выполняется выход из внутреннего цикла с установкой признака деления в логической переменной dev. По окончании внутреннего цикла производится анализ логической переменной dev и вывод простого числа.

Оператор goto и метки

Метка представляет собой идентификатор с расположенным за ним символом двоеточия (:).

Метками помечают какой-либо оператор, на который в дальнейшем должен быть осуществлен безусловный переход.

Безусловная передача управления на метку производится при помощи оператора goto.

Оператор goto может осуществлять переход (адресоваться) к меткам, обязательно расположенным в одном с ним теле функции.

Синтаксис оператора goto:

goto метка;

Данный оператор - очень мощное и небезопасное средство управления поведением программы. Использовать его нужно крайне осторожно, так как, например, "прыжок" внутрь цикла (обход кодов инициализации) может привести к трудно локализуемым ошибкам.

Рассмотрим пример применения оператора goto.

#include <iostream.h>

Int main ()

{

// Инициализация переменных

if (...)

{

// Если условие выполнено, производим

// какие-то действия и переходим

// к оператору по метке label

goto label;

}

...

label:

...

return 0;

}

Как только выполнение программы достигнет оператора goto, управление будет передано оператору, следующему за меткой label.

Вообще говоря, использование структурного и объектно-ориентированного подходов к программированию позволяет полностью отказаться от применения операторов безусловного перехода. Однако на практике часто бывают случаи, когда goto значительно упрощает код программы. В особенной степени это утверждение касается вложенных конструкций switch-case и if-else.

В качестве примера рассмотрим цифровую модель светофора:

#include <iostream.h>

Int main ()

{

enum lighter {RED, REDYELLOW, YELLOW, GREEN};

lighter current = YELLOW;

lighter previous = GREEN;

lighter next = RED;

start:

switch(current)

{

case RED:

cout « "СТОП!!!\n";

if(previous = YELLOW)

{

next = REDYELLOW;

break;

}

else

goto labl;

case REDYELLOW:

if(previous == YELLOW)

goto labl;

if(previous == GREEN)

goto labl;

cout « "Приготовиться.\n";

next = GREEN;

break;

case YELLOW:

if(previous = YELLOW)

goto labl;

if(previous = RED)

goto labl;

cout « "Остановись\n";

next = RED;

previous = GREEN;

break;

case GREEN:

if(previous == RED)

goto labl;

if(previous == YELLOW)

goto labl;

previous = REDYELLOW;

next = YELLOW;

cout « "Вперед!\n";

break;

}

previous = current;

current = next;

goto start;

labl:

cout « "Светофор неисправен...\n";

current = previous = next = YELLOW;

goto start;

return 0;

}

В приведенной программе объявляются три переменные для хранения информации о текущем (current), предыдущем (previous) и следующем (next) состоянии светофора. В операторе switch производится анализ текущего состояния и на основании полученного результата осуществляется вывод соответствующего сообщения. В случае сбоя работы светофора (рассчитанные значения переменных next и previous не совпадают с реальными данными), осуществляется переход к метке lаb1 с последующим переводом светофора в режим "Неуправляемый перекресток". После проверки выполнение программы продолжается с метки start.

РЕЗЮМЕ

Процедурные возможности C++ определяются как многообразием поддерживаемых типов данных, так и многообразиемопераций над даннымисоответствующих типов.

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

операции сложения (+), вычитания (-), умножения (*), деления (/) и взятия по модулю (%), то есть вычисления остатка от деления левого операнда на правый.

Для эффективного использования возвращаемого операциями значения предназначен оператор присваивания (=) и его модификации: сложение с присваиванием (+=). вычитание с присваиванием (-=), умножение с присваиванием (*=). деление с присваиванием (/=), модуль с присваиванием (%=) и ряд других, которые будут рассмотрены позже.

В приведенном ниже коде представлены примеры некоторых операций:

#include <iostream.h>

Соседние файлы в папке ЛекцииКарасева