C  + +           Л Е К Ц І Я   2
ОПЕРАТОР ПРИСВАИВАНИЯ
Оператор присваивания в Си имеет вид знака равенства “=”.
Язык Си позволяет производить транзитивные присваивания. Например, оператор  a = b = 1;
сначала присвоит
переменной b значение 1, а потом переменной
a присвоит значение переменной b.
Упражнение. Целочисленные
переменные a и b содержат некоторые значения. Найти значение переменных a=b+5 и s=a+10.
#include <stdio.h>
int a, b, s;
void main(void)
{
  scanf("%d
%d",&a,&b);                    
  s=10+a=b+5;   //Не у всіх середовищах працюватиме, краще s=10+(a=b+5)
  printf("%d %d\n", a, s);     
}
 УСЛОВНЫЙ ОПЕРАТОР И ОПЕРАЦИИ СРАВНЕНИЯ
 Синтаксис условного оператора:
   if (<условное выражение >) <выражение 1>;
или
   if (<условное
выражение >) <выражение 1>; else <выражение 2>;
Основные отличия синтаксиса условного оператора от языка программирования
Паскаль: 
1. Условное выражение всегда берется в круглые скобки, даже если оно имеет
простой вид;
2. Отсутствует ключевое слово then;
3. Перед ключевым словом else всегда ставится символ “;”
Операция сравнения в языке Си имеет вид “==” (два знака равенства).
Например, проверка равенства значения целочисленной переменной x двойке имеет вид:      if (x == 2) . . .
 Операция «меньше или
равно» в языке Си имеет вид “<=”, «больше или равно»  -  “>=”.
Операция «не равно» в языке Си
имеет вид “!=”.
| 
   
 Словесное выражение  
 | 
  
   
Запись выражения в языке Си 
 | 
 
| 
   
если  
 | 
  
   
if (x > 4)  . . . 
 | 
 
| 
   
если  
 | 
  
   
if (x >= 4) . . . 
 | 
 
| 
   
если  
 | 
  
   
if (x < 6)  . . . 
 | 
 
| 
   
если  
 | 
  
   
if (x <= 6) . . . 
 | 
 
| 
   
если  
 | 
  
   
if (x == 7) . . . 
 | 
 
| 
   
если  
 | 
  
   
if (x != 9) . . . 
 | 
 
 Пример 1. Вычислить значение функции
Пусть аргумент и значение функции являются действительными числами.
Программа ввода переменной x,
вычисления значения функции y и вывода
результата имеет вид:
 #include <stdio.h>
double x,y;
void main(void)
{
  scanf("%lf",
&x);
  if
(x >= 0) y = x + 1; else y = x * x;
  printf("%lf\n",
y);
}
 Пример2. Вычислить значение функции: 
 #include <stdio.h>
double x,y;
void main(void)
{
  scanf("%lf",
&x);
  if
(x < 0) y = x + 1; else 
  if
(x < 10) y = x * x; else y = x - 4;
  printf("%lf\n",
y);
}
 Пример. На вход программы подается одно из
целочисленных значений: 0 или 1. Если введен 0, то программа должна вывести 1.
Если введена 1, то следует вывести 0. Реализовать такую программу.
#include <stdio.h>
int x,y;
void main(void)
{
  scanf("%d",&x);
  if
(x == 1) y = 0; else y = 1;
  printf("%d\n",y);
}
 Можно обойтись и без условного оператора. Для этого следует
заметить, что y = 1 – x. 
#include <stdio.h>
int x,y;
void main(void)
{
  scanf("%d",&x);
  y = 1 - x;
  printf("%d\n",y);
}
 Упражнение 2. Найти наибольшее среди трех заданных целых чисел. 
#include <stdio.h>
int a, b, c, max;
void main(void)
{
  scanf("%d
%d %d",&a,&b,&c);
  if
(a > b)
   
if (c > a) max = c; else max = a;
  else
    if
(c > b) max = c; else max = b;
  printf("%d\n",max);
}
АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ
Основными арифметическими операциями
являются: сложение(‘+’), вычитание(‘-‘), умножение(‘*’) и
деление(‘/’). Порядок выполнения операций в выражении соответствует их
приоритету. Операции с одинаковым приоритетом в выражении выполняются слева
направо.
Операция деления (‘/’) выполняется
согласно типу ее операндов. Если оба операнда являются целыми числами, то
деление будет целочисленным. Если один из операндов является вещественным, то и
результат будет вещественным. Например, пусть переменная x имеет целочисленный тип, а y действительный тип.
Следующая таблица демонстрирует результаты деления для различных операндов:
| 
   
операция 
 | 
  
   
результат 
 | 
 
| 
   
x = 7 / 3; 
 | 
  
   
x = 2 
 | 
 
| 
   
y = 7 / 3; 
 | 
  
   
y = 2.000000 
 | 
 
| 
   
y = 7.0 / 3; 
 | 
  
   
y = 2.333333 
 | 
 
| 
   
y = (double)7 / 3; 
 | 
  
   
y = 2.333333 
 | 
 
Рассмотрим второй пример. При выполнении
операции присваивания значения выражения переменной, сначала вычисляется
значение выражения, а потом оно присваивается переменной. Поскольку операнды во
втором примере являются целыми, то результатом деления 7/3 будет 2. Потом
целочисленное значение 2 преобразовывается в действительное значение 2.000000 и
присваивается действительной переменной y.
В третьем и четвертом примере перед
выполнением операции деления происходит преобразование типа делимого из целого
в вещественный. Поэтому деление будет производиться без потери точности.
Пример 1. Найти среднее арифметическое двух целых чисел a и b.
Результатом вычисления выражения (a + b)
/ 2 может быть действительное число. Поэтому деление должно выполняться с
сохранением точности. А для этого один из операндов необходимо преобразовать в
действительный тип. Например, результат можно вычислить так: res =
(a + b) / 2.0. Программа имеет вид:
#include <stdio.h>
int a,b;
double res;
void main(void)
{
  scanf("%d %d",&a,&b);
  res = (a + b) / 2.0;
  printf("%lf\n",res);
}
Операция вычисления остатка в Си
обозначается символом ‘%’. При этом остаток при делении отрицательного числа на
положительное является отрицательным (хотя математически остаток при делении на
число n должен лежать в промежутке от 0 до  n –
1 включительно).
| 
   
 Операция 
 | 
  
   
результат 
 | 
 
| 
   
x = 6 % 3 
 | 
  
   
x = 0 
 | 
 
| 
   
x = 8 % 3 
 | 
  
   
x = 2 
 | 
 
| 
   
x = -6 % 3 
 | 
  
   
x = 0 
 | 
 
| 
   
x = -8 % 3 
 | 
  
   
x = -2 
 | 
 
В языке Си при выполнении операций
возможны синтаксические сокращения. Например, вместо i = i +
1 можно писать i++. Примеры сокращений:
| 
   
операция 
 | 
  
   
сокращение 
 | 
 
| 
   
i = i + 1 
 | 
  
   
i ++ 
 | 
 
| 
   
i = i – 1 
 | 
  
   
i -- 
 | 
 
| 
   
i = i + a 
 | 
  
   
i += a 
 | 
 
| 
   
i = i % a 
 | 
  
   
i %= a 
 | 
 
        Упражнение 1. Имеются
одинаковые коробки, каждая из которых вмещает m шаров. Сколько
коробок требуется для упаковки n шаров? 
Упражнение 2. Пусть n – трехзначное число. Найти сумму цифр числа n.
ЛОГИЧЕСКИЕ ОПЕРАЦИИ
Среди логических операций следует выделить
операции ‘и’ (‘and’), ‘или’ (‘or‘), отрицание ‘не’ (‘not’) и сложение по модулю
2 (‘xor’). В языке Си логические операции обозначаются следующим образом:
| 
   
операция 
 | 
  
   
Обозначение в Си 
 | 
 
| 
   
x and y 
 | 
  
   
x && y 
 | 
 
| 
   
x or y 
 | 
  
   
x || y 
 | 
 
| 
   
not x 
 | 
  
   
!x 
 | 
 
| 
   
x xor y 
 | 
  
   
x ^ y 
 | 
 
Таблицы истинности логических операций
приведены в следующих таблицах:
| 
   
 x 
 | 
  
   
y 
 | 
  
   
x and y 
 | 
  
   | 
  
   
x 
 | 
  
   
y 
 | 
  
   
x or y 
 | 
  
   | 
  
   
x 
 | 
  
   
not x 
 | 
  
   | 
  
   
x 
 | 
  
   
y 
 | 
  
   
x xor y 
 | 
 
| 
   
0 
 | 
  
   
0 
 | 
  
   
0 
 | 
  
   | 
  
   
0 
 | 
  
   
0 
 | 
  
   
0 
 | 
  
   | 
  
   
0 
 | 
  
   
1 
 | 
  
   | 
  
   
0 
 | 
  
   
0 
 | 
  
   
0 
 | 
 
| 
   
0 
 | 
  
   
1 
 | 
  
   
0 
 | 
  
   | 
  
   
0 
 | 
  
   
1 
 | 
  
   
1 
 | 
  
   | 
  
   
1 
 | 
  
   
0 
 | 
  
   | 
  
   
0 
 | 
  
   
1 
 | 
  
   
1 
 | 
 
| 
   
1 
 | 
  
   
0 
 | 
  
   
0 
 | 
  
   | 
  
   
1 
 | 
  
   
0 
 | 
  
   
1 
 | 
  
   | 
  
   | 
  
   | 
  
   | 
  
   
1 
 | 
  
   
0 
 | 
  
   
1 
 | 
 
| 
   
1 
 | 
  
   
1 
 | 
  
   
1 
 | 
  
   | 
  
   
1 
 | 
  
   
1 
 | 
  
   
1 
 | 
  
   | 
  
   | 
  
   | 
  
   | 
  
   
1 
 | 
  
   
1 
 | 
  
   
0 
 | 
 
Следует отметить также логическую операцию
сравнения, обозначаемую в Си двумя знаками равенства. При этом выражение (x == y)
эквивалентно  !(x xor y) –
смотреть таблицу истинности. 
Операция называется операцией “сложение по
модулю 2”, потому что x xor y = (x + y)
mod 2. Например, (0+0) mod 2=0, (0+1) mod 2=1, (1+0) mod 2=1,
(1+1) md2=0. Логические операции подчиняются правилу Де-Моргана:
not (x and y)
= (not x) or (not y)        или      в языке С :      !(x && y)
= !x  ||  !y
УСЛОВНЫЙ ОПЕРАТОР И
ЛОГИЧЕСКИЕ ОПЕРАЦИИ
Используя логические операции, можно
строить условные выражения. Реализуем на языке Си следующие задачи, в которых
требуется написать выражения для условного оператора.
Пример 1. Проверить, лежит
ли значение переменной x в интервале (1; 5):
if ((x > 1) && (x < 5)) ...
Пример 2. Проверить, лежит
ли значение переменной x вне интервала (1; 5):
if !((x > 1) && (x < 5)) ... 
или 
if ((x <= 1) || (x >= 5)) ... 
 В языке Си нет булевого типа. Если
значение переменной равно 0, то ее значение считается равным ‘ложь’ (иначе
‘истина’). Так, например, вместо выражения
               
if (x == 0) ...   
можно писать        if (!x) ...
Выражение !x будет истинным,
когда x будет ложным. А это возможно лишь в случае,
когда x равно нулю.
Пример 3. Записать условие
того, что обе переменные x и y имеют значение
0:
if ((x == 0) && (y == 0)) ...
или то же самое
if (!x && !y) ...
Упражнение 1. Записать условие
того, что переменная х принимает одно из значений множества S
= {1, 3, 6}.
Истинное выраженние считается равным 1,
ложное выражение считается равным нулю.
Пример 4. Присвоим
целочисленным переменным значения логических выражений и выведем их.
#include <stdio.h>
int i;
void main(void)
{
  i = (3 > 4);
  printf("%d\n",i);      // 0
  i = (3 < 4);
  printf("%d\n",i);      // 1
}
Пусть f(x) и g(x) – некоторые функции. 
Расмотрим функцию y(x):   y(x)=f(x), ecли p(x) =true, y(x)=g(x), ecли p(x) =false.
Функцию y(x) можно реализовать без использования
структуры if … else … .  Учитывая значения
логических выражений, можно записать:
y(x) = f(x) * p(x) + g(x) * (1 – p(x))
Записи 1 – p(x) и !p(x) эквивалентны.
 Пример 5. Вычислить
значение функции: 
y(x) = x+1 , если x>=0, y(x) = x^2 , если x<0.
#include <stdio.h>
double x, y;
void main(void)
{
  scanf("%lf",&x);
  y = (x + 1) * (x >= 0) + (x * x)
* (x < 0);
  printf("%lf\n",y);
}
Пример 6. Вычислить значение
функции знака числа:
sgn(x) = 1, если x>0,     sgn(x) = 0, если x=0,      sgn(x) = -1, если x<0.
Запишем функцию в виде:
sgn(x) = 1 * (x > 0) + 0 * (x = 0) + (-1)
* (x < 0) = (x > 0) – (x < 0)
#include <stdio.h>
int x, y;
void main(void)
{
  scanf("%d",&x);
  y = (x > 0) - (x < 0);
  printf("%d\n",y);
}
Немає коментарів:
Дописати коментар