Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
№1_C++(Aryfmet_vyrazy).doc
Скачиваний:
6
Добавлен:
24.04.2019
Размер:
292.35 Кб
Скачать

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

Національний Університет “Львівська політехніка”

Кафедра “Телекомунікації”

АРИФМЕТИЧНІ ОПЕРАЦІЇ ТА ВИРАЗИ МОВИ С.

Методичні вказівки до лабораторної роботи з курсу

«Інформатика, ч.І»

для студентів спеціальності

«Телекомунікації»

Львів 2003

“Арифметичні операції та вирази мови С”. Методичні вказівки до лабораторної роботи з курсу “Інформатика, ч.І” для студентів спеціальності “Телекомунікації”: Львів 2003. 12с.

Автори: старший викладач Єрмакова Н.А.,

доцент Чайковський І.Б.

Рецензент: професор, д.т.н. Тимченко О.В.

У лабораторній роботі розглянуто принципи створення математичних виразів при складанні програм для виконання обчислень за допомогою різних операцій мови програмування С.

Методичні вказівки розглянуто на засіданні кафедри “Телекомунікації” Національного університету “Львівська політехніка” від______2003р. протокол №____.

МЕТА РОБОТИ: Навчитися принципам створення математичних виразів при складанні програм для виконання обчислень за допомогою різних операцій мови програмування С

Попередні відомості.

Мова "Сі" була розроблена в процесі створення операційної системи UNIX (вона стала розвитком мови B++), тому можна зрозуміти, які принципові можливості в ній реалізовані: це максимальна гнучкість при діалоговому режимі роботи комп"ютера, представлення повідомлень системи і користувача в максимально простій і зрозумілій формі і, водночас, спроможність вибору адекватної реакції в найскладніших ситуаціях. Мова "Сі" поєднує в собі можливості прямої адресації і побітових операцій, як в Ассемблері, з використанням великої кількості (декілька сотен) функцій найвищого рівня. При використанні бібліотеки графічних функцій мова "Сі" отримала практично необмежені можливості для розробки діалогового матзабезпечення, чим користаються програмісти в усьому світі, і тепер вряд чи можна знайти програмний продукт відомої фірми-розробника матзабезпечення для автоматизованого проектування в будь-якій сфері або баз даних, в якому не використовувалась би мова "Сі".

Проте, мова "Сі" має один суттєвий недолік з точки зору потреб розробки радіотехнічних задач: тут недостатньо розвинені операції арифметики, зокрема, повністю відсутня комплексна арифметика, і ії імітація призводить до генерування недостаньо ефективних кодів, що значно збільшує потреби часу при проведенні об"ємних математичних обчислень. Фірма Microsoft розробила власну версію мови "Сі", яка здійснює інтерфейс з мовою ФОРТРАН, найбільш пристосованою для математичних розрахунків і виробляє найефективніші машинні коди. Паралельно на фірмі Borland ведеться розробка іншої версії мови "Сі", перші варіанти якої мали назву “TurboC", а пізніші - "Borland C", "C++", причому в версіях. "C++" комплексну арифметику реалізують за допомогою класу об»єкта.

Сервісна оболонка призначена для розробки та відладки програм на мові "C" і включає в себе засоби роботи з файлами, їх редагування, запуску виконуваних файлів, а також різноманітні режими компіляції і зборки виконуваного модуля, розвинуті засоби відладки програми - детальну діагностику помилок, можливість виконання по кроках з переглядом проміжних результатів, можливість прослідити зміст певних змінних тощо.

Як відомо, розробка програми на мові "Сі" проводиться в декілька етапів: створення вихідного файлу, який записано за правилами мови "Сі", його компіляція в об'єктний код за допомогою компілятора C, збірка об'єктних модулів і створення виконуваного файлу за допомогою програми LINK, відладка виконуваної програми шляхом дослідження її роботи на певних кроках (за допомогою опції STEP покрокового виконання C), при цьому, як правило, необхідно декілька проходів всіх етапів з редагуванням вихідного тексту. Оскільки на персональному комп'ютері прийнята файлова система, на кожному етапі розробки сворюється відповідний файл:

name.c - вихідний текст;

name.prj - вихідний файл проекту;

name.obj - об'єктний код програмного модуля;

name.exe - виконуваний файл.

Слід розрізняти ім'я файлу та ім'я програмної одиниці. Оскільки файл - це просто поіменована область пам'яті на диску, в ньому може бути записана довільна інформація, в тому числі і програма. В мові "Сі" розрізняється головна програмна одиниця, з якої обов'язково починається кожна програма, вона називається "main", включає до себе послідовність виконуваних операторів та може містити звертання до стандартних функцій та функцій користувача, визначених окремо. Кожна функція ідентифікується певним іменем, а її вихідний текст (якщо потрібна його компіляція) може бути розміщений як в окремому файлі, так і в тому самому файлі, який містить main-програму. Якщо всі програмні одиниці (main-програма і всі включені до неї функції) розміщені в одному вихідному файлі, компілятору достатньо вказати ім'я цього файлу, якщо ж які-небудь частини програми розмішені в окремих файлах, використовується файл проекту для того, щоби повідомити компілятору повний список файлів, що підлягають компіляції (знову ж таки, кожен з цих файлів може містити вихідний текст більше, ніж однієї програмної одиниці). Вибір розміщення програмних одиниць у файлах проводиться як з міркувань зручності, так і з метою підвищення ефективності роботи програми. На початковому етапі вивчення програмування зручніше зупинитися на розміщенні main-програми та визначень включених до неї функцій (їх вихідних текстів) в одному файлі.

Компілятор створює об'єктний код, як правило, з нерозв'язаними зовнішними зв'язками (якщо в програмі є звертання до стандартних або раніше створених функцій). Програма LINK відповідає за збірку всіх об'єктних модулів, які використовуються в даній програмі, розв'язує зовнішні зв'язки, створює машинний код програми в цілому, тобто модуль, готовий до виконання, і записує його в файл з розширенням ".exe". На етапі збірки можливе підключення файлів, які містять об'єктні коди (мають розширення ".obj") з файлу проекту програми.

Можливості роботи на різних етапах відладки програми відображені в лінійці головного меню:

FILE - операції з файлами;

EDIT - вікно редагування вихідного тексту;

RUN - режими запуску виконуваних модулів;

COMPILE - режими компіляції вихідних модулів;

PROJECT - зв'язування з файлом проекту;

OPTIONS - режими роботи і оточення оболонки;

DEBUG - режими "прокрутки" виконуваної програми;

BREAK/WATCH - вставка примусових зупинок у виконанні програми, визначення біжучих значень змінних.

Елементарною коміркою машинної пам'яті являється біт. Біт – це елемент інформації, який може приймати значення 1 або 0. Фізично це означає наявність або відсутність електричного струму в певній гілці мережі. Логічно такий спосіб представлення елементу інформації пристосований для двійкової системи числення, яка саме й використовується в ЕОМ. Група з восьми біт утворює байт. В одному байті можна записати беззнакове ціле число від 0 до 255 (256 - восьмий степінь числа 2) або знакове від 0 до 127. Звичайно одного байту недостатньо для запису більш складних даних, тому з двох (або чотирьох) байт утворюється машинне слово - вектор бітів, який розглядається апаратною частиною ЕОМ як єдине ціле. Число бітів у слові називається довжиною слова, залежить від апаратної реалізації комп'ютера і, як правило, буває 16 або 32. Пам'ять обчислювальної машини поділяється логічно на слова. Слово має довжину, достатню для роміщення в ньому команди або цілого числа.

Всі дані, якими оперує мова "Сі", підрозділяються на типи. Кожен тип даних має свій спосіб запису в пам'яті ЕОМ, і, отже, займає чітко визначену ділянку пам'яті. Компілятор мови "Сі" вимагає попереднього визначення типів абсолютно всіх даних, які використовуються в програмі, для того, щоби визначити спосіб і місце розміщення їх у пам'яті. При помилках робота компілятора припиняється, тому розуміння типів даних обумовлює успіх всієї подальшої роботи програміста.

Коли в програмі застосовуються ідентифікатори змінних величин, перед їх використанням обов'язково повинний бути опис типу кожної змінної, наприклад:

char ch;

int count = 1;

char* name = "Bob";

float f;

double df[20];

Серед даних розрізняються числові та текстові. Згадане вище однобайтне представлення цілого числа може бути використане як за прямим призначенням, так і для ідентифікації коду символа текстових даних. Існують стандартні (ASCII, а ткож декілька альтернативних) таблиці символів, які містять 256 цілих кодів, що відповідають найбільш поширеним текстовим символам. Можна вважати, що текстові дані представляються в пам'яті посимвольно послідовністю цілих однобайтових чисел. Таким чином, в мові "Сі" визначаються дані типу «char», які мають довжину 1 байт і можуть містити беззнакове ціле число від 0 до 255 (або від 0 до 127 зі знаком) або символьний код з таблиці..

Більшість цілих чисел в залежності від своєї величини та від апаратної реалізації ЕОМ можуть мати тип:

char - 1 байт; (символьний);

int - 2 байти;

long int - 4 байти;

беззнакові цілі представляються модифікаціями типів «unsigned».:

unsigned char;

unsigned short int;

unsigned int;

unsigned long int.

Причиною того, що програмісту надається декілька цілих типів, є спроба надати можливість скористатися характерними особливостями апаратного забезпечення. На багатьох комп'ютерах між різновидами основних типів існують великі розбіжності в потребі пам'яті, часу доступу до пам'яті і часу обчислень. Знаючи ці особливості, програміст вибирає найбільш ефективний тип для певної змінної.

Для представлення чисел з плаваючою точкою існує два типи:

float - займають 4 байти;

double - 8 байт.

Число з плаваючою точкою кодується як знак, мантиса і ступінь, на кожну з цих частин виділяється певна кількість біт (в залежності від апаратної реалізації). Для підвищення точності обчислень використовується тип «double».. Всі константи розглядаються як числа з подвійною точністю, всі математичні операції над нецілими числами виконуються з подвійною точністю, автоматично відбувається перетворення до вищого типу операндів, якщо вони мають різні типи, після чого здійснюється перетворення до типу, що об'явлений для результуючої змінної.

В мові "Сі" існує спеціальний оператор «sizeof» для знаходження розміру об'єкту або певного типу, і тому для конкретної ЕОМ можна вияснити точні розміри (в байт), що займають числа якогось типу, шляхом звертання:

sizeof(int), sizeof(char), sizeof(double).

Програмісту надається можливість здійснювати примусове, пряме перетворення типів шляхом запису ідентифікатора типу перед іменем змінної, яка перетворюється, наприклад:

(float) a;

(double) f;

(int) f;

float r = float(1);

Крім того, основні типи можна довільно комбінувати в присвоєннях та виразах, при цьому здійснюється неявне перетворення типів за певними правилами, значення перетворюються так, щоби н було втрати інформаціїя. Але існують випадки, в яких інформація може втрачатися або спотворюватися, наприклад, при присвоєнні значення змінної одного типу змінній другого типу, яке представлене меншою кількістю біт:

int i1 = 256+255;

char ch = i1; // ch == 255, більшого не буває!

int i2 = ch; // i2 == ?

В мові "Сі" існує ще декілька (неосновних) типів даних:

* - вказівники;

& - посилання;

[] - масив (вектор);

() - функція;

struct - структура;

union - об'єднання;

enum - перелік

та необмежена кількість похідних типів, утворених їх комбінаціями (наприклад, широко використовуються масиви вказівників, масиви структур, вказівники на функції і т.ін.).

Арифметичні операції над числами в мові "Сі" записуються за синтаксисом, що звичний для всіх. Але слід пам'ятати, що існує погодження про пріоритет виконання арифметичних операцій. За пріоритетом можна виділити такі групи (всередині груп пріоритет однаковий, кожна подальша група має нижчий пріоритет):

___________________________________________

1 sizeof розмір об'єкту (виразу)

sizeof розмір типу

___________________________________________

2 ++ приріст на 1 після

++ приріст на 1 до

-- зменшення на 1 після

-- зменшення на 1 до

- унарний мінус

+ унарний плюс

___________________________________________

3 * множення

/ ділення

% остача цілочисельного дідення (по модулю)

___________________________________________

4 + додавання

- віднімання

___________________________________________

14 = просте присвоєння

*= помножити та присвоїти

/= поділити та присвоїти

%= взяти по модулю та присвоїти

+= додати та присвоїти

-= відняти та присвоїти

___________________________________________

Тут приведений неповний перелік груп і операцій в них.

Коли із запису арифметичного виразу неясна послідовність виконуваних операцій, слід застосовувати запис у дужках.

Унарні операції та операції присвоєння правоасоціативні, всі решта - лівоасоціативні. Це означає, що, наприклад:

a = b = c те саме, що a = (b = c),

a + b + c те саме, що (a + b) + c, а

*p++ це *(p++), а не (*p)++.

При діленні додатніх цілих чисел заокруглення здійснюється в сторону 0, але якщо хоч один з операндів від'ємний, то форма заокруглення машинно-залежна. Тут завжди істинне, що :

(a/b)*b + a%b дорівнює a (якщо b не дорівнює 0).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]