Читать книгу Лекции по C++ для начинающих - Сергей Николаевич Талипов - Страница 8

ТЕМА 2 – ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ И ЦИКЛИЧЕСКИХ АЛГОРИТМОВ

Оглавление

1) ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ АЛГОРИТМОВ


Последовательность выполнения программы определяется ветвлениями. Ветвление – выбор одного из возможных направлений выполнения алгоритма в зависимости от значения некоторых условий. Для организации разветвлений в программах используются операторы перехода, условный и выбора.


ОПЕРАТОР ПЕРЕХОДА


Его можно представить в следующей форме: goto метка;

Метка – это любой идентификатор.


Например:

goto a2;


Оператор goto указывает, что выполнение программы необходимо продолжить, начиная с инструкции, перед которой записана метка. В программе обязательно должна быть строка, где указана метка, поставлено двоеточие и записана инструкция, к которой должен выполняться переход.


Например:

а2: к=5;


Метки в программе описывать не нужно. Применение оператора перехода в языке C++ является нежелательным, так как он нарушает структурную наглядность программы.


УСЛОВНЫЙ ОПЕРАТОР


Оператор if имеет вид:

if (проверка условия) {

инструкция 1

} else {

инструкция 2;

}


Если условие в скобках принимает истинное значение, выполняется инструкция 1, а если ложное – инструкция 2.


Например:

if (a > b) {

z=a;

} else {

z=b;

}


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


Например:

if (num>10) num = 2 * num;

printf("%d\n", num);

Оператор вывода будет выполняться всегда, а оператор присваивания только в том случае, если условие будет истинным.


Пример (EX1):


#include <stdio.h>


int main() {

int a, b;


puts("Введите значения а и b");

scanf("%d %d", &a, &b);


if (a > b) puts("a больше b");

else puts("a меньше или равно b");


if (a == b) puts("a равно b");

}


Если для выполнения программы ввести числа 5 и 3, то на экране появится строка: "а больше b". При введении чисел 5 и 5, на экране появится две строки: "а меньше или равно b" и "а равно b"

Иногда в условном операторе после ключевых слов if или else следует инструкция if, ее называют вложенной. Слово else всегда относится к ближнему предшествующему ему if. Также после ключевых слов if и else вместо одной инструкции может быть записано несколько инструкций, которые должны заключаться в фигурные скобки. В сложных конструкциях, содержащих много if и else, уместно вложенные if обрамлять фигурными скобками.


ПРИМЕР ЗАДАЧИ (EX2). Ввести целое число. Вывести сообщение существуется ли символ ASCII-таблицы под таким номером (от 0 до 31 расположены управляющие коды, затем от 32 до 256 – символы).


#include <stdio.h>


int main() {

int i;

char ch;

printf("Введите целое число:\n");

scanf("%d", &i);


if ((i > 31) && (i < 256)) {

printf("Такой символ существует");

} else {

printf("Taкoгo символа нет");

}

}

ПРИМЕР ЗАДАЧИ (EX3). Вычислить функцию


#include <stdio.h>

#include <math.h>


int main() {

float x, y;

printf("Введите исходное значение х\n");

scanf("%f", &x);


if (x > 0) {

y = log(x);

} else {

y = pow(cos(x), 2);

}


printf("y =%7.3f", y);

}


ПРИМЕР ЗАДАЧИ (EX4). Вычислить функцию

#include <stdio.h>

#include <math.h>


int main() {

float x, y, b;

printf("Введите исходные данные х, b \n");

scanf("%f%f", &x, &b);


if (x < 10) {

y = 1 + b * pow(x, 2);

} else {

if (x <= 15) {

y = log(x) + b;

} else {

y = sin(b * x);

}

}


printf("y = %7.3f", y);

}


ОПЕРАТОР ВЫБОРА


Оператор switch позволяет выбрать одну из нескольких альтернатив. Он записывается в следующем виде:


switch (выражение) {

case константа 1:

вариант 1;

break;

case константа n:

вариант n;

break;

default:

вариант n+1;

break;

}


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

Например (EX5):


#include<stdio.h>


int main() {

char y;

scanf("%c", &y);


switch (y) {

case '1':

printf("Ветвь 1\n");

break;

case '2':

case '3':

printf("Ветвь 2 или 3\n");

break;

default:

printf("Bетви 1, 2, 3 не работают\n");

}

}


Оператор scanf вводит переменную у. Ее значение в операторе switch сравнивается со всеми константами операторов case. Если ввести символ 1, то на экране появится строка: "Ветвь 1".

По оператору break произойдет выход из переключателя switch и программа завершит свою работу. Если ввести символы 2 или 3 то на экран будет выведена строка: "Ветвь 2 или 3".

При вводе любого другого символа управление перейдет к ключевому слову default и на экране появится строка: "Ветви 1, 2, 3 не работают".


2) ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ АЛГОРИТМОВ


Цикл – повторное выполнение операторов, завершаемое при выполнении некоторых условий. Однократное выполнение операторов цикла называется итерацией. Операторы и конструкции цикла также называются телом цикла.

Различают 3 вида оператора цикла: for, while и do-while.


ЦИКЛЫ С ПАРАМЕТРОМ


Описание: for (выражение 1; выражение 2; выражение 3) { … };

Действие: в круглых скобках содержится три выражения. Первое из них служит для инициализации счетчика. Она осуществляется только один раз – когда цикл for начинает выполняться. Второе выражение необходимо для проверки условия, которая осуществляется перед каждым возможным выполнением тела цикла. Когда выражение становится ложным, цикл завершается. Третье выражение вычисляется в конце каждого выполнения тела цикла, происходит приращение числа на шаг.

Комментарий: в операторе цикла for точка с запятой после закрывающейся круглой скобки не ставится. Любое из трех или все три выражения в операторе могут отсутствовать, однако разделяющие их точки с запятыми опускать нельзя. Если отсутствует выражение 2, имеем бесконечный цикл.

Если отсутствуют выражения 1 и 3, цикл становится эквивалентным while.

Например:

for (;а<20;) { … };


Каждое из выражений может состоять из нескольких выражений, объединенных операцией «запятая».

Например:

for (i=0, j=l; i<100; i++, j++) a[i] = b[j];

Пример (EX6):


#include <stdio.h>


int main() {

int i, j = 1, k;


for (i = 1; i <= 3; i++) {

printf("Acтана \t");

}


printf("\nУкажите число повторений цикла\n");

scanf("%d", &k);


for (i = 1; i <= k; i++) {

printf("%d", j);

}


j = i;

printf("\n");


for (i = 1; i <= k; i++) {

printf("%d ", j *= i);

}

}


Вывод:

Астана Астана Астана

Укажите число повторений цикла

5

11111

6 12 36 144 720


ПРИМЕР ЗАДАЧИ (EX7). Вычислить n-e число Фибоначчи. Числа Фибоначчи строятся следующим образом: F(0) = F(1) = 1; F(i + 1) = F(i) + F(i – 1) для i >= 1. Это пример вычислений по рекуррентным формулам.


#include<stdio.h>


int main() {

int a, b, c, i, n;


printf("Введите номер числа Фибоначчи ");

scanf("\n %d", &n);


a = 1; // a=F(0), а соответствует F(i-2)

b = 1; // b=F(1), b соответствует F(i-1)


for (i = 2; i <= n; i++) {

c = a + b; // с соответствует F(i)

// в качестве а и b берется следующая пара чисел

a = b;

b = c;

}

printf("%d-е число Фиббоначчи = %d", n, b);

}


ПРИМЕР ЗАДАЧИ (EX8). Вычислить 50 значений функции у = arctg(x2), где X изменяется от начального значения а с шагом h. Результаты вывести в виде таблицы значений X и У.


#include<stdio.h>

#include<math.h>


int main() {

float x, y, a, h;

int i;


printf("Введите исходные данные a, h \n");

scanf("%f %f", &a, &h);

x = a;


for (i = 1; i <= 5; i++) {

y = atan(pow(x, 2));

printf("x = %7.3f у = %7.3f \n", x, y);

x = x + h;

}

}


ПРИМЕР ЗАДАЧИ (EX9). Вычислить значение функции , если х изменяется с шагом h одновременно с i.


#include<stdio.h>

#include<math.h>


int main() {

float x, y, z, h;

int i, n;


printf("Введитe исходные данные h, n \n");

scanf("%f %n", &h, &n);


x = 0;

z = 0;


for (i = 1; i <= n; i++) {

y = sin(x) / sqrt(1 + x);

z = z + y;

x = x + h;

}


printf("x = %7.3f z = %7.3f", x, z);

}


ПРИМЕР ЗАДАЧИ (EX10). Вычислить сумму членов ряда, для заданных n и х.


#include<stdio.h>

#include<math.h>


int main() {

float x, s, p;

int k, n;


printf("Введите исходные данные х, n \n");

scanf("%f %d", &x, &n);


p = 1;

s = 0;


for (k = 1; k <= n; k++) {

p = p*x;

s = s + (p + k) / pow(k, 2);

}


printf("s = %7.3f", s);

}


ЦИКЛЫ С УСЛОВИЕМ


Оператор цикла while: while (выражение) { … };

Действие: Выполняется оператор до тех пор, пока значение выражения в скобках истинно. Проверка значения выражения происходит перед каждым выполнением оператора. Когда значение выражения ложно, цикл while заканчивается. Если выражение ложно с самого начала, оператор не выполняется ни разу.

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


Пример (EX11):


#include<stdio.h>


int main() {

int i, s;

i = 1;

while (scanf("%d", &s)) {

printf("Введенное число %d\n", s);

i++;

};

}


Оператор цикла do-while: do { … } while (выражение);

Действие: В операторе do-while тело цикла выполняется по крайней мере один раз. Тело цикла будет выполняться до тех пор, пока выражение в скобках не примет ложное значение. Если оно ложно при входе в цикл, то его тело выполняется ровно один раз.

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


Например (EX12):


#include<stdio.h>


int main() {

int i, s;

i = 1;

do {

printf("Введенное число %d\n", s);

i++;

} while (scanf("%d", &s));

}


ОПЕРАТОР BREAK


Описание: break используется для прекращения выполнения цикла из-за обнаружения ошибки, для организации дополнения к условию в заголовке цикла, для прекращения бесконечного цикла. Например:


while (st > 0 && st < 25) {

if (st == 4||st == 8||st == 12) break;

}


Работа цикла полностью прекращается, как только условие в операторе if становится истинным.


ОПЕРАТОР CONTINUE


Действие. Этот оператор может использоваться во всех трех типах циклов. Как и в случае оператора break, он приводит к изменению характера выполнения программы. Однако вместо завершения работы цикла наличие оператора continue вызывает пропуск "оставшейся" части итерации и переход к началу следующей.


Например:

Заменим в предыдущей программе оператор break на continue.


while (st > 0 && st < 25) {

if (st == 4 || st == 8|| st == 12) continue;

}


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


ПРИМЕР ЗАДАЧИ. Вычислить значение функции у = f(x) для для изменяющегося с шагом h, где

Лекции по C++ для начинающих

Подняться наверх