Функция getch в языке си

_getch, _getwch _getch, _getwch

Получает символ из консоли без отображения. Gets a character from the console without echo.

Этот API нельзя использовать в приложениях, выполняемых в среде выполнения Windows. This API cannot be used in applications that execute in the Windows Runtime. Дополнительные сведения: Функции CRT, которые не поддерживаются в приложениях универсальной платформы Windows. For more information, see CRT functions not supported in Universal Windows Platform apps.

Синтаксис Syntax

Возвращаемое значение Return Value

Возвращает считанный символ. Returns the character read. Ошибки не возвращаются. There’s no error return.

Примечания Remarks

Функции _getch и _getwch считывают один символ из консоли без вывода символа. The _getch and _getwch functions read a single character from the console without echoing the character. Эти функции нельзя использовать для считывания сочетания CTRL+C. None of these functions can be used to read CTRL+C. При считывании функциональной клавиши или клавиши со стрелкой каждая из этих функций должна вызываться дважды. Первый вызов возвращает 0 или 0xE0, а второй вызов возвращает фактический код клавиши. When reading a function key or an arrow key, each function must be called twice; the first call returns 0 or 0xE0, and the second call returns the actual key code.

Эти функции блокируют вызывающий поток, поэтому они потокобезопасны. These functions lock the calling thread and are therefore thread-safe. Описание неблокирующих версий см. в разделе _getch_nolock, _getwch_nolock. For non-locking versions, see _getch_nolock, _getwch_nolock.

По умолчанию глобальное состояние этой функции ограничивается приложением. By default, this function’s global state is scoped to the application. Чтобы изменить это, см. раздел глобальное состояние в CRT. To change this, see Global state in the CRT.

Универсальное текстовое сопоставление функций Generic-Text Routine Mappings

Процедура Tchar.h Tchar.h routine_UNICODE и _MBCS не определены _UNICODE and _MBCS not defined_MBCS определено _MBCS defined_UNICODE определено _UNICODE defined
_gettch _gettch_getch _getch_getch _getch_getwch _getwch

Требования Requirements

Подпрограмма RoutineОбязательный заголовок Required header
_getch _getch
_getwch _getwchили or

Дополнительные сведения о совместимости см. в разделе Compatibility. For more compatibility information, see Compatibility.

Источник

Функция ввода одиночного символа getch()

а) для остановки программы до нажатия произвольной клавиши, например, перед ее завершением. В этом случае листинг программы может быть таким

getch(); /* Ожидание ввода произвольной клавиши */

б) получение кода ASCII нажатой клавиши. Для получения кода клавиши необходимо объявить целую переменную и присвоить результат исполнения функции getch() этой переменной. При этом синтаксис использования функции может быть следующим:

i=getch(); /* Ожидание нажатия клавиши и присвоение

ее кода символа переменной i */

Пример 3.3

Написать программу, принимающую символ с клавиатуры и выдающую его код на экран

Листинг 3.3

/* программа вывода на экран кода нажатой клавиши */

int kod; /* объявление переменной */

clrscr(); /* очистка экрана */

cprintf(“Нажмите клавишу: ”); /* вывод сообщения */

kod=getch(); /* ввод клавиши */

cprintf(“\nКод клавиши: %d\n”); /* вывод кода клавиши */

getch(); /* ожидание нажатия

3.6. Задание для самостоятельной работы

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 позиций):

в) выполнить предыдущий пример, но совмещенный с вводом значений этих переменных.

3.6.3. Написать программу: выполняется очистка экрана, вводится вещественное число, на экран выводится корень из введенного числа (функция корня находится в математической библиотеке и вызывается так: y=sqrt(x); ). Вывод корня выполнить в следующем формате – выравнивание по левому краю, общая ширина поля – 10 позиций, точность – 2 символа после десятичной точки.

3.6.4. Составить программу, в которой: выполняется очистка экрана, рисуется на экране изображение окна, внутри окна выполняется ввод трех параметров двигателя (см. задачу 3.6.1,е).

ОСНОВНЫЕ ОПЕРАЦИИ ЯЗЫКА

Операции языка Си

В языке существует большое количество операций (операторов). С помощью операций языка выполняются вычисления, сравнения, присваивания, а также ряд специфических задач. Наиболее часто используемые приведены в табл. 4.1. При выполнении операторов учитываются следующие особенности их исполнения:

а) каждой операции соответствует определенное количество операндов:

– унарные операции, имеющие только один операнд, например, операция взятия адреса переменной x запишется так: &x, а операция инкрементирования переменной i: i++;

– бинарные операции, имеющие два операнда, например, простейшие арифметические операции сложения, вычитания и т.д.: a+b или 4*x;

б) некоторые операции могут работать только с определенными типами данных, например, побитовые операции применяются только к целым типам данных;

в) в сложных выражениях, содержащих ряд операций, исполнение большинства операций выполняется слева направо, за исключением, унарных операций и операций присваивания. Если необходимо задать строго определенный порядок исполнения выражения можно использовать круглые скобки;

г) в сложных выражениях последовательность исполнения операций определяется их приоритетом (см. крайнюю правую колонку в табл. 4.1, где 1 – наибольший приоритет исполнения операции).

x;

Опера-цияНазначениеПримерПрио-ритет
Первичные операции
[]индекс массиваx[2][0]=5;
()вызов функции, очередность выполненияy=sin(6.28*(x+1));
.элемент структуры (прямой доступ)time.tm_hour=5;
->элемент структуры (косвенный доступ)time->tm_hour=5;
Унарные операции
++инкремент (увеличение на единицу)i++
––декремент (уменьшение на единицу)i––
sizeofразмер в байтахx=sizeof(int);
(тип)преобразование типаy=(float)5/2;
унарный минус (изменение знака)y=-x;
*косвенная адресацияint x=*y;
&взятие адресаscanf(“%d”,&x);
Арифметические операции
*умножение20*x
/делениеx/10
%деление по модулюx%10
+сложениеx+20
вычитание40–x
Битовые операции
>побитовый сдвиг вправоy=x>>1;
&побитовое Иy=x&15;
^побитовое исключающее ИЛИy=x^15;
|побитовое ИЛИy=x|15;

Продолжение таблицы 4.1.

Опера-цияНазначениеПримерПрио-ритет
Операции отношения
большеif (x>6)
=больше или равноif (x>=6)
==равноif (x==6)
!=не равноif (x!=6)
Логические операции
!логическое отрицание (операция НЕ)if (!x)
&&логическое умножение (операция И)if (x>0 && x 6)
Условная операция
?:при условииa>b?10;-10
Операции присваивания
=присваиваниеx=5
*=присвоение произведенияx*=3
/=присвоение частногоx/=3
%=присвоение остаткаx%=3
+=присвоение суммыx+=3
–=присвоение разностиx–=3
>=присвоение правого сдвигаx>>=3
&=присвоение Иx&=3
^=присвоение исключающего ИЛИx^=3
|=присвоение ИЛИx|=3
Прочие операции
,запятаяa=1, b=2;

Арифметические операции

Операции сложения, вычитания, умножения и деления можно использовать ко всем типам данных. Если операнды одного типа, то результат будет того же типа. Например, вычисляя выражение 12/5, так как операнды целые числа, то в результате получим целое число 2 (округление не выполняется). С другой стороны, если рассчитывается выражение 12./5, результатом будет вещественное число 2.4.

Операция деление по модулю используется при необходимости вычисления остатка от деления целых чисел, например, при вычислении выражения 17%3, результатом будет целое число 2.

Операции присваивания

Эти операторы имеют наименьший приоритет при вычислении выражений, т.е. выполняются в последнюю очередь (за исключением оператора запятая). В языке Си знак равенства означает выполнение операции присваивания. Например, выражение

означает, что вначале вычисляется выражение слева от знака равенства и затем результат присваивается переменной x. Поэтому выражения

приобретают при программировании строго определенный смысл: вначале вычисляется выражение справа от знака равенства (к старому значению переменной x прибавляется число 2) и затем полученный результат присваивается переменной x.

Оператор присваивания выполняется справа налево. В языке Си возможно использования выражений с несколькими операторами присваивания, например, допустимо использовать следующее выражение

Оно выполняется в следующем порядке: вычисляется значение 5*45, результат присваивается переменной ‘а’, затем эта переменная умножается на 5 и результат присваивается переменной ‘b’, и далее присваивается переменной ‘c’.

Помимо традиционной операции присваивания в языке Си существуют дополнительные операции: +=, –=, *= и т.п. Например, операции слева и справа в приведенной ниже таблице идентичны

a=a+10;a+=10;
a=a/10;a/=10;
a=a&64;a&=10;
a=a>>1;a>>=1;

Достоинства этих операции – они выполняются быстрее, чем операции с обычным присваиванием.

Пример 4.1

Пример использования арифметических операций и операций присваивания:

Листинг 4.1

printf(“Деление целых чисел: %d\nОстаток: %d\n”,c,d);

printf(“Деление вещественных чисел: %d %d\n”,c,d);

printf(“Традиционная форма операции присваивания: %d %f\n”,a,y);

printf(“Присваивание со сложение и умножением: %d %f”,a,y);

Результат выполнения программы:

Деление целых чисел: 8

Деление вещественных чисел: 8.333333

Традиционная форма операции присваивания: 35 9.000000

Присваивание со сложение/умножением: 45 27.000000

Операции отношения

Эти операции позволяют сравнивать друг с другом данные, например:

определяет значение переменной ‘у’ равным единице для ‘x’ равным 25 и равным нулю для ‘х’ равным –5.

Согласно табл. 4.1. наибольшим приоритетом обладает операции ‘ ’, наименьшими равенство и неравенство. Поэтому, например, выражение

– сравнение на равенство.

Логические операции

Значение переменной aЗначение переменной bРезультат
a&&ba||b!a!b
нольноль
нольотлично от ноля
отлично от ноляноль
отлично от ноляотлично от ноля

Следует отметить, что «истинным» значением переменной считается не только ее положительное значение, но и отрицательное. Если выражение при выполнении логической операции является «истиной», то результату присваивается значение единица, в противном случае – нулевое значение.

Пример 4.2

Листинг 4.2

Результатом исполнения программы будут строки на экране

Согласно табл. 4.1. наибольшим приоритетом среди логических операций обладает операция НЕ. Поэтому, например, оператор

будет выполняться в следующем порядке:

– операция НЕ переменной c;

– операция И операндов a и b;

– операция И операндов (!c) и d;

– операция ИЛИ операндов (a&&b) и (!c&&d).

Логические операции можно использовать и для реализации сложных неравенств. Например, для составления условия 10 10 && x 20 можно представить в виде (x 20).

Битовые операции

Эти операции позволяют выполнять проверку и изменение отдельных битов в данных целого и символьного типов. Их нельзя использовать для вещественных чисел. Действие битовых операций идентично логическим, но они выполняются над каждым битом данных.

Каждая из битовых операций служит определенным целям. Например, операция & (И) полезна для проверки единичных значений отдельных битов числа, а также для установки определенных битов в «0». Операция | (ИЛИ) полезна для установки в «1» битов. Операция ^ (Исключающее ИЛИ) используется для проверки несовпадения битов. Операции сдвига > позволяют сдвинуть все биты числа влево/вправо на заданное количество разрядов. Недостающие значения битов дополняются нулями, информация в исчезающих битах теряется.

Примеры использования битовых операций приведены в табл. 4.3. Все переменные a, b, z этой таблицы типа unsigned char. Язык Си не умеет работать с данными в двоичном формате, но для упрощения понимания работы каждое число представлено в двоичном формате (например, для первой строки a=20210=110010102, b=15510=100110112).

Операция1 операнд2 операндРезультатКомментарий
НЕa=11001010b=10011011z=

b=01100100

Инвертируются все биты числа
Иa=10011010b=11110000z=a&b=10010000На число a накладывается маска (число b) – выделяются значения 4 старших битов числа а, младшие биты обнуляются
ИЛИa=10011010b=00001111z=a|b=10011111Четыре младших бита числа a устанавливаются в единичное состояние, старшие биты остаются без изменения
Исключающее ИЛИa=10011010b=00001111z=a^b=10010101Старшие биты числа a остаются без изменения, младшие – инвертируются
Сдвиг вправоa=10011010b=00001111z=a >2=00100110 z=b>>1=00000111Выполняется сдвиг влево всех битов числа a на два разряда, числа b – на один разряд. Происходит потеря младших битов, установленных в «1»

Следует отметить, что результатом исполнения битовой операции в отличии от логических операций будет число типа символ или целое, а не логические «0» или «1». Так, например, исполнение выражений b=a&&8 и b=a&8 при различных значениях переменной а даст такой результат:

Источник

_getche, _getwche _getche, _getwche

Получает символ из консоли с отображением. Gets a character from the console with echo.

Этот API нельзя использовать в приложениях, выполняемых в среде выполнения Windows. This API cannot be used in applications that execute in the Windows Runtime. Дополнительные сведения: Функции CRT, которые не поддерживаются в приложениях универсальной платформы Windows. For more information, see CRT functions not supported in Universal Windows Platform apps.

Синтаксис Syntax

Возвращаемое значение Return Value

Возвращает считанный символ. Returns the character read. Ошибки не возвращаются. There’s no error return.

Примечания Remarks

Функции _getche и _getwche считывают один символ из консоли с эхо-выводом, то есть символ отображается в консоли. The _getche and _getwche functions read a single character from the console with echo, meaning that the character is displayed at the console. Эти функции нельзя использовать для считывания сочетания CTRL+C. None of these functions can be used to read CTRL+C. При считывании функциональной клавиши или клавиши со стрелкой каждая из этих функций должна вызываться дважды. Первый вызов возвращает 0 или 0xE0, а второй вызов возвращает фактический код клавиши. When reading a function key or an arrow key, each function must be called twice; the first call returns 0 or 0xE0, and the second call returns the actual key code.

Эти функции блокируют вызывающий поток, поэтому они потокобезопасны. These functions lock the calling thread and are therefore thread-safe. Описание неблокирующих версий см. в разделе _getche_nolock, _getwche_nolock. For non-locking versions, see _getche_nolock, _getwche_nolock.

По умолчанию глобальное состояние этой функции ограничивается приложением. By default, this function’s global state is scoped to the application. Чтобы изменить это, см. раздел глобальное состояние в CRT. To change this, see Global state in the CRT.

Универсальное текстовое сопоставление функций Generic-Text Routine Mappings

Процедура Tchar.h Tchar.h routine_UNICODE и _MBCS не определены _UNICODE and _MBCS not defined_MBCS определено _MBCS defined_UNICODE определено _UNICODE defined
_getche _getche_getche _getche_getch _getch_getwche _getwche

Требования Requirements

Подпрограмма RoutineОбязательный заголовок Required header
_getche _getche
_getwche _getwcheили or

Дополнительные сведения о совместимости см. в разделе Compatibility. For more compatibility information, see Compatibility.

Источник

Функции

Введение

Ч ем дальше мы изучаем си, тем больше становятся программы. Мы собираем все действия в одну функцию main и по несколько раз копируем одни и те же действия, создаём десятки переменных с уникальными именами. Наши программы распухают и становятся всё менее и менее понятными, ветвления становятся всё длиннее и ветвистее.

Но из сложившейся ситуации есть выход! Теперь мы научимся создавать функции на си. Функции, во-первых, помогут выделить в отдельные подпрограммы дублирующийся код, во-вторых, помогут логически разбить программу на части, в-третьих, с функциями в си связано много особенностей, которые позволят использовать новые подходы к структурированию приложений.

Функция – это именованная часть программы, которая может быть многократно вызвана из другого участка программы (в котором эта функция видна). Функция может принимать фиксированное либо переменное число аргументов, а может не иметь аргументов. Функция может как возвращать значение, так и быть пустой (void) и ничего не возвращать.

Мы уже знакомы с многими функциями и знаем, как их вызывать – это функции библиотек stdio, stdlib, string, conio и пр. Более того, main – это тоже функция. Она отличается от остальных только тем, что является точкой входа при запуске приложения.
Функция в си определяется в глобальном контексте. Синтаксис функции:

Самый простой пример – функция, которая принимает число типа float и возвращает квадрат этого числа

Внутри функции sqr мы создали локальную переменную, которой присвоили значение аргумента. В качестве аргумента функции передали число 9,3. Служебное слово return возвращает значение переменной tmp. Можно переписать функцию следующим образом:

В данном случае сначала будет выполнено умножение, а после этого возврат значения. В том случае, если функция ничего не возвращает, типом возвращаемого значения будет void. Например, функция, которая печатает квадрат числа:

в данном случа return означает выход из функции. Если функция ничего не возвращает, то return можно не писать. Тогда функция доработает до конца и произойдёт возврат управления вызывающей функции.

Если функция не принимает аргументов, то скобки оставляют пустыми. Можно также написать слово void:

Формальные и фактические параметры

П ри объявлении функции указываются формальные параметры, которые потом используются внутри самой функции. При вызове функции мы используем фактические параметры. Фактическими параметрами могут быть переменные любого подходящего типа или константы.

Например, пусть есть функция, которая возвращает квадрат числа и функция, которая суммирует два числа.

Обращаю внимание, что приведение типов просиходит неявно и только тогда, когда это возможно. Если функция получает число в качестве аргумента, то нельзя ей передать переменную строку, например «20» и т.д. Вообще, лучше всегда использовать верный тип или явно приводить тип к нужному.
Если функция возвращает значение, то оно не обязательно должно быть сохранено. Например, мы пользуемся функцией getch, которая считывает символ и возвращает его.

Передача аргументов

При передаче аргументов происходит их копирование. Это значит, что любые изменения, которые функция производит над переменными, имеют место быть только внутри функции. Например

Программы выведет
200
100
200
Понятно почему. Внутри функции мы работаем с переменной x, которая является копией переменной d. Мы изменяем локальную копию, но сама переменная d при этом не меняется. После выхода из функции локальная переменная будет уничтожена. Переменная d при этом никак не изменится.
Каким образом тогда можно изменить переменную? Для этого нужно передать адрес этой переменной. Перепишем функцию, чтобы она принимала указатель типа int

Вот теперь программа выводит
200
100
100
Здесь также была создана локальная переменная, но так как передан был адрес, то мы изменили значение переменной d, используя её адрес в оперативной памяти.

В программировании первый способ передачи параметров называют передачей по значению, второй – передачей по указателю. Запомните простое правило: если вы хотите изменить переменную, необходимо передавать функции указатель на эту переменную. Следовательно, чтобы изменить указатель, необходимо передавать указатель на указатель и т.д. Например, напишем функцию, которая будет принимать размер массива типа int и создавать его. С первого взгляда, функция должна выглядеть как-то так:

Но эта функция выведет ERROR. Мы передали адрес переменной. Внутри функции init была создана локальная переменная a, которая хранит адрес массива. После выхода из функции эта локальная переменная была уничтожена. Кроме того, что мы не смогли добиться нужного результата, у нас обнаружилась утечка памяти: была выделена память на куче, но уже не существует переменной, которая бы хранила адрес этого участка.

Для изменения объекта необходимо передавать указатель на него, в данном случае – указатель на указатель.

Вот теперь всё работает как надо.
Ещё подобный пример. Напишем функцию, которая принимает в качестве аргумента строку и возвращает указатель на область памяти, в которую скопирована эта строка.

В этом примере утечки памяти не происходит. Мы выделили память с помощью функции malloc, скопировали туда строку, а после этого вернули указатель. Локальные переменные были удалены, но переменная test хранит адрес участка памяти на куче, поэтому можно его удалить с помощью функции free.

Объявление функции и определение функции. Создание собственной библиотеки

В си можно объявить функцию до её определения. Объявление функции, её прототип, состоит из возвращаемого значения, имени функции и типа аргументов. Имена аргументов можно не писать. Например

Это смешанная рекурсия – функция odd возвращает 1, если число нечётное и 0, если чётное.

Содержимое файла исходного кода File1.c

Рассмотрим особенности каждого файла. Наш файл, который содержит функцию main, подключает необходимые ему библиотеки а также заголовочный файл File1.h. Теперь компилятору известны прототипы функций, то есть он знает возвращаемый тип, количество и тип аргументов и имена функций.

Заголовочный файл, как и оговаривалось ранее, содержит прототип функций. Также здесь могут быть подключены используемые библиотеки. Макрозащита #define _FILE1_H_ и т.д. используется для предотвращения повторного копирования кода библиотеки при компиляции. Эти строчки можно заменить одной

Файл File1.c исходного кода подключает свой заголовочный файл. Всё как обычно логично и просто. В заголовочные файлах принято кроме прототипов функций выносить константы, макроподстановки и определять новые типы данных. Кроме того, именно в заголовочных файлах можно обширно комментировать код и писать примеры его использования.

Передача массива в качестве аргумента

К ак уже говорилось ранее, имя массива подменяется на указатель, поэтому передача одномерного массива эквивалентна передаче указателя. Пример: функция получает массив и его размер и выводит на печать:

В этом примере функция может иметь следующий вид

Также напомню, что правило подмены массива на указатель не рекурсивное. Это значит, что необходимо указывать размерность двумерного массива при передаче

Если двумерный массив создан динамически, то можно передавать указатель на указатель. Например функция, которая получает массив слов и возвращает массив целых, равных длине каждого слова:

Можно вместо того, чтобы возвращать указатель на массив, передавать массив, который необходимо заполнить

На этом первое знакомство с функциями заканчивается: тема очень большая и разбита на несколько статей.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *