
- Форум
- По малко от всичко
- Информационни технологии
- Уроци по С++
3.2.3. Аритметични изрази
Аритметичните изрази са правила за получаване на числови константи. Има два вида аритметични изрази: цели и реални.
<аритметичен_израз> ::= <цял_израз> | <реален_израз>
Цели аритметични изрази
Целите аритметични изрази са правила за получаване на константи от тип int или разновидностите му. Дефинират се рекурсивно по следния начин:
Целите константи са цели аритметични изрази.
Примери: 123 –2345 –32767
0 22233345 –87
са цели аритметични изрази.
Целите променливи са цели аритметични изрази.
Примери: Ако имаме дефиницията:
int i, j;
short p, q, r;
i j
са цели аритметични изрази от тип int, a
p q r
са цели аритметични изрази от тип short.
- Прилагането на унарните операции + и – към цели аритметични изрази е цял аритметичен израз.
Примери: -i +j -j
са цели аритметични изрази от тип int, а
+p -p +r -q
са цели аритметични изрази от тип short.
- Прилагането на бинарните аритметични операции +, -, *, / и % към цели аритметични изрази, е цял аритметичен израз.
Пример: i % 10 + j * i - p -i + j / 5
са цели аритметични изрази от тип int,
r – p / 12 – q r % q – p r + p – q
са цели аритметични изрази от тип short.
- Цели функции, приложени над цели аритметични изрази, са цели аритметични изрази.
Примери: abs(i+j) е цял аритметичен израз от тил int, а abs(p-r) е цял аритметичен израз от тип short.
Реални аритметични изрази
Реалните аритметични изрази са правила за получаване на константа от тип double или float. Дефинират се рекурсивно по следния начин:
Реалните константи са реални аритметични изрази.
Примери: 1.23е-3 –2345е2 –3.2767 0.0
222.33345 –8.7009
са реални аритметични изрази.
Забележка: Реална константа от диапазона на тип float, но с повече от 7 значещи цифри се приема от компилатора за реално число от тип double.
Реалните променливи са реални аритметични изрази.
Примери: Ако имаме дефинициите:
double i, j;
float p, q, r;
i j
са реални аритметични изрази от тип double, a
p q r
са реални аритметични изрази от тип float.
- Прилагането на унарните операции + и – към реални аритметични изрази е реален аритметичен израз.
Примери: -i +j -j
са реални аритметични изрази от тип double, а
+p -p +r -q
са реални аритметични изрази от тип float.
- Прилагането на бинарните аритметични операции +, -, * и / към аритметични изрази, поне един от които е реален, е реален аритметичен израз.
Пример: i % 10 + j*i - p -i + j/5
са реални аритметични изрази от тип double, а
–p/12 – q r%q – p r + p – q
са реални аритметични изрази от тип float.
- Реални функции, приложени над реални или цели аритметични изрази, са реални аритметични изрази.
Примери: fabs(i+j) sin(i-p) cos(p/r-q) floor(p)
ceil(r-p+i) exp(p) log(r-p*q)
са реални аритметични изрази от тип double.
Семантика на аритметичните изрази
За пресмятане на стойностите на аритметичните изрази се използват следният приоритет на операциите и вградените функции:
1. Вградени функции
2. Действията в скобите
3. Операции в следния приоритет
- +, - (унарни) най-висок
- *, /, %
- +, - (бинарни)
- <<, >> най-нисък
Забележка 1: Операторите >> и << са за побитови измествания надясно и наляво съответно. Те са предефинирани за входно/изходни операции. В случая имаме предвид тази тяхна употреба.
Забележка 2: Инфиксните операции, които са разположени на един и същ ред са с еднакъв приоритет. Тези оператори се изпълняват отляво надясно. Унарните операции се изпълняват отдясно наляво.
Пример: Нека имаме дефиницията
double x = 23.56, y = -123.5;
Изпълнението на оператора
cout << sin(x) + ceil(y) * x – cos(y);
ще се извърши по следния начин: отначало ще се пресметнат стойностите на sin(x), ceil(y) и cos(y), след това ще изпълни операцията * над стойността на ceil(y) и x, полученото ще събере със стойността на sin(x), след което от полученото реално число ще се извади пресметнатата вече стойност на cos(y). Накрая върху екрана ще се изведе получената реална константа.
Аритметичните изрази могат да съдържат операнди от различни типове. За да се пресметне стойността на такъв израз, автоматично се извършва преобразуване на типовете на операндите му. Без загуба на точността се осъществяват следните преобразувания:
Тип Преобразува се до тип
bool всички числови типове
short int
unsigned short unsigned int
float double
т.е.конвертира се от “по-малък” тип (в байтове) към “по-голям” тип.
За да се пресметне стойността на аритметичен израз с операнди от различни типове, последователно се прилагат правилата по-долу, докато се уеднаквят типовете (ако е възможно).
Ако има операнд от тип: Другите операнди се преобразуват до:
double double
float float
unsigned int unsigned int
int int
unsigned short unsigned short
short short
Семантика на булевите изрази
Булевите изрази са правила за получаване на булева стойност. За пресмятане на стойностите им се използва следният приоритет на операциите и вградените функции:
1. Вградени функции
2. Действията в скобите
3. Операции в следния приоритет
- !, not, +, - (унарни) най-висок
- *, /, %
- +, - (бинарни)
>> << (вход/изход)
<, <=, >, >=
==, !=
&&
|| най-нисък
Забележка: Инфиксните операции, които са разположени на един и същ ред са с еднакъв приоритет. Тези оператори се изпълняват отляво надясно, т.е. лявоасоциативни са. Унарните оператори се изпълняват отдясно наляво, т.е. дясноасоциативни са.
Примери: а) Нека имаме дефинициите:
double x = 23.56, y = -123.5;
bool b1, b2, b3;
b1 = true;
b2 = !b1;
b3 = b1||b2;
Изпълнението на оператора
cout << sin(x) + ceil(y) * x > 12398;
ще сигнализира грешка – некоректни аргументи на <<. Това е така, заради нарушения приоритет. Операторът << е с по-висок приоритет от този на операторите за сравнение. Налага се вторият аргумент на << да бъде ограден в скоби, т.е.операторът
cout << (sin(x) + ceil(y) * x > 1239;
вече работи добре.
б) Изпълнението на оператора
cout << b1 && b2 || b3 << “\n”;
също съобщава грешка – некоректни аргументи на <<. Отново е нарушен приоритетът на операциите. Налага се аргументът b1 && b2 || b3 на << да се огради в скоби, т.е.
cout << (b1 && b2 || b3) << “\n”;
вече работи добре.
Задачи върху типовете булев, цял и реален
Задача 5. Кои от следните редици от знаци са числа в C++?
а) 061 б) –31 в) 1/5 г) +910.009
д) VII е) 0.(3) ж) sin(0) з) 134+12
Решение: а), б), г).
Задача 6. Да се запишат на C++ следните числа:
а) 6! б) LXXIV в) –0,4(6) г) 138,2(3
д) 11/4 е) p ж) 1,2 .10-1 з) –23,(1) .102
В дробната част да се укажат до 4 цифри.
Решение:
а) 120 б) 74 в) –0.4667 г) 138.2384
д) 2.7500 е) 3.1416 ж) 0.1200 з) –2311.1111
Задача 7. Да се запишат на езика C++ следните математически формули:
а) a + b.c – a2b3c4
Решение:
a) a + b * c – a * a * b * b * b * c * c * c * c
б) (a * b) / c + c / (a * b)
в) (1 + x + x*x/2)*(1 + x*x*x/6 + x*x*x*x*x/120)
или
(1 + x + pow(x,2))/(1 + pow(x, 3)/6 + pow(x, 5)/120)
г) sqrt(1 + sqrt(2 + sqrt(3 + sqrt(4))))
Задача 8. Какво ще бъде изведено след изпълнението на следната програма:
#include <iostream.h>
#include <math.h>
int main()
{ cout << "x=";
double x;
cin >>x;
bool b;
b = x < ceil(x);
cout << "x=";
cin >> x;
b = b && (x < floor(x));
cout << "b= " << b << "\n";
return 0;
}
ако като вход бъдат зададени числата
a) 2.7 и 0.8 б) 2.7 и –0.8 в) –2.7 и –0.8.
Решение: а) ТЪй като булевият израз 2.7 < ceil(2.7) има стойност true, а true && (0.8 < floor(0.) - е false, ще бъде изведено 0 (false).
Задача 9. Какъв ще е резултатът от изпълнението на програмата
#include <iostream.h>
int main()
{int a, b;
cin >> a >> b >> a >> b >> a;
cout << a << " " << b << " "
<< a << " " << b << " "
<< a << "\n";
return 0;
}
ако като вход са зададени числата 1, 2, 3, 4 и 5?
Решение: След обработката на дефиницията int a, b; за променливите a и b са отделени по 4 байта ОП, т.е.
ОП
а b
- -
а след изпълнението на оператора за четене >>, a и b получават отначало стойностите 1 и 2. След това стойностите им се променят на 3 и 4 съответно. Най-накрая a става 5, т,е,
a b
5 4
Тогава програмата извежда
5 4 5 4 5
Задача 10. Да се запише булев израз, който има стойност true, ако посоченото условие е в сила, и стойност false, ако условието не е в сила.
а) цялото число a се дели на 5;
б) точката x принадлежи на отсечката [2, 6];
в) точката x не принадлежи на отсечката [2, 6];
г) точката x принадлежи на отсечката [2, 6] или на отсечката [-4, -2];
д) поне едно от числата a, b и c е отрицателно;
е) числата a, b и c са равни помежду си.
Решение:
a % 5 == 0
б) x >= 2 && x <= 6
в) x < 2 || x > 6 или !( x >= 2 && x <= 6)
г) x >= 2 && x <= 6 || x >= -4 && x <= -2
е) a == b && a == c
Задача 11. Да се напише програма, която въвежда координатите на точка от равнината и извежда 1, ако точката принадлежи на фигурата по-долу и – 0, в противен случай.
y
2
-2 -1 0 1 2
x
-2
Решение:
#include <iostream.h>
#include <math.h>
int main()
{cout << "x= ";
double x;
cin >> x;
cout << "y= ";
double y;
cin >> y;
bool b1 = x*x + y*y <= 4 && y >= 0;
bool b2 = fabs(x) <= 1 && y < 0 && y >= -2;
cout << (b1 || b2) << "\n";
return 0;
}
Задачи
Задача 1. Да се запишат на езика C++ следните математически формули:
Задача 2. Кои от следните редици от символи са правилно записани изрази на езика C++:
а) 1 + |y| г) 1 + sqrt(sin((u+v)/10))
б) -abs(x) + sin z д) -6 + xy
в) abs(x) + cos(abs(y - 1.7)) е) 1/-2 + Beta.
Задача 3. Да се запишат в традиционна (математическа) форма следните изрази, записани в синтаксиса на езика C++:
а) sqrt(a+b) - sqrt(a-b) в) x*y/(u+v)-(u-v)/y*(a+b)
б) a + b/(c+d)-(a+b)/c+d г) 1+exp(cos((x+y)/2)).
Задача 4. Да се пресметне стойността на израза:
а) cos(0) + abs(1/(1/3-1))
б) abs(a-10) + sin(a-1), за a = 1;
в) cos(-2+2*x) +sqrt(fabs(x-5)), за x = 1;
г) sin(sin(x*x-1)*sin(x*x-1)) + cos(x*x*x-1)*abs(x-2),
за x = 1;
д) sin(sin(x*x-1))+cos(x*x*x-1)*cos(abs(x-2)-1)/y*a +
sqrt(abs(y)-x), за x = 1, y = -2, a = 2.
Задача 5. В аритметичния израз
а) a/b*c/d*е/f*h
б) a+b/x-2*y
в) a+b/x-2*y
да се поставят скоби така, че полученият израз да съответствува на математическата формула:
Задача 6. Да се напише израз на езика C++, който да изразява:
а) периметърa на квадрат с лице, равно на a;
б) лицето на равностранен триъгълник с периметър, равен на p.
Задача 7. Да се напише програма, която пресмята стойността на v1, където
Задача 8. Да се пресметне стойността на израза:
a) pow(x, 2) + pow(y, 2) <= 4 при x = 0.6, y = -1.2
б) p % 7 == p / 5 - 2 при p = 15
в) floor(10*k+16.3)/2 == 0 при k = 0.185
г) !((k+325)%2 == 1) при k = 28
д) u*v != 0 && v > u при u = 2, v = 1
е) x || !y при x = false, y = true.
Задача 9. Да се запише булев израз, който да има стойност истина, ако посоченото условие е вярно и стойност - лъжа, ако условието не е вярно:
а) цялото число p се дели на 4 или на 7;
б) уравнението a.x2 + b.x + c = 0 (a ≠ 0) няма реални корени;
в) точка с координати (a, b) лежи във вътрешността на кръг с радиус 5 и център (0, 1).
г) точка с координати (a, b) лежи извън кръга с център (c, d) и радиус f;
д) точка принадлежи на частта от кръга с център (0, 0) и радиус 5 в трети квадрант;
е) точка принадлежи на венеца с център (0, 0) и радиуси 5 и 10;
ж) x принадлежи на отсечката [0, 1];
з) x = max{a, b, c}
и) x != max{a, b, c} (операцията ! да не се използва);
к) поне една от булевите променливи x и y има стойност true;
л) и двете булеви променливи x и y имат стойност true;
м) нито едно от числата a, b и c е положително;
н) цифрата 7 влиза в записа на положителното трицифрено число p;
о) цифрите на трицифреното число m са различни;
п) поне две от цифрите на трицифреното число m са равни помежду си.
Допълнителна литература
К. Хорстман, Принципи на програмирането със C++, С., СОФТЕХ, 2000.
П. Лукас, Наръчник на програмиста, С., Техника, 1994.
Ст. Липман, Езикът C++ в примери, “КОЛХИДА ТРЕЙД” КООП, С. 1993.
Аз съм МОМЧЕ R.I.P. липсваш ми боже колко ми липсваш защо трябваше да става така мамкаму