ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 22.12.2021
Просмотров: 268
Скачиваний: 3
Лекція №2
Вибір варіантів, прийняття рішень, "істина" і "хибність" в мові Сі. Порівняння. Логіка в мові Сі.
Ми повинні зрозуміти роботу і використання таких ключових слів:
goto, continue, if, else, switch, break, case, default; використання операцій : >> = <<= = = != && / : ?.
Оператор if називається ще оператором розгалуження і дія його подібна до аналогічного оператора в мові Паскаль.
Якщо значення виразу ненульове або true (істина) тоді виконується наступний оператор, якщо воно дорівнює нулю або false(хибне), то наступний оператор не виконується.
Наприклад if (і)
++ і;
Дужки навкруги виразу і є обов’язковими. Вираз в дужках може бути зовсім довільним, але з однією умовою: він повинен повертати скалярну величину, яку можна порівняти з нулем. Попередній приклад можливо переписати в вигляді
if (і !=0)
++ і;
Коли величина може дорівнювати нулю? Для типів bool(false), short(0), int(0l), float(0.0) і double(0.0) відповідь очевидна. А якщо це символ або покажчик? Нульовим значенням типу char є \0. Покажчики дорівнюють нулю в тому випадку, якщо вони мають значення Null або 0.
Крім того оператор if має ще дві форми використання:
іf (вираз) оператор 1;
еlse оператор 2;
Якщо вираз істинний, то виконується оператор 1, якщо ні, то виконується оператор 2. Оператор 1, оператор 2 – це простий або скалярний оператор. Перед ключовим словам еlse крапка з комою – ставиться, якщо оператор 1-простий оператор, і – не ставиться, якщо оператор 1 – складений оператор.
Приклади умовних операторів повної форми
if (х < 0) y = 1; // повна форма
еlse y = 2; // і прості оператори
if (a > b) { x = 0; y = 1} // повна форма
еlse {x = 1; y = 0} // і складені оператори.
Форма 3.
if (вираз 1 ) оператор 1
еlse if (вираз 2 ) оператор 2 еlse оператор 3
Якщо вираз 1 істинний, то виконується оператор 1, якщо вираз 1 – хибний, але вираз 2 – істинний, то виконується оператор 2. Якщо обидва вирази хибні, то виконується оператор 3.
Приклад:
if(legs = = 4)
printf (“Це може бути кінь \n ”);
else if (legs > 4)
printf (“Це не кінь \n ”);
else /* в випадку, якщо ніг < 4 */
{
legs ++;
printf (“тепер у нього стало на одну ногу більше. \n”)
}
Якщо вкладений оператор if повинен бути в скороченій формі, можна використовувати фігурні дужки, щоб не використовувати пустий оператор після ключового слова else.
Наприклад:
-
можна використовувати оператор if з пустим else:
if (n > 0)
if (a > b) z = a; // повна форма if
else; // + пустий оператор після else;
else z = b;
-
але краще в цьому випадку використовувати фігурні дужки:
if (n > 0)
{if (a > b) z = a;} // -скорочена форма if
else z = b;
Умовний вираз
Умовний вираз або тернарна операція ?: призначена для вибору одного з двух виразів для обчислення значень змінної в лівій частині оператора присвоєння.
Форма умовного виразу така:
a = (b ) ? B1 : B2;
де a – ім’я змінної лівої частини оператора присвоєння;
b – умова прийняття рішень, вираз любого типу;
B1, B2 – вирази, за допомогою яких вираховується значення а (дужки не обов’язкові ).
Виконання оператора з умовним виразом відбувається таким чином: спочатку вираховується значення b. Потім аналізується результат його обчислення:
-
Якщо B! = 0, тобто умова істина. То обчислення змінної а відбувається за допомогою виразу b1;
-
Якщо B = 0, тобто хибне, то – за допомогою виразів b2.
Якщо типи змінної лівої частини оператора присвоєння і результатів віразів b1 і B2 різні, то тип результат n обчислення виразу перетворюється в тип змінної а.
Наприклад: Дано а. Якщо a > 0, то х = 1.5, а якщо а <= 0, то х =2.3
Рішення можна записати в вигляді умовного оператора:
if (a > 0 ) x = 1.5;
y = 2.3;
Або за допомогою умовного виразу:
x = (a > 0 ) ? 1.5 : 2.3;
Приклад вибору за допомогою умовного виразу більшого з двох значень a і b;
x = (a > b ) ? a : b;
або x = a > b ? a : b;
Switch – оператор вибору варіанта.
Оператор switch використовується, якщо треба вибрати одну із деяких альтернатив процесу обробки даних, тобто одно із N можливих комбінацій в залежності від значення ключа (перемикача).
Switch є мов би узагальненням оператора if (вибір одного із 2-х варіантів) на N варіантів. Оператор switch має скорочену (без default) або повну форму (з default).
Switch (B)
{ case мітка _1: [оператори)] [break;]
...,,...,,.....,,....,,…,,…..
case мітка_n : [оператори)] [break;]
[default : оператори;]
}
де B – вираз любого типа, результатом якого може бути значення цілого або символьного типу; воно визначає одну з міток, які стоять після слова case;
мітка_1 мітка_n – константний вираз, в тому числі ціла або символьна константа;
S1 SN – нуль і більше операторів, які виконуються при виборі відповідної мітки.
Break – переривання, не обов’язковий оператор завершення виконання оператора switch;
default – ключове слово, після якого стоять оператори, які виконуються, якщо результат виразу В не стоїть з жодною міткою після ключового слова case; використовується тільки в повній формі оператор switch.
Константний вираз – це вираз, який вираховується під час компіляції; він складається з раніше визначених констант і змінних, з’єднаних операціями.
Правила виконання оператора switch подібні правилам виконання оператора case в Паскалі.
1) вираховується значення виразу В (ключ).
2) це значення послідовно порівнюється з кожним значенням мітки, яка стоїть після ключового слова case;
3)якщо знаходиться значення мітки, яке співпадає з ключем, то можливі два варіанта дій в залежності від наявності оператора break;
а) якщо після оператора або групи операторів даного case стоїть оператор break, то після нього виконання оператора завершується.
б) якщо після оператора або групи операторів даного case стоїть оператор break, то після цього виконання оператора switch завершується.
4) в випадку, якщо значення ключа не співпадало з жодною міткою case , то можливий один з двох варіантів виконання в залежності від наявності або відсутності default;
а) якщо default є, то виконується оператори, які стоять після нього;
б) якщо default нема, то не виконується жоден оператор switch;
5) всі мітки варіантів одного оператора switch повинні бути різні;
6) на мітку варіантів оператора switch не рекомендується переходити за допомогою оператора goto, хоча це і допустимо.
Приклад програми з використанням оператора switch. При введенні одного із символів, ‘y’ або ‘Y’ програма виведе на екран слово “Так”, а при введенні символів ‘n’ або ‘N’ – слово “Ні”.
#include <stdio.h>
#include <conio.h>
void main()
{
char c;
clrscr (); // очистити екран
puts(“введіть символ ’Y’, ’y’ або ‘n’, ‘N’ \ ”); //введення симв. з клавіатури
с = getchar();
switch (c)
{ case ‘Y’:
case ‘y’: puts (“ Так”); break;
case ‘N’:
case ‘n’: puts (“Ні”); break;
default : printf(“Ви помилились! \n” );
}
printf(“\n Для завершення програми натисніть любу клавішу\n”);
getch ();
}
Приклад програми введення номера запитання і вибору необхідного виду посилання за допомогою оператора switch:
#include <stdio.h>
#include <conio.h>
void main()
{ int i; clrscr ();
puts (“введіть номер запитання від 1 до 4: \ ”);
scanf(“%d”, &i);
switch (i)
{ case 1: puts(“Створення файла \n”); break;
case 2: puts (“ Пошук в файлі \n”); break;
case 3: puts (“ Модифікація файлу \n”); break;
case 4: puts (“Читання файлу \n”); break;
default : printf (“Ви помилились! \n\n” );
}
printf(“ Для завершення програми натисніть любу клавішу\n”);
getch ();
}
Приклад підпрограми-функції, яка
vowel(ch)
char ch;
{
switch (ch)
{
default: return (0);
case ‘u’: case ‘U’: return (5);
case ‘a’: case ‘A’: return (1);
case ‘e’: case ‘E’: return (5);
case ‘i’: case ‘I’ : return (3);
case ‘o’: case ‘O’: return (4);
}
}
визначає, чи є символ голосною буквою. Якщо є, то повертається ціле від 1 до 5, якщо ні, то повертається 0.
0ператор default може стояти в будь якому місті. Замість break використовується оператор return – повернення. Він приводе до виходу і із оператора і із функції.
Цикли. Вкладені цикли. Переходи в програмі.
Ключові слова: while, do, for, break, continue, goto, return.
Цикл – це участок програми, який повторюється декілька разів.
Цикли використовуються тоді, якщо деякі дії треба виконати багато разів, кожний раз з новими даними. Кількість повторень визначається в залежності від типу оператора заголовку цикла. Початок виконання циклу може виконуватись тільки через оператори заголовку цикла. Завершення циклу любого типу може бути:
-в відповідності з умовами, визначенними заголовком цикла;
-по оператору goto – перехід на оператор зовні тіла цикла;
-по оператору break – вихід із цикла або
-по оператору return – вихід із функції.
В мові Сі є оператори циклу for, while, і do-while.
Якщо кількість повторів попередньо відома, то доцільно використовувати оператор for, а якщо кількість повторів визначається умовами, то оператори while або do-while.
Форма оператора цикла for:
For (сп. 1; сп 2; сп. 3) //заголовок цикла
S; //тіло цикла
Сп. 1 – список операторів, ініціюючих початкове значення, виконуються 1 раз до початку виконання тіла циклу, як правило для установки початкових значень параметрів циклу;
Сп. 2 – список операторів і виразів для перевірки кінця циклу; кінець циклу звичайно визначається на основі аналізу значення параметрів циклу, виконується перед кожним використанням циклу; якщо значення останнього виразу сп. 2 істинно (!= 0), тіло виконується, а якщо хибне (= 0) – завершується.
Сп. 3 – список операторів і(або ) для корегування параметрів циклу; виконується після кожного виконання тіла циклу.
S – простий або складений оператор тіла циклу. Всі 3 списка в тілі циклу необов’язкові.
Основні правила використання циклу for
-
Сп 1 виконується 1 раз до початку виконання тіла циклу;
-
Сп 2 див. раніше;
-
Після виконання тіла циклу виконується сп 3 й перехід на п. 2;
-
Поява в любому місці тіла цикла оператора continue дає перехід до використання сп 3, тобто до п. 3. правил;
-
Поява оператора break викликає перехід до оператора, який йде після оператора циклу. Після виходу із цикла по оператору break або goto параметр цикла зберігає значення, при якому завершається цикл.
-
Після нормального завершення циклу (не по goto) значення параметра циклу дорівнює значенню, яке привело до завершення виконання циклу. Наприклад, якщо межа змінних значень параметрів циклу визначена в вигляді:
for (і =1; і <5; і++) ,
то для значень і від 1 до 4 виконуються оператори тіла циклу, а при значенні і = 5 виконання циклу завершується.
-
Якщо нема сп. 1 або сп. 2, їх крапка з комою(;) повинна залишитись в операторі заголовку циклу; наприклад
for (; ; ) for (і =1; ; і++),
– це безкінечні цикли, з яких треба вийти за допомогою операторів, break, return, goto на мітку зовні циклу.
Приклад оператора циклу типовий
for (і =1; і<20; і++)
і – параметр змінюється від 0 до 19 з кроком 1, тіло цикла виконується 20 разів.
За допомогою скороченої форми оператора for можливо реалізувати в програмі тимчасову затримку процеса виконання програми. Наприклад для обмеження часу чекання відповіді користувача
Приклад циклу з пустим оператором S:
For (n=1; n<=10000; n++);
Цей цикл рахує значення від 1 до 10000, нічого більше не роблячи. Символ ; після заголовку цикла – це пустий оператор.
Будь – який список заголовка може містити операцію кома, тобто декілька операторів і виразів, розділених комами, які виконуються зліва направо. Таким чином, оператор циклу for може мати якби декілька параметрів циклу, які змінюються синхронно (одночасно). Частіше за всі списки Сп 1 і Сп 3 – оператори присвоєння або звернення до функцій, а Сп 2 – містить вирази відношення або логічні вирази. Якщо нема сп. 1 і сп. 3, то параметр циклу мов би не розглядається.
Якщо нема сп.2 (для нього залишиться ;), то вважається, що умова перевірки кінця циклу істинна, при цьому цикл не може бути завершений по умові циклу в заголовку цикла (безкінечний цикл ), а може бути завершений тільки по оператору goto (перехід на оператор зовні тіла циклу ), за допомогою операторів break або return.
Приклад 1: Визначити сумму парних чисел від 1000 000 до 0
for (s=0.0, i=1000 000; i>=2; i- =2 ) s+=i;
Ініціюються початкові значення, після кожного разу крок параметра циклу зменшується на 2. По завершенні і=0.
Приклад 2: Вивести значення х=2і від і=1 до n по 5 значень в рядку.
#include <stdio.h>
#include <conio.h>
void main()
{ int і, n;
long x;
clrscr ();
printf(“введіть число –макс. степінь дв.\n”);
scanf(“%d ” ,&n );
printf(“\n n=%d\n” ,n);
for(x=i=1; i<=n; i++)
{
x=2; printf (“ %5d”, x);
if (i%5 = = 0) printf(“\n”);
}
printf(“\nНатисніть будь яку клавішу \n”);
getch();
}
В приведених вище прикладах оператор for мови Сі подібний іншим операторам циклів.
Але, крім того, for мови Сі має ряд інших можливостей. Розглянемо деякі з них:
-
Для зміни значень параметра циклу (кроку) можливо використовувати любі значення і операції; приклади заголовків циклу, де корегування параметру циклу відбувається по формулі:
For (n=1000; n>0; n -- ) // n= n - 1
For (n=1000; n>0; n - = 13 ) // n= n - 13
For (x=0; x< = 200; x + = 1,5) // x= x + 1.5
For (x=1000; x>0; x - = 3.7 ) // x= x – 3.7
For (x = 1; n< = 2000; x = 1.2 ) // x= x 1.2
2. Можна використовувати і змінювати значення параметру циклу, які є символами; наприклад:
for (c = ‘a’; c< = ‘z’; c+ +) putch (c);
при виконанні цього циклу будуть виведені всі букви латинського алфавіту від а до z, для пред’явлення яких використовується відрізок натурального ряда чисел:
3. В сп. 1 можна використовувати оператор – кому, тобто декілька операторів присвоєння, які розділяються комами.
Наприклад, обчислити суму значень і для і = 1 ÷ 100
for (S = 0.0, i = 1; i< = 100; i++) S + = i;
4. В якості сп. 3 також можна використовувати один або декілька операторів і виразів для зміни змінних або параметрів циклу.
Наприклад:
For ( x = 1; y< = max; y = 5 x +10, x ++) {…..}
В заголовку циклу приклада встановлюється початкове значення х, а на закінчення циклу перевіряється значення у, а не х; в сп. 3 змінюються значення у і х.
5. Параметри, які входять в сп. 2 і сп. 3 можливо змінювати при виконанні операторів тіла циклу.
Наприклад:
For ( n = 1; n< 100; n+ = dn ) - заголовок цикла
Після декількох ітерацій можливо за допомогою if всередині тіла циклу проаналізувати необхідність зміни і змінити значення dn.
Наприклад, оператором
іf ( a > b && n > 10 ) dn = dn 2;
6. Сп. 1 необов’язково повинен ініціювати параметр цикла. На цьому місті може стояти оператор виведення, який виконується 1 раз до початку виконання циклу.
В програмі друкується речення “ Вгадайте число!” до початку циклу і програма переходе в режим чекання введення числа з клавіатури. Після введення воно перевіряється на співпадання з сп. 2. Процес повторюється до тих пір поки не буде введене задане значення (в прикладі -0). Після цього виведеться друге повідомлення: “Це те, що треба!”.