
- •Глава 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()
Присваивание значения
Некоторые переменные могут иметь начальное значение, то есть значение, которое переменная принимает при запуске программы, но которое, в отличие от значения константы, будет изменяться в процессе выполнения. Начальное значение может быть присвоено либо при определении переменной, либо оформлено в виде отдельной инструкции.
Числовым или символьным переменным (определение строк мы обсудим позже) значение может присваиваться при их определении:
main()
{
int count = 5;
char initial = 'A';
float rate = 0.55;
}
В этих инструкциях мы определили целочисленную переменную count и присвоили ей начальное значение 5. Далее мы определили символьную переменную initial, присвоив ей букву 'А' в качестве начального значения, и переменную типа float с именем rate и начальным значением 0.55. Значение символьной переменной должно быть заключено в одинарные кавычки, а число с плавающей точкой должно иметь хотя бы по одному знаку слева и справа от точки.
Если переменная определена, можно присваивать ей значение в отдельной инструкции, используя оператор присваивания (=):
count = 5;
initial = 'A';
rate = 0.55;
Присвоенное значение является начальным и может изменяться в процессе выполнения программы, иначе переменная не была бы переменной.
Если начальное значение переменной не известно заранее, то после начала выполнения программы оно может быть введено с клавиатуры, из дискового файла или получено в результате определенных вычислений. Со всеми этими способами вы познакомитесь чуть позже.
Определение строковой переменной
Рис.
3.10. Данные строкового типа в памяти
|
|
Как вы помните, язык Си не содержит строкового типа данных и не имеет никаких средств для работы со строками. К счастью, Си позволяет работать с данными строкового типа, используя массивы. Раньше мы уже определяли строку как ряд последовательных символов. Именно этим она и является— рядом символьных переменных, объединенных в нечто, называемое массивом. Элементы строки хранятся вместе в последовательных элементах памяти. В качестве примера на рис.3.10 показано, как выглядит переменная, имеющая значение "Привет". Каждая буква хранится в отдельном элементе памяти так же, как одиночная символьная переменная, но вся строка может быть выведена на экран монитора как единое целое при помощи одной функции puts(). Последовательность \0 является специальным символом, который Си вставляет после каждой строки. Он отмечает конец строки, указывая функции типа puts(), где следует прекратить вывод символов на экран.
Вы уже знаете как определить строковую константу— с помощью директивы #define, заключив символы строки в кавычки:
#define CLIENT "Кейт Тиммонс"
Чтобы определить строковую переменную, необходимо использовать тип char и указать максимальное число символов, которое может содержать строка. Например, так:
char var_name[N];
где var_name означает имя переменной, а N— максимальное количество символов, которое всегда заключается в квадратные скобки: прямую [ и обратную ].
Число, указанное в скобках, должно быть на единицу больше максимального количества символов, которое вы собираетесь использовать, так как Си нуждается в дополнительном пространстве, чтобы поставить нулевой символ. Например, переменная, содержащая аббревиатуры названий штатов, может быть определена следующим образом:
char state[3];
Рис.
3.11. Определение
строковой переменной
Рис.
3.12. Нельзя присвоить строковой переменной
значение,имеющее большее количество
символов, чем было для нее зарезервировано
при этом, как показано на рис.3.11, создается строковая переменная, которая называется state и содержит два символа, плюс нулевой символ, означающий конец строки (\0).
Вы не можете записать в строку больше символов, чем было указано при ее определении, так как Си отводит ровно столько памяти, сколько необходимо для хранения заданного числа символов. Поэтому, прежде чем определять переменную, хорошенько подумайте, сколько символов может вам потребоваться.
Почему это так важно, можно пояснить на следующем жизненном примере. Допустим, вы вводите переменную, содержащую имена клиентов. Вы определили ее следующим образом:
char client[10];
Программа работает безупречно до тех пор, пока вы не получаете заказ от господина Флаглехоффена. Когда вы попытаетесь ввести его имя в список, ваша программа остановится из-за ошибки выполнения, что иллюстрирует рис.3.12.
Для того чтобы избежать подобной неприятности, вы могли бы в определении переменной несколько увеличить допустимое количество символов:
char client[80];
но если в программе будет несколько таких переменных, вы впустую потратите немало памяти компьютера.
Определив строковую переменную, вы тут же можете инициализировать ее, присвоив ей начальное значение в тексте программы. Помимо этого, значение можно присвоить, введя его с клавиатуры или из дискового файла, как это делается для переменных любого другого типа (подробнее о том, как вводить значение строковой переменной с клавиатуры, вы узнаете в следующей главе). В языке Си нельзя присваивать значение строковой переменной так, как это сделано в примере:
main()
{
char client[15];
client = "Кейт";
puts(client);
}
где употребляется не разрешенная инструкция
client = "Кейт";
Если вы хотите присвоить начальное значение строковой переменной, это можно сделать, определив используемую переменную одним из двух допустимых
Рис.
3.13. Инициализация строки
способов. Вы можете присвоить значение определением переменной перед функцией main():
char client[] = "Флаглехоффен";
main()
{
puts(client);
}
Заметьте, что в этом случае значение максимального числа символов строковой переменной в квадратных скобках не проставлено. Максимальное число символов строковой переменной при таком способе определения зависит от используемого компилятора, но практически определяется количеством символов в начальном значении плюс один (рис.3.13). Заметим, что в качестве параметра функции puts() используется только имя переменной без каких-либо квадратных скобок.
Другой способ присваивания начального значения внутри функции main() несколько более сложен:
main()
{
static char greet[] = "Привет";
puts(greet);
}
Определение выполняется внутри функции main(), но начинается со слова static, а переменная называется статической. Определяемая таким образом переменная может быть использована только внутри функции, в теле которой она была определена. Если вы желаете присвоить начальное значение строковой переменной, определяемой внутри функции, то ее следует определить как статическую переменную (подробнее смотри в главе 7).