5) Розробка тексту програми.
5.1 Вибір імен
Вибір потрібних імен для складних програм в загалі є складною задачею: однакові по вимову імена будуть різні по напису, імена в тексті програми і імена відповідних предметів повинні бути однаковими (добре - TemperatureBody, TemperatureRoom1, TemperatureBigRoom1, а такі імена як TB, TR1, TBR1 про теж, це погано), деякі символи зарезервовані як початкові для особистих імен, найбільш часто це символи ”_” на початку ( _main() ) або всередині (EXIT_SUCCESS). В окремих випадках в колективах розробників програмних продуктів можуть використовуватися свої окремі вимоги при виборі різних найменувань (змінних, констант, функцій, їх аргументів тощо ), з якими слід попередньо знайомитися.
Для нашого завдання можна вибрати безпосередньо х і у.
5.2 Вибір типів даних
Як вже було сказано вибір типів даних визначає вимогу до розмірів потрібної пам’яті. Слід також враховувати, що при виконанні різних арифметичних дій компілятор перетворює операнди різних типів в тип найбільшого операнда. Любі два операнда з любими типами даних при виконанні любої операції між ними перетворюються в один найбільший тип (по об’єму займаємої пам’яті). Це перетворення виконує компілятор і передбачувати програмісту послідовність його дій зайве. Загальна направленість перетворення – від типу з меншим значенням до типу з більшим значенням. Це виглядає так:
(char)→(signed_char)→(unsigned_char)→(int)→(short_int)→(unsigned_int)→ (unsigned_short_int)→(long_int)→(untsigned_long_int)→(float)→(double)→
(long_double)
Можливі і такі перетворення – (char)→(long_double) і так далі.
Як слід з приведеного, об’єм пам'яті, вказаний розроблювачем програми при виконанні програми може значно збільшуватися і як що це допустимо, то можна заздалегідь на стадії розробки вибрати типи даних з більшою пам’ятю. При цьому зменшиться час виконання програми.
Можна використати приведення типів, яке має такий вигляд:
(новий тип) вираження
Таке приведення є унарним оператором і згідно з пріоритетами спочатку виконається унарне приведення до нового типу а потім виконається вираження.
Приклад: int і=1; int i =1;
float x; float x;
……………. ……………….
x = i /2; результат x=0; x = (float) x / 2; результат x = 0.5;
В результаті висновків наведених у пп. 5.1 та 5.2 в таблиці 3 приведені результати вибору імен і їх типів для розглянутих варіантів схем алгоритмів.
Таблиця 3 Вибір імен та їх типів
№ варіанта |
|
i |
n |
k |
х, х[i] |
z, z[i] |
y, y[i] |
F(x) |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Рис.1 |
типи |
- |
- |
- |
double |
double |
double |
- |
Рис.2 |
int |
|
int |
double |
double |
double |
- |
|
Рис.3 |
int |
int |
- |
double |
|
double |
tan(x) |
|
Рис.4 |
int |
int |
- |
double |
double |
double |
double |
Примітка: тип double дозволяє роботу з великими числами і з великою точністю;
там де це треба х, у та z треба розглядати як масиви x[i], z[i], y[i] ;
при виконанні своєї особистої лабораторної роботи після порівняльного
аналізу різних ситуацій в таблиці 3 слід реалізувати тільки один варіант.
-
Розробка окремих операцій та операторів.
Всі операції приведені в таблиці 4
Таблиця 4 Операції в мові С++
ОПЕРАЦИИ (во всех примерах начальные х=7, у=27, zb – bool; zi – int; zl – long; zf – float; *p - int)
Приоритет |
Название операции |
С, С++ |
С# |
|||
Символ |
Порядок выполнения |
Пример записи |
Символ |
|
||
1 |
Доступ к глобальной переменной Обозначение члена структуры |
:: :: |
Справа налево Слева направо |
|
|
|
2 |
Обращение к функции Выделение элемента массива Инкремент (постфиксное увеличение на 1) (zi=27 y=28) Декремент (постфиксное уменьшение на 1) (zi=27 y=26) Получение ссылки на объект класса type_info Динамическое определ.типов (RTTI) dynamic_cast (преобразование типа) |
() [] ++ -- typeid |
Слева направо Слева направо Слева направо Слева направо Слева направо о |
f(x) m[i] zi=y++; zi=y--; typeid() |
() [] ++ -- |
|
3 |
Логическое отрицание (zb=1) Поразрядное логическое НЕ (дополнение к 1) (0xF00F) Изменение знака (унарный минус) (y=-27) Плюс Инкремент (префиксное увеличение на 1) (zi=28 y=28) Декремент (префиксное уменьшение на 1) (zi=26 y=26) Определение адреса переменной (py=00AC) Обращение к памяти по значению указателя (y=27) Преобразование результата к указанному типу (zf=27.000000) Определение размера в байтах (zi=2) Cоздание объекта (py=00AC) Удаление объекта |
! ~ - + ++ -- & *
(type) SizeOf new delete |
Справа налево Справа налево Справа налево Справа налево Справа налево Справа налево Справа налево Справа налево
Справа налево Справа налево Справа налево Справа налено |
zb=!0; ~0x0FF0 y=-y;
zi=++y; zi=--y; py=&y; y=*py;
zf=(float)y; zi=SizeOf y; new(py); delete(py) |
! ~ -
++ -- & *
(type)
new |
|
4 |
Выделение поля структурной переменной Выделение поля структурной переменной по указателю ее начала |
•
→ |
Слева направ
Слева направо |
a.x
pa→x |
•
|
|
5 |
Умножение (zi=189) Деление (zf=1.928571) Определение остатка целого от деления (zi=6) |
* / % |
Слева направо Слева направо Слева направо |
zi=y*x; zf=(float)y/x/2; zi=y%x; |
* / % |
|
6 |
Сложение (y=34) Вычитание (y=20) |
+ - |
Слева направо Слева направо |
y=y+x; y=y-x; |
+ - |
|
7 |
Сдвиг влево (на к двоичных разрядов) (zi=216) Сдвиг вправо (на к двоичных разрядов) (zi=3) |
<< >> |
Слева направо Слева направо |
zi=y<<3; zi=y>>3; |
<< >> |
|
8 |
Меньше (zb=fals) Меньше или равно (zb=fals) Больше (zb=true) Больше или равно (zb=true) |
< <= > >= |
Слева направо Слева направо Слева направо Слева направо |
zb= y<x; zb=y<=x; zb=y>x; zb=y>=x; |
< <= > >= is |
|
9
|
Равно (zi=false) Не равно (zi=true) |
== != |
Слева направо Слева направо |
zi=y == x; zi=y != x |
== != |
|
10 |
Поразрядное логическое И (zi=3) |
& |
Слева направо |
zi=y&x; |
& |
|
11 |
Поразрядное исключающее ИЛИ (zi=28) |
^ |
Слева направо |
zi=y^x; |
^ |
|
12 |
Поразрядное логическое ИЛИ (zi=31) |
| |
Слева направо |
zi=y|x |
| |
|
13 |
Логическое И (y>x&&x<5 - false zi – не определено) |
&& |
Слева направо |
if(y>x&&x<5)zi=10; |
&& |
|
14 |
Логическое ИЛИ (y>x||x<5 - true zi=10) |
|| |
Слева направо |
if(y>x||x<5)zi=10; |
|| |
|
15 |
Присваивание простое (ниже x=7, y=27) (y=7) Сложить и присвоить (y=34) Вычесть и присвоить (y=20) Умножить и присвоить (y=189) Разделить и присвоить (x,y-цел.) (y=3) Взять по модулю и присвоить (y=6) Сдвинуть влево и присвоить (y=3456) Сдвинуть вправо и присвоить, (y=0) Поразрядное ИЛИ и присвоить (y=31) Поразрядное исключительное ИЛИ и присвоить (y=28) Поразрядное И и присвоить (y=3) Последовательное выполнение (y=108 x=2) (результаты zf= 5.000000 y=5 x=5) |
= += -= *= /= %= <<= >>= |= ^= &= |
Справа налево Справа налево Справа налево Справа налево Справа налево Справа налево Справа налево Справа налево Справа налево Справа налево Справа налево Справа налево Справа налево |
y = x; y += x; y -= x; y *= x; y /= x; y %= x; y <<= x; y >>= x; y |= x; y ^= x; y &= x; y<<=x-=5; zf=y=x=5; |
:= += -= *= /= %= <<= >>= | = ^ = &= y=x=5 -“- |
|
16 |
Операция условия (тринарная операция) (max = 27) |
?: |
Справа налево |
max=y>x?y:x; |
?: |
|
17 |
throw |
|
|
|
|
|
18 |
Операция «запятая» (результат - x>y – true y1=37) |
, |
Слева направо |
if(x=8*x,y=2*y, x>y) y1=10+y; |
|
|
Для приведених даних х і у виконайте всі 44 приведених операції і отримайте дані результати. (користуйтеся літературою Шилд Герберт Полный справочник по С++, 4-е издание. Стр 40 -72).
По виконаній роботі скласти конспект в зошиті до домашніх робіт. Цей зошит використовувати для практичних занять (обов’язково мати їх на практичних заняттях ).
Оператори це окремі команди, які складають текст програми і які виконуються комп’ютером . Основні оператори мови С++ приведені в таблиці 5 (див. папка ”Главные_справки_2013/Таблиця_5 Операторы_С++”). Структура таблиці відповідає прийнятій класифікації операторів, включає їх опис та приклади запису і використання (користуйтеся літературою Шилдт Полный справочник по С++, 4-е издание. Стр 65 - 98 ).
Розглянемо докладніше вибір потрібного оператора для виконання відповідного блоку схеми алгоритму, наведеному на рис.1 :
блок 1 – початок (створення шаблону);
блок 2 – уведення x ;
блок 3 – знаходження допоміжної змінної z = cos(x);
блок 4 – перевірка z=0;
блок 5 – якщо ні (z≠0), то виконання у = sin(x)/z ;
блок 6 – вивід y;
блок 9 – якщо да (z=0), то вивід НР (немає рішення);
блок 7 – перевірка умови продовжувати чи ні
– якщо да, то передача управління до блоку 2;
блок 8 - якщо ні, то зупинка –завершення задачі.
Мова С/C++ - це мова функцій і завжди виконання програми починається з головної функції main(). Для вказаних номерів блоків в таблиці 5 приведені прийняті тексти операторів.