Особенности оператора
Определённые затруднения вызывает вложенность операторов if, когда среди операторов первой и (или) второй последовательности if есть другой, внутренний оператор if полной или сокращённой формы.
Например:
if (a>0)
if (b>0) cout<<”Yes”;
else cout<<”No”.
Для правильной интерпретации такой конструкции необходимо использовать следующее правило: else соответствует ближайшему предшествующему оператору if, ещё не имеющему else. В примере else связан с if (b>0). Поэтому вывод Yes или No в зависимости от b будет выполняться только в случае, если a>0. Если значение a неположительное, ничего выводиться не будет. Поэтому для наглядности желательно располагать ключевые слова так, чтобы это соответствовало логике программы, несмотря на то, что расположение операторов не влияет на их выполнение.
Чтобы else соответствовал внешнему оператору ветвления if (a>0), необходимо добавить фигурные скобки следующим образом:
if (a>0)
{ if (b>0) cout<<”Yes”;
}
else cout<<”No”;
И тогда имеет место полная форма внешнего оператора if и сокращённая форма внутреннего, а не наоборот, как было в первом случае.
Уровень вложенности операторов if может быть больше, чем показано выше. Часто на практике используется следующая конструкция if…else…if :
if ( 1-е выражение )
1-я последовательность операторов;
else if (2- е выражение )
2-я последовательность операторов; …
else if (n-е выражение )
n-я последовательность операторов;
else
(n+1)-я последовательность операторов;
Выражения вычисляются сверху вниз. Если будет найдено, что k-е выражение истинно, то выполняется k-я последовательность операторов, а остальные последовательности пропускаются. Если не найдено ни одного истинного выражения, то выполняется (n+1)-я последовательность операторов при условии, что последний else присутствует, или не выполняется никаких действий, если (n+1)-я последовательность вместе с последним оператором else отсутствует. Пример такой конструкции, которую иногда называют “лесенка if-else-if”, приведён в § 4.
Могут быть и другие конструкции вложенных операторов if, например:
if (выражение 1)
if (выражение 2)
1-я последовательность операторов;
еlse 2-я последовательность операторов;
else 3-я последовательность операторов;
Здесь и внутренний, и внешний операторы if имеют полную форму. Во внешнем операторе в случае истинности выполняется единственный оператор if. Среди любой из трёх последовательностей операторов может быть также оператор if.
Ещё одна особенность оператора if и других операторов связана с тем, что истине соответствует любое ненулевое значение, а значению false соответствует нуль. Поэтому в операторе if выражение в скобках не обязательно должно быть логическим, то есть в нём могут быть только арифметические операции или выражение может представлять собой просто переменную. Допустима, например, следующая компактная запись:
int a=5; /* при объявлении можно инициализировать переменную, то есть присваивать ей начальное значение */
if (a) cout<<” ненулевое значение”;
else cout<< “нулевое значение” ;
// Этот оператор if в стиле языка Pascal можно записать проще:
if (a!=0) // операция сравнения “не равно”
cout<<” ненулевое значение”;
else cout<< “нулевое значение” ; // или
if (a = = 0) // операция сравнения “ равно”
cout<<” нулевое значение”;
else cout<< “ненулевое значение” ;
Наконец, в отличие от языка Pascal, присваивание можно записать внутри другого оператора, например, внутри if в выражении в скобках. Поэтому в языке С присваивание, являясь частью выражения, называют не оператором, а операцией.
Пусть int x=5, y=2. Сравним следующие два выражения в операторе if:
/*1*/ if (x = = y) cout<<”Yes”; else cout<<”No”;
/*2*/ if (x=y) cout<<”Yes”; else cout<<”No”;
В первом варианте значения двух переменных проверяются на равенство, и в результате будет выведено слово No. Второй вариант в стиле языка Pascal равносилен следующей последовательности:
x=y; // х примет значение y, то есть 2
if (x!=0) cout<<”Yes”; else cout<<”No”; // или в стиле языка С
if (x) cout<<”Yes”; else cout<<”No”;
Поэтому в результате будет выведено слово Yes. Во втором варианте результат зависит только от начального значения y и не зависит от x.
Задачи и упражнения
1. Ввести число. Вывести 0 или 1 в зависимости от того, положительное число или неположительное. Выполнить это двумя способами:
#include <iostream.h>
#include <conio.h>
int main()
{ float x; int result;
cout<<"The number "; cin>>x;
cout<<"The first variant " ; cout<<(x>0)<<endl;
cout<<"The second variant " ; if (x>0) result=1;
else result=0;
cout<<result<<endl;
getch(); return 0;
}
2. Найти наибольшее из трех введенных чисел:
main()
{ int x, y, z, res1, res2, res3;
cout<<"The first number "; cin>>x;
cout<<"The second number "; cin>>y;
cout<<"The third number "; cin>>z;
cout<<"Max of numbers ("<<x<<" , "<<y<<" , "<<z<<" ) ";
// Полная форма оператора if:
if (x>y) res1=x;
else res1=y;
if (z>res1) res1=z; cout<<”\nVariant 1 “<<res1<<endl;
// Сокращённая форма оператора if:
res2= x; if (y > res2) res2= y;
if (z > res2) res2= z; cout<<" Variant 2 "<< res2;
// Тернарная операция (см. 3.5):
res3=x>y?x:y; res3=z>res3?z:res3;
cout<<" Variant 3 "<<res3;
getch(); return 0; }
3. Дано x. Вычислить y = x*x, если x > 0, иначе, y = 100.
a) if (x>0) y=x*x; else y=100; cout<<"y= "<<y;
б) y = x>0?x*x:100; cout<<"y= "<<y;
в) cout<<"y= "<<(x>0?x*x:100);
4. Даны х, y. Вывести “+++” или “– – –” в зависимости от того, x>y или нет.
а) if (x>y) cout<<”+++”; else cout<<“– – –”;
б) x>y? cout<<" +++ " : cout<<“– – –”;
5. Ввести три числа x, y, z. Вычислить:
а) r = max(min(x, y), z); б) r = max(x, 0) + min(y, z);
в) r = min(x, y, 0) + max(y, z);
г) произведение двух наименьших из трех чисел.
6. Расположите четыре числа a, b, c, d в порядке возрастания их значений.
7. Даны длины трех отрезков A, B, C. Определить возможность построения треугольника и его вид (разносторонний, равнобедренный, равносторонний).
8. Ввести коэффициенты квадратного уравнения A, B и C. Вывести A*x^2+B*x+C=0. При этом если A=1, выводить только x^2, если A=-1, выводить –x^2, если A=0, первый одночлен не выводить. Аналогично для B. Не выводится также нулевое значение С.
9. Найти действительные корни квадратного уравнения, если заданы его коэффициенты. Предусмотреть следующие варианты: два различных корня; один корень; нет действительных корней.
10. Ввести часы, минуты и секунды. Определить корректность момента времени.
11. Ввести два числа: номер месяца и день. Выполнить проверку корректности этой даты. Например, 3 и 31 определяют дату, а 4 и 31, 20 и 5 — нет. Вывести слово “да” или “нет”.
12. Вычислить значение функции в соответствии с заданным графиком для произвольного одного фиксированного значения аргумента.
13. Вычислить значение функции
Выражения
Выражение — это любая допустимая, записанная по определённым правилам, комбинация переменных, констант, обращений к функциям и операций. Как и в других языках, в выражениях можно использовать обращения к стандартным функциям и функциям пользователя с одним результатом, который возвращается с помощью return (гл. 2), то есть подпрограммы типа Function (функции) в смысле языка Pascal. Любой из перечисленных элементов не является обязательным, любой из них может отсутствовать. Как частный случай выражение может содержать только один из первых трёх элементов, например, константу или единственную переменную, или только обращение к функции.
Константы
Константы в отличие от переменных не могут изменяться программой. Записываются они по следующим правилам. Вещественныеконстанты можно записать в обычной форме, используя символ “.”(точка) для разделения целой и дробной частей
(5.,-12.345, 0.00987) или в экспоненциальной форме (0.5e1,
-0.12345е+2, 987е-5). Константы целого типа можно записать в десятичной (-26) или шестнадцатеричной (0x1A) системе счисления. Символьные константы записываются в одинарных кавычках (‘5’, ‘А’, ‘\t’,’\r’, ‘\”’, ‘\’’,’\\’). Последние пять констант представляют собой следующие символьные константы с обратным слэшем: горизонтальная табуляция, возврат каретки, двойная кавычка, одинарная кавычка и символ “обратный слэш”. Строковые константы записываются в двойных кавычках (“1234”, “Это строка”, “The first number”). Как и в других языках программирования, грамматический контроль строк не выполняется.
Константы можно определить одним из следующих способов:
· непосредственно записать в выражении;
· с помощью ключевого слова const, например, const SIZE=10. И тогда в выражении (в одном или нескольких) вместо константы 10 указываем идентификатор SIZE. Этот способ имеет следующее преимущество. Если одна и та же константа в программе встречается несколько раз, то для её изменения не надо искать каждое появление такой константы, а достаточно изменить её значение один раз при объявлении;
· с помощью директивы #define, например, #define SIZE 10. Директива заменяет каждое появление символов SIZE, образующих слово, на 10. Например, операторы
int SIZE2=5;
cout<<(SIZE+SIZE2);
выведут число 15. Идентификатор SIZE2 определяет не константу, а переменную с начальным значением, которое в дальнейшем можно изменить. В идентификаторе SIZE2 последовательность символов SIZE не меняется на 10 ни первый, ни второй раз, а замена выполняется только в cout для SIZE. В отличие от второго способа, в этом случае SIZE можно переопределить, т. е. в любом месте программы можно записать новую директиву для определения SIZE, например, #define SIZE 2.
Дата добавления: 2016-07-18; просмотров: 1684;