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

Вид материалаЛабораторная работа

Содержание


Часть 1 операторы языка с++: операторы условия
Общие сведения
Подобный материал:
1   2   3   4   5   6

ЧАСТЬ 1

ОПЕРАТОРЫ ЯЗЫКА С++: ОПЕРАТОРЫ УСЛОВИЯ


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


Общие сведения


К операторам выбора, называемым операторами управления потоком выполнения программы, относят: условный оператор (if...else) и переключатель (switch). Каждый из них служит для выбора пути выполнения программы.


Синтаксис условного оператора:

if (выражение) оператор 1; else оператор 2;


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


if (х > 0) {х = -x; f(x * 2); }

else { int i = 2; х *= i; t(x) ; }


При использовании блоков (т. е. составных операторов с определениями и описаниями) нельзя забывать о локализации определяемых в блоке объектов. Например, ошибочна будет последовательность:

75
if (j > 0) { int i; i = 2 * j; ) else i = -j;


т. к. переменная i локализована в блоке и не существует вне его.

Допустима сокращенная форма условного оператора, в которой отсутствует else и оператор_2. В этом случае при ложности (равенстве нулю) проверяемого условия никакие действия не выполняются:


if (а < 0) а = -а;


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

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


if (х == 1)

if (у == 1) cout « "х равно 1 и у равно 1";

else cout « "х не равно 1";


При х, равном 1, и у, равном 1, совершенно справедливо печатается фраза "х равно 1 и у равно I". Однако фраза "х не равно 1" может быть напечатана только при х, равном 1, и при у, не равном 1, т. к. else относится к ближайшему if. Внешний условный оператор, где проверяется х==1, является сокращенным и в качестве оператора_1 включает полный условный оператор, в котором проверяется условие у==1. Таким образом, проверка этого условия выполняется только при х, равном 1. Простейшее правильное решение этой микрозадачи можно получить, применив фигурные скобки, т. е. построив составной оператор. Нужно фигурными скобками ограничить область действия внутреннего условного оператора, сделав его неполным. Тем самым внешний оператор превратится в полный условный:


if (х == 1)

{ if (у == 1) cout « "х равно 1 и у равно 1"; }

else cout « "х не равно I";


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


int max3(int х, int у, int z)

{ if (х < у)

if (у < z) return z

else return y;

else

if (ac < z) return z

else return x;


В тексте соответствие if и else показано с помощью отступов.

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


switch (переключающее_выражение)

{ case константное_выражение 1: операторы 1 ;

case константное выражение 2: операторы 2;



case константное выражение п: операторы п;

default: операторы;

}


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

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

Сами по себе метки case константное выражение j : и default: не изменяют последовательности выполнения операторов. Если не предусмотрены переходы или выход из переключателя, то в нем последовательно выполняются все операторы, начиная с той метки, на которую передано управление. Пример программы с переключателем:


//названия нечетных целых цифр, не меньших заданной #include

void main()

{ int ic;

cout « "\nВведите любую» десятичную цифру: " ;

cin » ic;

cout « ' \n' ;

switch (ic)

{ case 0: case 1: cout « "один, ";

case 2: case 3: cout « "три, ";

case 4: case 5: cout « "пять, ";

case 6: case 7: cout « "семь, ";

case 8: case 9: cout « "девять. " ;

break; // Выход из переключателя

cout « "Ошибка! Это не цифра'";

} //Конец переключателя

} // Конец программы


Результаты двух выполнений программы:


Введите любую десятичную цифру: 4

пять, семь, девять


Введите любую десятичную цифру: z

Ошибка! Это не цифра!


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

Несмотря на то, что в формате переключателя после конструкции switch() приведен составной оператор, это не обязательно. После switch() может находиться любой оператор, помеченный с использованием служебного слова case. Однако без фигурных скобок такой оператор может быть только один, и смысл переключателя теряется, он превращается в разновидность сокращенного условного оператора.

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


Switch (n) // Переключатель с ошибками

{ char d = ‘D’ // Никогда не обрабатывается

case 1: float f= 3.14; // Обрабатывается только для n = 1

case 2: … if (int (d) != int(f))... // Ошибка:


Практические задания


Написать программу вычисления следующих функций:

1. y=x, x=1.5 2. y= ln(s+1)+t, |s|<1

y=e+1, x1.5 y=ln|s|+e, |s|>1


3. y= bx+cx,b
y=sin x +b, b=c y=e+4,t>a


71
y= c+bc, b>c


5. y= 0.7ln(cx),c>x 6. y= |q|,q<1

y= x,c
y=1,c=x y=q+2q,q<-1

7. y= e,bx

y= e,a
y=1,b=a y=z,z=x


9. Найти сумму положительных элементов вектора.


10. Вычислить y= na+(n-1)a+…+a.


11. Задать число и вывести все нечетные числа до него. Результат вывести на печать.


12. Задать число и вывести числа, делящиеся на него. Выводить не менее 20 чисел.

23
13. Вывести случайным образом ряд из 15 цифр. Задать число и подсчитать количество таких цифр в выведенном ряду.


14. Задать число и вывести все числа до него с заданным интервалом. Результат вывести на печать.


15. y= ln(s+1)+t, |s|<1 16. y= e+1,b
y=ln|s|, |s|>1 y= e2,a
y=1,b=a


17. y= 2z+5x,z>x 18. y= bx+c,b
y= z-2x,z
y=z+1,z=x y= cx+bc, b>c


19. Вычислить y= a+2a+…+na.


20. Вычислить y= a+…+an.


Лабораторная работа №11