
- •Глава 1 основы программирования
- •Компьютерная программа
- •Языки программирования
- •Компиляторы
- •Расширения имен файлов
- •Интерпретатор
- •Скорость
- •Переносимость
- •Структурирование
- •Библиотеки функций
- •Необходимые пояснения
- •Что такое объектно-ориентированное программирование
- •Что Си может и чего не может
- •Этапы программирования
- •План программы
- •Текст программы
- •Компиляция программы
- •Компоновка программы
- •Тестирование программы
- •Изучение основ программирования
- •Что нужно, чтобы писать программы
- •Вопросы
- •Упражнения
- •Глава 2
- •Структура программы
- •Прописные и строчные символы
- •Инструкция return
- •Использование комментариев
- •Понятие параметров
- •Директива #include
- •Проектирование программы
- •Глава 3 переменные и константы
- •Символьные данные
- •Целочисленные величины
- •Вещественные числа
- •Почему надо использовать целые числа?
- •Константы и переменные
- •Имена констант и переменных
- •Определение констант
- •Почему используют константы?
- •Определение переменных
- •Присваивание значения
- •Определение строковой переменной
- •Типы данных и функции
- •Литералы
- •Проектирование программы
- •Глава 4
- •Функция puts()
- •Функция putchar()
- •Двойственность символьных переменных
- •Управляющие коды
- •Код «новая строка»
- •Код «табуляция»
- •Код «возврат каретки»
- •Код «возврат на шаг»
- •Код «перевод страницы»
- •Отображение специальных символов на экране монитора
- •Многогранная функция printf()
- •Вывод чисел
- •Перевод строки
- •Преобразование типов данных
- •Форматированный вывод
- •Выбор правильных средств вывода информации
- •Проектирование программы
- •Глава 5
- •Функция gets()
- •Функция getchar()
- •«Для продолжения нажмите Enter»
- •Оператор получения адреса &
- •Функция scanf()
- •Входной поток
- •Использование функции scanf()
- •Выбор соответствующих средств ввода данных
- •Будьте осторожны при использовании scanf()
- •Неинициализированные переменные
- •Используемые алгоритмы ввода
- •Глава 6 операторы
- •Арифметические операторы
- •Деление нацело
- •Типы данных и операторы
- •Выражения
- •Приоритет операторов и порядок вычислений
- •Используемые алгоритмы обработки данных
- •Счетчики
- •Операторы инкремента
- •Аккумуляторы
- •Операторы присваивания
- •Присваивание начального значения
- •Проектирование программы
- •Остерегайтесь логических ошибок
- •Ищите образцы
- •Диагностические проблемы
- •Глава 7 для чего нужны функции
- •Как использовать функции
- •Переменные в функциях
- •Автоматические (локальные) переменные
- •Внешние (глобальные) переменные
- •Статические переменные
- •Передача параметров
- •Возвращаемые значения
- •Возврат значений типа float
- •Использование return() в функции main()
- •Использование макроопределений
- •Проектирование программы
- •Автоматические или внешние переменные?
- •Неправильный ввод
- •Глава 8 позвольте компьютеру принимать решения
- •Условия
- •Составные инструкции
- •Конструкция if...Else
- •Дополненный Опросник
- •Логические операторы
- •Вложенные инструкции if
- •Конструкция switch/case/default
- •Проверка чисел с плавающей точкой и строк
- •Проектирование программы
- •Проверка правильности ввода
- •Глава 9 циклы
- •Использование цикла for
- •Создание паузы в программе
- •Составные инструкции
- •Использование переменных
- •Вложенные циклы
- •Использование цикла do...While
- •Вложенные циклы do
- •Использование цикла while
- •Комбинирование циклов разных типов
- •Проектирование программы
- •Использование флагов
- •Использование инструкции break
- •Глава 10 массивы и строки
- •Массивы
- •Определение массива
- •Ввод значений в массив
- •Работа с массивами
- •Просмотр массива
- •Поиск в массиве
- •Передача массива функции
- •Использование массивов
- •Сравнение двух строк
- •Определение длины строки
- •Присваивание строк
- •Слияние строк
- •Массивы строк
- •Проектирование программы
- •Глава 11 структуры и указатели
- •Использование структур
- •Определение структуры
- •Определение структурных переменных
- •Присвоение начального значения
- •Использование структуры
- •Массивы структур
- •Структуры и функции
- •Указатели
- •Указатели и функции
- •Глава 12 вывод на диск и принтер
- •Что такое файловая структура
- •Указатель на файл
- •Как открыть файл
- •Как избежать ошибок выполнения
- •Как закрыть файл
- •Функции ввода и вывода
- •Работа с символами
- •Посимвольное чтение из файла
- •Работа со строками
- •Чтение строк
- •Форматированный ввод и вывод
- •Чтение форматированных файлов
- •Работа со структурами
- •Чтение структур
- •Чтение в массив
- •Дополнение файла новыми данными
- •Текстовый и двоичный форматы
- •Двоичный формат
- •Печать данных
- •Инструкции
- •Проектирование программы
- •Глава 13 как собрать все вместе
- •Прикладная программа
- •Глобальные определения
- •Функция main()
- •Добавление записей: функция addcd()
- •Удаление записи: функция delcd()
- •Редактирование данных: функция chcd()
- •Изменение номера ячейки: функция chloc()
- •Вывод записи на экран: функция locate()
- •Печать записей: функция plist()
- •Сортировка записей: функция sort()
Будьте осторожны при использовании scanf()
Во многих системах символы, входящие во входной поток, помещаются в область памяти, называемую буфером. Если функция scanf() прерывает работу преждевременно, символы не будут внесены в значение переменной, а останутся в буфере. Существует опасность, что при следующей процедуре ввода данных функция начнет чтение символов с тех, которые уже содержатся в буфере, а не с тех, которые вводятся в ответ на новый запрос.
Поэтому функцию scanf() следует использовать с осторожностью. Лучше всего вводить только один набор данных с одной функцией и использовать подсказки, четко объясняющие пользователю, какой именно ввод от него ожидается.
Ввод в Си++
Компиляторы языка Си++ поддерживают функции gets(), getchar() и scanf(), о которых мы говорили в этой главе. Кроме того, Си++ имеет собственное многоцелевое средство ввода для всех типов данных. Стандартный поток ввода cin в сочетании с двумя символами «больше» (>>), которые называются оператором извлечения*, служит для считывания данных с клавиатуры. Программа
int count;
cin >> count;
вносит целочисленные данные с клавиатуры в значение переменной count. Стандартный поток ввода cin не требует указания адреса переменной для числовых и символьных данных, указывается только имя переменной.
При использовании cin нет необходимости определять формат с помощью указателей формата. Поток ввода cin имеет возможность определять тип данных самостоятельно на основании вводимой информации. Это свойство называется перегрузкой. Из-за этой особенности оператора cin большинство программистов предпочитают использовать именно его, а не функцию scanf().
При работе с несколькими аргументами необходимо отделять каждое имя переменной оператором извлечения:
* В оригинале extraction operator. (Прим.перев.)
Рис.
5.11. Оператор вставки и оператор извлечения
cin >> amount >> count >> age >> name;
Возможно, первое время вы будете испытывать затруднения в использовании операторов извлечения >> и вставки <<. На рис.5.11 показан простой способ запоминания этих операторов, изображенных в виде стрелок, которые указывают направление вперед или назад относительно переменной из списка данных.
Оператор извлечения >> изображен в виде стрелки, направленной в сторону переменной. Это означает, что данные поступают к ней в виде ввода. Когда вы применяете cin для ввода данных, пользуйтесь оператором, который как бы указывает направление к переменной.
Оператор вставки << изображен в виде стрелки, направленной от переменной. Это значит, что данные выводятся из переменной на экран. Со стандартным потоком вывода cout используйте, соответственно, тот оператор, который как бы указывает направление от переменной.
Неинициализированные переменные
Может получиться так, что переменной, которая определена в тексте программы, так никогда и не присваивается никакое значение. Это может произойти по причине того, что функция scanf() прервала работу, либо потому, что вы забыли написать инструкцию ввода значения для этой переменной. Могут быть и другие причины. Если переменную, которой не присвоено значение, использовать в инструкциях вывода данных, компилятор может не сообщить об ошибке, но отображенная на дисплее информация будет лишена смысла. Почему это происходит?
При включении компьютера области памяти, которые не используются операционной системой, заполнены случайными данными. Когда Си резервирует память для переменных при их определении, то содержимое этих областей памяти не меняется до тех пор, пока переменная не инициализирована или пока ей не присвоены введенные данные. Поэтому, если в программе в качестве параметра функции вывода используется переменная, которой не было присвоено к этому моменту никакого значения, на экране появятся те случайные данные, что все еще хранятся в памяти. Но это еще не самое худшее. Если подобная переменная используется при расчетах, компилятор Си тоже не сообщит об ошибке, но при этом все полученные результаты будут лишены смысла, а поскольку вы не были предупреждены о том, что произошло, вы можете принять их как вполне достоверные.
Чтобы избежать неприятностей, многие программисты присваивают начальные значения всем переменным. Можно присвоить ноль в качестве начального значения числовой переменной и пробел символьной и строковой переменным:
int count = 0;
char initial = ' ';
float rate = 0.0;
Разумеется, логика программы может потребовать присваивания других начальных значений.
Поступив подобным образом, можно, как минимум, избежать появления на экране бессмысленных символов, если с функцией вывода будет использована переменная, которой не присвоено никакого значения. Позже вы узнаете, как протестировать список переменных, чтобы убедиться, что они имеют правильные значения. Помните: чистый вход— чистый выход.
В табл. 5.1 собраны все средства ввода данных, о которых говорилось в этой главе.
Таблица
5.1. Основные средства ввода данных в
языке Си/Си++.
|
|