Uploaded by bogdanlisuk8

Лабка з ІТ

advertisement
Лабораторна робота №1
Програмування лінійних алгоритмів
Мета роботи: виробити практичні навички роботи з системою Borland C , навчитися створювати,
вводити в комп'ютер, виконувати і виправляти найпростіші програми на мові C / С ++ режимі діалогу,
познайомитися з діагностичними повідомленнями компілятора про помилки при виконанні програм, що
реалізують лінійні алгоритми.
Загальні відомості:
Лінійним називається алгоритм, в якому результат виходить шляхом одноразового виконання заданої
послідовності дій при будь-яких значеннях вихідних даних. Оператори програми виконуються
послідовно, один за іншим, відповідно до їх розташуванням в програмі.
Директиви препроцесора
Заголовки включаються в текст програми за допомогою директиви препроцесора #include. Директиви
препроцесора починаються зі знака "дієз" (#), який повинен бути найпершим символом рядка. Програма,
яка обробляє ці директиви, називається препроцесором (в сучасних компіляторах препроцесор зазвичай
є частиною самого компілятора).
Директива #include включає в програму вміст зазначеного файлу. Файл може бути зазначено двома
способами:
#Include < some_file.h >
#Include " my_file.H "
Якщо ім'я файлу укладено в кутові дужки (<>), вважається, що нам потрібен якийсь стандартний
заголовки, і компілятор шукає цей файл в зумовлених місцях. (Спосіб визначення цих місць сильно
розрізняється для різних платформ і реалізацій.) Подвійні лапки означають, що заголовки - призначений
для користувача, і його пошук починається з того каталогу, де знаходиться вихідний текст програми.
Коментарі
Коментарі допомагають людині читати текст програми. Писати їх грамотно вважається правилом
хорошого тону. Коментарі можуть характеризувати використовуваний алгоритм, пояснювати
призначення тих чи інших змінних, роз'яснювати незрозумілі місця. При компіляції коментарі
викидаються з тексту програми тому розмір виходить виконуваного модуля не збільшується.
В С є два типи коментарів.
Перший тип коментарів - / * для позначення початку і * / для позначення кінця коментаря. Між цими
парами символів може перебувати будь-який текст, який займає одну або кілька рядків: вся
послідовність між / * і * / вважається коментарем.
Другий тип коментарів - однорядковий. Він починається послідовністю символів // і обмежений кінцем
рядка. Частина рядка вправо від двох косих рис ігнорується компілятором.
Зазвичай в програмі вживають відразу обидва типи коментарів. Рядкові коментарі зручні для коротких
пояснень - в одну або піврядка, а коментарі, обмежені / * і * /, краще підходять для розгорнутих
багаторядкових пояснень.
Змінна , або об'єкт - це іменована область пам'яті, до якої ми маємо доступ з програми; туди можна
поміщати значення і потім отримувати їх. Кожна змінна С має певний тип, який характеризує розмір і
розташування цієї області пам'яті, діапазон значень, які вона може зберігати, і набір операцій, які можна
застосувати до цієї змінної.
Базові типи змінних
тип
(байт)
розмір тип
(байт)
розмір тип
(байт)
розмір тип
(байт)
розмір
unsigned short int
2
0
65535
short int
2
-32768
32767
unsigned long int
4
0
4294967295
long int
4
-2147483648
2147483647
int (16 bit)
2
-32,768
32767
int (32 bit)
4
-2147483648
2147483647
unsigned int (16
2
bit)
0
65535
unsigned int (32
2
bit)
0
4294967295
char
1
256 символів
float
4
1.2e-38
3.4e38
double
8
2.2e-308
1.8e308
Змінні типу int можуть мати розмір 2 або 4 байти в залежності від компілятора і системи комп'ютера (16
або 32-розрядна).
Змінна, як і літерал, має певний тип і зберігає своє значення в деякій області пам'яті. Адресованість - ось
чого не вистачає літералу. Зі змінною асоціюються дві величини:
власне значення, або r-значення (від read value - значення для читання), яке зберігається
в цій області пам'яті і притаманне як змінній, так і літералу;
значення адреси області пам'яті, асоційованої зі змінною, або l-значення (від location
value - значення місця розташування) - місце, де зберігається r-значення; притаманне тільки
об'єкту.
Оператор визначення змінної виділяє для неї пам'ять. Оскільки об'єкт має тільки одну асоційовану з ним
область пам'яті, такий оператор може зустрітися в програмі тільки один раз.
С вимагає, щоб об'єкт був відомий до першого звернення до нього. Це викликано необхідністю
гарантувати правильність використання об'єкта відповідно до його типу.
Визначення об'єкта
Перед тим як використовувати змінну в C треба її оголосити. У найпростішому випадку оператор
визначення об'єкта складається з специфікатору типу і імені об'єкта і закінчується крапкою з комою.
наприклад:
int a;
Можна оголосити кілька змінних одного типу в одному рядку:
int a, b, c;
Можна ініціалізувати (привласнити значення) змінну при оголошенні:
int a, b = 1, c = 10, d;
ім'я змінної
Ім'я змінної, або ідентифікатор , може містити лише латинські літери, цифри і символу підкреслення.
Великі та малі літери в іменах розрізняються. Мова С не обмежує довжину ідентифікатора, проте
користуватися занадто довгими іменами типу gosh_this_is_an_impossibly_name_to_type незручно.
Деякі слова є ключовими в С і не можуть бути використані в якості ідентифікаторів; нижче наведено їх
повний список.
Ключові слова C
asm
auto
bool
break
case
catch
char
class
const
const_cast
continue
default
delete
do
double
dynamic_cast else
enum
explicit
export
extern
false
float
for
friend
goto
goto
inline
int
long
mutable
namespac
new
e
operator
private
protected
public
register
reinterpret_cas
return
t
short
signed
sizeof
static
static_cast
short short
signed
sizeof
static
static_cast
struct
switch
templat
this
e
throw
typedef
true
try
typeid
typename
union
voidunion using
virtual
void
Щоб текст вашої програми був більш зрозумілим, слід дотримуватися загальноприйнятих угод про імена
об'єктів:
ім'я змінної зазвичай пишеться малими літерами, наприклад index (для порівняння:
Index - це ім'я типу, а INDEX - константа, визначена за допомогою директиви препроцесора
#define);
ідентифікатор повинен нести будь-який сенс, пояснюючи призначення об'єкта в
програмі, наприклад: birth_date або salary;
якщо таке ім'я складається з декількох слів, як, наприклад, birth_date, то прийнято або розділяти слова
символом підкреслення (birth_date), або писати кожне наступне слово з великої літери (birthDate).
Помічено, що програмісти, які звикли до Об'ектноОріентірованномуПідходу воліють виділяти слова
великими літерами, в той час як ті_хто_багато_пишуть_на_С використовують символ підкреслення.
Який з двох способів краще - питання смаку.
Виконання програми починається з виконання першої інструкції функції main ()
Функція складається з чотирьох частин: типу значення, що повертається, імені, списку параметрів і тіла
функції. Перші три частини складають прототип функції .
Список параметрів полягає в круглі дужки і може містити нуль або більше параметрів, розділених
комами. Тіло функції містить послідовність виконуваних інструкцій і обмежена фігурними дужками.
Останньою виконується інструкція
return 0 ;
Інструкція return забезпечує механізм завершення роботи функції. Якщо оператор return
супроводжується деяким значенням (в даному прикладі 0), це значення стає повертаючим значенням
функції . У нашому прикладі значення, що повертається 0 говорить про успішне виконання функції main
(). (Стандарт С передбачає, що функція main () повертає 0 за замовчуванням, якщо оператор return не
використано явно.)
Функції форматного введення / виведення ( scanf / printf ) файл stdio.h
Функція виведення printf (), виконує форматований вивід в стандартний потік stdout. (тобто значення
змінних, які зберігаються в пам'яті в двійковому вигляді, при виведенні в потік (на екран) переводяться в
символьний вид, причому вид перетворення задається специфікатором формату. Специфікатори
формату задаються як складова частина обов'язкового першого аргументу - рядка формату. Після рядка
формату задається список виразів, значення яких повинні видаватися на екран. як виразів допускається
задавати і змінні. Функція повертає кількість виведених символів. Специфікатор формату починаються
символом % (відсоток), слідом за яким прописується код формату. кількість аргументів-змінних має в
точності відповідати кількості специфікаторів формату. При відсутності списку змінних функція просто
виводить в потік (на екран) форматний рядок.
специфікація формату має наступний вигляд:
%[Прапор][ширина][.Точність][h | l | L] тип \
тут квадратні дужки означають, що відповідний елемент специфікації може бути відсутнім. У
найпростішому вигляді специфікатор формату записується як
%тип
Тип задається однією буквою, і визначає, в якому вигляді постане значення змінної в потоці (на екрані).
Так як знак відсотка% використовується як керуючий, то для виведення його в потік треба прописати
його в форматної рядку двічі %%.
Таблиця. Деякі типи специфікаторів формату
Т
и
п
Вид в потоці
c
символ
s
рядок символів
d,
i
Ціле десяткове зі знаком
o
ціле вісімкове
u
Ціле десяткове без знака
Х,
х
ціле шістнадцятирічне
f
Дробове число в фіксованому форматі
e,
E
Дробове число в науковому форматі
g,
G
Дробове число в науковому або фіксованому
форматі
p
Покажчик (в шістнадцятирічному вигляді)
Ширина показує, скільки символів буде виведено в потік. До цього числа входять всі символи: і знак, і
десяткова точка для дробних чисел. Якщо ширина виявиться фактично менше, ніж потрібно для
виведення, то все одно значення виводиться повністю. Точність задає кількість цифр дробової частини і
застосовується зазвичай тільки для дробних чисел.
Перед типом може стояти модифікатор типу. Зазвичай модифікатори застосовуються до числових
змінним: в цьому випадку вони вказують коротку (h) або довгу (L, l) форму типу. Наприклад, тип% f
застосовується для виведення значень типу float,% lf - для виведення double, а% Lf - для виведення
значень long double.
модифікатори типу
Модифікатор
формату
Специфікатор Тип
змінної
hiduox X
short int
liduox X
long int
le E fg G
double
L e E fg G
long
double
Замість ширини і точності в специфікаторами формату можна вказувати символ * (зірочка). Це дозволяє
задавати і ширину, і точність як значення цілих змінних - це дозволяє обчислювати ширину поля
виведення під час виконання програми. Розглянемо найпростіший приклад:
// Змінні ширина і точність
float number = -12.3;
int w = 10, // ширина
p = 4; // точність
printf ( "% 0 *. * f \ n", w, p, number);
w = 15, p = 5; // нова ширина і точність
printf ( "% 0 *. * f \ n", w, p, number);
На екрані виводяться два рядки
-0012.3000
-00000012.30000
Змінні, в яких вказані ширина і точність, повинні задаватися першими в списку аргументів після рядка
формату, інакше програма просто зациклюється.
У зв'язку з можливістю задавати змінну ширину поля часто буває необхідно знати кількість символів,
виведених в потік після останнього звільнення буфера. І цю величину можна отримати за допомогою
специфікатору % n. У списку аргументів після рядка формату задається адреса цілої змінної, куди і
заноситься кількість виведених в потік символів. Наприклад.
w = 15, p = 5; // нова ширина і точність
int kk = 0;
printf ( "% 0 *. * f% n \ n", w, p, number, & kk); // обчислення кількості
printf ( "% d \ n", kk); // виводить 15
У змінну kk, адреса якої задана в списку аргументів, вміщається кількість символів, виведених в потік з
моменту останнього звільнення буфера, в даному випадку 15.
А тепер про введення
Функція scanf () виконує форматване введення зі стандартного потоку stdin в змінні програми. Так як
stdin "прив'язаний" до клавіатури, то при введенні, очевидно, виконується перетворення з символьного
виду у внутрішній двійковий формат. Першим параметром теж є форматна рядок, за якою слідує список
адрес змінних, куди потрібно помістити задані значення.
Символи в форматному рядку діляться на три види: специфікатор формату, роздільники та інші. До
розділювачей відносяться пробіл, табуляція ( '\ t') і символ кінця рядка ( '\ n'). Специфікатори формату такі ж, як і для функції printf ().
У загальному вигляді специфікатор формату має наступну форму:
% [ширина] [h / l / L] тип , квадратні дужки означають, що цей елемент специфікатор може бути
відсутнім. У порівнянні зі специфікатором формату для виводу тільки символ * (зірочка) має інший
зміст: якщо вона вказана, то запис значення в змінну не відбувається. Наприклад, можна визначити
введення двох значень в дві числових змінних, розділяючи їх при введенні будь-яким символом
double a, b;
scanf ( "% lf% * c% lf", & a, & b);
У цьому випадку ми можемо задавати введення і так
1б2
і так
1,2
і так
1-2
У всіх випадках в змінну a потрапить значення 1, а в змінну b - значення 2.
ПРИМІТКА
Введення рядків виконується зазвичай іншими, більш придатними функціями, наприклад, fgets (), яку ми
далі розглянемо. При цьому, природно, мова йде про символьні масиви, а не про змінних типу string.
char ss [80] = {0}; // оголошення символьного масиву
scanf ( "% s", ss); // ім'я ss пишеться без амперсанта!
Якщо ми спробуємо ввести послідовність символів "1234 567", то в масив ss потрапить тільки "1234".
Крім того, зверніть увагу, що ім'я масиву потрібно прописувати без амперсанта - це єдиний виняток із
загального правила!
При введенні даних за допомогою scanf () треба зовсім жорстко дотримуватися формату введення.
Наприклад, при введенні декількох значень можна розділяти їх символами пунктуації (кома, крапка з
комою, двокрапка). Ці символи повинні бути прописані і в форматному рядку, наприклад
char c1, c2, c3;
double d1, d2, d3;
scanf ( "% c,% c,% c", & c1, & c2, & c3); // введення трьох символів
scanf ( "% lf,% lf,% lf", & d1, & d2, & d3); // введення трьох чисел
При введенні треба так і набирати на клавіатурі
а, б, в <Enter> // введення трьох символів
1,2,3 <Enter> // введення трьох чисел
математичні операції
знак
математична
операція
*
множення
/ (Завжди означає розподіл. Однак якщо з обох сторін від цього знака стоять Розподіл
і
цілі величини (константи, змінні або їх комбінації), він означає цілочисельне цілочисельне
ділення. Якщо в результаті такого поділу виходить залишок, З його відкидає.)
ділення без остачі
Розподіл по модулю
% (Означає виділення залишку при целочисленном розподілі. Ця операція
і
залишок
від
вимагає, щоб з обох сторін від її знака стояли цілі величини.)
ділення
+
додавання
-
віднімання
Присвоєння
В одному рядку може стояти більше однієї операції присвоювання =.
Приклад. a = b = c = d = 100;
Знак = завжди означає: "змінній зліва привласнити значення, що стоїть праворуч". Операція виконується
справа наліво. Тому першою значення 100 отримує змінна d, потім з, b і а.
Знак привласнити може стояти навіть всередині математичного виразу: value = 5 + (r = 9-c)
Присвоєння має більш високий пріоритет, ніж додавання і віднімання. Тому спочатку змінної r буде
присвоєно значення 9-с. А потім змінна value отримає значення 5 + 9-с.
складене присвоювання
операц прикла
ія
д
еквівале
нт
+=
B + = B = b +
500;
500;
-=
С- = 50;
*=
D * = D = d *
1.2;
1.2;
/=
F / = 50;
f = f / .50;
%=
m% = 7;
M = m%
7;
C = с - 50;
математичні функції
функція
значення
abs (n)
Абсолютне значення n
sqrt (n)
Квадратний корінь з n
exp (n)
експонента n
Випадкове ціле число в діапазоні від 0 до п-1 (перед першим зверненням до функції
random [VI
необхідно викликати функцію randomize (), яка виконає ініціалізацію програмного
9] (n)
генератора випадкових чисел)
sin (a)
Синус вираженого в радіанах кута а
cos (a)
Косинус вираженого в радіанах кута а
tan (a)
Тангенс вираженого в радіанах кута а
asin (n)
Кут (в радіанах), синус якого дорівнює n
acos (n)
Кут (в радіанах), косинус якого дорівнює n
atan (n)
Кут (в радіанах), тангенс якого дорівнює n
Зверніть увагу: для того щоб в програмі були доступні наведені функції, в її текст треба включити
директиву #include <math.n>.
Величина кута тригонометричних функцій повинна бути виражена в радіанах. Для перетворення
величини кута з градусів в радіани використовується формула (а -3.1415256) / 180, де а- величина кута в
градусах; 3.1415926- число "пі". Замість константи 3.1415926 можна використовувати стандартну
іменовану константу M_PI. Константа M_PI визначена в файлі math.h.
приклад
Приклад 1: Визначити відстань на площині між двома точками із заданими координатами M1 (x1, y1) і
M2 (x2, y2)
Етапи виконання завдання:
1.
Математична модель: відстань на площині між двома точками M1 (x1, y1) і M2 (x2, y2)
вираховується за формулою
2.
Складемо схему алгоритму
вміст блоку з "Обчислення і друк відстані"
Подальша деталізація не потрібна. Переводимо блок-схему на мову C .
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main ()
loat d, x1, x2, y1, y2;
clrscr ();
scanf ( "% f% f% f% f", & x1, & x2, & y1, & y2);
d = sqrt ((pow ((x2-x1), 2) + pow ((y2-y1), 2))));
printf ( "rastoyanie mejdu 2 tochkami =% f", d);
getch ();
return 0;
}
Контрольні питання:
1.
2.
3.
4.
5.
6.
Які призначення і можливості системи Borland C ?
Як запустити програму на трансляцію і виконання?
Як записуються оператори початку і кінця програми?
З яких розділів складається програма на мові C ?
В якій послідовності повинні бути записані розділи програми на мові C ?
Як записуються оператори виведення на екран в C ?
завдання:
1.
2.
3.
Дана довжина ребра куба. Знайти об'єм куба і площа його бічної поверхні.
Три опору R1, R2, R3 з'єднані паралельно. Знайти опір з'єднання.
Визначити час падіння каменя на поверхню землі з висоти h.
Відома довжина кола. Знайти площу круга, обмеженого цим колом.
Трикутник задано координатами своїх вершин. знайти:
периметр трикутника;
площа трикутника.
6.
Обчислити висоту трикутника, опущену на сторону а, за відомими значеннями довжин
його сторін a, b, c.
7.
Обчислити обсяг циліндра з радіусом основи і висотою.
8.
Визначити відстань, пройдену фізичним тілом за час t, якщо тіло рухається з
постійним прискоренням а й має в початковий момент часу швидкість V0
9.
Обчислити площу трикутника за формулою Герона, якщо задані його боку.
10.
Визначити координати вершини параболи y = ax2 + bx + c (a№0). Коефіцієнти a, b, c
задані.
11.
За даними сторонам прямокутника обчислити його периметр, площа і довжину
діагоналі.
4.
5.
* Додаткові запитання:
1.
Студент почав вирішувати завдання даного уроку програмування, коли електронний
годинник показували h1 годин і min1 хвилин, а закінчив, коли було h2 годин і min2 хвилин.
Складіть програму, що дозволяє визначити, скільки часу студент вирішував ці завдання. (Будемо
вважати, що завдання вирішувалися не довше доби.)
2.
Дано дійсне число а. Чи не користуючись ніякими іншими операціями, крім множення,
отримати: а) а4 за дві операції; б) А6 за три операції; в) А7 за чотири операції; г) А8 за три
операції; д) а9 за чотири операції; е) А10 за чотири операції; ж) а13 за п'ять операцій; з) А15 за
п'ять операцій; і) а21 за шість операцій; к) А28 за шість операцій; л) А64 за шість операцій;
3.
Знайти максимум і мінімум двох натуральних чисел не використовуючи розгалуження
алгоритму.
Download