Файл: Основные структуры алгоритмов:сравнительный анализ и примеры их использования.pdf
Добавлен: 05.04.2023
Просмотров: 167
Скачиваний: 3
Таблица 1.1 – Результаты логической операции И
|
операнд1 |
операнд2 |
операнд1 && операнд2 |
|
1 |
1 |
1 |
|
1 |
0 |
0 |
|
0 |
1 |
0 |
|
0 |
0 |
0 |
Если значение первого операнда равно нулю, то второй операнд не вычисляется.
Логическая операция ИЛИ (||) вырабатывает значение 0, если оба операнда имеют значение 0. Если какой-либо из операндов имеет ненулевое значение, то результат операции равен 1. Если первый операнд имеет ненулевое значение, то второй операнд не вычисляется. В табл. 1.2 показаны результаты логической операции ИЛИ для различных значений операндов.
Таблица 1.2 – Результаты логической операции ИЛИ
|
операнд1 |
операнд2 |
операнд1 || операнд2 |
|
1 |
1 |
1 |
|
1 |
0 |
1 |
|
0 |
1 |
1 |
|
0 |
0 |
0 |
Логическая операция НЕ (!) вырабатывает значение 1 (истинно), если операнд имеет значение ложно ( 0 ) и наоборот.
Интуитивно логические выражения наподобие "2<7", "1.2!=3.7" и "6>=9" воспринимаются человеком как утверждения, которые могут быть "истинными (true)" или "ложными (false)" (логическая операция "!=" означает "не равно"). Допускается объединение нескольких подобных выражений в более сложное выражение с помощью логических операций "&&" ("И"), "||" ("ИЛИ") и "!" ("НЕ").
В табл. 1.3 приводятся примеры сложных логических выражений, в которых используются логические операции и операции отношения (сравнения).
Таблица 1.3. – Примеры логических выражений
|
Выражение |
Значение выражения |
|
(6 <= 6) && (5 < 3) (6 <= 6) || (5 < 3) (5 != 6) (5 < 3) && (6 <= 6) || (5 != 6) (5 < 3) && ((6 <= 6) || (5 != 6)) !((5 < 3) && ((6 <= 6) || (5 != 6))) |
false true true true false true |
По приоритетам от высшего к низшему операции отношения и логические операции располагаются следующим образом:
!
>>= <<=
= = !=
&&
||
Составные логические выражения обычно применяются в качестве условий в операторах if и в циклах for. Например:
...
...
if ( total_test_score>= 50 &&total_test_score< 65 )
cout<< "Вы прошли тест со средним результатом.\n";
...
...
Поскольку в Си++ истинное значение ("true") представляется в виде целого числа 1 (большинство компиляторов любое положительное число считают истинным значением), а ложное значение ("false") – в виде значения 0, то это может привести к ошибкам. Например, легко напечатать "=" вместо "= =". Поэтому фрагмент программы
...
if ( number_of_people = 1 )
cout<< "Естьтолькоодинчеловек.\n";
...
всегда будет выводить сообщение "Есть только один человек", даже если до оператора if переменная "number_of_people" была больше 1.
Практическая часть:
Задание 3.
Даны два вещественных числа x и y. Определить, попадает ли точка с координатами x, y в заштрихованную область.
1
y
1
-1
1
x
-1
-1
- Вводим исходные данные x и y
- Проверяем попадает ли точка в область ограниченную линиями .
- Если попадает, то проверяемпопадает ли в область
- Если точка попала в указанную область, товыводим на экран «Точка попадает»
- В противном случае «точка не попадает»
Описание переменных
x, y – Координаты
Листинг программы
#include"iostream"
Usingnamespacestd;
intmain()
{
setlocale(LC_ALL, "russian");
floatx, y;
cout<<"Введите координату x = ";
cin>> x;
cout<<"Введите координату y = ";
cin>>y;
//проверка
if (y<= 1 - x&&y<= x + 1)
{
if ((y <= 0) && (pow(x, 2) + pow(y, 2) <= 1))
{
cout<<"Точка попадает"<<endl;
}
elsecout<<"Точка не попадает \n";
}
else
{
cout<<"Точка не попадает"<<endl;
}
system("pause");
}
Результаты выполнения программы представлены на рисунке 3
Рис.3. Результаты выполнения программы
Задание 4.
Разработать программу в соответствии с заданием. Элементы окружности пронумерованы следующим образом: 1 – радиус R, 2 – диаметр, 3 – длина, 4 – площадь круга. Дан номер одного из этих элементов и его значение. Вывести значения остальных элементов данной окружности (в том же порядке).
Словесное описание алгоритма.
- Выбираем элемент окружности (a).
- Ввод исходных данные (aa)
- В зависимости от выбранного элемента окружности будут производится соответствующие подсчеты для нахождения оставшихся элементов окружности.
- Результат выводим на экран.
Описание переменных
R – Радиус
D – Диаметр
P – Длина
S - Площадь круга
a- Элемент окружности
aa-Значениепараметра а
Листинг программы
#include"iostream"
Usingnamespacestd;
intmain()
{
setlocale(LC_ALL, "russian");
int a;
cout<<"Выбирите 1н из 4 вариантов"<<endl;
cin>> a;
floataa;
cout<<"Введите значение параметра а \n";
cin>>aa;
switch (a)
{
case 1:
cout<<"Ответ: Радиус (R) = "<<aa<<endl;
cout<<"Ответ: Диаметр (D) = "<<aa*2 <<endl;
cout<<"Ответ: Длина (P) = "<< 2 * 3.14*aa<<endl;
cout<<"Ответ: Площадь круга (S) = "<< 3.14*pow(aa, 2) <<endl;
break;
case 2:
cout<<"Ответ: Диаметр (D) = "<<aa<<endl;
cout<<"Ответ: Радиус (R) = "<<aa/2 <<endl;
cout<<"Ответ: Длина (P) = "<< 2 * 3.14*(aa/2) <<endl;
cout<<"Ответ: Площадь круга (S) = "<< 3.14*pow((aa/2), 2) <<endl;
break;
case 3:
cout<<"Ответ: Длина (P) = "<<aa<<endl;
cout<<"Ответ: Радиус (R) = "<<aa/3.14/2 <<endl;
cout<<"Ответ: Диаметр (D) = "<<aa/3.14 <<endl;
cout<<"Ответ: Площадь круга (S) = "<< 3.14*pow((aa / 3.14 / 2), 2) <<endl;
break;
case 4:
cout<<"Ответ: Площадькруга (S) = "<<aa<<endl;
cout<<"Ответ: Радиус (R) = "<<sqrt(aa / 3.14) <<endl;
cout<<"Ответ: Диаметр (D) = "<< (sqrt(aa / 3.14))*2 <<endl;
cout<<"Ответ: Длина (P) = "<< 2 * 3.14*(sqrt(aa / 3.14)) <<endl;
break;
}
system("pause");
}
Результаты выполнения программы представлены на рисунке 4
Рис.4. Результаты выполнения программы
3 Программирование программы цикличных структур
Алгоритмы, отдельные действия в которых повторяются несколько раз, называются алгоритмами циклической структуры.
При решении задач часто приходится повторять одни и те же действия. Например, при построении таблиц значений функции при изменении аргумента в некотором диапазоне. Для выполнения таких повторяющихся вычислений используются операторы цикла.
В языке программирования С++ существуют такие циклы:
· цикл for
· цикл while
· цикл do…while
Цикл for
Цикл со счетчиком позволяет выполнить один или несколько операторов определенное количество раз. Синтаксис данного цикла:
for (начальная_инструкция; условие; выражение)
{
инструкции;
}
Семантика (смысл) цикла for такова, что сначала выполняется начальная_инструкция - она инициализует переменную, используемую в цикле. Затем проверяется условие. Если оно истинно, то выполняются инструкции, вычисляется выражение, и управление передается обратно в начало цикла for с той разницей, что начальная_инструкция уже не выполняется. Это продолжается до тех пор, пока условие не станет ложно, после чего управление передается следующей_инструкции. Каждый проход цикла называется итерацией цикла.
Начальной_инструкцией может быть просто объявление или же сложное выражение либо инструкция.
Цикл for является итерационной инструкцией, обычно используется с увеличивающейся либо уменьшающейся переменной. Например, в следующем коде инструкция for используется для сложения целых чисел от 1го до 10и:
rez=0;
for(inti=1; i<=10;++i)
rez+=i;
Когда инструкция for начинает выполняться, управляющей переменной i задается начальное значение 1. Затем проверяется условие продолжения цикла i <= 10. Поскольку начальное значение i равно 1, это условие удовлетворяется, так что оператор тела инструкции суммирует к значению переменной rez, равному 0, значение счетчика i, равное 1. Затем управляющая переменная i увеличивается на единицу в выражении ++i и цикл опять начинается с проверки условия его продолжения. Поскольку значение i теперь 2, предельная величина не превышена, так что программа снова выполняет тело цикла. Этот процесс продолжается, пока управляющая переменная i не увеличится до 11 -- это приведет к тому, что условие продолжения цикла нарушится и повторение прекратится. Выполнение программы продолжится с первого оператора, расположенного после цикла for.
Другой пример показывает, как оператор запятая может быть использован для инициализации более одной переменной.
for (j = 0,i = 1; i <= 10; ++i)
j += i;
Основное назначение использования оператора запятая -- помочь программисту использовать несколько выражений задания начальных значений и (или) несколько выражений приращения переменных. Например, в одной структуре for может быть несколько управляющих переменных, которым надо задавать начальное значение и которые надо изменять. Например:
for(i=0,j=0;i<3,j<`4;i++,j+=2)
cout<<i*j;
Данный цикл проведет две итерации, после которых значение счетчика i станет равным 2, а значение счетчика j = 4. При этом условие для второго счетчик не выполняется (т.к. j строго должен быть меньше 4) и цикл будет прерван. На экране будет выведено 02.
В цикле for может присутствовать локальное объявление переменной управления циклом, как в следующем примере.
for (inti = 0; i< N; ++i)
rez+= i*i;
Целая переменная i теперь является объявленной в программе. Это может вносить путаницу, поэтому лучше объявлять все программные переменные в начале блока.
Любое или все выражения в инструкции for могут отсутствовать, но две точки с запятой должны быть обязательно. Если пропущена начальная_инструкция, то никакая инициализация в цикле for не выполняется. Если пропущено выражение, то не производится приращение, а в случае отсутствия условия не производится проверка. Есть специальное правило для тех случаев, когда пропущено условие; в такой ситуации компилятор будет считать условие выполненным всегда. Так, цикл for в следующем фрагменте бесконечен.
for (i = 1, rez = 0 ; ; rez += i++ )
cout<<rez<<endl;
Размещение точки с запятой сразу после правой закрывающей скобки заголовка for делает тело структуры пустым оператором. Обычно это логическая ошибка.
"Приращение” инструкции for может быть отрицательным (в этом случае в действительности происходит не приращение, а уменьшение переменной, управляющей циклом).
Если условие продолжения цикла с самого начала не удовлетворяется, то операторы тела инструкции for не выполняются и управление передается оператору, следующему за for.
Управляющая переменная иногда печатается или используется в вычислениях в теле инструкции for, но обычно это делается без изменений ее величины. Чаще управляющая переменная используется только для контроля числа повторений и никогда не упоминается в теле инструкции.
Хотя управляющая переменная может изменяться в теле цикла for, избегайте делать это, так как такая практика приводит к неявным, неочевидным ошибкам.
Давайте рассмотрим несколько вариантов применения цикла for:
a) Изменение управляющей переменной от 100 до 1 с шагом -1 (с уменьшением на 1).
for (int i = 100; i >= 1; i--)
Распространенная ошибка при программировании, это использование несоответствующей операции отношения в условии продолжения цикла при счете циклов сверху вниз (например, использование i <= 1 при счете циклов сверху до 1 не включая).
b) Изменение управляющей переменной от 7 до 77 с шагом 7.
for (int i = 0; i <= 77; i += 7)
c) Изменение управляющей переменной от 20 до 2 с шагом -2.
for (int i = 20; i >= 2; i -= 2)
d) Изменение управляющей переменной в следующей последовательности:
2, 5, 8, 11, 14.
for (int j = 2;j <= 14; j += 3)
Циклwhile
Когда мы не знаем, сколько итераций должен произвести цикл, нам понадобится цикл while или do...while. Циклический алгоритм while - является циклом с предисловием, а do…while - цикл с постусловием.
Оператор цикла while или цикл while - цикл, повторяющий одно и то же действие, пока условие продолжения цикла while остаётся истинным.
Синтаксис цикла while в C++ выглядит следующим образом.
// форма записи цикла while
while (/*условие продолжения цикла while*/)
{
/*блок операторов*/;
/*управление условием*/;
}
Условие продолжения цикла должно быть истинно - «true», как только условие стало ложным, выполняется выход из цикла. Вначале вычисляется выражение. Если результат отличен от нуля (true), тогда выполняется оператор и управление переходит обратно к началу цикла while. Это приводит к выполнению тела цикла while, а именно оператора, который будет выполняться до тех пор, пока выражение не станет равным нулю (false). Фигурные скобки могут опускаться в том случае, если тело цикла -- это один оператор. Но как правило в цикле выполняется несколько операторов, так как кроме выполнения полезного действия необходимо делать условие цикла while ложным, иначе цикл будет бесконечным, а это, в свою очередь, приведет к зависанию программы.