Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

programmirovanie / ОПиАЯ_№3_2_слайдыы

.doc
Скачиваний:
32
Добавлен:
03.03.2016
Размер:
76.29 Кб
Скачать

3.2 Операторы CИ

3.2.1 Операторы Ввода\вывода в Си

Файл заголовков <conio.h> содержит определение функции очистки экрана

clrscr(); .

Форматная передача данных.

Форматный ввод с клавиатуры выполняет функция scanf(). Ее прототип в файле <stdio.h>.

С ее помощью вводятся данные любых типов: числа, символы и строки. Имя функции (от англ. Scan formatted characters) отражает ее назначение — функция сканирует посматривает клавиатуру, определяя, какие клавиши нажаты, а затем интерпретирует ввод, основываясь на форматах (дескрипторах преобразований).

Общий вид вызова функции следующий:

scanf("список форматов", &v1, &v2, ..., &vn);

Здесь символ & является операцией получения адреса. Она устанавливает, что в настоящий момент нужен адрес области памяти, зарезервированной для переменной Vi (i =1, 2,…,n), а не значение переменной, хранящееся в этой области.

Операция & не используется со строковыми переменными, так как Си-строка — массив символов.

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

Формат, используемый при вводе, имеет вид

%форматный код

Форматные коды, для ввода целых данных:

d, ld — для int или long десятичных чисел;

Форматными кодами для веществ. данных:

f, lf, — для float, double чисел с фиксированной точкой (соответственно);

e, le,— для float, double чисел с плавающей точкой (соответственно);

Форматный код символьных данных есть c. Он определяет, что читается один символ.

Форматный код строковых данных s означает, что читаются символы, пока не встретится символ "новая строчка \n или пробел.

Функция scanf() принимает с клавиатуры все символы до нажатия клавиши (Enter) и помещает их в буфер. Затем по списку форматов определяется способ преобразования символов, причем данное, преобразованное в соответствии с первым форматом, помещается по адресу переменной v1, т. e. &v1; данное, обработанное по второму формату, помещается по адресу v2, т. e. &v2, и т. д.

ПРИМЕР:

#include <conio.h>

#include <stdio.h>

main ()

{ double X, Z;

scanf ("%lf %lf ", &X, &Z);

printf("%lf %lf ", X, Z,);

getch();

}

Вводимая строка не должна содержать пробелов, потому что по формату %s функция scanf() передает все символы строки до первого разделителя, в том числе и пробела. Оставшиеся в буфере символы будут поступать в программу при следующих обращениях к функции (что может не входить в наши планы). По этой причине перед очередным обращением к функции scanf() следует посредством функции fflush(stdin) выполнить очистку буфера (scanf() не слишком удобна для ввода строк; далее функции gets() и getline()). Заметим еще, что компилятор все символы после знака % до первого разделителя считает форматным кодом. Можно ошибиться при его записи, и тогда данные, формат которых не соответствует ожидаемому (написанному в списке форматов), игнорируются, и они остаются в буфере. Здесь снова может оказаться полезной функция очистки буфера.

Форматный вывод производит функция printf() :

printf("списокформатов", v1, v2, ..., vn);

где v1, v2, ..., vn целочисленные, вещественные, символьные, строковые или "логические" выражения.

Теперь формат имеет следующий вид:

%[флажок][w][, d] форматный код

здесь флажок есть знак (тогда преобразованное данное выравнивается влево в поле вывода ширины и справа от данного могут появиться пробелы; выравнивание вправо — по умолчанию), и/или знак + (тогда для положительных чисел выводится знак +), и/или пробел (тогда перед положительным числом выводится пробел). Знак минус для отрицательных чисел выводится всегда, и/или # для восьмеричных и шестнадцатеричных чисел; для десятичных чисел d=0 обеспечивает вывод точки. Параметр w задает минимальную ширину поля вывода в w символов (если ширина недостаточна, данное выводится полностью). Параметр d определяет число цифр после точки для кодов f, lf, е, le или число значащих цифр для кодов g, lg (при d = 0 точка не выводится; по умолчанию d= 6).

Список форматов может содержать управляющие символы, пробелы и другие символы, поясняющие выводные данные (они воспроизводятся на экране; если нужен знак процента, то его следует набрать как %%, а двойную кавычку — как \").

Длинный список форматов можно разбить на части таким образом:

"список форматов ~ 1"

"список форматов ~2"

"список форматов n"

ПРИМЕР:

#include <stdio.h>

main ()

double Х = 1.234567е2;

printf("\n X=%8.41f "

"\n X=%5.01f “, Х,X);

Форматирование чисел при выводе.

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

Форматирование величин типа int.

Форматированный ввод целых величин в языке Си достаточно прост. Все, что требуется сделать – это добавить число между символами % и d в спецификаторе формата %d для целого в форматной строке функции printf. Число определяет, сколько позиций будет использовано разрядами выводимого числа или ширину поля. Например, выражение

printf (“Result: %3d meters = %4d ft/ %2d in.\n, meters gm sm)

означает, что 3 позиции будут отведены для вывода первой переменной в списке печати (meters), 4 позиции для второй переменной(gm), и 2 позиции для третьей(sm) переменной, которая в данном случае всегда будет иметь значение между 0 и 9. Если meters = 21, gm = 210, а sm = 0 программа выведет:

Result: 21 meters = 210 ft. 0 in.

Обратите внимание, что в этой строке имеется один лишний пробел перед значением meters(21) и один лишний пробел перед величиной gm. Дело в том, что спецификатор формата для meters(%d3) отводит место для 3 разрядов. Если значение meters между 10 и 99, эти два разряда печатаются с правым выравниванием, оставляя впереди пробел. Аналогично, поскольку спецификатор gm(%4d) отводит место для 4 разрядов, при печати трёхзначного числа, выровненного вправо, при выводе напечатается один лишний пробел. Мы можем использовать спецификацию %2d для вывода любого целого числа в интервале от-9 до 99. Спецификатор %4d работает с величинами в диапазоне -999 до 9999. В случае отрицательных величин, знак минус включается в число выводимых разрядов.

Число

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

Результат печати

234

%4d

_234

234

%5d

_ _234

234

%6d

_ _ _234

-234

%4d

-234

-234

%5d

_-234

-234

%5d

_ _-234

234

%2d

234

234

%1d

234

-235

%2d

-234

Форматирование величин типа float.

При описании спецификации формата для величины типа float, нужно указать как общую ширину поля, так и число разрядов после десятичной точки. Общая ширина поля должна быть достаточной для размещения всех разрядов, как до, так и после десятичной точки. Перед десятичной точкой должен быть, по крайней мере, один разряд, поскольку нуль печатается как целая часть числа, меньшего 1.0 и большего -1.0. Одну позицию также надо оставить для десятичной точки, а для отрицательных чисел – ещё и для знака минус. Общий вид необходимого спецификатора формата будет %n.mf, где n представляет общую ширину поля, а m – требуемое число разрядов после десятичной точки.

Если х – переменная типа double со значениями в интервале -99,99 до 999,99, мы можем использовать спецификатор %6.2f для отображения числа х с точностью до двух знаков после точки. В таблице показано, как с такой спецификацией будут выводиться различные значения х.

Х

Результат печати

-99,42

-99,42

0,123

_ _0,12

-9,536

_-9,54

-25,554

-25,55

99,999

100.00

999,4

999.40

При округлении до двух знаков, если третий разряд дробной части 5 или более, второй разряд увеличивается на 1 (-9.536 становится -9.54) В противном случае, цифры после второго разряда дробной части просто отбрасываются (-25,554 становится -25,55).

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

Значение

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

Результат вывода

3,14159

%5.2f

_3,14

3,14159

%4.2f

3,14

3,14159

%3.2f

3,14

3,14159

%5.1f

_ _3,1

3,14159

%5.3f

3,142

3,14159

%8.5f

_3,14159

3,14159

%.4f

3,1416

0,1234

%4.2f

0,12

-0,006

%4.2f

-0,01

-0,006

%.4f

-0,0060

-0,006

%8.5f

-0,0060

-0,006

%8.3f

_ _-0,006

Как видно из таблиц, значения, у которых полное число разрядов меньше чем указано в спецификаторе формата, выводятся с лидирующими пробелами. Для исключения лидирующих пробелов опустите общую половину поля в спецификаторе. Простой спецификатор %.d выводит целое без лидирующих пробелов. Спецификатор вида %.mf дает тот же эффект для величин типа double, и в тоже время такой спецификатор позволяет выбрать желаемое число разрядов после десятичной точки.

Соседние файлы в папке programmirovanie