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

OOP_C++ / 03

.htm
Скачиваний:
23
Добавлен:
02.02.2015
Размер:
21.51 Кб
Скачать

03 - Инструкции Содержание     Предыдущее занятие     Следующее занятие

Занятие 03 Инструкции 1 Инструкции (операторы) Инструкции - это синтаксические конструкции, определяющие действия, выполняемые программой.

Пустая инструкция состоит из одной точки с запятой.

Инструкция-выражение представляет собой полное выражение, заканчивающееся точкой с запятой.

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

Инструкции выбора - условная инструкция и переключатель. Условная инструкция применяется в двух видах:

if (условное_выражение) инструкция_1 else инструкция_2 и

if (условное_выражение) инструкция_1 При выполнении данной инструкции вычисляется условное выражение и если оно истинно (отлично от 0), то выполняется инструкция_1, а иначе - инструкция_2. Условное выражение может быть любого типа, приводимого к целому. В условии if может быть размещено определение переменной с инициализацией. В соответствии со стандартом языка такая переменная видна только в пределах условной инструкции (включая часть else).

Переключатель позволяет выбрать одну из нескольких возможных ветвей вычислений и строится по схеме:

switch ( целое_выражение ) { case константа_1: инструкции case константа_2: инструкции ... default: инструкции } Выполнение переключателя состоит в вычислении управляющего выражения и переходе к группе инструкций, помеченных case-меткой, равной управляющему выражению, если такой метки нет, выполняются инструкции по метке default (которая может отсутствовать). При выполнении переключателя происходит переход на инструкцию с выбранной меткой и дальше инструкции выполняются в естественном порядке. Для того, чтобы не выполнять оставшихся инструкций в теле переключателя, необходимо использовать операцию break.

2 Инструкции цикла Инструкции цикла представлены в трех вариантах: цикл с предусловием, цикл с постусловием и цикл с параметром.

Цикл с предусловием строится по схеме

while (выражение-условие) инструкция При каждом повторении цикла вычисляется выражение-условие и если значение этого выражения не равно нулю, выполняется инструкция - тело цикла.

Цикл с постусловием строится по схеме:

do инструкция while (выражение-условие); Выражение-условие вычисляется и проверяется после каждого повторения инструкции - тела цикла, цикл повторяется, пока условие выполняется. Тело цикла в цикле с постусловием выполняется хотя бы один раз.

Цикл с параметром строится по схеме:

for (E1; E2; E3) инструкция где E1, E2 и E3 - выражения скалярного типа. Цикл с параметром реализуется по следующему алгоритму:

вычисляется выражение E1 (обычно это выражение выполняет подготовку к началу цикла);

вычисляется выражение E2 и если оно равно нулю выполняется переход к следующей инструкции программы (выход из цикла);

если E2 не равно нулю, выполняется инструкция - тело цикла;

вычисляется выражение E3 - выполняется подготовка к повторению цикла, после чего снова выполняется выражение E2.

В следующем примере сумма

y = 12 + 22 + 32 + ... + n2

находится с помощью трех различных инструкций цикла.

С помощью цикла while:

int y = 0; int i = 1; while (i <= n) { y += i * i; i++; }

С помощью цикла do . . . while:

int y = 0; int i = 1; do { y += i * i; i++; } while (i <= n);

С помощью цикла for:

int y = 0; for (int i = 1; i <= n; i++) y += i * i; В сочетании с инструкциями цикла используются операции перехода - операция break, позволяющая прервать выполнение самого внутреннего из циклов, операция continue, прерывает текущую итерацию самого внутреннего из объемлющих его циклов while, do или for. Обычно break используется в конструкции:

if (условие_досрочного_завершения_цикла) break; Операция break может также использоваться для выхода из тела переключателя. Инструкция goto позволяет перейти на метку. Метка - идентификатор с двоеточием, стоящий перед инструкцией. Использование инструкции goto в большинстве случаев нецелесообразно. Единственный случай разумного использования goto - выход из нескольких вложенных циклов сразу (break осуществляет выход только из одного внутреннего цикла):

for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { for (int k = 1; k <= n; k++) { . . . if (/* Условие выхода */) goto label1; . . . } } } label1: // Последующие инструкции 3 Примеры программ Пример 1 В следующем примере вычисляется и выводится на экран значение, равное 100, если x < -8, значение 200, если x находится в диапазоне от -8 до 1, или 300 в противном случае:

#include <iostream> using namespace std; int main(int argc, char* argv[]) { double x; cin >> x; double y; if (x < -8) y = 100; else if (x <= 1) y = 200; else y = 300; cout << y; return 0; } Пример 2 Неоходимо написать программу, в которой вводятся значения x и n и вычисляется y с использованием инструкции switch:

n y 1 x 2 x2 3 x3 4 1 / x другие значения 0  

#include <iostream> using namespace std; int main(int argc, char* argv[]) { double x, y; int n; cin >> x >> n; switch (n) { case 1 : y = x; break; case 2 : y = x * x; break; case 3 : y = x * x * x; break; case 4 : y = 1 / x; break; default: y = 0; } cout << y; return 0; } Пример 3 Неоходимо написать программу, в которой вводятся значения x и n и вычисляется y:

y = 1/(x - 1) + 1/(x - 2) + ... + 1/(x - n)

Программа выводит сообщение об ошибке, если знаменатель равен 0.

#include <iostream> using namespace std; int main(int argc, char* argv[]) { double x, y = 0; int i, n; cout << "Input x and n: "; cin >> x >> n; for (i = 1; i <= n; i++) { if (x == i) { cout << "Error!\n"; break; } y += 1/(x - i); } if (i > n) // Сумма определена cout << "y = " << y << "\n"; return 0; } Альтернативное решение:

#include <iostream> using namespace std; int main(int argc, char* argv[]) { double x, y = 0; int i, n; cout << "Input x and n: "; cin >> x >> n; for (i = 1; i <= n; i++) { if (x == i) { cout << "Error!\n"; return 1; } y += 1/(x - i); } cout << "y = " << y << "\n"; return 0; } Пример 4 Неоходимо написать программу, в которой вводятся значения x, k и n и вычисляется y:

y = x (x + 1) (x + 2) (x + 3) ... (x + k - 1)(x + k + 1) ... (x + n)

#include <iostream> using namespace std; int main(int argc, char* argv[]) { double x, y = 1; int i, k, n; cout << "Input x, k, and n: "; cin >> x >> k >> n; for (i = 0; i <= n; i++) { if (i == k) continue; y *= (x + i); } cout << "y = " << y << "\n"; return 0; } Альтернативное решение:

#include <iostream> using namespace std; int main(int argc, char* argv[]) { double x, y = 1; int i, k, n; cout << "Input x, k, and n: "; cin >> x >> k >> n; for (i = 0; i <= n; i++) { if (i != k) y *= (x + i); } cout << "y = " << y << "\n"; return 0; } Пример 5 Неоходимо написать программу, в которой вводится значение x и вычисляется ex:

y = ex = 1 + x + x2/2! + x3/3! + ...

Цикл должен быть прекращен, если очередное слагаемое меньше 0.00001.

#include <iostream> using namespace std; int main(int argc, char* argv[]) { double x, y = 0; double z = 1; // Слагаемое int i = 1; cout << "Input x: "; cin >> x; while (z > 0.00001) { y += z; z *= x / i; i++; } cout << "y = " << y << "\n"; return 0; } Альтернативное решение:

#include <iostream> using namespace std; int main(int argc, char* argv[]) { double x, y = 0; double z = 1; // Слагаемое cout << "Input x: "; cin >> x; for (int i = 1; z > 0.00001; i++) { y += z; z *= x / i; } cout << "y = " << y << "\n"; return 0; } Пример 6 Допустим, необходимо определить сумму цифр числа, введенного с клавиатуры. Следующий вариант использует нахождение остатка от деления.

#include <iostream> using namespace std; void main() { int n; cin >> n; int sum = 0; while (n > 0) { sum += n % 10; n /= 10; } cout << sum; } Пример 7 Допустим, необходимо ввести два числа и найти их наибольший общий делитель. Чтобы найти наибольший общий делитель двух чисел, нужно из большего числа вычесть меньшее и заменить большее число результатом, а меньшее оставить без изменений. Это действие нужно повторять до тех пор, пока оба числа не станут равными - каждое из них и есть искомый наибольший общий делитель.

Программа будет иметь вид:

#include <iostream> using namespace std; void main() { int m, n; cin >> m >> n; while (m != n) { if (m > n) m -= n; else n -= m; } cout << m; } 4 Задания на самостоятельную работу Задание 1 Реализовать программу, в которой вводится x и вычисляется y (функция signum) с использованием условной операции и инструкции if:

x y меньше 0 -1 0 0 больше 0 1 Задание 2 Реализовать программу, в которой вводится целое число n и вычисляется y с помощью инструкции switch:

n y 0 2 1 4 2 5 3 3 4 1 другие значения 0 Задание 3 Написать программу, в которой вводятся значения x, k и n и вычисляется y:

y = 1/(x + 2) + 2/(x + 4) + ... + (k - 1)/(x + 2(k - 1)) + (k + 1)/(x + 2(k + 1)) + ... + n/(x + 2n)

Программа должна выводить сообщение об ошибке, если знаменатель равен 0.

Задание 4 Написать программу, в которой вводятся значения x и n и вычисляется y:

y = (x + 1)(x - 2)(x + 3)(x - 4) ... (x - 2n) Задание 5 Написать программу, в которой вводится значение eps и вычисляется y:

y = 1/2 + 1/4 + 1/8 + 1/16 + ...

Цикл должен быть прекращен, если очередное слагаемое меньше eps.

Задание 6 Найти сумму первой и последней цифр числа. Совет: пропустить все слагаемые кроме первого и последнего (когда осталось число, меньшее 10).

Задание 7 Вычислить наименьшее общее кратное двух чисел путем деления произведения чисел на наибольший общий делитель.

 

 

Содержание     Предыдущее занятие     Следующее занятие

 

© 2001 - 2006 Иванов Л.В.

Соседние файлы в папке OOP_C++