You are on page 1of 9

Лабораторна робота №2

Тема: Оператори циклів while, for і do-while.

Приклад 1. Напишіть програму виводу на екран користувача цілих додатніх чисел за


допомогою оператора while. Початкове та останнє число повинне задаватися
користувачем з клавіатури.

Програмний код рішення прикладу:


# Include <stdio.h>
# Include <conio.h>

int main (void)


{
int i, j = 0, n;
printf ("\n \t Enter the primary natural number:");
scanf_s ("%d", &i);
printf ("\t Enter the last natural number:");
scanf_s ("%d", &n);

printf ("\n \t The numbers are:");


while (i <= n) {
printf ("\n \t%3d", i);
++i;
++j;
}
printf ("\n \t Total numbers:%d \n", j);
printf ("\n Press any key:");
_getch ();
return 0;
}
Можливий результат виконання програми показаний на рис. 2.1.

Рис. 2.1. Результат виконання програми з введенням цілих чисел

У програмі використана функція scanf_s (), прийнята в MS Visual Studio. У програмі


застосовано інкрементування змінних, прийняте в мові С, а саме ++i або ++j означає, що
змінні збільшуються на одиницю. При цьому знаки "++" можуть розташовуватися перед
ім'ям змінної чи після. Відмінність в тому, що ++ i - це значення змінної після збільшення, а
i++ - спочатку змінна має задане значення, а потім відбувається її збільшення. Для
змінних циклу обидві форми рівнозначні.
Умовою циклу є те, що поки змінна i менше або дорівнює змінної n
(передбачається, що n більше початкового значення i), то будуть виконуватися дії (друк і
збільшення змінної j), закладені в тілі циклу. Розрахунок виразу, вкладеного в круглі дужки
оператора, призначений для перевірки нерівності змінної i по відношенню до змінної n.
Якщо це нерівність виконується, то в тілі циклу відбуваються друк та збільшення
(інкрементування) змінних i, j.

Завдання 1
1 Передбачте введення тільки від'ємних чисел.
2 Передбачте введення тільки невід'ємних чисел.
3 Передбачте вивід чисел і їх порядкові номери (тобто в два стовпці).
4 Передбачте вивід чисел на консоль у вигляді рядка.
5 Передбачте введення і виведення тільки дійсних чисел.
6 Розглянути варіанти форм інкрементування. Виконайте вивід на консоль.

Приклад 2. Напишіть програму посимвольного введення пропозиції "Hello, world" і


підрахувати число символів в ньому (включаючи кому і пропуск).

# Include <stdio.h>
# Include <conio.h>
int main (void)
{
int c, i = 0;

printf ("\n Enter symbol-by-symbol the offer \"Hello, world\", \n press twice Ctrl + Z and press
Enter: \n");
printf ("\t");

while ((c = getchar ())!= EOF)


{
printf ("\t");
c = getchar ();
++i;
}
printf ("\n\t The number of characters:%d \n", i);

printf ("\n Press any key:");


_getch ();
return 0;
}
У програмі введення символьних даних повинен завершитися комбінацією клавіш Ctrl + Z,
що буде відповідати закінченню вводу (файлу), тобто EOF. Оператор циклу while буде
виконуватися до тих пір, поки не зустрінеться так званий кінець файлу EOF. В пропозиції \
"Hello, world \" два зворотних слеша включені для виведення на консоль подвійних лапок.

Функції printf ("\t") здійснюють табуляцію символів, що вводяться. Підрахунок числа


символів, що вводять виконується за допомогою змінної циклу (лічильника) i, яка
інкрементується в тілі циклу.

Заголовний файл #include <conio.h> служить для підтримки консольного вводу-виводу для
функції _getch (). Без нього при компіляції програми можуть виводитися попередження,
хоча програма з попередженнями працює.

Результат виконання програми показаний на рис. 2.2.


Рис. 2.2. Виконання програми посимвольного введення даних

Завдання 2

1 У програму введіть коментарі за допомогою символів // і / * ... * /.


2 В якості символів, що вводять використовуйте букви свого прізвища (буквами
латинського алфавіту). У звіт вставте отриманий результат.
3 В якості символів, що вводять використовувати своє прізвище та ім'я. У звіт вставте
отриманий результат.
4 Зробіть вивід свого прізвища та імені по головній діагоналі дисплея.
5 В якості символів введіть числа від 1 до (2 + Х), де Х - номер комп'ютера, за яким
виконується лабораторна робота. У звіт вставте отриманий результат.
Виконайте дублювання символів за допомогою функції putchar (), яка відображає символи
на екрані користувача.
Примітка. Прототип функції putchar () має наступний вигляд:
# include <stdio.h>
int putchar (int ch);

Приклад 3. Напишіть програму табличного виведення малих літер латинського алфавіту і


їх десяткових кодів за допомогою оператора циклу for.
Як відомо, в латинському алфавіті 26 букв. Тому можна створити масив символів
цих букв. З урахуванням того, що тип char являє собою цілочисельний тип, то можна
обійтися без створення масиву.
Програмний код рішення прикладу:
# include <stdio.h>
# include <conio.h>
int main (void) {
int j = 1;
char a = 'a';
printf ("\ n Table code characters: \ n");
for (; a <= 'z'; ++a)
printf ("\n%4d)%2c: code%4d", j++, a, a);
printf ("\ n \ n Press any key:");
_getch ();
return 0;
}
Результат виконання програми показаний на рис. 2.3.
Рис. 2.3. Таблиця десяткових кодів літер латинського алфавіту

Форматований вивід даних передбачає вирівнювання по правому краю, для чого


передбачаються числові специфікатори типу% 4d і% 2c для цілих чисел і символів у
функції printf ().

Завдання 3
1 Застосуйте префіксних форму інкрементування змінної j.
2 Інкрементування змінної j створіть окремо в тілі циклу.
3 Ініціалізацію змінної j почніть з нуля. Результат виконання програми повинен бути той
самий, що і в наведеній програмі.
4 Напишіть програму для виведення кодів літер із заданого діапазону на розсуд
користувача, наприклад, від 'j' до 'w'.
5 У циклі for заповніть всі поля.
6 Напишіть програму для виведення кодів літер латинського алфавіту великих і малих
літер в одній таблиці.
7 Виведіть букви свого прізвища та коди цих букв.

Напишіть програму розрахунку значень функції розподілу потоку Ерланга 4-го


порядку з параметром = 2.3 на відрізку часу від 0 до 5 (умовних одиниць) з кроком 0.2:

Програмний код рішення прикладу:


# include <stdio.h>
# include <conio.h>
# include <math.h>
int main (void)
{
int j, f, k = 4;
double F, Lt, s, t = 0.0, Tend = 5.0;
float L = 2.3F;

printf ("\ n Erlang function of order% d, Lambda =%1.2f: \n \n", k, L);


for (; t <= Tend; t+= 0.2)
{
s = 0.0; f = 1; Lt = 1.0;
for (j = 1; j <= k; ++j)
{
f * = j;
Lt * = (L * t);
s += (Lt / f) * exp (-L * t);
}
F = 1 - exp (-L * t) - s;
printf ("\ t% lg \ n", F);
}
printf ("\ n \ n Press any key:");
_getch ();
return 0;
}
У програмі використані вкладені цикли for. Застосовані специфічні умови зміни змінних
(характерних для мови С):
t + = 0.2; /* t = t + 0.2; */
f * = j; /* f = f * j; */
Lt * = (L * t) /* Lt = Lt * (L * t); */
Обчислення факторіала виконано за допомогою добутку і виділення окремого доданка
суми, коли розраховується 0!

У програмі також передбачено накопичення суми для кожного кроку часу t. Для розрахунку
експоненти в заголовок програми включена бібліотека математичних функцій # include
<math.h>.
Результат виконання програми показаний на рис. 2.4.

Рис. 2.4. Розрахунок функції розподілу Ерланга 4-го порядку

Завдання 4

1 У заголовку зовнішнього циклу for додайте перше поле і усуньте третє поле.
2 Передбачте виведення кількості значень розрахованої функції Ерланга.
3 Передбачте введення параметрів програми, а саме: порядок потоку Ерланга k,
параметр, кінцеву величину часового інтервалу, крок за часом.

Приклад 5. Обчисліть з точністю до "машинного нуля" значення суми числового ряду:

Програмний код рішення прикладу:

# Include <stdio.h>
# Include <conio.h>
int main (void)
{
double denom;
double sum1 = 0.0, sum2 = 0.0;
int k = 1;
denom = k * (k + 1) * (k + 2); // знаменник ряду

do {
sum1 = sum2;
sum2 + = 1.0 / denom;
denom = denom / k * (k + 3);
++ k;
} While (sum1 <sum2);

printf ("\ n \ t The amount of numerical series:% lg \ n", sum2);

printf ("\ n Press any key:");


_getch ();
return 0;
}
У наведеній програмі сума обчислюється як значення змінної sum2. Її попереднє значення
зберігається у змінній sum1. Так як наближене значення з додаванням невід'ємних
доданків не зменшується, умовою продовження циклу служить відношення sum1 <sum2
(оскільки зростає знаменник denom). Коли при додаванні чергового доданка значення
суми залишається незмінним (за рахунок кінцевої розрядної сітки для подання дійсних
чисел), порушується умова sum1 <sum2 і цикл припиняється. Таким чином, кінцівку
розрядної сітки подання дійсних чисел у комп'ютері визначає собою "машинний нуль".
Ініціалізація знаменника зроблена до початку циклу. Форматний вивід результату
виконаний за допомогою специфікатора символу "l".
Результат виконання програми показаний на рис. 2.5.

Рис. 2.5. Результат підрахунку суми нескінченного ряду

Завдання 5

1 Підрахуйте число ітерацій циклу для підрахунку суми ряду.


2 Напишіть програму з нульовою ініціалізацією змінної k.
3 У програмі застосуйте тип float замість типу double. Проаналізуйте результат.
4 Замість оператора циклу do-while застосуйте інший оператор циклу.
Приклад 6. Проведіть реверс цифр заданого цілого числа, що вводиться з
клавіатури користувачем.
Завдання полягає в тому, щоб, наприклад, число 123 переписати як 321.
Програмний код рішення прикладу:

# include <stdio.h>
# include <conio.h>

int main (void)


{
long int x, r;

printf ("\ n Enter an integer:");


scanf_s ("%ld", &x);

printf ("\n Reverse-digit number% ld: \n \n \t", x);

do {
r = x%10;
printf ("%ld", r);
x = x/10;
} while (x! = 0);

printf ("\n \n Press any key:");


_getch ();
return 0;
}
У програмі застосована операція арифметична операція ділення по модулю, яка має
символ відсотка, тобто "%". Залишок в результаті ділення цілих чисел, буде відкинутий. У
шкалі старшинства оператор ділення за модулем має пріоритет, рівний пріоритету
операторів множення і ділення. Змінні, що використовуються в програмі, оголошені як
довгі числа, тому застосований тип long int (або long).
Результат виконання програми показаний на рис. 2.6.

Рис. 2.6. Результат програми по реверсу числа

Завдання 6
1 Передбачте підрахунок ітерацій заданого циклу.
2 Напишіть програму по реверсу числа з оператором циклу while. Протестуйте обидві
програми, в тому числі по вводу числа 0.

Приклад 7. На основі тільки оператора циклу for напишіть програму з виведення


"гірки" заголовних букв, симетрично убуваючих до букви, введеної користувачем. Також на
основі оператора циклу for передбачте захист від неправильного вводу.
Програмний код рішення прикладу:
# include <stdio.h>
# include <conio.h>

int main (void) {


int p = 0;
char ch = 'A';
char i, j, k, ch2, kk, chA;
chA = ch;
printf ("\n Enter a capital letter between \" A \ "and \" S \ ":");
scanf_s ("%c", &ch2, sizeof (char));

for (chA - = 1; chA> = ch2; chA --)


{
printf ("\n Error! Press any key:");
_getch ();
return -1;
}
for (kk = 'S' +1; kk <= ch2; kk + +)
{
printf ("\n Error! Press any key:");
_getch ();
return -1;
}
k = ch2;
for (kk = ch; kk <= k; kk ++)
{
printf ("\n ");
for (ch2 = ch; ch2 <= k-p; ch2++)
printf (" ");
for (j = ch; j <= kk; j ++)
printf ("%c", j);
for (i = kk; i> ch; i --)
printf ("%c", i-1);
p++;
}
printf ("\ n \ n Press any key:");
_getch ();
return 0;
}
Приклад виконання програми показаний на рис. 2.7.

Рис. 2.7. Приклад гірки букв

Завдання 7
1 Напишіть програму на основі тільки оператора циклу for з виведення перевернутої гірки
букв, а також "лівої" і "правої" гірки.
2 Напишіть програму на основі тільки оператора циклу for щодо виведення "ромба" букв,
щодо введеної літери.
3 Напишіть програму з виведення гірки букв тільки на основі оператора циклу while.

Контрольні питання
1 Як організуються складені оператори циклів у мові С?
2 Як організуються вкладені цикли в мові С?
3 У яких випадках може статися зациклення при використанні оператора циклу з
передумовою?
4 У яких випадках може статися зациклення при використанні оператора циклу з
післяумовою?
5 Скільки умов потрібно для роботи оператора циклу з параметром?
6 Чим відрізняються префіксне і постфіксне інкрементування і декрементування?
7 Яке відмінність в операторах циклу між префіксним і постфіксним
інкрементуванням?
8 Скільки операторів відношень в мові С? Перерахуйте їх.
9 Як реалізується взаємозамінність операторів циклу while і for?
10 У чому подібність і відмінність між циклами з передумовою і з післяумовою?

You might also like