Печать литералов и Esc-последовательностей — КиберПедия 

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Печать литералов и Esc-последовательностей

2020-05-08 263
Печать литералов и Esc-последовательностей 0.00 из 5.00 0 оценок
Заказать работу

Большинство литералов, которые выводятся оператором printf, могут быть просто включены в строку управления форматом. Однако существуют отдельные «проблемные» символы типа кавычек ("), которые ограничивают саму строку управления форматом. Различные управляющие символы типа символа новой строки и символа табуляции должны быть представлены соответствующей escape -последовательностью, или escape -кодом. Esc-последовательность представляет собой обратную косую черту (\) с последующим escape -символом. В таблице на рис. 16 приведен список всех Esc-последовательностей и действий, которые они вызывают.

 

Esc -последова - тельность Описание
\’ Вывод символа одинарной кавычки С).
\" Вывод символа двойной кавычки(").
\? Вывод символа вопросительного знака (?).
\\ Вывод символа обратной косой черты (\).
Вызывает звуковой сигнал (звонок) или визуальное предупреждение.
\b Перемещает курсор на одну позицию назад в текущей строке.
\f Перемещает курсор на начало следующей логической страницы.
\n Перемещает курсор на начало следующей строки.
\r Перемещает курсор на начало текущей строки.
\t Перемещает курсор на следующую позицию горизонтальной табуляции.
\v Перемещает курсор на следующую позицию вертикальной табуляции.

Рис. 16. Esc -последовательности

 

Форматированный ввод с применением scanf

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

Ввод всех типов данных.

Ввод определенных символов из входного потока.

Пропуск определенных символов из входного потока.

Функция scanf имеет следующий формат:

scanf (строка_управления_форматом, другие_аргументы);

В строке_управления_форматом содержится описание входного формата, а другие_аргументы — это указатели на переменные, в которых сохраняются введенные данные.

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

 

Спецификатор Описание

Целые

d Прочитать десятичное целое число с необязательным знаком. Соответствующий аргумент - указатель на целое число. i Прочитать десятичное, восьмеричное или шестнадцатеричное целое число с необязательным знаком. Соответствующий аргумент - указатель на целое число. о Прочитать восьмеричное число. Соответствующий аргумент - указатель на целое число без знака. u Прочитать десятичное целое число без знака. Соответствующий аргумент - указатель на целое число без знака. х или X Прочитать шестнадцатеричное число. Соответствующий аргумент -указатель на целое число без знака. h или 1 Помещается перед любым спецификатором преобразования целых, чтобы показать, что вводится целое соответственно типа short или long.

Числа с плавающей то чкой

е, Е, f, g или G Прочитать значение с плавающей точкой. Соответствующий аргумент -указатель на переменную с плавающей точкой. l или L Помещается перед любым спецификатором преобразования значений с плавающей точкой, чтобы показать, что вводится значение типа double или long double.

Символы и строки

с Прочитать символ. Соответствующий аргумент - указатель на char. Нулевой символ С\0') не добавляется. s Прочитать строку. Соответствующий аргумент - указатель на массив типа char. Массив должен иметь достаточный размер для хранения строки и ограничивающего нулевого символа С\и')-

Набор сканирования

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

Рис. 17. Спецификаторы преобразования для scanf

Программа, приведенная на рис. 9.18, читает целые числа с различными спецификаторами преобразования целых чисел и выводит их в десятичной нотации. Обратите внимание, что спецификатор % i дает возможность вводитьдесятичные, восьмеричные и шестнадцатеричные целые числа.

/* Чтение целых чисел */

# include < stdio. h >

main () {

int a, b, с, d, e, f, g;

printf("Enter seven integers: ");

scanf("%d%i%i%i%o%u%x", &a, &b, &c, &d, &e, &f, &g);

printf("The input displayed as decimal integers is:\n");

printf("%d %d %d %d %d %d %d\n", a, b, c, d, e, f, g);

return 0; }

 

Вывод на экран:

Enter seven integers: -70 -70 070 0x70 70 70 70

 The input displayed as decimal integers is:

-70 -70 -70 56 112 56 70 112

Рис. 18. Чтение входных данных со спецификаторами преобразования целых чисел

 

При вводе чисел с плавающей точкой может быть использован любой из спецификаторов преобразования значений с плавающей точкой: е, Е, f, g или G. Программа на рис. 19 читает три числа с плавающей точкой с тремя видами спецификаторов преобразования и выводит их со спецификатором преобразования f. Обратите внимание, что результат исполнения программы подтверждает тот факт, что выведенные значения с плавающей точкой не являются точными. Об этом свидетельствует второе по счету напечатанное значение.

/* Чтение значений с плавающей точкой */

#include <stdio.h>

main () {

float a, b, c;

printf("Enter three floating-point numbers: \n");

scanf("%e%f%g", &a, &b, &c);

printf ("Here are the numbers entered in plain\n");

printf("floating-point notation:\n");

printf("%f %f %f\n", a, b, c);

return 0; }

Вывод на экран:

Enter three floating-point numbers:

1.27987 1.27987e+03 3.38476e-06

Here are the numbers entered in plain

floating-point notation

1.279870

1279.869995

0.000003

Рис. 19. Чтение входных данных со спецификаторами преобразования значений с плавающей точкой

Символы и строки вводятся с использованием спецификаторов преобразования соответственно с и s. Программа на рис. 20 предлагает пользователю ввести строку.

Программа считывает первый символ строки со спецификацией % с и сохраняет его в символьной переменной х; затем вводит оставшуюся часть строки со спецификацией %s и сохраняет ее в массиве символов у.

Последовательность символов можно ввести, используя набор сканирования. Набор сканирования — это список символов, заключенный в квадратные скобки [], следующий сразу за знаком процента в строке управления форматом. Набор сканирования просматривает символы во входном потоке, выбирая только те из них, которые содержатся в наборе символов. Каждый раз при совпадении символа он сохраняется в соответствующем аргументе набора сканирования. Аргумент — это указатель на массив символов. Набор сканирования прекращает читать символы после того, как встречается символ, не содержащийся в наборе. Если уже первый символ входного потока не соответствует ни одному из символов набора, то в массиве сохраняется только нулевой символ. Программа на рис. 9.21 использует набор символов сканирования [aeiou] для отбора гласных из входного потока. Обратите внимание, что считываются только первые семь введенных символов. Восьмой символ (h) не содержится в заданном наборе и ввод завершается.

 

 /* Чтение символов и строк */

# include < stdio. h >

main ()

{

char x, у [9];

printf("Enter a string: ");

scanf("%c%s", &x, y);

printf ("The input was:\n");

printf ("the character \"%c\" ", x);

printf ("and the string \"%s\"\n", y);

return 0;}

 

Вывод на экран:

Enter a string: Sunday

The input was:

the character "S" and the string "unday"

Рис. 20. Ввод символов и строк

 /* Применение набора сканирования */

#include <stdio.h>

main ()

 {

char z [ 9 ];

printf ("Enter a string: ");

scanf ("%[aeiou] ", z);

printf ("The input was \"%s\"\n", z);

return 0;}

Вывод на экран:

Enter a string: ooeeooahah

The input was "ooeeooa"

Рис. 21. Применение набора сканирования

Набор сканирования можно также использовать для ввода символов, не содержащихся в заданном списке, если применить инвертированный набор сканирования. Чтобы инвертировать набор символов, поместите символ " в квадратные скобки перед первым символом набора. В этом случае в массиве будут сохраняться только те символы, которые не входят в набор. Инвертированный набор завершает ввод после появления во входном потоке символа, который имеется в наборе. Программа на рис. 22 использует набор ["aeiou] для поиска во входном потоке символов, не являющихся гласными.

Для чтения определенного числа символов из входного потока со спецификацией преобразования scanf может использоваться значение ширины поля. Программа на рис. 23 читает ряд последовательных цифр как целое число с двумя десятичными разрядами и целое число, состоящее из остатка цифр входного потока.

 

/* Применение инвертированного набора сканирования */

# include < stdio. h >

main ()

{

char z [ 9 ];

printf ("Enter a string: ");

scanf ("% [^aeiou]", z);

printf ("The input was \"%s\"\n", z);

return 0;}

 

Вывод на экран:

Enter a string: String

The input was "Str"

Рис. 22. Применение инвертированного набора сканирования

 

/* Ввод данных с заданием ширины поля */

#include <stdio.h>

main () {

int x, у;

printf("Enter a six digit integer: ");

scanf("%2d%d", &x, &y);

printf("The integers input were %d and %d\n", x, y);

return 0;

}

Вывод на экран:

Enter a six digit integer: 123456

The integers input were 12 and 3456

Рис. 23. Ввод данных с заданием ширины поля

Часто бывает необходимо пропустить некоторые символы входного потока. Например, дата могла бы быть введена как

7-9-91

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

scanf ("%d-%d-%d", &month, &day, &year);

Хотя scanf и устраняет тире в предыдущем примере, дата может быть введена и в следующем формате:

7/9/91

В этом случае предыдущий оператор scanf не пропустил бы ненужные символы.

По этой причине scanf имеет возможность установить символ подавления присваивания* (звездочка). Символ подавления присваивания дает возможность scanf читать любой тип данных и отбрасывать их, не присваивая переменной. Программа на рис. 9.24 использует символ подавления присваивания в спецификации преобразования %с для указания того, что символ, появляющийся во входном потоке, должен быть прочтен и отброшен. Сохраняются только значения месяца, дня и года. Для демонстрации корректности ввода программа печатает введенные значения. Обратите внимание, здесь нет таких переменных в списке аргументов, которые соответствовали бы спецификациям преобразования с символом подавления присваивания, поскольку для этих спецификаций преобразования присваивание не выполняется.

/* Чтение и отбрасывание символов из входного потока */

#include <stdio.h>

main () {

int monthl, day1, year1, month2, day2, year2;

printf("Enter a date in the form mm-dd-yy: ");

scanf("%d%*c%d%*c%d", &month1, &day1, &year1);

printf("month = %d day = %d year = %d\n\n", month1, day1, year1);

printf ("Enter a date in the form mm/dd/yy: ");

scanf("%d%*c%d%*c%d", &month2, &day2, &year2);

printf("month = %d day = %d year = %d\n", month2, day2, year2);

return 0;. }

Вывод на экран:

Enter a date in the form mm-dd-yy: 11-18-71 month = 11 day = 18 year = 71

Enter a date in the form mm/dd/yy: 11/18/71 month = 11 day = 18 year = 71

Рис. 24. Чтение и отбрасывание символов из входного потока

Порядок выполнения работы

1. Изучите теоретический материал.

2. Напишите программу, согласно заданному в варианте задания условию.

3. Ответьте на контрольные вопросы.

 

ВАРИАНТЫ ЗАДАНИЙ

Вариант 1

Выполните следующие задания, написав оператор printf или scanf:

· Напечатайте целое значение без знака 40000, с выравниванием по левому краю поля шириной 15 позиций и содержащее 8 цифр.

· Введите шестнадцатеричное значение в переменную hex.

· Напечатайте значение 200 со знаком и без знака.

· Напечатайте значение 100 в шестнадцатеричном формате с префиксом Ох.

· Введите символы в массив s пока во входном потоке не встретится буква р.

· Напечатайте значение 1.234 в поле из 9 цифр с заполняющими нулями.

· Введите время в формате hh:mm:ss, запоминая численные значения в целых переменных hour, minute и second и отбрасывая двоеточия (:) из входного потока. Используйте символ подавления присваивания.

· Введите строку «characters» из стандартного входного устройства. Сохраните строку в массиве символов s. Отбросьте кавычки из входного потока.

· Введите время в формате hh:mm:ss, запоминая численные значения в целых переменных hour, minute и second и отбрасывая двоеточия (:) из входного потока. Не используйте символ подавления присваивания.

Вариант 2

Покажите, что печатают следующие операторы. Если в операторе имеется ошибка, укажите, почему.

a) printf("%-10d\n", 10000);

b) printf("%c\n", "This is a string");

c) printf("%*.*lf\n", 8, 3, 1024.987654);

d) printf("%#o\n%#X\n%#e\n", 17, 17, 1008.83689);

e) printf ("% ld\n% + ld\n", 1000000, 1000000);

f) printf("%10.2E\n", 444.93738);

g) printf ("%10.2g\n", 444.93738); h) printf ("%d\n", 10.987);

 

Вариант 3

Найдите ошибки в следующих фрагментах программ. Объясните,
как их можно исправить.

a) printf("%s\n", 'Happy Birthday');

b) printf ("%c\n", 'Hello');

c) printf("%c\n", "This is a string");

d) Следующий оператор должен напечатать «Bon Voyage»

printf(""%s"", "Bon Voyage");

e) char day[] = "Sunday"; printf("%s\n", day[3]);

f) printf('Enter your name: ');

g) printf (%f, 123.456);

h) Следующий оператор должен напечатать символы 'О' и 'К'.

printf("%s%s\n", 'О', 'К');

i) char s [10];

scanf("%c", s[7]);

Вариант4

Напишите программу, которая заполняет массив number из 10-ти элементов случайными целыми числами в диапазоне от 1 до 1000. Программа должна вывести каждое значение и текущее общее количество выведенных символов. Для этого используйте cпецификацию преобразования %п, чтобы определить число выводимых символов
для каждого текущего случайного значения. Каждый раз при печа-
ти текущего случайного значения печатайте общее число символов
для всех выведенных значений, включая текущее. Вывод должен
иметь следующий формат:

Value Total characters

342 3

1000      7

963 10

6   11

и т.д.

Вариант 5

Напишите программу для проверки различия между спецификато-
рами преобразования %d и %i при использовании их в операторе
scanf. Для ввода и вывода значений используйте операторы

scanf("%i%d", &x, &y);

printf("%d %d\n", x, у);

Проверьте программу со следующим набором входных данных:

10 10

-10 -10

010 010

0x10 0x10

Вариант 6

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

Вариант 7

Напишите программу для проверки результатов вывода целого зна­чения 12345 и значения с плавающей точкой 1.2345 в полях разной ширины. Что происходит, когда значения выводятся в поле, содер­жащее меньше цифр, чем выводимые значения?

Вариант 8

Напишите программу, которая печатает значение 100.453627, округленное до ближайшего целого, до десятых, сотых, тысячных и до десятитысячных.

Вариант 9

Напишите программу, которая вводит строку с клавиатуры и определяет ее длину. Напечатайте строку в поле с шириной, равной удвоенной длине строки.

Вариант 10

Напишите программу, которая преобразует целые значения температуры в шкале Фаренгейта в диапазоне от 0 до 212 градусов в значения температуры с плавающей точкой в шкале Цельсия с точностью 3 цифры. Для вычислений используйте формулу

celcius = 5.0 / 9.0 * (fahrenheit - 32); Результат должен быть напечатан в два столбца шириной 10 символов с выравниванием по правому краю. Перед значением температуры в шкале Цельсия должен выводиться знак как для отрицательных температур, так и для положительных.

Вариант 11

Напишите программу для проверки всех esc-последовательностей, приведенных на рис. 9.16. Для тех из них, которые перемещают курсор, напечатайте любой символ как до, так и после вывода esc-последовательности, чтобы было видно, куда переместился курсор.

Вариант 12

Напишите программу, которая выясняет, можно ли вывести в операторе printf символ? как литеральный символ, являющийся частью строки управления форматом, или нужно использовать esc-no-следовательность \?.

Вариант 13

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

Вариант 14

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

Вариант 15

В некоторых языках программирования при вводе строк необходимо использовать одинарные или двойные кавычки. Напишите програм­му, которая читает три строки: suzy, «suzy» и ' suzy '. Игнорируются ли те и другие кавычки при вводе в языке С или они читаются как часть строки?

Вариант 16

Напишите программу, которая выясняет, можно ли со спецификато­ром преобразования %с в строке управления форматом оператора printf вывести символ? как символьную константу — '?', или нуж­но использовать символьную константу esc-последовательности '\?'.

Вариант 17

Напишите программу, которая использует спецификатор преобразо­вания g для вывода значения 9876.12345. Напечатайте значение с точностью, изменяющейся от 1 до 9.                       

Форма отчёта: отчет выполняется в текстовом редакторе в электронном виде.

Содержание отчета:

1. Тема работы.

2. Цель работы.

3. Выполненные задания.

 

Система оценки: пятибальная.


Контрольные вопросы

1. Заполните пропуски в каждом из следующих утверждений.

а) Весь ввод и вывод организован в виде _________.

b) _______поток обычно подключен к клавиатуре.

с) ______ поток обычно подключен к экрану компьютера.

d) Форматированный вывод выполняется функцией _________

e) Строка управления форматом может содержать _____, _____

 и __________.

f) Спецификаторы преобразования ___ и ___используются для вывода десятичного целого со знаком.

g) Спецификаторы преобразования _____ и _____ используются для вывода целых без знака в восьмеричном, десятичном и шестнадцатеричном форматах соответственно.

h) Модификаторы _____ и ______ помещаются перед спецификаторами преобразования целых для вывода целых значений типа short или long.

i) Спецификатор преобразования _____используется для вывода значений с плавающей точкой в экспоненциальной нотации.

j) Модификатор _______ помещается перед любым спецификатором преобразования значений с плавающей точкой для вывода значений типа long double.

к) Спецификаторы преобразования е, Е и f выводят значение с точностью, равной ___________ цифрам справа от десятичной точки, если точность представления не указана.

l) Спецификаторы преобразования ____ и ____ используются для вывода соответственно строк и символов.

m) Все строки заканчиваются символом __________.

n) Ширина поля и точность представления в спецификации преобразования функции printf могут задаваться целочисленным выражением при подстановке ________ в качестве значения ширины поля или значения точности и при включении этого целочисленного выражения в список аргументов функции.

о) Флаг _________ выравнивает выводимое значение по левому краю поля.

р) Флаг _________выводит значение вместе со знаком «плюс» или знаком «минус».

q) Ввод с контролем формата выполняется функцией ________.

r) Для чтения заданных символов из потока и сохранения их в массиве символов используется _______.

s) Спецификатор преобразования _______ может использоваться для ввода восьмеричных, десятичных и шестнадцатеричных целых с необязательным знаком.

t) Спецификатор преобразования _______ может использоваться для ввода значений типа double.

u) __________используется для чтения данных их входного потока и отбрасывания их без присваивания переменной.

v) Чтобы показать, что из входного потока должно быть введено определенное число символов или цифр, в спецификации преобразования scanf может использоваться _____________.

2. Найдите ошибку в следующих операторах и объясните, как ее можно исправить.

a) Следующий оператор должен напечатать символ 'с ’:

printf ("%s\n", 'с');

b) Следующий оператор должен напечатать 9.375%:

printf("%.3f%", 9.375);

c) Следующий оператор должен напечатать первый символ строки «Monday»

printf ("%c\n", "Monday");

d) printf(""A string in quotes"");

e) printf(%d%d, 12, 20);

f) printf("%c", "x");

g) printf ("%s\n", 'Richard');

3. Напишите операторы для выполнения следующих действий:

a) Напечатать 1234 с выравниванием по правому краю поля шириной 10 позиций.

b) Напечатать 123.456789 в экспоненциальной нотации со знаком (+или -) и с точностью 3 разряда.

c) Ввести в переменную number значение типа double.

d)Напечатать 100 в восьмеричном формате с префиксом 0.

e) Ввести строку в массив символов string.

f) Ввести символы в массив п до первого встретившегося символа, не относящегося к цифрам.

g) Используйте целые переменные х и у для задания ширины поля и точности представления при выводе значения 87.4573 типа double.

h) Введите значение в виде 3.5%. Сохраните число в переменной percent типа float, отбросив при вводе символ % из входного пото­ка. Не используйте символ подавления присваивания.

i) Напечатайте 3. 333333 как значение типа long double со знаком (+или-) в поле шириной 20 символов и с точностью 3.

Список использованной литературы

1. Х.Дейтел Как программировать на C; Пер. с англ. под ред. В. Тимофеева. - М.: БИНОМ, 2000. - 1005 с.: ил.; 24

2. Язык программирования С / Брайан Керниган, Деннис Ритчи; [пер. с англ. и ред. В. Л. Бродового]. - 2-е изд., перераб. и доп. - Москва [и др.]: Вильямс, 2007. - 289 с.; 23 см.

3. Бьерн Страуструп Язык программирования C++; Пер. с англ. С. Анисимова и М. Кононова под ред. Ф. Андреева, А. Ушакова. - 3. изд. - М.: Binom Pablishers; СПб.: Нев. диалект, 2004. - 990 с.: ил.; 24 см.

 

ПРАКТИЧЕСКОЕ ЗАНЯТИЕ 7


Поделиться с друзьями:

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

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.138 с.