Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс ПЯВУ 2 сем / Лекции 2 сем / Л№33 ФорматировВвод / Лекция № 31. Форматированный Ввод вывод .odt
Скачиваний:
16
Добавлен:
17.04.2015
Размер:
50.53 Кб
Скачать

31. Использование ansi-драйвера для позиционирования курсора

Как известно, передавая в ANSI-драйвер соответствующие Esc-последовательности, можно выполнять очистку экрана и управлять цветом вывода. Кроме этого, имеется набор Esc-последовательностей, с помощью которых можно позиционировать курсор в указанные строку и колонку. Данная возможность позволяет нам располагать выводимую информацию в требуемом месте экрана. В табл. 3представлены Esc-последовательности ANSI-драйвера, предназначенные для позиционирования курсора.

Таблица 3. Esc-последовательности управления курсором ANSI-драйвера

-------------------------------------------------------------------------------------------------------

Esc-последовательность Функция Пример

-------------------------------------------------------------------------------------------------------

Esc[#;#H Установить позицию курсора строка/колонка Esc[10;25H

Esc[#A Переместить курсор вверх на # строк Esc[la

Esc[#B Переместить курсор вниз на # строк Esc[2b

Esc[#C Переместить курсор вправо на # колонок Esc[10c

Esc[#D Переместить курсор влево на # колонок Esc[10d

Esc[S Сохранить текущую позицию курсора Esc[S

Esc[U Восстановить позицию курсора Esc[U

Esc[2j Очистить экран и переместить курсор в левый

верхний угол Esc[2j

Esc[K Очистить до конца текущей строки Esc[K

-------------------------------------------------------------------------------------------------------

Итак, мы рассмотрели как работает функция printf() и переходим к изучению второй не менее полезной функции.

Функция scanf()

Как уже упоминалось в начале функция scanf() используется для обработки информации, введенной пользователем с клавиатуры. Несомненный плюс данной функции, что она может преобразовывать введенную информацию не только в символы, но и в числа, в том числе и в числа с плавающей точкой.

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

int scanf(const char *control-str[, argument1 [, argument2 [, ... ]]]);

Возвращает эта функция число элементов, которые она успешно прочитала. Если она не прочла никаких элементов, функция возвращает значение 0. Функция scanf() вернет значение EOF, если обнаружит символ конца строки или символ конца файла, а также в случае ошибки.

Первый параметр функции - control-str - как и в предыдущей функции это управляющая строка, сопровождаемая списком параметров argument.

После управляющей строки идут параметры argument, каждый из которых является адресом переменной, в которую будет записано введенное и считанное значение. Следовательно,если мы используем функцию для чтения строки в символьный массив, в качестве аргумента мы передаем название символьного массива, в остальных случаях, то есть для чтения других типов - мы передаем название переменной со знаком амперсанта (&).

Управляющая строка указывает, в какие форматы должен быть преобразован вводимый текст. В ней также используются спецификаторы преобразования, их прототип похож на прототип спецификатора функции printf, но все же отличается. Вот как выглядит прототип спецификатора преобразования функции scanf():

% [*] [width] [{h | l | L}] type

Рассмотрим типы (type) спецификаторов преобразования для данной функции. Они идентичны спецификаторам функции printf.

Спецификатор

преобразования Значение

%c Интерпретирует ввод как символ

%d, %i Интерпретирует ввод как десятичное целое число со знаком

%e, %f, %g

%E, %G Интерпретирует ввод как число с плавающей точкой (float)

%o Интерпретирует ввод как восьмеричное целое число со знаком

%p Интерпретирует ввод как указатель (адрес)

%s Интерпретирует ввод как строку; считывает введенное значение с первого

символа, не являющегося служебным, и включает все символы до следующего

служебного символа. (О служебных символах Вы можете прочитать ниже)

%u Интерпретирует ввод как десятичное целое число без знака

%x, %X Интерпретирует ввод как шестнадцатиричное целое число со знаком

Для того, чтобы отделить вводимые значения, функция scanf() использует символы, называемые служебными. К ним относятся символы перевода строки, табуляции и пробелы. Что сие значит: во время ввода информации пользователь должен после каждого введенного значения вводить служебный символ для того, чтобы показать функции, что он закончил ввод очередного значения. Единственное исключение - спецификатор %c, который читает каждый следующий символ, даже если этот символ является служебным. Приведем пример:

char name[15];

int age;

float salary;

printf("Input your name, age and your salaryn");

scanf("%s %d %f", name, &age, &salary);

printf("Name is %sn Age is %dn Salary is %6.2fn", name, age, salary);

когда на экране появляется строка

Input your name, age and your salary

мы вводим

Bill

35 521.55

после этого на экране должна появиться строка

Name is Bill

Age is 35

Salary is 521.55

Модификатор * заставляет функцию scanf() игнорировать соответствующий ввод. То есть, если в спецификаторе преобразования стоит звездочка, то функция введенное значение не записывает в переменную. Пример:

int num;

printf("Input 3 numbers:n");

scanf("%*d %d %*d", &num);

printf("Second number is %dn",num);

когда на экране появится строка

Input 3 numbers:

мы вводим

44 55 66

в результате чего на экране должна появиться строка

Second number is 55

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

Использование необязательных префиксов h | l | L рассмотрено в таблице:Использование

префикса с типом спецификатора определяет тип

l d, i, o, x или X long

l u unsigned long

l e, f, g, E или G double

h d, i, o, x, или X short int

h u unsigned short int

L е, f, g, E или G long double

Как Вы уже заметили, в контрольной строке функции scanf() между спецификаторами преобразования в примерах использовались пробелы. Пробел в контрольной строке означает, что нужно пропускать любой служебный символ перед следующим получаемым элементом. Так как практически все спецификаторы, за исключением %с, автоматически пропускают служебные символы, то :

int n;

float m;

строка кода

scanf("%d%f", &n, &m);

идентична

scanf(" %d %f", &n, &m);

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

В контрольной строке можно также использовать обычные символы, отличные от пробела. Например,

scanf("%d + %f", &n, &m);

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