МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ПРОГРАМУВАННЯ МОВОЮ С
МЕТОДИЧНІ ВКАЗІВКИ
до лабораторних робіт
з дисципліни
“Проблемно-орієнтовані мови програмування”
для студентів базового напрямку 6.0804 "Комп’ютерні науки"
Затверджено
на засіданні кафедри
програмного забезпечення
Протокол № 4 від 17.11.2003 р.
Львів – 2003
“Програмування мовою C”: Методичні вказівки до лабораторних робіт/ Укл.: В.М. Семотюк, Є.В Левус, Т.О. Кототєєва. – Львів: Видавництво Національного університету “Львівська політехніка”, 2003. – 30 с.
Укладачі
Семотюк В.М., канд. тех. наук, доцент каф. програмного забезпечення
Левус Є.В, канд. тех. наук, ст. викладач каф. програмного забезпечення
Коротєєва Т.О., канд. тех. наук, доцент каф. програмного забезпечення
Відповідальний за випуск: Грицик В.В.,
д-р. техн. наук, професор
Рецензенти: Мельник Р.А., докт. техн. наук, професор кафедри ПЗ
Ковальчук, асистент кафедри АСУ
Вступ
Мова С є однією з найбільш поширених серед сучасних мов програмування. Завдяки високій ефективності, потужності функціональних можливостей та мобільності, застосування мови С має досить широкі області. Особливо ефективним є розроблення мовою C елементів системного програмного забезпечення, інтерфейсних систем та реалізація алгоритмів обробки числової та текстової інформації. Мова C має ряд суттєвих особливостей, які дозволяють їй поєднувати риси універсальних мов програмування високого рівня із забезпеченням легкості доступу до апаратних ресурсів комп’ютера, що є властиво мовам низького рівня.
Метою лабораторних робіт є застосування на практиці студентами теоретичних знань про синтаксис і семантику мови, технологію програмування та функціональні можливості мови програмування C для написання власних програм.
Порядок виконання лабораторної роботи
Вивчити необхідний теоретичний матеріал та ознайомитися з прикладами програм, які реалізують аналогічні задачі до тематики лабораторної роботи.
Розробити алгоритм розв’язку поставленої задачі та написати відповідну програму на мові C.
Використовуючи команди та функціональні можливості інтегрованого середовища Borland C набрати текст програми, відкомпілювати, відлагодити та виконати програму на мові С.
Проаналізувати отриманий результат та оформити письмовий звіт по роботі, дотримуючись наступного змісту:
· тема та мета лабораторної роботи;
постановка задачі;
· алгоритм розв’язку поставленої задачі у формі блок-схеми з поясненнями, у яких вказується форма введення даних та можливий діапазон їх значення, а також форма і діапазон значень отриманих результатів;
· текст програми розв’язку задачі на мові С (з обов’язковими коментарями та поясненнями);
· протокол виконання програми для для трьох різних наборів вхідних даних, які підтверджують правильність роботи програми;
· висновки, в яких необхідно зазначити: які знання отримано в процесі виконання даної роботи; для чого призначена розроблена програма (вказати область її застосування).
Лабораторна робота № 1
Тема: виконання та відлагодження програм в інтегрованому середовищі Borland C
Мета: вивчити склад інтегрованого середовища Borland C та його можливості для вводу, відлагодження та виконання програм на мові С
Теоретичні відомості
Склад та призначення середовища програмування Borland C
Середовище програмування Borland C включає в себе:
інтегроване середовище програмування (Integtated Development Environment - IDE);
компілятор вхідного тексту програми;
редактор зв'язків;
бібліотеки файлів включення;
бібліотеки функцій;
програми-утиліти.
Інтегроване середовище програмуванн включає в себе вбудований редактор текстів, підсистему роботи з файлами, вбудований компілятор (ВС.ЕХЕ або BCW.EXE), редактор зв'язків (TLINK.EXE), вбудовані засоби для відлагодження програми, встановлення параметрів середовища, систему допомоги.
Компілятор ВС.ЕХЕ призначений для роботи в реальному режимі, а BCW.EXE - в захищеному режимі (запускається з середовища Windows). Крім вбудованих в середовище компіляторів, до складу Borland C входить компілятор, який працює в режимі командного рядка - ВСС.ЕХЕ .
Середовище дозволяє роботу з однофайловими або багато файловими програмами, написаними на мові С або C++. Файли програм, написаних на мові С, повинні мати розширення .С, а на мові С, - розширення .СРР .
Файли включення мають розширення .h і містять прототипи бібліотечних функцій, визначення констант та типів даних.
До програм-утиліт відносяться: препроцесор (СРР.ЕХЕ), асемблер (TASM.EXE), автономний відладчик (TD.EXE), профайлер (TPROF.EXE), програма для формування об'єктних бібліотек (TLIB.EXE) та зв'язані з ними файли.
Головне меню
Для запуску інтегрованого середовища з командного рядка необхідно набрати ВС та натиснути клавішу Enter. При необхідності потрібно вказати повний шлях доступу, наприклад, C:\BORLANDC\BIN\BC . В залежності від настройки файлів конфігурації середовища Norton Commander, виклик інтегрованого середовища може бути здійснений за допомогою меню (клавіша F2) або по розширенню файлів (.С або .СРР).
Після запуску інтегрованого середовища на екрані з'являється меню наступної структури:
+ - системне меню;
File - меню файлової системи;
Edit - меню редагування;
Search - меню пошуку та заміни;
Run - меню управління виконанням програми;
Compile - меню компіляції програми;
Debug - меню вбудованої програми відлагодження; Project - меню управління проектом;
Options - меню встановлення опцій інтегрованого середовища;Window - меню управління вікнами;Help - меню допомоги.
У нижньому рядку екрану висвічується статус "гарячих клавіш", які використовуються на даному етапі роботи.
Вибір команд головного меню може бути виконаний одним із наступних способів:
1) натиснути клавішу F10 і клавішами "стрілка вліво" або "стрілка вправо" вибрати необхідний пункт головного меню, після чого натиснути клавішу Enter. Далі продовжити вибір за допомогою клавіш "стрілка вниз" або "стрілка вгору" і натиснути клавішу Enter. Знаходячись у позиції меню, вибір пунктів меню можна здійснити також натиснувши клавішу з виділеною у команді літерою;
натиснути клавішу Alt і, не відпускаючи її, натиснути клавішу з виділеною у команді літерою. Це забезпечить перехід в головне меню. Далі вибір здійснюється одним з описаних вище способів;
встановити курсор маніпулятора "миша" на будь-яке ключове слово і натиснути ліву клавішу маніпулятора;
використати "гарячі" клавіші, інформація про які висвітлена у нижньому рядку екрану. Для переходу в головне меню необхідно натиснути клавіші Alt та SpaceBar.
Вікна діалогу
Вікна діалогу використовуються для керування роботою команд інтегрованого середовища. З їх допомогою можна уточнити початкові умови та режими роботи команд. Якщо пункт меню закінчується символами "...", то це означає, що після натискання клавіші Enter з'явиться вікно діалогу. Вікно діалогу може включати в себе наступні елементи управління: 1) кнопки; 2) поля перевірки; 3) поля вибору; 4) поля вводу; 5) вікна списків.
Перехід з одного елементу вікна діалогу на інший здійснюється натисканням клавіші Tab. Активний елемент виділяється іншим кольором. "Натискання" клавіші у вікні діалогу здійснюється шляхом натискання клавіші Enter або лівої клавіші "миші". Встановлення значення семафорних елементів здійснюється натисканням клавіші SpaceBar.
Підсистема роботи з файлами
Для виклику підсистеми роботи з файлами необхідно вибрати команду File головного меню. Після її запуску на екрані з'являється меню управління файловою системою, що включає в себе пункти:
New - початок редагування нового файлу програми з початковим іменем NONAME.CPP;
Open ... - відкриває вікно діалогу для вибору існуючого файлу;
Save - зберігає файл з активного вікна редактора. Якщо файл має ім'я NONAME.*, то відкривається вікно для зміни імені файла;
Save as... - перейменування файлу, запис його в інший каталог або на інший носій;
Save all - зберігає файли з усіх відкритих вікон;
Change dir ... - відкриває вікно діалогу для зміни біжучого каталогу. Вибір каталогу або диску здійснюється шляхом його набору у вікні-редакторі або за допомогою дерева каталогів або дисків;
Print - роздруковує вміст активного вікна на принтері. Для роздруку тільки виділеного тексту необхідно натиснути клавіші Ctrl-K-P;
Dos shell - забезпечує тимчасовий вихід у DOS. Для повернення в середовище необхідно набрати команду Exit;
Quit - завершення роботи інтегрованого середовища.
Багатовіконний текстовий редактор
Призначений для набору та виправлення тексту програми. Перехід у редактор здійснюється при виборі команди New пункту File головного меню, або автоматично при відкритті файла або виявленні помилки при компіляції програми.
Редагування тексту програми здійснюється за допомогою ряду команд, які можна розділити на наступні групи:
команди переміщення курсору;
команди вставки та витирання;
блокові команди;
команди пошуку та заміни.
Команди переміщення курсору
Команди вставки та витирання
Блокові команди
Міжвіконний інтерфейс
Для забезпечення передачі блоків даних між різними вікнами використовуються команди меню Edit. Передача виділеного блоку здійснюється через спеціальну область пам'яті -Clipboard.
Для запису виділеного блоку в Clipboard виконується команда меню Edit-Copy або Edit-Cut. Команда Edit-Copy залишає виділений у вікні текст, а команда Edit-Cut - витирає його.
Скопійовані блоки нагромаджуються в Clipboard. Останній переміщений блок є активним. Для вставки активного блоку Clipboard в позицію курсору вікна необхідно виконати команду меню Edit-Paste.
Команди пошуку та заміни
Управління режимами пошуку та заміни здійснюється через меню Search, яке включає команди Find ..., Replace ..., Search again, Go to line number ..., Previous error, Next error та Locate function ....
Інший спосіб запуску команд, вказаних у меню, полягає у натисканні певної комбінації клавіш-акселераторів, значення яких приводяться у пунктах меню.
При виборі команди Find відкривається вікно діалогу з елементами Text to Find, Options, Direction, Scope, Origin, Ok, Cancel, Help.
Ввід тексту пошуку здійснюється у полі Text to Find. Режими пошуку задаються за допомогою елементів полів Options, Directions, Scope та Origin, які дозволяють виконувати наступні дії: Case-sensitive при пошуку розрізняються великі та малі літери; Whole words only здійснюється пошук рядка тексту, який має з обох сторін пропуски або інші розділювачі слів тексту; Regular expression - пошук рядка тексту здійснюється за шаблоном; Forward - пошук здійснюється вперед до кінця файлу; Backward - пошук здійснюється назад до початку файлу; Global пошук здійснюється по всьому файлу; Selected text - пошук здійснюється у виділеному тексті; From cursor - пошук здійснюється від біжучої позиції курсору; Entiere scope - пошук здійснюється з початку файлу.
Для здійснення пошуку необхідно натиснути клавішу Enter або кнопку Ok. Для продовження пошуку необхідно виконати команду меню Search-Search again або натиснути клавіші Ctrl-L.
Команда меню Replace дозволяє здійснювати заміну тексту. Для цього у полі Text to Find задається рядок, який необхідно замінити, а у полі New text - значення нового рядка. Режими пошуку задаються так як для команди Find. Додаткове поле Prompt on Replace контролює необхідність вводу підтвердження заміни знайденого тексту. Кнопка Change All виконує операцію заміни для всіх знайдених рядків тексту. Кнопка Ok замінює тільки перший знайдений рядок. Команда меню Search Go to Line Number вимагає вводу номера рядка, на який буде встановлений курсор.
Встановлення опцій інтегрованого середовища
Опції інтегрованого середовища встановлюються за допомогою пункту Options головного меню, який включає в себе ряд команд. Найбільш важливими є команди Compiler - для встановлення опцій компілятора, Linker - для встановлення опцій редактора зв'язків, Directories - для встановлення шляхів доступу до файлів.
Після вводу команди Compiler на екрані з'являється вікно діалогу, в якому виводиться меню конкретизації набраної команди. Найбільш важливі дії зосереджені в пунктах меню Code generation та Edvanced code generation. Вікно команди Code generation містить елементи Model встановлення моделі пам'яті, Options - встановлення значень типів даних та їх розміщення в пам'яті, що діють по замовчуванню, Assume SS equals DS - визначає випадки, у яких значення регістрів SS та DS будуть рівними при завантаженні програми в оперативну пам'ять. Елемент вікна діалогу Defines дозволяє визначити макроімена для препроцесора.
Додаткові опції компілятора встановлюються за допомогою команди Edvanced code generation. Вікно діалогу цієї команди дозволяє вибрати режим генерації коду для арифметики з плаваючою крапкою, визначити набір машинних команд, які буде використовувати компілятор, встановити опції для програми відлагодження та ін.
Команда головного меню Linker дозволяє встановити опції для редактора зв'язків і розгортається у дві підкоманди Settings... та Libraries... . У вікні діалогу команди Settings встановлюється вид завантажувального модуля - стандартний для DOS, оверлейний для DOS, для Windows або бібліотека динамічної компоновки. Крім цього встановлюється ряд допоміжних опцій. Команда Libraries дозволяє встановити вид та режими роботи із стандартними бібліотеками. Якщо є необхідність роботи з графікою, то необхідно встановити режим Graphics library.
Команда Directories дозволяє встановити директорії, які використовуються редактором текстів, компілятором та редактором зв'язків програми. У вікні діалогу цієї команди вказуються шляхи до файлів включення (Include Directories), стандартних бібліотек (Library Directories) та результуючих файлів .obj, .exe, .map (Output Directory). У списку можна вказувати декілька шляхів, розділених символом "крапка з комою".
Створення проекту програми
Створення проекту виконуваної програми необхідне для багатофайлової компіляції, тобто в тому випадку, коли програма складається з декількох файлів.
Створення проекту здійснюється за допомогою пункту головного меню Project. Насамперед необхідно виконати команду Open project... та у вікні діалогу набрати ім'я нового проекту, або вибрати зі списку існуючий проект. Виконання команди Open project завершується появою вікна Project.
Якщо проект відкритий, то його можна наповнити іменами текстових файлів, які будуть брати участь у сумісній компіляції. Для цього використовується команда Add item... . Ім'я файлу можна вибрати у списку вікна діалогу команди Add item. Для цього необхідно підсвітити необхідний файл та натиснути клавішу Enter або кнопку Add. Для завершення формування проекту необхідно натиснути кнопку Done.
Компіляція, компоновка та виконання програми
Компіляція та компоновка програми здійснюється за допомогою команди головного меню Compile. Для запуску цієї команди необхідно перейти в головне меню (клавіша F10) та натиснути клавішу Enter. На екрані з'явиться підменю наступної структури:
Compile - компіляція програми з активного вікна вбудованого редактора текстів (створення .obj-файлу);
Make - компіляція програм, вказаних у проекті програми, або з активного вікна редактора текстів (створення .obj-файлу) та їх компоновка при відсутності помилок (створення .exe-файлу); компілюються тільки текстові файли, у які були внесені зміни;
Link- компоновка файлів із проекту програми (створення .exe-файлу з .obj-файлу);
Build all - повна перекомпіляція текстових файлів програми (при їх наявності), розміщених у проекті, та їх компоновка при відсутності помилок (створення .exe-файлу).
Information - статистичні дані про виконувану програму;
Remove messages - очистка вікна повідомлень Message.Команду Compile можна виконати також натисканням клавіш Alt-F9, команду Make -натисканням клавіші F9.
Всі зауваження та повідомлення про помилки виводяться у вікні Message. Порядкове переміщення у вікні Message приводить до виділення рядків програми, в яких допущена помилка. Перехід між вікном повідомлень та вікном редактора текстів здійснюється натискання клавіші F6.
Запуск програми на виконання здійснюється командою Run меню Run, або натисканням клавіш Ctrl-F9. Для перегляду результатів програми необхідно натиснути клавіші Alt-F5.
Відлагодження програми
Відлагодження програми може бути виконане за допомогою вбудованого відлагоджувача або зовнішнього відлагоджувача - програми TD.EXE. Зовнішній відлагоджувач необхідно використовувати для відлагодження програм-драйверів, резидентних програм та в тих випадках, коли вбудований відлагоджувач не знаходить причини помилки. Нижче коротко розглядаються можливості вбудованого відлагодження програм.
Для можливості роботи вбудованого відлагоджувача необхідно виконати компіляцію та компоновку програми із включеною опцією Source Debugging, яка розміщена в меню Options -Debugger.
Вбудований відлагоджувач дозволяє:
виконати програму по кроках (по рядках текстового файлу);
виконати програму до вказаного рядка (до точки Breikpoint);
прослідкувати зміну значень змінних програми і при необхідності встановити нові значення змінних.
Покрокове виконання програми здійснюється за допомогою команди Trace into або Step over, розміщених у меню Run, або відповідно натисканням клавіш F7 або F8. При натисканні клавіші F7 виконуються команди, розміщені в одному рядку текстового файлу. Якщо у рядку є звертання до функції, то відбувається перехід до покрокового виконання команд цієї функції. Команда, закріплена за клавішею F8, працює так само як F7, тільки звертання до функції виконується як один крок.
Для прискорення процесу відлагодження використовується команда Go to cursor, розміщена в меню Run. Запуск цієї команди може бути здійснений також натисканням клавіші F4. Програма буде виконуватися до рядка, в якому розміщений курсор. Дальше виконання програми може бути здійснене покроково шляхом натискання клавіш F7 або F8.
Інша можливість прискореного відлагодження програми полягає у використанні точок зупинки. Включення точки зупинки виконує команда Toggle breakpoint меню Debug (або Ctrl-F8). Точка розміщується у рядку знаходження курсору. Рядок, в якому встановлена точка зупинки, зафарбовується іншим кольором. Повторне виконання команди Toggle breakpoint витирає точку зупинки.
Для точки зупинки може бути задана певна умова. Умова задається у вікні діалогу команди Breikpoint... меню Debug. Якщо умова задана, то виконання програми у точці зупинки призупиняється тільки тоді, коли ця умова приймає значення логічної істини. Якщо умова відсутня, то програма призупиняє свою роботу в даній точці завжди. Дальше можливе покрокове виконання програми (F7 або F8), виконання до курсора (F4) або до наступної точки зупинки (Ctrl-F9).
Вбудований відлагоджувач дає можливість відслідковувати проміжні значення змінних і при необхідності міняти їх. Для цього використовується спеціальне вікно Watch, яке з'являється після натискання клавіші F7 або F8. Задання змінних або виразів для контролю здійснюється командою Watches меню Debug. Для визначення контрольованих змінних або виразів необхідно виконати команду Add Watch меню Debug-Watch. Іншою можливістю вибору змінних або виразів для контролю є встановлення курсора на імені змінної та натискання клавіш Ctrl-F7. На екрані з'являється вікно Add Watch, в якому висвітлюється ім'я змінної. Для вводу виразу необхідно натиснути клавішу "стрілка вліво". Переміщення виразу у вікно перегляду здійснюється натисканням клавіші Enter.
Команда Watch меню Debug дозволяє витирати окремий вираз вікна перегляду, редагувати або очистити його.
Команда Evaluate/modify меню Debug дає можливість перегляду та зміни значення змінних в процесі відлагодження програми. Виконання цієї команди приводить до появи вікна діалогу, яке містить три поля: Expression - для задання виразу, Result - де відображається результат обчислення виразу та New Value - для задання при необхідності нового значення виразу.
Команда Inspect меню Debug дозволяє дослідити та змінити значення комірок пам'яті, які відводяться під змінні.
У процесі відлагодження програми можна змінювати її текст. Після кожної зміни відлагодчик запитує підтвердження на продовження відлагодження програми або рекомендує здійснити її перекомпіляцію. Якщо потрібно почати виконання програми спочатку, то необхідно натиснути клавіші Ctrl-F2 або виконати команду Program reset меню Run.
Приклад програми для вводу, компіляції, відлагодження та виконання
#include <stdio.h>
#include <conio.h>
main()
{ float a,b;
char opr;
double result;
textbackground(RED);
clrscr();
textcolor(YELLOW);
puts ("Здійсніть ввід по формату: операнд1 операція операнд2 <Enter>");
puts ("Для закінчення роботи натисність клавішу Esc"); window(1,4,80,25);
textbackground (BLUE);
clrscr();
while (cputs("Ввід->"), cscanf("%f %c %f",&a,&opr,&b)!=0)
{ switch (opr)
{ case '+':result=a+b;break;
case '-':result=a-b;break;
case '*':result=a*b;break;
case '/':if (b==0)
{ срuts("\п\гПомилка: ділення на нуль!!\n\r"); continue;}
else {result=a/b;break;}
default:{ срuts("\п\гПомилка: недопустимий код операції!!\n\r");
continue;}
}
gotoxy(20,wherey());
cprintf("=%f\n\r",result);
}
return; }
Лабораторна робота № 2
Тема: Арифметичні операції, оператор присвоєння, вирази в мові С. Функції форматованого та неформатованого введення-виведення
Мета: Навчитися програмувати на мові С найпростіші послідовні алгоритми із застосуванням для введення вхідних даних та виведення результатів стандартних функції введення-виведення мови С
Теоретичні відомості
Уведення-виведення може бути двох видів: форматоване і неформатоване. Дві функції - scanf() і printf() виконують відповідно введення і виведення. Цим функціям передається змінне число аргументів, але першим аргументом завжди є текстовий (так званий форматний) рядок. Він задає спосіб перетворення даних. Функція printf() видає на екран весь форматний рядок, у якому знак %ххх заміняється символами виведеної інформації. Символи після % до першого роздільника розглядаються як специфікація перетворення значення виведеної змінної. Ім'я змінної - це другий, третій і т.д. аргументи списку аргументів.
Функція scanf() приймає з клавіатури всі символи до натискання клавіші ENTER і поміщає їх у буфер. Потім за форматним рядком визначається спосіб перетворення введених символів відповідно до заданих специфікацій. Отримане в результаті перетворення число міститься за адресою змінної, яка є другим, третім і т.д. аргументом у списку аргументів функції. Специфікація перетворення задається у вигляді послідовності
% [прапорці ] [ширина ] [.точність ] [F | N | h | l ]<тип>
Функції неформатованого введення-виведення працюють з окремими символами або рядками символів. Для введення символу використовується функція getchar(), що не має аргументів і повертається ціле число. Для виводу символу використовується функція putchar(int).
Введення-виведення рядків символів виконують відповідно функції gets(char *string) і puts(char *string), де string задає адресу області пам'яті, у якій містяться символи рядка, що вводиться і відкіля вони виводяться на екран. Функції gets(string) і puts(string) за виконуваними діями подібні до scanf("%s",string) і printf("%s\n",string) відповідно. Однак функція gets () передає в програму всі символи до '\n'.
Вираз в мові С - це послідовність операндів, операцій і символів-роздільників. Операнди - це змінні, константи або інші вирази. Роздільниками в С є символи [](){},;:... *=#, кожний із яких виконує свою функцію. Вираз може складатися з однієї або більше операцій і визначати виконання цілого ряду елементарних кроків з перетворення інформації. Компілятор дотримується строгого порядку інтерпретації виразів, званого правилами пріоритетності. Цей порядок може бути змінений, якщо окремі частини виразу узяти в круглі дужки. Елементарна операція з перетворення інформації задається знаком операції.
Мова С включає стандартний набір арифметичних операцій додавання (задається знаком +), віднімання (-), множення (*), ділення (/), що не вимагають особливого пояснення. Специфічними для С є операції визначення залишку (%), інкремента (++) і декремента (- -).
Операції інкремента і декремента відповідно збільшують і зменшують операнд на 1. Операції ++ і -- можуть застосовуватися тільки до змінної. Існують дві форми їхнього запису: префіксна, коли операнд розташовується зліва від знака операції і постфіксна, коли операнд розташовується після знака операції. У префіксній формі спочатку виконується збільшення операнда на 1 і збільшене значення використовується у виразі. У постфіксній формі спочатку береться значення операнда і тільки після цього його значення збільшується на 1.
Мова С має декілька особливостей виконання присвоювання, що задається символом операції =. При виконанні операції значення операнда справа від знака рівності пересилається в комірку пам'яті, відведену компілятором під змінну, посилання на яку записане зліва від знака.
У більшості мов програмування присвоювання - це окреме речення мови, що задає тільки операцію пересилки значення. У С операція присвоювання додатково має ще і значення результату виконання, що співпадає із присвоюваним значенням. Тому С допускає запис в одному реченні відразу декількох операцій присвоювання. Наприклад:
int а, b, c, d;
a=b=c=d=0;
Інша особливість операції присвоювання в С - наявність так званої комбінованої операції присвоювання:
varl op= expression;
де varl - зміна, що має комірку пам'яті; ор - одна з операцій, що задаються знаками *, /, +, -, %, <<, >>, &, ^, | ; expression - будь-який вираз.
Завдання
Написати програму, яка забезпечуватиме виконання наступних послідовних дій:
друк “Обчислення ідеальної ваги для стрункої людини” [1];
введення відповідної інформації на запитання:
а) “Назвіть ваше ім`я” [2] < Ім`я > [3];
б) “Вкажіть рік народження” [4] < Рік >;
в) “Вкажіть свою вагу (кг)” [5] < Вага >;
г) “Вкажіть свій ріст (см)” [6] < Рік >;
обчислення величини ідеальної ваги за ростом:
92%*(ріст (см) – 100);
обчислення ідеального росту для дійсної ваги;
друк “< Ім`я > [7] , ідеальною вагою для вас є < ід. вага > кг”;
друк < Ім`я > [8] , при вашій вазі, рівній < вага > кг, вам потрібно мати ріст < ід. ріст > см”;
друк “< Ім`я > [9] , вам потрібно відкоректувати фігуру на
<стільки> кг”;
друк
а) “Через рік вам виповниться < стільки-то > років”;
б) “Бажаємо успіхів у досягненні стрункої фігури” [10].
Нумеровані дії [1]-[10] виконуються згідно заданого варіанту з наступної таблиці:
Таблиця індивідуальних варіантів
Позначення
Н – використати функції неформатованого введення чи виведення
Ф – використати функції форматованого введення чи виведення
Контрольні запитання
Яка різниця між форматованим та неформатованим введенням/виведенням?
Як здійснюється фоматоване введення даних?
Як здійснюється фоматоване виведення даних?
Як здійснюється неформатоване введення символів і рядків?
Як здійснюється неформатоване виведення символів і рядків?
Чим відрізняються арифметичні та логічні вирази?
В чому полягає префіксна і постфіксна форми інкремента і декремента?
В чому полягає комбінована операція присвоєння?
Лабораторна робота № 3
Тема: Базові типи даних. Логічні операції, умовна операція. Виведення дійсних чисел у різному форматі з допомогою стандартної функції мови С. Явне та неявне перетворення типів
Мета: Навчитися задавати дані різного типу та освоїти операції мови С для арифметичних, логічних обчислень та задання умов.
Теоретичні відомості
С підтримує такі порозрядні логічні операції:
& порозрядне логічне І (AND) ;
^ порозрядне додавання по модулю 2 (XOR - виключаюче АБО);
| порозрядне логічне АБО (OR) ;
~ порозрядна інверсія.
Кожний біт результату визначається по бітах операндів так, як це показано в табл. 3.1.
Табл.3.1.Порозрядні логічні операції
Інверсія вимагає єдиного операнда справа від знака ~. Результат утворюється порозрядною інверсією всіх бітів операнда.
Мова С передбачає дві операції порозрядного зсуву:
<< - зсув вліво операнда зліва від знака операції на число двійкових розрядів справа від знака операції;
>> - зсув вправо операнда зліва від знака операції на число двійкових розрядів справа від знака операції.
Висунуті біти втрачаються, а "втягаються" нульові біти.
Обмеженням операції зсуву є те, що кількість двійкових розрядів для зсуву операнда зліва може бути задана тільки константою або константним виразом, тобто виразом, що цілком складається з констант.
Логічні операції й операції відношення використовуються при формуванні логічних виразів, що мають тільки два значення: 1, якщо логічний вираз є TRUE; 0, якщо логічний вираз є FALSE.
С підтримує такі операції відношення:
> - більше; дає результат 1, якщо операнд зліва від знака більший від операнда справа; у протилежному випадку дає 0;
< - менше; дає результат 1, якщо операнд зліва менший від операнда справа; у протилежному випадку дає 0;
= = - дорівнює; дає результат 1, якщо операнд зліва від знака дорівнює операнду справа; у протилежному випадку дає 0;
>= - більше або дорівнює; дає результат 1, якщо операнд зліва від знака більший або дорівнює операнду справа; у протилежному випадку дає 0;
<= - менше або дорівнює; дає результат 1, якщо операнд зліва від знака менший або дорівнює операнду справа; у протилежному випадку дає 0;
!= - не дорівнює; дає результат 1, якщо операнд зліва від знака не дорівнює операнду справа; у протилежному випадку дає 0.
С підтримує наступні логічні операції:
&& - логічне І; дає результат 1 (TRUE), якщо операнд зліва від знака й операнд справа мають значення 1 (TRUE) ; у протилежному випадку дає 0 (FALSE);
| | - логічне АБО; дає результат 1 (TRUE), якщо операнд зліва від знака або операнд справа має значення 1 (TRUE); у протилежному випадку дає 0 (TRUE);
! = логічне НЕ; дає результат 1 (TRUE), якщо операнд справа від знака має значення 0 (FALSE); у протилежному випадку дає 0 (FALSE).
У С існує одна тернарна операція (тобто в операції є 3 операнди). Це умовна операція, яка записується у вигляді
(операнд1) ? (операнд 2) : (операнд3)
і має результатом значення другого операнда при ненульовому значенні першого операнда, або значення третього операнда в протилежному випадку. Операнди в умовній операції задаються за правилами запису виразів у мові С.
Операнди бінарної та тернарної операцій можуть бути різного типу. У цьому випадку перед її виконанням компілятор попередньо приводить операнди до однакового типу.
Правила приведення типів у С:
операнди різних типів приводяться до "старшого", тобто довшого, типу. Нижче перераховані типи, починаючи від найстаршого, у порядку спадання старшинства: найстарший - long double, double, float, unsigned long, long int, unsigned, int, char - наймолодший;
при виконанні операції присвоювання результат приводиться до типу змінної зліва від знака операції. У цьому випадку може виникнути ситуація перетворення старшого типу до молодшого.
Перетворення молодшого цілого типу до старшого цілого типу вимагає розширення значення на 8 або 24 біт. Ці старші біти можуть заповнюватися або нулями (так зване розмноження нуля), або найстаршим бітом перетворюваного значення (так зване розмноження знака).
Перетворення типу char у int, unsigned int, long int або unsigned long виконується розмноженням нуля тоді, коли тип char вважається беззнаковим типом unsigned char. У протилежному випадку відбувається розмноження знака.
Перетворення цілих типів у типи з плаваючою крапкою виконується за допомогою спеціальних бібліотечних процедур із заповненням вільних бітів мантиси нулями. Діапазон представлення типів із плаваючою крапкою набагато ширший від діапазону представлення цілих типів, і таке перетворення завжди дає коректний результат.
Перетворення старших цілих типів у молодші виконується відкиданням старших байтів.
Перетворення старшого типу з плаваючою крапкою в молодший тип (наприклад, long double у float) виконується за допомогою спеціальних бібліотечних процедур із заокругленням числа до потрібної кількості знаків після десяткової крапки.
Перетворення типу з плаваючою крапкою в цілий тип виконується за допомогою спеціальних бібліотечних процедур і дає найближче ціле число. Результат коректний тільки тоді, коли ціла частина перетворюваного числа з плаваючою крапкою міститься в діапазоні представлення для даного цілого типу.
Мова С дозволяє задати і явне приведення типу операндів, використовуючи операцію (type), де type – будь-який допустимий тип мови С. Результатом операції
(type) expression
є значення виразу expression, перетворене до типу type, де type – визначений перед цим тип. Приведення до типу відбувається відповідно до правил, розглянутих вище.
Завдання
Написати програму, яка виконує таку послідовність дій:
для введеного дійсного числа друкує окремо цілу та дробову частину;
друкує число у формах
/D.ddd/
/D.d /
/d.dde<знак>dd/
/D./
/<знак>D.d/
/d.ddddE<знак>dd/
/D.dddddd/
/0..0D.dd/ (друкує 2 цифри після коми, при вирівнюванні до довжини вивідного поля 6, доповнюючи при потребі нулем)
/ D.dd/ (друкує 2 цифри після коми, при вирівнюванні до довжини вивідного поля 8, доповнюючи при потребі пробілом)
Тут через d позначено одну десяткову цифру, D – одну або більше десяткових цифр.
3) для цілої частини цього числа друкує n-ту цифру з кінця (останню, 2, 3, 4, 5)
4) для цілої частини здійснює обчислення з допомогою операцій зсуву
(/8, *2) (/4, *16) (/16, *8) (/32, *4) (/8, *16) (/32, *8) (/16, *4) (/64, *2) (/4, *8) (/16, *16) (/8, *8) (/32, *16) (/64, *4) (32/, *2)
та друкує результат цих дій;
5) для введеного символу (через функції Ф/Н) друкує код цього символу;
6) використовуючи умовну операцію для одного з наступних варіантів:
виводить результат перевірки, чи остання цифра меншого з введених довгих цілих чисел не рівна 3;
виводить результат знаходження меншого з двох введених дійсних чисел;
виводить результат перевірки, чи найближче ціле до введеного дійсного числа є числом, що закінчується на 7;
виводить результат перевірки , чи старша цифра дробової частини більшого з двох введених дійсних чисел є непарною;
виводить результат перевірки, чи найближче ціле до введеного дійсного числа є числом кратним 5;
виводить результат перевірки, чи точка з введеними координатами (x,y) потрапляє у частину кола із заданим радіусом r (центр кола в точці початку координат), що розташована в другому квадранті;
виводить результат перевірки, чи серед 4-х молодших двійкових розрядів заданого цілого числа є хоч одна 1;
виводить останню цифру числа, яке є результатом округленням до ближчого цілого меншого з двох введених дійсних чисел;
виводить результат перевірки, чи найближче до введеного числа більше ціле є парним числом;
виводить першу цифру з дробової частини меншого з двох введених дійсних чисел;
виводить суму двох останніх цифр числа, що є результатом округлення до ближчого цілого більшого з двох введених дійсних чисел;
виводить результат перевірки, чи найближче до введеного дійсного числа більше ціле є числом, що закінчується 0;
виводить результат перевірки, яке з 3-ох введених дійсних чисел є найменшим.
виводить результат перевірки, чи значення молодшого байта введеного беззнакового цілого числа вдвічі менше за значення його старшого байта.
Контрольні запитання
Яка відмінність між порозрядними логічними операціями і звичайними?
В чому полягає операція порозрядного логічного додавання по модулю 2?
Що таке порозрядна логічна інверсія?
Що таке унарна і бінарно операції?
Який формат операцій зсуву?
Пояснити виконання операцій зсуву.
Пояснити виконання умовної операції.
Яке значення відповідає логічному TRUE і логічному FALSE?
Як позначаються операції “дорівнює”, ”не дорівнює”?
Як позначаються операції “логічне І”, “логічне АБО”, “логічне НЕ” (заперечення) ?
Яка різниця між явним і неявним перетворенням типу?
Які правила перетворення типів ви знаєте?
Лабораторна робота № 4
Тема: правила запису та використання операторів у мові С (умовний оператор, оператор вибору, оператор безумовного переходу)
Мета: навчитися програмувати на мові С розгалужені процеси
Теоретичні відомості
Оператори керування обчислювальним процесом дозволяють виконувати розгалуження, циклічне повторення одного або декількох операторів, передачу керування в потрібне місце коду програми. Під обчислювальним процесом розуміють процес виконання операторів програми. Оператори програми можуть бути простими або складеними. Простий оператор - це оператор, що не містить інших операторів. Роздільником простих операторів служить крапка з комою. Спеціальним випадком простого оператора є порожній оператор, що складається з єдиного символу ';'.
Складений оператор, або блок, - це будь-яка сукупність простих операторів, укладена у фігурні дужки {}. Складений оператор ідентичний простому оператору і може знаходитися в будь-якому місці програми, де синтаксис мови допускає наявність оператора, але додатково впливає на так звану видимість змінних.
Оператори розгалуження вибирають у програмі з групи альтернатив можливе продовження обчислювального процесу. Вибір виконується виходячи зі значення заданого виразу. У С використовуються два оператори розгалуження: if... else і switch.
Оператор if має таку загальну форму запису:
if (cond_expression) TRUE_statement;
[else FALSE_statement]
При виконанні оператора if спочатку обчислюється логічний вираз cond_expression. Якщо результат - TRUE (будь-яке відмінне від нуля значення), виконується оператор TRUE_statement. Якщо результат логічного виразу - FALSE (дорівнює 0), то виконується оператор FALSE_statement. Якщо ключове слово else відсутнє, то в цьому випадку оператор TRUE_statement пропускається, а керування передається на наступний після if оператор.
Часто виникає в програмуванні задача вибору одного варіанта з багатьох. Можна це зробити за допомогою вкладених if ... else. Однак зручніший спосіб - використання оператора switch, загальний формат якого такий:
switch (switch_expression)
{ case constant1: statement1; [break;]
……………………
case constanti: statementi; [break;]
…………………......
case constantN: statementN; [break; ]
[default: statementN+1; ] }
Оператор switch виконується так. Спочатку обчислюється значення виразу switch__expression. Тип значення повинен бути одним із цілих - char, int, unsigned int, long int і long unsigned. Обчислене значення зрівнюється зі значеннями констант або константних виразів constant1, ... , constantN. При співпадінні значення switch_expression із constanti виконується оператор statementi. Потім керування передається на оператор відразу після switch, якщо в i-й гілці є присутнім оператор break. У протилежному випадку виконуються оператори в гілках i+1, i+2 і так далі доти, поки в них не зустрінеться оператор break або не буде виконаний оператор statement n+1.
Якщо значення switch_expression не збіглося з жодною з констант constanti,... , constantN, виконується оператор у гілці, позначеній default. При її відсутності виконується наступний після switch оператор.
Для зміни послідовного виконання операторів використовується оператор безумовного переходу, загальний формат запису якого
goto label
У програмі є стрічка, помічена міткою, вигляду
label : <statement>,
на яку оператор переходу передає керування. Мітка (label) задається за правилами запису ідентифікаторів.
Завдання
Не використовуючи оператор циклу скласти програму, яка
Визначає, чи можна побудувати трикутник за заданими довжинами сторін. Якщо так, то визначити, яким він є: гостро-, тупо-, прямокутним, а також різно-, рівностороннім чи рівнобедреним.
За заданим кутом (в градусах) визначити знаки усіх тригонометричних функцій. (Не використовувати математичні функції з стандартної бібліотеки).
Читає натуральні числа m, n і друкує всі натуральні числа менші від n, сума цифр яких дорівнює m.
Обчислює корені квадратного рівняння ах2 +b*х +с=0 для заданих довільних дійсних а, b, с. У випадку відсутності дійсних коренів цього рівнянн...