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);
}
Немає коментарів:
Дописати коментар