- •Материалы для подоговки к экзамену по дисциплине «основы программировния»
- •Тема №1 Основные понятия
- •Способы записи алгоритма
- •Тема №2 Переменные
- •Типы переменных
- •Типы с плавающей точкой
- •Переполнение переменных
- •Постфиксное обозначение типа
- •Шестнадцатеричный и восьмеричный формат
- •Экспоненциальная форма представления чисел
- •Объявление переменных
- •Начальное значение переменной
- •Область видимости переменной
- •Тема №3 Оператор присваивания
- •Ввод-вывод Форматированный вывод
- •Форматированный ввод
- •Непечатные символы
- •Тема №4 Ветвления и логические операторы
- •Оператор Switch
- •Логические операторы
- •Логическое отрицание
- •Логическое и
- •Логическое или
- •Пример: закон де-Моргана.
- •Порядок выполнения логических операторов
- •Тема №5 Циклы
- •Цикл с предусловием
- •Циклы с постусловием
- •Цикл for
- •Вложенные циклы
- •Тема №6 Одномерные массивы
- •Начальная инициализация массива.
- •Размер массива
- •Переполнение массива
- •Пример с одномерным массивом
- •Многомерные статические массивы
- •Пример с многомерным массивом
- •Тема №7 Строки в си. Введение
- •Чтение строк
- •Указатели
- •Определение
- •Арифметика указателей
- •Указатель на указатель
- •Указатели и приведение типов
- •Null pointer - нулевой указатель
- •Пример работы с указателями
- •Тема №8 Указатели и массивы
- •Многомерные массивы и указатели на многомерные массивы
- •Определение макросов
- •Тема №9 Тернарный оператор и оператор запятая
- •Оператор запятая.
- •Сегментация приложения на си
- •Тема №10 Динамическое выделение памяти
- •Освобождение памяти с помощью free
- •Работа с двумерными и многомерными массивами
- •Тема №11 Параметры командной строки
- •Функции
- •Параметры и аргументы
- •Передача аргументов По значению
- •По указателю (ссылке)
- •Передача массива в качестве аргумента
- •Тема №12 Битовые операции
- •Операции побитового сдвига
- •Примеры
- •Вопросы к экзамену по дисциплине «Основы программирования»
Ввод-вывод Форматированный вывод
Сегодня мы рассмотрим две важные функции форматированного ввода и вывода. Устройство и работу этих функций полностью можно понять только после изучения работы с указателями и функций с переменным числом параметров. Но пользоваться этими функциями необходимо уже сейчас, так что некоторые моменты придётся пропустить.
Функция форматированного вывода printf получает в качестве аргументов строку формат и аргументы, которые необходимо вывести в соответствии с форматом, и возвращает число выведенных символов. В случае ошибки возвращает отрицательное значение и устанавливает значение ferror. Если произошло несколько ошибок, errno равно EILSEQ (Ошибочная последовательность байтов).
int printf (const char * format, ...);
#include <stdio.h>
#include <conio.h>
void main() {
//функция не получает никаких аргументов, кроме строки
printf("Hello world");
getch();
}
Функция проходит по строке и заменяет первое вхождение %<спецификатор формата> на первый аргумент, второе вхождение %<спецификатор формата> на второй аргумент и т.д. Далее мы будем просто рассматривать список флагов и примеры использования.
Общий синтаксис спецификатора формата
%[флаги][ширина][.точность][длина]спецификатор
Спецификатор – это самый важный компонент. Он определяет тип переменной и способ её вывода.
Спецификатор |
Что хотим вывести |
Пример |
d или i |
Целое со знаком в десятичном виде |
392 |
u |
Целое без знака в десятичном виде |
7235 |
o |
Беззнаковое в восьмеричном виде |
657 |
x |
Беззнаковое целое в шестнадцатеричном виде |
7fa |
X |
Беззнаковое целое в шестнадцатеричном виде, верхний регистр |
7FA |
f или F |
Число с плавающей точкой |
3.4563745 |
e |
Экспоненциальная форма для числа с плавающей точкой |
3.1234e+3 |
E |
Экспоненциальная форма для числа с плавающей точкой, верхний регистр |
3.1234E+3 |
g |
Кратчайшее из представлений форматов f и e |
3.12 |
G |
Кратчайшее из представлений форматов F и E |
3.12 |
a |
Шестнадцатеричное представление числа с плавающей точкой |
-0xc.90fep-2 |
A |
Шестнадцатеричное представление числа с плавающей точкой, верхний регистр |
-0xc.90FEP-2 |
c |
Буква |
a |
s |
Строка (нуль-терминированный массив букв) |
Hello World |
p |
Адрес указателя |
b8000000 |
n |
Ничего не пачатает. Аргументом должен быть указатель на signed int. По этому адресу будет сохранено количество букв, которое было выведено до встречи %n |
|
% |
Два идущих друг за другом процента выводят знак процента |
% |
Примеры
#include <stdio.h>
#include <conio.h>
void main() {
int a = 0x77, b = -20;
char c = 'F';
float f = 12.2341524;
double d = 2e8;
char* string = "Hello, World!";
printf("%s\n", string);
printf("a = %d, b = %d\n", a, b);
printf("a = %u, b = %u\n", a, b);
printf("a = %x, b = %X\n", a, b);
printf("dec a = %d, oct a = %o, hex a = %x\n", a, a, a);
printf("floating point f = %f, exp f = %e\n", f, f);
printf("double d = %f or %E\n", d, d);
printf("not all compiler support %a\n", f);
printf("character c = %c, as number c = %d", c, c);
printf("address of string is %p", string);
getch();
}
Строка формата также может включать в себя следующие необязательные суб-спецификаторы:
флаг,
ширина,
.точность и
модификатор (именно в таком порядке).
Флаг |
Описание |
- |
Выключка влево на заданное шириной значение |
+ |
Явно указывать знак у числа, даже для положительных чисел |
(пробел) |
Если знак не будет выведен, то вставляет пробел перед выводимым числом |
# |
Когда используется вместе с o, x или X, вставляет перед числом 0, 0x или 0X. Когда используется со спецификаторами a, A, e, E, f, F, g или G, вставляет десятичную точку, даже если после неё нет десятичных знаков |
0 |
Вставляет нули, когда объявлен спецификатор ширины |
Ширина |
Описание |
(число) |
Минимальное количество знаков, которое необходимо вывести. Если в числе меньше знаков, то вставляет пробелы (или нули) |
* |
Ширина не указана в строке формата, она передаётся отдельно в виде аргумента, который должен предшествовать выводимому числу |
Точность |
Описание |
.число |
Для спецификаторов целых (d, i, o, u, x, X) точность определяет минимальное количество знаков, которое необходимо вывести. Если значение короче, то выводятся нули перед числом. Значение не обрезается, даже если оно длиннее. Точночть 0 означает, что для значения 0 ничего не выводится. Для спецификаторов чисел с плавающей точкой (a, A, e, E, f, F) это число знаков, которые необходимо вывести после десятичной точки (по умолчанию 6). Для g и G - это число значащих разрядов, которые необходимо вывести. Для s - выводится указанное число символов. По умолчанию выводятся все символы до первого нулевого. Если число не стоит, то по умолчанию точность равна 0 |
.* |
Точность не указана в строке формата, она передаётся отдельно в виде аргумента, который должен предшествовать выводимому числу |
Примеры
#include <stdio.h>
#include <conio.h>
void main() {
int a = 0x77, b = -20;
char c = 'F';
float f = 12.2341524;
double d = 2e2;
char* string = "Hello, World!";
printf("%.3f\n", f);
printf("%.*f\n", 2, f);
printf("%010.3f\n", d);
printf("%*d\n", 6, a);
printf("%+d\n", b);
printf("%0.6d\n", a);
printf("%.f\n", d);
printf("%.4s", string);
getch();
}
Суб-спецификатор длины изменяет длину типа. В случае, если длина не совпадает с типом, по возможности происходит преобразование до нужного типа.
|
Спецификаторы |
||||||
Длина |
d, i |
u o x X |
f F e E g G a A |
c |
s |
p |
n |
(none) |
int |
unsigned int |
double |
int |
char* |
void* |
int* |
hh |
signed char |
unsigned char |
|
|
|
|
signed char* |
h |
short int |
unsigned short int |
|
|
|
|
short int* |
l |
long int |
unsigned long int |
|
wint_t |
wchar_t* |
|
long int* |
ll |
long long int |
unsigned long long int |
|
|
|
|
long long int* |
j |
intmax_t |
uintmax_t |
|
|
|
|
intmax_t* |
z |
size_t |
size_t |
|
|
|
|
size_t* |
t |
ptrdiff_t |
ptrdiff_t |
|
|
|
|
ptrdiff_t* |
L |
|
|
long double |
|
|
|
|
Примеры
#include <stdio.h>
#include <conio.h>
void main() {
long long x = 12300000000579099123;
short i = 10;
printf("%llu\n", x);
printf("%d\n", i);
printf("%hd\n", i);
getch();
}
