Лекция №3 Структура программы. Стандартный ввод и вывод Схема подготовки исполняемой программы Исходный текст на Си (файлы *.c) Препроцессор Компилятор Объектный код программы (файлы *.obj) Заголовочные файлы (файлы *.h) Компоновщик (Linker) Библиотеки (файлы *.lib) Исполняемая программа (файл .exe) Подключение заголовочных файлов #include <имя-файла> Поиск файла происходит в каталогах библиотек #include "имя файла" Поиск файла происходит в текущем каталоге, затем в каталоге библиотек Пример: #include <stdio.h> Стандартный ввод/вывод Библиотека ввода/вывода: stdio.h (standard input/output) #include <stdio.h> Стандартный ввод – ввод с клавиатуры Стандартный вывод – вывод на экран Форматированный вывод Функция форматированного вывода: printf(<форматная строка> [, <список аргументов>]) Пример простейшего использования printf: #include <stdio.h> void main( ) { printf("Hello, World!\n"); } Форматированный вывод Форматная строка состоит из символов и спецификаторов преобразования: printf("Amount= %d, summa=%f", n, s); Обычные символы Результат: Amount= 4, summa=12.34 Спецификатор преобразования Форматированный вывод Общий вид спецификатора преобразования: %[флаги][<ширина>][.<точность>][<модификатор>]<тип> Пример: printf("%-8.2lf“, (double) 3.14159265359); Результат: 3.14 Печать символа «%» на экран: printf("GMP increase: %.1f%%", 6.2); Результат: GMP increase: 6.2% Форматированный вывод Основные спецификаторы типа Символ Тип аргумента Вид печати d,i int знаковая десятичная запись o unsigned int беззнаковая восьмеричная запись x, X unsigned int беззнаковая шестнадцатеричная запись u unsigned int Беззнаковое десятичное целое c int Единичный символ s char * Строка (последовательность символов) f double Запись вида: [-]dddd.dddd e, E double Запись вида: [-]d.dddde[знак]ddd (экспоненциальная форма) Форматированный вывод Основные спецификаторы типа Пример #1: float c = 48.3; int k = -83; float e = 16.33; printf("c=%5.2f k=%5d e=%8.2f e=%11.4e", c, k, e, e); Результат: c=48.30 k= -83 e= 16.33 e= 1.6330e+01 Пример #2 int x = 95; printf("x=%d x=%x(hex) x=%X(HEX) x=%o(oct)", x, x, x, x); Результат: x=95 x=5f(hex) x=5F(HEX) x=137(oct) Форматированный вывод Ширина поля – целое положительное число, определяющее длину (в позициях) представления вводимого значения Точность – целое положительное число, определяющее количество цифр, выводимых после запятой. Пример: float c = 48.3; int k = -83; float e = 16.33; printf("c=5.2f k=%5d e=%8.2f Результат: c=48.30 k= 16.33 -83 e= e=%11.4e", c, k, e, e); e= 1.6330e+01 Форматированный вывод Модификатор – определяет размер аргумента Пример: long max = 2147483647; printf("Long max=%ld", max); Модификатор Значение h Аргумент печатается как short l (строчная L) Аргумент печатается как long L Аргумент печатается как long double Форматированный вывод Флаги Символ Значение - указывает на то, что преобразованный аргумент должен быть прижат к левому краю поля; + предписывает печатать число всегда со знаком; пробел если первый символ - не знак, то числу должен предшествовать пробел 0 указывает, что числа должны дополняться слева нулями до всей ширины поля # указывает на одну из следующих форм вывода: для o первой цифрой должен быть 0; для x или X ненулевому результату должны предшествовать 0x или 0X; для e, E, f, g и G вывод должен обязательно содержать десятичную точку Форматированный вывод Флаги Пример #1: int a = 48; int b = 1234; int c = 55; int d = 3; printf("%-5d|%5d|%+5d|%0+5d|", a,b,c,d); Результат: 48 | 1234| +55|+0003| Пример #2 int x = 95; printf("x=%#x(hex) x=%#X(HEX) x=%#o(oct)", x, x, x); Результат: x=0x5f(hex) x=0X5F(HEX) x=0137(oct) Форматированный ввод Функция форматированного ввода: scanf(<форматная строка> , <список аргументов>) В форматную строку могут входить: • пробелы и табуляции, которые игнорируются; • обычные символы (кроме %); • спецификации преобразования; Общий вид спецификатора преобразования %[*][<ширина>] <тип> Ширина поля – целое число, определяющее максимальную ширину поля. «*» - игнорирование (пропуск) данного аргумента. Форматированный вывод Основные спецификаторы типа Символ Тип аргумента Вид печати d int Десятичная запись i int Целое (восьмеричное с нулем слева или шестнадцатиричное с «0x» слева) o unsigned int Восьмеричное (с нулем слева или без) x unsigned int Шестнадцатиричное целое (с «0x» слева или без) u unsigned int Беззнаковое десятичное целое c int Единичный символ s char * Строка (последовательность символов) e,f,g float Число с плавающей точкой (в виде десятичной или экспоненциальной форме) Форматированный ввод Пример: int a,b; float f; scanf("%d %i %f", &a, &b, &f); Ввод и вывод символов Вывод символа: putchar(<символ>) Ввод символа: getchar() Пример: #include <stdio.h> void main() { char c; c = getchar(); putchar(c); putchar('\n'); } Ввод и вывод строк Вывод строки: puts(<строка>) Пример: puts("Hello, world"); Ввод строки: gets(<строка>) Пример: char s[50]; gets(s);