Курс лекций CS (первый семестр)
.pdfКафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова
Лекция №9.
Выражения.
При написании программного кода из объявленных переменных, чисел, констант составляют выражения, которые содержат операторы (при использовании переменных совместно с операторами они называются операндами). Существуют различные операторы, начиная от самых простых и до чрезвычайно сложных. Простые операторы включают в себя все основные математические действия (например, оператор + производит сложение двух операндов), а сложные операторы предназначены для выполнения манипуляций над двоичным представлением содержимого переменной. Существуют также логические операторы, работающие с логическими значениями, и операторы присваивания типа =. На этой лекции мы изучим математические операторы и оператор присваивания.
Все операторы могут быть условно разделены на три категории:
Унарные операторы, которые выполняют действие над единственным операндом.
Бинарные операторы, которые выполняют действие над двумя операндами.
Тринарные операторы, которые выполняют действие над тремя операндами.
Большинство операторов попадает в категорию бинарных; существует также несколько унарных операторов и единственный тринарный, называемый условным оператором.
Арифметические операции языка C#.
В C# используется пять математических операндов: сложения (+), вычитания (-), умножения
(*), целочисленного деления (/) и деления по модулю (%).
В операциях сложения, вычитания и умножения разобраться несложно.
Если делитель и делимое – целые числа, то результатом будет целая часть частного. Если делитель и делимое – вещественные числа, то результатом будет вещественное частое.
Результатом операции % будет остаток частного, если делитель и делимое целочисленные
данные. Если делитель или делимое отрицателен, знак результата зависит от реализации языка.
Если операнды типа float, то операция деления по модулю выполняется следующим образом:
fResult = fDividend % fDivisor;
Знак fResult совпадает со знаком fDividend, причем fResult может быть рассчитан по формуле:
51
Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова
fResult = fDividend - n * fDivisor
где n — наибольшее целое число, меньшее или равное fDividend /fDivisor. Например:
4.5 % 1.25
равно 0,75. Давайте посчитаем... 4,5 / 1,25 = 3,6, следовательно, n равно 3.
4,5 -3*1,25 = 0,75.
Для арифметических операций используется обычная арифметическая приоритетность. Все эти операторы могут использоваться как бинарные:
…
int a = 8, b=3;
Console.WriteLine("Значение a+b={0}", a + b);
Console.WriteLine("Значение a-b={0}", a - b);
Console.WriteLine("Значение a*b={0}", a * b);
Console.WriteLine("Значение a/b={0}", a / b);
Console.WriteLine("Значение a%b={0}", a % b);
…
Результат:
52
Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова
Операторы (+) и (-), могут быть использованы как унарные:
…
int a = 8; int b = +a; int c = -a;
Console.WriteLine("Значение b={0}", b);
Console.WriteLine("Значение c={0}", c);
...
Результат:
Если варажение состоит из переменных разного типа, то результат повышается до типа с большим диапазоном значений (это называется неявное преобразование типов).
Совместное использование математических операторов с операторами присваивания.
Рассмотрим еще раз на операторе присваивания (=):
Х=35;
Операнд, который может находиться слева от оператора присваивания, называется адресным операндом, или l-значением (от англ. слова left, т.е. левый). Операнд, который может
53
Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова
находиться справа от операнда присваивания, называется операционным операндом, или r-
значением ( от англ. слова right, т.е. правый).
Пример: myAge=myAge+2;
Можно: myAge+=2;
Этот оператор присваивания с суммой (+=) добавляет r-значение к l-значению, а затем снова записывает результат в l-значение.
int a = 9, f = 10;
a+=f;
Помимо оператора присваивания с суммой существуют также операторы присваивания с вычитанием (-=), делением (/=), умножением (*=) и делением по модулю (%=). Все операторы бинарные.
Инкремент и декремент.
Очень часто в программах к переменным добавляется (или вычитается) единица. В языке C# увеличение значения на 1 называется инкрементом, а уменьшение на 1 – декрементом. Для этого предусмотрены специальные унарные операторы.
Оператор инкремента (++) увеличивает значение переменной на 1, а оператор декремента (--) уменьшает его на 1.
А++; |
//увеличение значения А на 1 |
А--; |
//уменьшение значения А на 1 |
Как оператор инкремента, так и оператор декремента работает в двух вариантах: префиксном и постфиксном. Префиксный вариант записывается перед именем переменной (++myAge), постфиксный - после него (myAge++). В простом выражении вариант использования не имеет большого значения, но в сложном при выполнении приращения одной переменной с последующим присваиванием результата другой переменной это весьма существенно. Префиксный оператор вычисляется до присваивания, а постфиксный – после.
x=5;
int d=++x;
Результат: d=6
x=5;
int d=x++;
Результат: d=5
54
Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова
|
Старшинство операторов. |
|
|
Старшинство |
Операторы |
|
|
Высшее |
++, -- (используемые в качестве префиксов); +, - |
|
(унарные) |
|
|
|
*, /, % |
|
|
|
+, - |
|
|
|
=, * = , / = , % = , + = , - = |
|
|
Низшее |
++, -- (используемые в качестве суффиксов) |
|
|
Для изменения порядка выполнения операторов используются скобки.
Выражения отношения.
Операторы отношений используются для сравнения двух значений. Выражения всегда возвращают значения true (истина) или false (ложь). Все операторы бинарные.
|
|
|
Возвращаемое |
Имя |
Оператор |
Пример |
Значение |
|
|
|
|
Равно |
== |
100 == 50 |
false |
|
|
50 == 50 |
true |
|
|
|
|
Не равно |
!= |
100 != 50 |
true |
|
|
50 != 50 |
false |
|
|
|
|
Больше |
> |
100>50 |
true |
|
|
50>50 |
false |
|
|
|
|
Больше |
>= |
100>=50 |
true |
или равно |
|
50>=50 |
true |
|
|
|
|
Меньше |
< |
100<50 |
false |
|
|
50<50 |
false |
|
|
|
|
Меньше |
<= |
100<=50 |
false |
|
|
|
|
55
Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова
или равно |
|
50<=50 |
true |
|
|
|
|
56
Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова
Лекция №10.
Программирование ветвящихся алгоритмов.
Обычно программа выполняется по порядку, строка за строкой. Оператор if позволяет проверить условие (например, равны ли две переменные) и изменить ход выполнения программы, направив ее другое русло, которое будет зависеть от результата сравнения.
Простейшая форма оператора if имеет следующий вид:
if (условие)
выражение;
Условие в круглых скобках содержит операторы отношений. Если это выражение возвращает значение true, то оператор выполняется. Рассмотрим следующий пример:
if (a>b)
a=b;
Здесь сравниваются значения переменных а и b. Если значение переменной а больше, то во второй строчке этого программного фрагмента ее значение устанавливается равным значению переменной b.
Если должно выполняться не одно выражение, то используется блок выражений, заключенный в фигурные скобки.
if (условие)
{
выражение1;
выражение2;
выражение3;
}
Предупреждение. Многие начинающие программисты по невнимательности ставят точку с запятой после выражения if:
if (a<10);
57
Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова
a=10;
В этом программном фрагменте было задумано сравнить значение переменной а с числом 10 и, если окажется, что оно меньше десяти, установить его равным этому числу. При выполнении этого программного фрагмента обнаруживается, что переменная а (вне зависимости от ее исходного значения) всегда устанавливается равной 10. В чем же дело? А дело в том, что оператор if, вернее, связанное с ним выражение сравнения, оканчивается точкой с запятой, создавая тем самым бездействующую инструкцию.
Помните, что для компилятора отступ не играет никакой роли. Приведенный выше фрагмент можно переписать по-другому:
if (a<10) //проверка
;//пустое выражение, контролируемое оператором if
a=10; // присваивание
При удалении ненужной точки с запятой последняя строка этого фрагмента станет частью конструкции с оператором if и программа заработает в соответствии с намерением программиста.
Довольно часто в программах требуется, чтобы при выполнении некоторого условия (т.е. когда это условие возвратит значение true) программа выполняла один блок команд, а при его невыполнении (т.е. когда условие возвратит значение false) – другой блок.
if (условие)
выражение1;
else
выражение2;
следующее выражение;
Если условие возвращает значение true, выполняется выражение1, в противном случае выполняется выражение2. После этого выполняется следующее выражение.
Пример. Программа нахождения максимального числа из двух.
using System;
58
Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова
using System.Collections.Generic; using System.Text;
namespace ConsoleApplication1
{
class MyProgram
{
static void Main(string[] args)
{
int a, b;
Console.Write("Введите первое число:"); a=Convert.ToInt32(Console.ReadLine()); Console.Write("Введите второе число:"); b=Convert.ToInt32(Console.ReadLine()); if (a > b)
Console.WriteLine("Большее число: {0}", a); else
Console.WriteLine("Большее число: {0}", b);
Console.ReadLine();
}
}
}
Результат.
59
Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова
Сложные конструкции с if.
Нет никаких ограничений на использование любых операторов в блоках выражений в конструкции if-else, в том числе на использование дополнительных операторов if и else. В этом случае будет получена вложенная конструкция из нескольких операторов if:
if (условие1)
{
if (условие2)
выражение 1;
else
{
if(условие3)
выражение 2;
else
выражение 3;
}
}
else
выражение 4;
Смысл этой конструкции из нескольких операторов if можно расшифровать так: если условие1 истинно и условие2 истинно, выполняется выражение1. Если условие1 истинно, а условие2 – нет, тогда проверьте условие3 и, если оно истинно, выполните выражение2. Если условие1 истинно, а условие2 и условие3 – нет, тогда выполните выражение3. Наконец, если условие1 ложно, выполните выражение4.
Пример использования фигурных скобок для правильного сопоставления операторов else и if.
С точки зрения компилятора в этой программе на языке С# нет никаких ошибок. Программа не работает как хотелось из-за логической ошибки. Более того, даже при тестировании этой программы может создаться впечатление, что она работает правильно. Ведь при вводе числа
60