Херсонський національний технічний університет
Лабораторна робота № 1, 2
з дисципліни
«Програмування»
Виконала
студентка групи 1зКСС
Малахова Т.М.
Перевірив
Дроздова О.О.
Херсон 2005
Лабораторна робота № 1
Керуючі структури мови «Сі»
Мета роботи: Вивчення прийомів використання операторів розгалуження і операторів циклів у С.
Теоретичні відомості:
Керуючі структури або оператори управління служать для управління послідовністю обчислень в програмі. Оператори розгалуження та цикли дозволяють переходити до виконання іншої частини програми або виконувати якусь частину програми багато разів, поки задовольняється одне або більше умов.
Блоки і складові оператори.
Будь-яка послідовність операторів, укладена у фігурні дужки, є складеним оператором (блоком). Складовою оператор не повинен закінчуватися (;), оскільки обмежувачем блоку служить сама закривається дужка. Усередині блоку кожен оператор повинен обмежуватися (;).
Складовою оператор може використовуватися скрізь, де синтаксис мови допускає застосування звичайного оператора.
Порожній оператор.
Порожній оператор представляється символом (;), перед яким немає вираження. Порожній оператор використовують там, де синтаксис мови вимагає присутності в даному місці програми оператора, проте за логікою програми оператор повинен бути відсутній.
Необхідність у використанні порожнього оператора часто виникає, коли дії, які можуть бути виконані в тілі циклу, цілком вкладаються у заголовку циклу.
Оператори розгалуження.
До операторів розгалуження відносяться if, if e l se,?, Switch і goto. Загальний вигляд операторів розгалуження наступний:
if (логічне вираження)
оператор;
if (логічне вираження)
оператор_1;
else
оператор_2;
<Логічний вираз>? <Вираженіе_1>: <вираженіе_2>;
Якщо значення логічного виразу істинне, то обчислюється вираженіе_1, у противному випадку обчислюється вираженіе_2.
switch (вираз цілого типу)
{
case значення_1:
последовательность_операторов_1;
break;
case значення_2:
последовательность_операторов_2;
break;
. . .
case значеніе_ n:
последовательность_операторов_n;
break;
default:
последовательность_операторов_n +1;
}
Гілку default можна не описувати. Вона виконується, якщо жодна з вищестоящих виразів не задоволено.
Оператор циклу.
У Турбо Сі є такі конструкції, що дозволяють програмувати цикли: while, do while і for. Їх структуру можна описати таким чином:
Цикл з перевіркою умови нагорі:
while (логічне вираження)
оператор;
Цикл з перевіркою умови внизу:
do
оператор;
while (логічне вираження);
Універсальний оператор циклу:
for (ініціалізація; перевірка; новое_значеніе)
оператор;
Завдання:
Скласти та отримати роздруківку програми вибору всіх парних чисел від 1 до 1000.
Скласти та отримати роздруківку програми вибору всіх чисел, що закінчуються на цифру 5, від 1 до 1000.
Написати програму з використанням циклу do-while, яка очікує натискання клавіші '' 'і по натисканні її завершує роботу.
Програма 1: роздруковує всі парні числа від 1 до 1000:
# Include <stdio.h>
int vit;
int main (void)
{
vit = 2;
while (vit <= 1000)
{
vit = vit +2;
printf ("% d \ n", vit);
}
system ("PAUSE");
return 0;
}
Програма 2: роздруковує всі числа від 1 до 1000, які закінчуються на цифру 5:
# Include <iostream.h>
# Include <stdlib.h>
int den;
int main ()
{
den = 5;
while (den <= 1000)
{
den = den +10;
printf ("% d \ n", den);
}
system ("PAUSE");
return 0;
}
Програма 3: Програма очікує натискання клавіші «'» і за її натисненні завершує роботу:
# Include <iostream.h>
# Include <conio.h>
# Include <stdio.h>
/ / # Include <bios.h>
int getkey; (void);
{
int key, lo, hi;
key = bioskey (0);
lo = key & 0X00FF;
hi = (key & 0X0FF00)>> 8;
return ((lo == 0)? hi +256: lo);
}
main ()
{
clrscr ();
int input;
do
{
input = getkey ();
printf ("Program is running \ n");
}
while (input! =']');
}
Лабораторна робота N2
Програмування з використанням покажчиків
Мета роботи: O ознайомитися з поняттям покажчика, навчитися використовувати їх при програмуванні на С.
Теоретичні відомості
Покажчик - це змінна, яка містить в пам'яті адресу даних. Змінна-вказівник містить місце розташування значення. Тобто, зміна-вказівник вказує на значення, так як вона містить його адресу.
Покажчики надають ефективні засоби доступу і зміни даних. Так як покажчики містять адреси даних, то при пошуку значень у пам'яті в комп'ютера скорочується обсяг роботи. Покажчики не прив'язують дані до якогось певного імені змінної. Вони можуть містити адресу будь-якого не іменованого значення.
Суть змінних-вказівників.
Так як покажчики є звичайними змінними, для них дійсні всі правила іменування звичайних змінних. Як і у випадку зі звичайною змінною, потрібно спочатку оголосити покажчик і тільки потім його використовувати. У Сі покажчики можуть бути на всі існуючі в мові типи даних; можна створити покажчик на ціле, символьне дане, і так далі. У залежності від того, в якому місці програми оголошений покажчик, він може бути локальним або глобальним (як і для звичайних змінних, використовувати глобальні без потреби не рекомендується).
Єдина різниця між звичайними змінними і покажчиками полягає в їх вмісті. Покажчики містять не саме значення, а його адресу.
У Сі має два оператори, що відносяться до покажчиків:
& - Оператор "адреса значення"
* - Оператор "значення за адресою"
Оголошення покажчиків.
Якщо потрібно оголосити змінну для зберігання, наприклад, віку то можна зробити це таким чином:
int age = 20;
Таке оголошення змінної age увазі декілька моментів. По-перше, повідомляється Сі, що потрібна змінна з ім'ям age, і Сі резервує для цієї змінної місце в пам'яті. По-друге, Сі дізнається, що age буде використовуватися для зберігання тільки цілих чисел. По-третє, при оголошенні ця змінна ініціалізується значенням 20.
Нехай потрібно оголосити змінну-вказівник, яка не містить вік, а вказує на age, змінну, де знаходяться потрібні дані. Для оголошення покажчика на змінну age потрібно зробити наступне:
int * p _ age;
У цьому рядку резервується місце для змінної з ім'ям p_age. Однак це не звичайна цілочисельна змінна. Так як перед нею стоїть *, Сі визначить, що це зміна-вказівник.
Присвоєння значень вказівниками.
Покажчик може містити адреси значень тільки відповідного йому типу. Наприклад, p_age може вказувати тільки на цілочисельні змінні. Сі не ініціалізує покажчики при їх оголошенні. Якщо age оголошена як показано вище, і потрібно, щоб p_age містила адресу age, потрібно присвоїти його змінної p_age:
p _ age = & age;
Замість занесення адреси змінної age в змінну p_age за допомогою оператора присвоєння можна одночасно оголошувати і ініціалізувати покажчики.
int age = 20;
int * p_age = &age;
Можна привласнювати різні значення змінної age наступним оператором:
age = 35;
Або можна зробити те ж саме іншим шляхом:
* P_age = 35;
Цей рядок має на увазі "взяти елемент пам'яті, на яку вказує p_age і занести туди значення 35".
Оголошення масивів покажчиків.
Якщо потрібно зарезервувати велика кількість покажчиків для різних даних, можна оголосити масив покажчиків, причому кожен його елемент буде бути типу одного й того ж зазначеного типу. Наступний приклад резервує масив з 10 покажчиків на змінну цілого типу:
int * iptr [10];
Можна присвоїти адресу будь-якого елементу з iptr таким же чином, як і будь-якому іншому вказівником, що не входить в масив:
iptr [4] = &age;
У наступному рядку резервується масив з 20 покажчиків на змінні символьного типу:
char * cpoint [20];
Завдання:
Скласти програму для визначення максимального елемента одновимірного масиву. Масив спочатку заповнюється нулями, потім дані вводяться з клавіатури. Замінити нулем всі елементи, рівні максимальному. Масив задати за допомогою покажчика. Зарезервувати пам'ять під масив за допомогою функцій динамічного розподілу пам'яті.
Програма: визначає максимальний елемент одновимірного масиву:
# Include <stdio.h>
# Include <conio.h>
# Include <alloc.h>
int * arr;
void zero ();
void in ();
int max ();
void out ();
void main ()
{
arr = (int *) malloc (10);
clrscr ();
zero ();
out ();
getch ();
in ();
int maxEl = max ();
int i;
for (i = 0; i <10; i + +)
if (* (arr + i) == maxEl) * (arr + i) = 0;
else;
clrscr ();
out ();
getch ();
}
void zero ()
{
int i;
for (i = 0; i <10; i + +)
* (Arr + i) = 0;
}
void in ()
{
printf ("\ nEnter elements of array:");
printf ("\ n");
int i;
for (i = 0; i <10; i + +)
scanf ("\ n% i", arr + i);
}
int max ()
{
int mx =* arr;
int i = 1;
for (i; i <10; i + +)
if (mx <* (arr + i)) mx =* (arr + i);
else;
return mx;
}
void out ()
{
int i;
for (i = 0; i <10; i + +)
{
printf ("% i", * (arr + i));
printf ("");
}
system ("PAUSE");
return 0;
}
Результат роботи програми: Масив спочатку заповнюється нулями, потім дані вводяться з клавіатури. Замінюються нулем всі елементи, рівні максимальному. Масив задається за допомогою покажчика. Пам'ять під масив зарезервована за допомогою функцій динамічного розподілу пам'яті.