пʼятниця, 29 вересня 2017 р.

11 клас С++ Лекція 2

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 действительный тип. Следующая таблица демонстрирует результаты деления для различных операндов:

операция
результат
= 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 включительно).
 Операция
результат
= 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);
}