- •Происхождение языка с
- •Язык среднего уровня
- •Структурированный язык
- •Язык программирования
- •Компиляторы против интерпретаторов
- •Вид программ на с
- •Библиотеки и компоновка
- •Раздельная компиляция
- •Карта памяти с-программы
- •Переменные, константы, операторы и выражения
- •Идентификаторы
- •Типы данных
- •Модификаторы типов
- •Модификаторы доступа
- •Объявление переменных
- •Локальные переменные
- •Формальные параметры
- •Глобальные переменные
- •Спецификаторы хранения
- •Статические переменные
- •Статические локальные переменные
- •Статические глобальные переменные
- •Регистровые переменные
- •Оператор присваивания
- •Многочисленное присваивание
- •Преобразование типов при присваивании
- •Инициализация переменных
- •Константы
- •Символьные константы с обратным слэшем
- •Операторы
- •Арифметические операторы
- •Увеличение и уменьшение
- •Операторы отношения и логические операторы
- •Битовые операторы
- •Оператор ?
- •Операторы указания & и *
- •Оператор sizeof
- •Оператор «запятая»
- •Операторы [ ] u ()
- •Приоритеты в с
- •Выражения
- •Преобразование типов в выражениях
- •Принудительные преобразования
- •Пробелы и круглые скобки
- •Сокращенные операторы в с
- •Операторы управления программой
- •Истина и ложь в с
- •Операторы выбора
- •Вложенные if
- •Лесенка if-else-if
- •Оператор ?
- •Вложенные операторы switch
- •Вариации цикла for
- •Бесконечный цикл
- •Циклы for без тела
- •Метки и goto
- •Функции
- •Оператор return
- •Выход из функции
- •Возвращаемые значения
- •Значения, возвращаемые функцией main()
- •Правила видимости для функций
- •Аргументы функции
- •Передача по значению и передача по ссылке
- •Создание передачи по ссылке
- •Передача массивов в функции
- •Аргументы функции main()
- •Функции, возвращающие нецелые значения
- •Использование прототипов функции
- •Прототипы стандартных библиотечных функций
- •Создание прототипов функций, не имеющих параметров
- •Возврат указателей
- •Рекурсия
- •Сопоставление классического и современного объявления параметров
- •Указатели на функции
- •Особенности реализации
- •Параметризированные функции и функции общего назначения
- •Эффективность
- •Массивы
- •Одномерный массив
- •Создание указателя на массив
- •Передача одномерных массивов в функции
- •Двумерные массивы
- •Массивы строк
- •Многомерные массивы
- •Индексация с помощью указателей
- •Размещение массивов
- •Инициализация массива
- •Инициализация безразмерных массивов
- •Пример программы игры в крестики-нолики
- •Указатели
- •Указатели - это адреса
- •Переменные-указатели
- •Операторы для работы с указателями
- •Выражения с указателями
- •Присваивание указателей
- •Арифметические действия с указателями
- •Сравнение указателей
- •Динамическое выделение и указатели
- •Указатели на константы
- •Указатели на константы
- •Указатели на константы
- •Указатели и массивы
- •Указатели на символьные массивы
- •Массивы указателей
- •Указатели на указатели - многочисленное перенаправление
- •Инициализация указателей
- •Указатели на функции
- •Проблемы, связанные с указателями
- •Структуры, объединения и определяемые пользователем типы
- •Структуры
- •Доступ к членам структуры
- •Присваивание структур
- •Массивы структур
- •Программа инвентаризации
- •Передача структур в функции
- •Передача членов структур в функции
- •Передача всей структуры в функцию
- •Указатели на структуры
- •Объявление указателя на структуру
- •Использование указателей на структуру
- •Массивы и структуры в структурах
- •Битовые поля
- •Объединения
- •Перечисления
- •Использование sizeof для обеспечения переносимости
- •Ввод, вывод, потоки и файлы
- •Потоки и файлы
- •Текстовые потоки
- •Двоичные потоки
- •Консольный ввод/вывод
- •Чтение и запись символов
- •Чтение и запись строк: gets() и puts()
- •Форматированный консольный ввод/вывод
- •Печать символов
- •Вывод чисел
- •Вывод адресов
- •Спецификатор %n
- •Модификаторы формата
- •Спецификатор минимума ширины поля
- •Спецификатор точности
- •Выровненный вывод
- •Работа с другими типами данных
- •Модификаторы * u #
- •Спецификаторы формата
- •Ввод чисел
- •Ввод беззнаковых целых
- •Чтение отдельных символов с помощью scanf()
- •Чтение строк
- •Ввод адреса
- •Спецификатор %n
- •Использование множества сканирования
- •Пропуск нежелательных специальных символов
- •Обычные символы в управляющей строке
- •В scanf() следует передавать адреса
- •Модификаторы формата
- •Подавление ввода
- •Файловая система ansi с
- •Указатель на файл
- •Открытие файла
- •Запись символа
- •Чтение символа
- •Использование fopen(), getc(), putc() и fclose()
- •Использование feof()
- •Две расширенные функции: getw() и putw()
- •Работа со строками: fgets() и fputs()
- •Fseek() и произвольный доступ
- •Удаление файлов
- •Работа с консолью
- •Препроцессор и комментарии
- •Директивы условной компиляции
- •Использование defined
- •Операторы препроцессора # и ##
- •Предопределенные макросы
- •Комментарии
Консольный ввод/вывод
Консольный ввод/вывод относится к событиям, возникающим от клавиатуры или на экране. Поскольку ввод и вывод на консоль - это типичные операции, была создана подсистема файловой системы ввода/вывода ANSI С для работы исключительно с консолью. Эти функции направляют операции в стандартный ввод (stdin) и стандартный вывод (stdout) системы. Возможно перенаправить консольный ввод на другие устройства. Для простоты обсуждения предполагается, что консоль - это устройство, используемое стандартными способами.
|
ЗАМЕТКА: Ни С, ни С++ не предоставляют встроенную поддержку графического интерфейса пользователя, как Windows или Linux. При выполнении ввода или вывода в среде Windows или Linux требуется использование специальных функций, определенных в самой операционной системе. |
Чтение и запись символов
Простейшей из стандартных функций ввода/вывода на консоль является getchar(), читающая символ с клавиатуры, и putchar() печатающая символ на экран в текущей позиции курсора. Тем не неменее getchar() имеет некоторые существенные ограничения, описываемые ниже. Поэтому большую часть времени мы будем использовать getche(), когда будет потребность в чтении символа. Функцию getche() определила фирма Borland (в стандарте ANSI С ее нет). Хотя это довольно, типичное расширение, функция «может не поддерживаться в других средах. getche() ожидает нажатия клавиши, а затем возвращает значение. Нажатие клавиши также приводит к выводу символа на экран. Ниже показаны прототипы функций getche() и putchar(): int getche(void); int putchar(int cb); Функция getche() возвращает нажатый символ. Функция putchar() возвращает cb в случае успеха или EOF - в случае ошибки. (EOF - это макроопределение, находящееся в stdio.h, означающее конец файла.) Хотя cb объявлена как целое, на экран выводится только младший байт. Аналогично, хотя getche() возвращает целое, только младший байт будет содержать символ, введенный с клавиатуры. Функция getche() требует заголовочный файл conio.h.
Следующая программа вводит символы с клавиатуры и выводит их в противоположном регистре. То есть прописные буквы будут выведены строчными, а строчные - прописными. Программа останавливается при обнаружении точки. /* переключатель регистра */ #include <conio.h> #include <stdio.h> #include <ctype.h> int main(void) { char ch; do { ch = getche(); if(islower(ch)) putchar(toupper(ch)); else putchar (tolower(ch)); } while (ch!='.'); /* использование точки для остановки */ return 0; }
Существуют две важные альтернативы getche(). Первая - это getchar(), упомянутая ранее, являющаяся функцией ввода символов, определенная в ANSI С. Проблема, связанная с getchar(), заключается том, что она буферизирует ввод, пока не встретится возврат каретки. Причина этого заключается в системе ввода, реализованной в UNIX. В ней требуется ввести символ возврат каретки перед набором чего угодно, что требуется послать на компьютер. Для совместимости с UNIX многие компиляторы С включая Borland, имеют getchar() для такого ввода. Можно немного помучить данную функцию для лучшего понимания эффекта.
Следующей, более полезной вариацией getche() является getch(), которая действует подобно getche(), за тем исключением, что она не выводит символ на экран. Можно использовать этот факт для создания программ-розыгрышей ничего не подозревающих пользователей. Программа показанная ниже, выводит стандартную подсказку операционной системы и ожидает ввода. Каждый символ, вводимый пользователем, отображается следующей буквой алфавита. То есть «А» станет «В» и так далее. Для остановки программы нажмите CTRL-A. /* данная программа выглядит так же, как подсказка командной строки. Она выводит подсказку, но каждый введенный пользователем символ заменяется на следующий символ алфавита*/ #include <stdio.h> #include <conio.h> int main(void) { char ch; do { printf("С:\"); for(;;) { ch = getch(); /* чтение символов без эха */ if(ch=='\r' || ch==1) { printf("\n"); break; } putchar(ch+1); } } while(ch!=1); /* выход no control-A */ return 0; }
Хотя эта программа не имеет никаких применений, кроме шуток, функция getch() имеет достаточно широкое применение. Например, ее можно использовать для ввода пароля без вывода символов на экран.
