Консольная библиотека <conio.h> имеет очень похожие функции ввода-вывода. Отличие состоит в том, что с помощью консольных функций можно задать атрибуты вводимых/выводимых символов: задать положение курсора, изменить цвета фона и символов. Поэтому, например, не имеет смысла использовать некоторые специальные символы при выводе данных на экран (перевод строки, горизонтальная табуляция и т.п.). Синтаксис функций cscanf() и cprintf() идентичен аналогичным функциям библиотеки <stdio.h>.
Вспомогательные функции консольной библиотеки
Рассмотрим вспомогательные «полезные» функциями консольной библиотеки, используемые вместе с функциями ввода-вывода:
1) очистка экрана
clrscr();
2) задание нового текущего положения курсора на экране
gotoxy(x,y);
где x, y – координаты нового положения курсора, диапазоны возможных изменения координат следующие x=1…80, y=1…25, координате (1,1) соответствует верхний левый угол экрана;
3) изменение текущего цвета символов (в текстовом режиме):
textcolor(c);
где c – цвет символов (с=0…15 или цвета в виде макроопределения, например, BLACK, BLUE, GREEN, RED,…YELLOW, WHITE);
|
|
4) изменение текущего звена фона под символами (в текстовом режиме):
textbackground(c);
где c – цвет фона (с=0…7 или цвета в виде макроопределения, например, BLACK, BLUE, …LIGHTGRAY);
Пример 3.2
Создадим программу ввода фамилии в окне. С помощью консольных функций необходимо выполнить следующие операции: очистить экран дисплея, в центре экрана вывести изображение окна (цветная рамка с желтым цветом символов и синим цветом фона) размером 20 столбцов на 3 строки, ввести строку в пределах окна.
Листинг 3.2
/* Рисование окна и ввод фамилии */
#include <conio.h>
void main()
{
char name[15];/*объявление массива символов для ввода строки*/
clrscr(); /* очистка экрана */
textcolor(YELLOW); /* задание цвета символов */
textbackground(BLUE); /* задание цвета фона */
gotoxy(30,11); /* задание положения курсора */
cprintf(“┌────────────────────┐”);
gotoxy(30,12);
cprintf(“│ Введите фамилию │”);
gotoxy(30,13);
cprintf(“│ │”);
gotoxy(30,14);
cprintf(“└────────────────────┘”);
textcolor(CYAN); /* задание цвета символов */
gotoxy(35,13);
cscanf(“%s”,name); /* ввод строки */
}
Примечание: для ввода программы необходимы символы псевдографики. При их вводе можно использовать коды символов:
218 ┌ 196 ─ 191 ┐
179 │ 179 │
192 └ 196 ─ 217 ┘
Функция ввода одиночного символа getch()
Функции scanf() и cscanf() требуют аккуратного ввода данных с клавиатуры, незначительная ошибка при вводе информации приводит к сбоям в работе программ. В добротных программах используется посимвольный ввод данных с помощью функции getch(), определяемую в той же библиотеке <conio.h>. Эта функция имеет два варианта применения:
|
|
а) для остановки программы до нажатия произвольной клавиши, например, перед ее завершением. В этом случае листинг программы может быть таким
{
…
getch(); /* Ожидание ввода произвольной клавиши */
}
б) получение кода ASCII нажатой клавиши. Для получения кода клавиши необходимо объявить целую переменную и присвоить результат исполнения функции getch() этой переменной. При этом синтаксис использования функции может быть следующим:
{
int i;
…
i=getch(); /* Ожидание нажатия клавиши и присвоение
ее кода символа переменной i */
…
}
Пример 3.3
Написать программу, принимающую символ с клавиатуры и выдающую его код на экран
Листинг 3.3
/* программа вывода на экран кода нажатой клавиши */
#include <conio.h>
void main()
{
int kod; /* объявление переменной */
clrscr(); /* очистка экрана */
cprintf(“Нажмите клавишу: ”); /* вывод сообщения */
kod=getch(); /* ввод клавиши */
cprintf(“\nКод клавиши: %d\n”); /* вывод кода клавиши */
getch(); /* ожидание нажатия
произвольной клавиши */
}
Задание для самостоятельной работы
3.6.1. Записать отдельные строки программы, используя функции форматированного ввода-вывода:
а) вывод на экран двух переменных типа символ, целой переменной в восьмеричном формате и переменной типа длинное целое (идентификаторы выбрать самостоятельно);
б) вывод на экран значения переменных типа строка (массив символов) family, name, gruppa в следующем виде (после символов … должны идти значения указанных переменных):
Фамилия: …
Имя: …
Группа: …
в) вывести на экран две вещественные переменные в заданном формате: 10 позиций общая ширина поля переменной, 3 позиции – точность;
г) ввод двух переменных типа беззнаковое целое first и second;
д) ввод целой переменной x в шестнадцатеричном формате, вещественной переменной y и вещественной переменной двойной точности z;
е) выполнить ввод вещественных переменных power, moment и velocity, используя функции ввода-вывода в следующем формате (после символов … должен идти ввод указанных переменных):
Параметры двигателя:
мощность двигателя – …
момент двигателя – …
скорость двигателя – …
3.6.2. Записать отдельные строки программы, используя только функции консольного ввода-вывода:
а) очистить экран и далее вывести в центре экрана значения двух целых переменных
a и b, изменив при этом цвет символа и фона;
б) вывести значения четырех вещественных переменных a, b, c и d в следующем виде (ширина поля каждой переменной – 8 позиций, точность – 0 позиций):
a= …
b=…
c=…
d=…
в) выполнить предыдущий пример, но совмещенный с вводом значений этих переменных.
3.6.3. Написать программу: выполняется очистка экрана, вводится вещественное число, на экран выводится корень из введенного числа (функция корня находится в математической библиотеке и вызывается так: y=sqrt(x);). Вывод корня выполнить в следующем формате – выравнивание по левому краю, общая ширина поля – 10 позиций, точность – 2 символа после десятичной точки.
3.6.4. Составить программу, в которой: выполняется очистка экрана, рисуется на экране изображение окна, внутри окна выполняется ввод трех параметров двигателя (см. задачу 3.6.1,е).
ОСНОВНЫЕ ОПЕРАЦИИ ЯЗЫКА
Операции языка Си
В языке существует большое количество операций (операторов). С помощью операций языка выполняются вычисления, сравнения, присваивания, а также ряд специфических задач. Наиболее часто используемые приведены в табл. 4.1. При выполнении операторов учитываются следующие особенности их исполнения:
|
|
а) каждой операции соответствует определенное количество операндов:
– унарные операции, имеющие только один операнд, например, операция взятия адреса переменной x запишется так: &x, а операция инкрементирования переменной i: i++;
– бинарные операции, имеющие два операнда, например, простейшие арифметические операции сложения, вычитания и т.д.: a+b или 4*x;
– единственная трехоперандная операция в языке – операция выполнения условия <операнд1>? <операнд2>: <операнд3>.
б) некоторые операции могут работать только с определенными типами данных, например, побитовые операции применяются только к целым типам данных;
в) в сложных выражениях, содержащих ряд операций, исполнение большинства операций выполняется слева направо, за исключением, унарных операций и операций присваивания. Если необходимо задать строго определенный порядок исполнения выражения можно использовать круглые скобки;
г) в сложных выражениях последовательность исполнения операций определяется их приоритетом (см. крайнюю правую колонку в табл. 4.1, где 1 – наибольший приоритет исполнения операции).
Таблица 4.1.
Опера-ция | Назначение | Пример | Прио-ритет |
Первичные операции | |||
[] | индекс массива | x[2][0]=5; | 1 |
() | вызов функции, очередность выполнения | y=sin(6.28*(x+1)); | 1 |
. | элемент структуры (прямой доступ) | time.tm_hour=5; | 1 |
-> | элемент структуры (косвенный доступ) | time->tm_hour=5; | 1 |
Унарные операции | |||
++ | инкремент (увеличение на единицу) | i++ | 2 |
–– | декремент (уменьшение на единицу) | i–– | 2 |
sizeof | размер в байтах | x=sizeof(int); | 3 |
(тип) | преобразование типа | y=(float)5/2; | 3 |
- | унарный минус (изменение знака) | y=-x; | 3 |
* | косвенная адресация | int x=*y; | 3 |
& | взятие адреса | scanf(“%d”,&x); | 3 |
Арифметические операции | |||
* | умножение | 20*x | 4 |
/ | деление | x/10 | 4 |
% | деление по модулю | x%10 | 4 |
+ | сложение | x+20 | 5 |
– | вычитание | 40–x | 5 |
Битовые операции | |||
~ | побитовое НЕ | y=~x; | 3 |
<< | побитовый сдвиг влево | y=x<<1; | 6 |
>> | побитовый сдвиг вправо | y=x>>1; | 6 |
& | побитовое И | y=x&15; | 9 |
^ | побитовое исключающее ИЛИ | y=x^15; | 10 |
| | побитовое ИЛИ | y=x|15; | 11 |
Продолжение таблицы 4.1.
|
|
Опера-ция | Назначение | Пример | Прио-ритет |
Операции отношения | |||
< | меньше | if (x<6) | 7 |
> | больше | if (x>6) | 7 |
<= | меньше или равно | if (x<=6) | 7 |
>= | больше или равно | if (x>=6) | 7 |
== | равно | if (x==6) | 8 |
!= | не равно | if (x!=6) | 8 |
Логические операции | |||
! | логическое отрицание (операция НЕ) | if (!x) | 3 |
&& | логическое умножение (операция И) | if (x>0 && x<6) | 12 |
|| | логическое сложение (операция ИЛИ) | if (x<0 || x>6) | 13 |
Условная операция | |||
?: | при условии | a>b?10;-10 | 14 |
Операции присваивания | |||
= | присваивание | x=5 | 15 |
*= | присвоение произведения | x*=3 | 15 |
/= | присвоение частного | x/=3 | 15 |
%= | присвоение остатка | x%=3 | 15 |
+= | присвоение суммы | x+=3 | 15 |
–= | присвоение разности | x–=3 | 15 |
<<= | присвоение левого сдвига | x<<=3 | 15 |
>>= | присвоение правого сдвига | x>>=3 | 15 |
&= | присвоение И | x&=3 | 15 |
^= | присвоение исключающего ИЛИ | x^=3 | 15 |
|= | присвоение ИЛИ | x|=3 | 15 |
Прочие операции | |||
, | запятая | a=1, b=2; | 16 |