Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 21-24.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
181.25 Кб
Скачать

Функція getche()

Далі приведений приклад демонструє використання розгалуження if...else всередині циклу while. Крім того, в ньому використовується бібліотечна функція getche(). Програма підраховує кількість слів і символів в рядку, який вводиться користувачем з клавіатури.

#include <iostream>

using namespace std;

#include <conio.h> //для getche()

int main()

{

int chcount=0; //число непробільних символів

int wdcount=1; //число пробілів

char ch=’a’; //ch повинна мати певне значення

cout<<”Vvedit rjadok: “;

while(ch!=’\r’) //цикл поки не буде натиснута клавіша Enter

{ch=getche();

if(ch==’ ‘) //якщо символ є пробілом

wdcount++;

else

chcount++;

}

cout<<”\nSliv “<<wdcount<<endl<<”Bukw “<<(chcount-1)<<endl;

return 0;

}

Досі ми використовували для вводу тільки об’єкт cin і операцію >>. Такий спосіб вводити значення передбачає, що після вводу значення користувач натискає клавішу Enter. Це правильно і по відношенню до окремих символів: користувач спочатку вводить символ, а потім натискає Enter. В даному випадку програмі потрібно обробляти символ відразу після його появи, не чекаючи на натиск Enter. Таку можливість забезпечує бібліотечна функція getche(). Ця функція не має аргументів, а її опис міститься в заголовочному файлі CONIO.H. Значення, що повертається функцією getch(), присвоюється змінній ch і друкує це значення на екрані. Інша функція, під назвою getch(), теж «перехоплює» введений символ, але не виводить його на екран.

Умова з присвоюванням

Перепишемо попередню програму, скоротивши її на один рядок і продемонструвавши аспекти, що стосуються пріоритету операцій. Одержана конструкція може видатися незвичайною, але вона часто викоритовується не тільки в С++, а також в С.

#include <iostream>

using namespace std;

#include <conio.h> //для getche()

int main()

{

int chcount=0; //число непробільних символів

int wdcount=1; //число пробілів

char ch=’a’; //ch повинна мати певне значення

cout<<”Vvedit rjadok: “;

while((ch!=getche())!=’\r’)

{if(ch==’ ‘) //якщо символ є пробілом

wdcount++;

else

chcount++;

}

cout<<”\nSliv “<<wdcount<<endl<<”Bukw “<<(chcount-1)<<endl;

return 0;

}

Значення, що повертається функцією getche(), присвоюється змінній ch, як і раніше, але сама операція присвоювання знаходиться всередині умови циклу while. Присвоєне значення порівнюється з ‘\r’ для того, щоб вияснити, продовжити виконання циклу чи ні. Ця конструкція працює правильно, тому що операція присвоєння значення сама одержує це значення. Якщо, наприклад, функція getche() повертає символ ‘a’, то при цьому не тільки відбувається присвоювання значення змінній, але й сам вираз

(ch=getche())

одержує значення ‘a’, яке бере участь в перевірці.

Той факт, що операції присвоювання мають власне значення, використовується в множинному присвоюванні, такому як:

x=y=z=0;

Подібні конструкції є цілком коректними в С++, в результаті такого присвоювання всі три змінні – x, y, z – дістають значення 0.

Зовнішні круглі дужки у виразі

(ch!=getche())

необхідні, оскільки операція присвоювання = має більш низький пріоритет, ніж операція відношення !=.

Таким чином, оператор while в нашій програмі виконує багато корисних дій. Він не тільки перевіряє, чи є значення змінної ch символом ‘\r’, але ще одержує символ з клавіатури і присвоює його змінній ch/