операнд_1 ? операнд_2 : операнд_3




Первый операнд может иметь арифметический тип или быть указателем. Он оце­нивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рас­сматривается как false, не равный пулю - как true). Если результат вычисления первого операнда равен true, то результатом условной операции будет значение второго операнда, иначе - третьего операнда. Вычисляется всегда либо второй операнд, либо третий. Их тип может различаться. Условная операция является сокращен­ной формой условного оператора if.

#include <stdio.h>

int main()

{

int a = 11, b = 4, max;

max = (b > a)? b: a;

printf(“Наибольшее число: %d”, max);

return 0;

}

Результат работы программы:

Наибольшее число: 11.

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

(а + 0.12) / 6

х && у | |!z

(t * sin(x) - 1.05e4)/((2 * k + 2) * (2 * k + 3))

Операции выполняются в соответствии с приоритетами. Для изменения порядка выполнения операций используются круглые скобки. Если в одном выражении за­писано несколько операций одинакового приоритета, унарные операции, условная операция и операции присваивания выполняются справа налево, остальные - сле­ва направо. Например, а = b = с означает а = (b = с), а а + b + с означает (а + b) + с. Порядок вычисления подвыражений внутри выражений не определен: например, нельзя считать, что в выражении (sin(x + 2) + cos (у + 1)) обращение к синусу бу­дет выполнено раньше, чем к косинусу, и что х + 2 будет вычислено раньше, чем y + 1.

Результат вычисления выражения характеризуется значением и типом. Напри­мер, если а и b - переменные целого типа и описаны так:

int а = 2, b = 5;

то выражение а + b имеет значение 7 и тип int, а выражение а = b имеет значение, равное помещенному в переменную а (в данному случае 5) и тип, совпадающий с типом этой переменной. Таким образом, в C++ допустимы выражения вида а = b = с: сначала вычисляется выражение b = с, а затем его результат становится правым операндом для операции присваивания переменной а.

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

Преобразования бывают двух типов:

  • изменяющие внутреннее представление величин (с потерей точности или без потери точности);
  • изменяющие только интерпретацию внутреннего представления.

К первому типу относится, например, преобразование целого числа в веществен­ное (без потери точности) и наоборот (возможно, с потерей точности), ко второ­му - преобразование знакового целого в беззнаковое.

В любом случае величины типов char, signed char, unsigned char, short int и unsigned short int преобразуются в тип int, если он может представить все значе­ния, или в unsigned int в противном случае.

После этого операнды преобразуются к типу наиболее длинного из них, и он ис­пользуется как тип результата. Программист может задать преобразования типа явным образом.

Стандартные математические функции. В языке C для математических вычислений используются стандартные математические функции, декларированные в заголовочном файле math.h (табл. 1.8 и табл. 1.9).

Таблица 1.8 - Тригонометрические и гиперболические функции

Тригонометрические функции (угол задается в радианах) Обратные тригонометрические функции (возвращают угол в радианах) Гиперболические функции
sin(x) - синус asin(x) - арксинус sinh(x) - гиперболический синус
cos(x) - косинус acos(x) - арккосинус cosh(x) - гиперболический косинус
tan(x) - тангенс atan(x) - арктангенс tanh(x) - гиперболический тангенс
  atan2(y, x) - угол в полярных координатах точки (x, y) в диапазоне .  

Таблица 1.9 - Другие наиболее часто используемые математические функции

Функция Действие
hypot(x,y) вычисляет гипотенузу прямоугольного треугольника с катетами x и y
exp(x) экспоненциальная функция,
log(x) натуральный логарифм, ln(x), x > 0
log10(x) десятичный логарифм, lg(x), x > 0
pow(x, y) вычисляет . Ошибка области, если x = 0 и y ≤ 0 или x < 0, y - не целое
pow10(p) Вычисляет . Результат вычисляется в видеdouble. Все аргументы считаются допустимыми, p типа int.
sqrt(x) корень квадратный из x, x ≥ 0
ceil(x) находит наименьшее целое типа double, не меньшее x ceil(6.25) = 6.00, ceil(-6.25) = -6.00
floor(x) находит наибольшее целое типа double не превышающее значение x. floor(6.25) = 6.00, floor(-6.25) = -7.00
fabs(x) абсолютное значение (модуль) числа с плавающей точкой fabs(-6.25) = 6.25

Пример:

#include "stdafx.h"

#include "math.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

double x, z, s;

const double a=0.5, b=1.08, c=2.1, m=0.7;

z=(sin(x)/sqrt(1+m*m*sin(x*x))-c*m*log10(m*x));

cout<< "z=";

cout<< z;

s=(exp(-a*x)*sqrt(x+1)+exp(-b*x)*sqrt(x+1.5));

cout<< "\ns=";

cout<< s;

getch();

return 0;

}

В этом примере вычисляется функция:

при заданных значениях: х = 1.7; a = 0.5; b =1.08; c = 2.1; m =0.7.

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

К ошибкам, выявляемым на этапе компиляции, относятся, прежде всего, синтак­сические ошибки (нарушения правил языка C++ в исходном тексте программы). Такие ошибки обычно выявляются самой средой программирования. Встретив синтаксическую ошибку в программе, прервет компиляцию и выдаст сообщение об ошибке.

К ошибкам времени выполнения программы относятся такие, которые возникают не в результате нарушения синтаксиса C++, а в результате выполнения програм­мой каких-либо недопустимых действий (например, попытка разделить число на нуль или записать данные на заполненный диск). Некоторые из этих ошибок от­личаются тем, что возникают лишь при определенных условиях, например при заполнении диска или обращении в нуль значения какой-либо переменной. Как правило, при возникновении ошибки времени выполнения программа выдает специальное сообщение об ошибке (и часто ее выполнение на этом завершается), Логические ошибки в программе относятся к самому «труднонаходимому» типу ошибок, поскольку их зачастую невозможно выявить формальными методами. При наличии логических ошибок программа выполняется и компилируется без проблем, но делает не то, что ждет от нее программист. Обнаружить и устранить логические ошибки (а также ошибки времени выполнения) в программе можно с помощью тестирования и отладки.

Сообщение об ошибке содержит указание на имя файла и строку, в которой обнаруже­на ошибка, код ошибки и ее краткое описание. Более подробные сведения об ошибке можно получить в справочной системе. Для этого нужно щелкнуть на стро­ке сообщения об ошибке один раз (при этом строка будет выделена) и нажать кла­вишу F1. Если щелкнуть на строке сообщения об ошибке дважды, в окне редактора исходных текстов будет выделена строка, в которой обнаружена ошибка. Visual C++ выводит сразу все сообщения об ошибках, обнаруженных в программе.

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

Кроме сообщений об ошибках выводит предупреждения (war­nings). Предупреждения означают, что компилятор обнаружил в программе фраг­мент, который может быть ошибочным. Таким образом, компилятор пытается пре­дотвратить возможные ошибки времени выполнения, и даже логические ошибки. Структура предупреждающего сообщения аналогична структуре сообщения об ошибках. Справочная система также предоставляет информацию о предупрежде­ниях компилятора. Само появление предупреждений еще не означает, что вы обя­зательно должны что-то изменить в тексте программы, но к ним необходимо относиться к ним внимательно.

Аппаратура и материалы. Для выполнения лабораторной работы необходим персональный компьютер со следующими характеристиками: процессор Intel Pentium-совместимый с тактовой частотой 800 МГц и выше, оперативная память - не менее 64 Мбайт, свободное дисковое пространство - не менее 500 Мбайт, устройство для чтения компакт-дисков, монитор типа Super VGA (число цветов от 256) с диагональю не менее.²15 Программное обеспечение - операционная система Windows2000/XP и выше, среда разработки приложений Microsoft Visual Studio.

Указания по технике безопасности. Техника безопасности при выполнении лабораторной работы совпадает с общепринятой для пользователей персональных компьютеров, самостоятельно не производить ремонт персонального компьютера, установку и удаление программного обеспечения; в случае неисправности персонального компьютера сообщить об этом обслуживающему персоналу лаборатории (оператору, администратору); соблюдать правила техники безопасности при работе с электрооборудованием; не касаться электрических розеток металлическими предметами; рабочее место пользователя персонального компьютера должно содержаться в чистоте; не разрешается возле персонального компьютера принимать пищу, напитки.

Методика и порядок выполнения работы. Перед выполнением лабораторной работы каждый студент получает индивидуальное задание. Защита лабораторной работы происходит только после его выполнения (индивидуального задания). При защите лабораторной работы студент отвечает на контрольные вопросы, приведенные в конце, и поясняет выполненное индивидуальное задание. Ход защиты лабораторной работы контролируется преподавателем.Номер индивидуального задания студента , где - номер студента в журнале преподавателя. Порядок выполнения работы:

  1. Оформить программу, указав свою фамилию и инициалы, группу с использованием однострочного и многострочного комментариев.
  2. Объявить и проинициализировать переменные основных типов (int, double, char).
  3. По инструкции cin >> ввести одно из предложенных значений переменных с клавиатуры (int, double).
  4. Оставшиеся значения определить как константы, используя константные переменные.
  5. Вычислить значения выражение по заданным расчетным формулам и наборам исходных данных.
  6. Инструкцией cout << вывести на экран значения исходных данных и результаты вычислений, сопровождая вывод именами выводимых величин на экран. При переводе на новую строку использовать управляющий символ ‘/n’ и манипулятор endl.
  7. Изменить программу таким образом, чтобы значения всех переменных вводились с клавиатуры.

Индивидуальное задание №1. Вариант:

Задание   Задание
при х = 1.426; у = - 1.220; z = 3.5.  
при х = 1.4; a = 0.5; b = 3.1.
при х = 1.825; у = 18.225; z = - 3.289.  
при х = 0.3; a = 0.5; b = 2.9.
при х = 0.335; у = 0.025.  
при х = 1.426; у = -0.823; z = 2.724.
при a = - 0.5; b = 1.7; t = 0.44.  
при х = 0.9; m = 1.2; c = 2.4.
при a = - 1.5; b = 15.5; x = -2.9.  
при х = 5.4; у = 1.9; b = 3.5; m = 0.2.
при a = 16.5; b = 3.4; x = 0.61.  
при х = 0.54; a = 1.1; b = - 1.22.
при a = 0.7; b = 0.05; x = 0.5.  
при х = 1.82; у = 18.23; z = 3.44.
при х = 0.2; a = 1.1; b = 0.04.  
при a = 1.5; b = 15.6; t = 0.9.
при m = 2; c = -1; t = 1.2; b = 0.7.  
при b = 0.7; c = -1.8; t = 1.2.
при a = 3.2;b = 17.5; x =- 4.8.  
при a = 3.44; b = 17.52; x=- 4.8, z = 5.34.
при a = 10.2; b = 9.2; x = 2.2; c = 0.5.  
при х = 3.23; a = 10.23; b = 9.84; c = 0.5.
при a = 0.3; b = 0.9; x = 0.61.  
при a =0.001; b = 5.8; x = 1.77.

Содержание отчета и его форма. Отчет по лабораторной работе должен состоять из:

  1. Названия лабораторной работы.
  2. Цели и содержания лабораторной работы.
  3. Ответов на контрольные вопросы лабораторной работы.
  4. Формулировки индивидуального задания и порядка его выполнения.

Отчет о выполнении лабораторной работы в письменном виде сдается преподавателю.

Вопросы для защиты работы

  1. Назовите преимущества языка С++.
  2. Какие окна включает в себя рабочий стол Visual C++?
  3. Каковы этапы создания консольного приложения в среде Visual C++?
  4. Какова структура программы, написанной на языке C++?
  5. Какие существуют основные типы данных в языке C++? Дать их назначение.
  6. Каково назначение директивы #include в языке C++?
  7. Каково назначение функций printf() и puts() в языке C++?
  8. Каково назначение функций clrscr(), getch() и cputs() в языке C++?
  9. Каким образом осуществляется потоковый ввод-вывод в языке C++? Каково назначение объектов cin и cout?
  10. Что такое литерал?
  11. Как производится объявление переменной и константной переменной в языке C++? В чем отличие присваивания от инициализации?
  12. Какие спецификаторы используются для задания класса памяти?
  13. Какое существует деление операций в соответствии с количеством операндов, которые в них используются?
  14. Из чего состоят выражения?
  15. Какие существуют математические функции в языке C++?
  16. Каким образом осуществляется диагностирование ошибок компиляции в среде Visual C++?

Пример выполнения лабораторной работы №1:

Конец формы

Начало формы

Конец формы

1. Формулировка индивидуального задания:

Вычислить:

при х = 1.7; a = 0.5; b =1.08; c = 2.1; m =0.7.

2. Листинг программы:

// Лабораторная работа №1

/* Горошко А.А.

гр. БАС-051*/

#include "stdafx.h"

#include <iostream>

#include "conio.h"

#include "math.h"

#include "windows.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

setlocale(LC_ALL, "Russian");

double x, z, s;

//const double a = 0.5, b = 1.08, c = 2.1, m = 0.7;

double a, b, c, m;

cout<<"Введите переменную"<<"\nx=";

cin >> x;

cout<<"Введите переменную"<<"\na=";

cin >> a;

cout<<"Введите переменную"<<"\nb=";

cin >> b;

cout<<"Введите переменную"<<"\nc=";

cin >> c;

cout<<"Введите переменную"<<"\nm=";

cin >> m;

z=(sin(x)/sqrt(1+m*m*sin(x*x))-c*m*log10(m*x));

cout<< "z=";

cout<< z;

s=(exp(-a*x)*sqrt(x+1)+exp(-b*x)*sqrt(x+1.5));

cout<< "\ns=";

cout<< s;

getch();

return 0;

}

3. Результаты работы программы:

Лабораторная работа №2. Программирование алгоритмов разветвляющейся структуры в языке C++

Цель работы и содержание: приобретение навыков программирования разветвляющихся алгоритмов. Освоить операторы языка C++ if и switch, позволяющего реализовывать разветвляющиеся алгоритмы.

Ход работы

Диаграммы деятельности. Унифицированный язык моделирования (UML) является стандартным инструментом для создания «чертежей» программного обеспечения. С помощью UML можно визуализировать, специфицировать, конструировать и документировать артефакты программных систем. UML пригоден для моделирования любых систем: от информационных систем масштаба предприятия до распределенных Web-приложений и даже встроенных систем реального времени. Это очень выразительный язык, позволяющий рассмотреть систему со всех точек зрения, имеющих отношение к ее разработке и последующему развертыванию. Несмотря на обилие выразительных возможностей, этот язык прост для понимания и использования.

Диаграммы деятельности - это один из пяти видов диаграмм, применяемых в UML для моделирования динамических аспектов поведения системы. Диаграмма деятельности - это, по существу, блок-схема, которая показывает, как поток управления переходит от одной деятельности к другой, однако, по сравнению с последней, у ней есть явные преимущества: поддержка многопоточности и объектно-ориентированного проектирования.

Диаграмма деятельности (Activity diagram) показывает поток переходов от одной деятельности к другой. Деятельность (Activity) - это продолжающийся во времени неатомарный шаг вычислений в автомате. Деятельности в конечном счете приводят к выполнению некоего действия (Action), составленного из выполняемых атомарных вычислений, каждое из которых либо изменяет состояние системы, либо возвращает какое-то значение. Действие может заключаться в вызове другой операции, посылке сигнала, создании или уничтожении объекта либо в простом вычислении - скажем, значения выражения. Графически диаграмма деятельности представляется в виде графа, имеющего вершины и ребра.

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

а) б) в)

Рисунок 2.1 - Состояния действия и комментарий: а) простое действие;

б) выражение; в) комментарий

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

В противоположность этому состояния деятельности могут быть подвергнуты дальнейшей декомпозиции, вследствие чего выполняемую деятельность можно представить с помощью других диаграмм деятельности. Состояния деятельности не являются атомарными, то есть могут быть прерваны. Предполагается, что для их завершения требуется заметное время. Можно считать, что состояние действия - это частный вид состояния деятельности, а конкретнее - такое состояние, которое не может быть подвергнуто дальнейшей декомпозиции. А состояние деятельности можно представлять себе как составное состояние, поток управления которого включает только другие состояния деятельности и действий.

Переходы. Когда действие или деятельность в некотором состоянии завершается, поток управления сразу переходит в следующее состояние действия или деятельности. Для описания этого потока используются переходы, показывающие путь из одного состояния действия или деятельности в другое. В UML переход представляется простой линией со стрелкой, как показано на рис. 2.2.

Рисунок 2.2 - Нетриггерные переходы

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

Ветвление. Простые последовательные переходы встречаются наиболее часто, но их одних недостаточно для моделирования любого потока управления. Как и в блок-схеме, вы можете включить в модель ветвление, которое описывает различные пути выполнения в зависимости от значения некоторого булевского выражения. Как видно из рис. 2.3, точка ветвления представляется ромбом. В точку ветвления может входить ровно один переход, а выходить - два или более. Для каждого исходящего перехода задается булевское выражение, которое вычисляется только один раз при входе в точку ветвления. Ни для каких двух исходящих переходов эти сторожевые условия не должны одновременно принимать значение «истина», иначе поток управления окажется неоднозначным. Но эти условия должны покрывать все возможные варианты, иначе поток остановится.

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

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

Рисунок 2.3 - Ветвление

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

Любое выражение, завершающееся точкой с занятой, рассматривается как опера­тор, выполнение которого заключается в вычислении выражения. Частным слу­чаем выражения является пустой оператор; (он используется, когда но синтак­сису оператор требуется, а по смыслу - нет). Примеры:

i++; // выполняется операция инкремента

а* = b + с; // выполняется умножение с присваиванием

fun(i, k); // выполняется вызов функции

Логическоевыражение - некоторое утверждение, относительно которого можно сказать: истинно оно или ложно.

В языке C++ любое выражение, равное нулю считается ложным, тогда как любое выражение не равное нулю будет истинным.

В Си++ используются шесть операторов отношения (табл. 2.1), позволяющих сравнивать между собой значения числовых переменных, а также значение переменной и константы.

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

<выражение> <оператор_сравнения> <выражение>

Из простых условий, которые являются выражениями логического типа можно строить составные условия. В этом случае простые условия необходимо связывать при помощи логических операций:!(не), &&(и), ||(или).

Таблица 2.1 - Операторы отношения в языке C++

a = b равно a == b
a > b больше a > b
a < b меньше a < b
a ≥ b больше или равно a >= b
a ≤ b меньше или равно a <= b
a ≠ b не равно a!= b

Операция логического И (&&). Логическая операция И используется в том случае, когда требуется одновременность выполнения двух условий, входящих в данную операцию. В языке C++ данное выражение может быть представлено следующим образом

<условие 1> && <условие 2>

На практике эта логическая операция часто применяется для создания условия, что некоторая переменная принадлежит указанному промежутку. Например, составим условие, которое будет истинно тогда и только тогда, когда переменная х принадлежит промежутку от 10 до 20: 10 < x < 20. Это произойдёт только в том случае, когда х >10 и x < 20. На языке C++ это записывается так:

x > 10 && x < 20

Операция логического ИЛИ (||). Логическая операция ИЛИ используется только в том случае, когда требуется выполнение хотя бы одного из условий, входящих в данную операцию. В языке C++ данное выражение может быть представлено следующим образом:

<условие 1> || <условие 2>

На практике эта логическая операция часто применяется для создания условия, что некоторая переменная принимает одно из допустимых значений. Например, составим условие, которое истинно тогда и только тогда, когда x принимает фиксированные значения: 1,2; 2,3; 3,4. Это произойдет только в том случае, когда x = 1,2 или x = 2,3 или x = 3,4. На языке C++ это запишется как

x == 1.2 || x == 2.3 || x == 3.4

Операция логического НЕ (!). Операция НЕ принимает значение истина, если ее операнд принимает значение ложь, и наоборот, результатом операции НЕ будет ложь, если ее операнд принимает значение истина. В языке C++ данное выражение может быть представлено следующим образом:

! <условие>

На практике операция НЕ применяется для отрицания какого-либо факта.

Все логические операции (за исключением операции логического НЕ) имеют приоритет ниже операций отношения, поэтому обрамлять скобками простые условия на основе операторов отношения не обязательно.

Примеры:

if (a<0) b = 1; // 1

if (a<b && (a>d||a==0)) b++;

else

{

b*=a;

a=0;

} // 2

if (a<b)

{

if (a<c) m = a;

else m = c;

}

else

{

if (b<c) m = b;

else m = c;

} // 3

if (a++) b++; // 4

if (b>a) max = b;

else max = a; // 5

В примере 1 отсутствует ветвь else. Подобная конструкция называется «пропуск оператора», поскольку присваивание либо выполняется, либо пропускается в за­висимости от выполнения условия.

Если требуется проверить несколько условий, их объединяют знаками логиче­ских операций. Например, выражение в примере 2 будет истинно в том случае, если выполнится одновременно условие a<b и одно из условий в скобках. Если опустить внутренние скобки, будет выполнено сначала логическое И, а потом - ИЛИ.

Оператор в примере 3 вычисляет наименьшее значение из трех переменных. Фи­гурные скобки в данном случае не обязательны, так как компилятор относит часть else к ближайшему if.

Пример 4 напоминает о том, что хотя в качестве выражений в операторе if чаще всего используются операции отношения, это не обязательно.

Конструкции, подобные оператору в примере 5, проще и нагляднее записывать в виде условной операции (в данном случае: max=(b>a)?b:a;).

Условный оператор. Условный оператор if используется для разветвления процесса вычислений на два направления.

t rue false false

true

Рисунок 2.4 - Структурная схема условного оператора

Сначала вычисляется выражение, которое может иметь арифметический тип или тип указателя. Если оно не равно нулю (имеет значение true), выполняется пер­вый оператор, иначе - второй. После этого управление передается на оператор, следующий за условным.

Одна из ветвей может отсутствовать, логичнее опускать вторую ветвь вместе с ключевым словом else. Если в какой-либо ветви требуется выполнить несколь­ко операторов, их необходимо заключить в блок, иначе компилятор не сможет понять, где заканчивается ветвление. Блок может содержать любые операторы, в том числе описания и другие условные операторы (но не может состоять из од­них описаний). Необходимо учитывать, что переменная, описанная в блоке, вне блока не существует.

Условный оператор в языке C++ имеет формат:

if(<Условие>) <Оператор>;

его действие можно описать с помощью фрагмента UML-диаграммы деятельности, изображенного на рис. 2.5 а:

а) б)

Рисунок 2.5 - Фрагмент диаграммы деятельности UML, описывающей действия оператора if в языке C++: а) без альтернативной ветви else;

б) с альтернативной ветвью else

Если помимо тех действий, которые требуется выполнить, когда заданное условие истинно, требуется исполнить и ряд действий, когда заданное условие ложно, то применяют следующую форму условного оператора:

if(<Условие>) <Оператор_1>; else <Оператор_2>;

его действие можно описать с помощью фрагмента блок-схемы алгоритма, изображенного на рис. 2.5 б. Иными словами, если «условие» принимает значение «истина», то выполняется «оператор1», и если «условие» принимает значение «ложь», то выполняется «оператор2».

Например, для оператора if без альтернативной ветви else можно привести следующий фрагмент кода:

// Условный оператор

if(temperature >= 0)

cout << "Выше точки замерзания!\n";

// Действия, не относящиеся к условному оператору

cout << "Температура " << temperature << endl;

тогда как для оператора if-else можно привести следующий пример:

// Условный оператор

if(x < у) min = х;

else min = у;

// Действия, не относящиеся к условному оператору

cout <<"min = " << min;

Последний пример может быть прокомментирован следующим образом. Если условие x < у истинно, то переменной min будет присвоено значение х, если оно ложно, то min будет присвоено значение у. После выполнения инструкции if-else будет напечатано значение min.

Оба оператора <Оператор_1> и <Оператор_2> могут представлять простые операторы (один оператор), в этом случае они не заключаются в фигурные скобки. Если же <Оператор_1> и/или <Оператор_2> представляют составной оператор (несколько операторов), то их нужно заключить в фигурные скобки.

{

Оператор_1;

Оператор_2;

...

Оператор_n;

}

Каждый оператор внутри скобок должен заканчиваться точкой с запятой.

Структура называется вложенной, если после <условия> или служебного слова else используются вновь условные операторы. Число вложений может быть произвольным. При этом справедливо следующее правило: служебное слово else всегда относится к ближайшему выше <условию>.

Пример 2.1. Составить UML-диаграмму деятельности и программу с использованием конструкции ветвления для вычисления значения функции:

(3.1)

Составим UML-диаграмму деятельности вычисления значения функции (рис. 2.6).

Рисунок 2.6 - UML-диаграмма деятельности для задачи расчета значения функции

По составленной диаграмме может быть написана программа вычисления значения функции.

Листинг 2.1

#include “stdafx.h”

#include <iostream>

#include <math.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

double x, y;

setlocale(LC_ALL, "Russian");

cout << ”Введите x: ”;

cin >> x;

if (x <= 0)

y=2*x*x + cos(x);

else

if (x<5) y = x + 1;

else y = sin(x) - x*x;

cout << “y(x = ” << x << “) = ” << y << endl;

getch();

return 0;

}

Переключатель. Оператор switch (переключатель) предназначен для разветвления процесса вы­числений на несколько направлений. Переключатель является наиболее удобным средством для органи­зации мультиветвления. Синтаксис переключателя таков:

switch(Выражение)

{

case Константа_1: Операторы_1;

case Константа_2: Операторы_2;

...

case Константа_n: Операторы_n;

default: Операторы_(n+1);

}

Выражение

Операторы 1

Операторы 2

Операторы n

Операторы

Рисунок 2.7 - Структурная схема оператора switch

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

Выход из переключателя обычно выполняется с помощью операторов break или return. Оператор break выполняет выход из самого внутреннего из объемлющих.

Управляющая конструкция switch передает управление к тому из помеченных с помощью case операторов, для которого значение кон­стантного выражения совпадает со значением переключающего вы­ражения. Переключающее выражение должно быть целочисленным или его значение приводится к целому. Значения константных выра­жений, помещаемых за служебными



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-10-17 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: