- •Содержание
- •Как пользоваться данной книгой
- •Благодарности
- •Введение
- •Что вам даст эта книга
- •Программные средства
- •Глава 1
- •Компьютерная программа
- •Пройти два квартала на север; повернуть налево на 90 градусов; пройти 50 футов прямо; повернуть налево на 90 градусов; подняться на четыре ступеньки; открыть дверь и войти.
- •Языки программирования
- •Компиляторы
- •Интерпретатор
- •Скорость
- •Переносимость
- •Структурирование
- •Библиотеки функций
- •Необходимые пояснения
- •Что такое объектно-ориентированное программирование
- •Карточка члена клуба
- •Взять карточки
- •Клубная Карточка
- •Клубная карточка: Изменить адрес (Смит, Западная Авеню, 12)
- •Что Си может и чего не может
- •Этапы программирования
- •План программы
- •Текст программы
- •Компиляция программы
- •Компоновка программы
- •Тестирование программы
- •Изучение основ программирования
- •Что нужно, чтобы писать программы
- •Вопросы
- •Упражнения
- •Глава 2
- •Структура программы
- •Main() Функция, означающая начало программы— точку входа
- •(Прим.Перев.)
- •Прописные и строчные символы
- •Инструкция return
- •Использование комментариев
- •/*Эта программа выводит сообщение на экран*/ main()
- •/*Эта программа выводит сообщение на экран */ main()
- •/*Эта программа выводит сообщение на экран, она содержит инструкцию return(0) для совместимости с компиляторами, не имеющими автоматического возврата в систему
- •/*Эта программа выводит сообщение на экран, она содержит
- •//Эта программа выводит сообщение на экран
- •//Эта программа выводит сообщение на экран, она содержит
- •Понятие параметров
- •Puts("Привет");
- •Директива #include
- •Вопросы
- •Упражнения
- •Добро пожаловать в мой мир. Командовать парадом буду я.
- •Глава 3
- •Символьные данные
- •Целочисленные величины
- •Вещественные числа
- •Почему надо использовать целые числа?
- •Константы и переменные
- •Имена констант и переменных
- •Определение констант
- •#Define my_friend "Марина"
- •Определение переменных
- •Присваивание значения
- •Определение строковой переменной
- •#Define client "Кейт Тиммонс"
- •Типы данных и функции
- •Литералы
- •Проектирование программы
- •Упражнения
- •Глава 4
- •Функция puts()
- •Puts("Всем привет!");
- •#Define message "Всем привет"
- •Функция putchar()
- •Двойственность символьных переменных
- •Управляющие коды
- •Код «новая строка»
- •Код «табуляция»
- •Код «возврат каретки»
- •Код «возврат на шаг»
- •Код «перевод страницы»
- •Отображение специальных символов на экране монитора
- •Мы зовем ее "Наташа"
- •Puts("Мы зовем ее "Наташа"");
- •#Define message "Привет!" main()
- •Вывод чисел
- •Моими счастливыми номерами являются 12 и 21
- •Моими счастливыми номерами являются 21 и 12
- •17 Равно 11 в шестнадцатеричной и 21
- •Printf("Стоимость составляет %8.2f", amount);
- •Стоимость составляет 45.58
- •Printf("Стоимость составляет %2.2f", amount);
- •Стоимость составляет 45.58
- •Printf("Стоимость составляет %-8.2f
- •Стоимость составляет 45.58 в долларах сша
- •Printf("я позвонил, чтобы сказать %8s", message);
- •Я позвонил, чтобы сказать Привет
- •Выбор правильных средств вывода информации
- •Вам исполнилось 43 года.
- •Проектирование программы
- •(Прим.Перев.)
- •Puts("Пожалуйста, введите сумму полученного займа:");
- •Упражнения
- •Наименование товара: Гибкий диск Цена за 1 упаковку: 3.55
- •Внимание! Внимание! Внимание! Внимание! Нежелательное отклонение параметров среды.
- •Глава 5
- •Функция gets()
- •Пожалуйста, введите Ваше имя:
- •Пожалуйста, введите Ваше имя: Петр Иванов Подтвердите, Ваше имя: Петр Иванов
- •Функция getchar()
- •«Для продолжения нажмите Enter»
- •Printf("Для продолжения нажмите Enter"); getchar();
- •Оператор получения адреса &
- •Функция scanf()
- •Входной поток
- •Использование функции scanf()
- •Пожалуйста, введите целое число и нажмите Enter:
- •Выбор соответствующих средств ввода данных
- •Будьте осторожны при использовании scanf()
- •Неинициализированные переменные
- •Вопросы
- •Упражнения
- •Глава 6
- •Арифметические операторы
- •Для того чтобы дать 57 долларов сдачи, используйте: 2 банкнот(ы) достоинством 20 долларов
- •Типы данных и операторы
- •Выражения
- •Значение равно 24
- •Приоритет операторов и порядок вычислений
- •40 * Rate /* обычный недельный заработок */ hours - 40 /* сверхурочные часы */
- •Счетчики
- •Новое значение переменной равно старому значению плюс 1
- •Операторы инкремента
- •Первое значение переменной count равно 0
- •Printf("Второе значение переменной
- •Первое значение переменной count равно 0
- •Первое значение переменной count равно 0
- •Аккумуляторы
- •Присваивание начального значения
- •Остерегайтесь логических ошибок
- •Ищите образцы
- •Диагностические проблемы
- •Значение regular равно 400 значение extra равно -2 значение d_time равно 40
- •Вопросы
- •Глава 7
- •Как использовать функции
- •Puts("Сколько байтов в одном килобайте?"); puts("Для получения ответа нажмите Enter");
- •Переменные в функциях
- •Автоматические (локальные) переменные
- •Внешние (глобальные) переменные
- •Статические переменные
- •Значение autovar равно 0 значение statvar равно 0 значение autovar равно 0 значение statvar равно 0 значение autovar равно 0 значение statvar равно 0 значение autovar равно 0 значение statvar равно 0
- •Передача параметров
- •Puts("Привет!");
- •Фактических параметров. (Прим.Перев.)
- •Введите стоимость единицы товара: 100
- •Возвращаемые значения
- •Возврат значений типа float
- •Использование return() в функции main()
- •Использование макроопределений
- •#Define enter printf("Пожалуйста, введите число: ")
- •#Define enter printf("Пожалуйста, введите число: ") main()
- •#Define enter printf("Пожалуйста,
- •Проектирование программы
- •Автоматические или внешние переменные?
- •Неправильный ввод
- •Введите размер скидки (в виде десятичной дроби):
- •Вопросы
- •Упражнения
- •Глава 8
- •Условия
- •Составные инструкции
- •Дополненный Опросник
- •Вложенные инструкции if
- •Конструкция switch/case/default
- •Проектирование программы
- •Проверка правильности ввода
- •Вопросы
- •Упражнения
- •Глава 9
- •Цикл for;
- •Использование цикла for
- •Создание паузы в программе
- •Использование переменных
- •Вложенные циклы
- •Использование цикла do...While
- •Вложенные циклы do
- •Использование цикла while
- •Printf("Введите размер скидки: "); scanf("%f", &discount);
- •Проектирование программы
- •Использование флагов
- •Использование инструкции break
- •Вопросы
- •Упражнения
- •3. Цена Налог Итого
- •Глава 10
- •Массивы
- •Определение массива
- •Ввод значений в массив
- •Введите значение температуры #n
- •Работа с массивами
- •Просмотр массива
- •Поиск в массиве
- •Передача массива функции
- •Использование массивов
- •Сравнение двух строк
- •Слияние строк
- •Массивы строк
- •Вопросы
- •Упражнения
- •Глава 11
- •Использование структур
- •Определение структуры
- •Определение структурных переменных
- •Присвоение начального значения
- •Puts("Введите сведения о диске
- •Структуры и функции
- •Значение переменной tax равно 35
- •Указатели и функции
- •Вопросы
- •Упражнения
- •Глава 12
- •Что такое файловая структура
- •Указатель на файл
- •R Указывает на то, что будет выполняться
- •Как закрыть файл
- •Функции ввода и вывода
- •Работа с символами
- •Посимвольное чтение из файла
- •Работа со строками
- •Printf("Пожалуйста, введите имя: "); gets(name);
- •Форматированный ввод и вывод
- •Дискеты 1.120000 100
- •Дискеты 1.120000 100лента 7.340000 150картридж 75.000000 3
- •Дискеты 1.120000 Memoryexлента
- •Дискеты 1.120000 Memoryexлента
- •Чтение форматированных файлов
- •Текстовый и двоичный форматы
- •Двоичный формат
- •Печать данных
- •Инструкции
- •Проектирование программы
- •Вопросы
- •Упражнения
- •Глава 13
- •Прикладная программа
- •Глобальные определения
- •Добавление записей: функция addcd()
- •Удаление записи: функция delcd()
- •Printf("Введите название диска: "); gets(delname);
- •Редактирование данных: функция chcd()
- •Printf("Введите название диска: "); gets(disc.Name);
- •Вывод записи на экран: функция locate()
- •Нажмите Enter");
- •Печать записей: функция plist()
- •Приложение I
- •Глава 1
- •Глава 2
- •Добро пожаловать в мой мир.Командовать парадом буду я.
- •Глава 3
- •Для вещественных чисел:
- •Глава 4
- •Printf("%80s","Страница");
- •Наименование товара: Гибкий диск Цена за 1 упаковку: 3.55
- •Внимание! Внимание! Внимание! Внимание! Нежелательное отклонение параметров среды.
- •Глава 5
- •Переменная initial определена как символьная.
- •Глава 6
- •В программе используется переменная shipping, которая не была определена. Вторая инструкция scanf() оканчивается апострофом, вместо точки с запятой.
- •Глава 7
- •Puts("Это первое"); main(); return(0);
- •Собственная функция может помещаться только после функции main(), а не перед ней.
- •Puts("Это первое"); dothis();
- •Глава 8
- •В первой инструкции printf() литерал
- •Глава 9
- •Переменные row и column определены с типом float, но если вы хотите использовать их в цикле, они должны относиться к типу int.
- •Глава 10
- •Индексы всех элементов массива temps заключены в круглые скобки, вместо квадратных. Переменные high и low не определены. Переменная total определена,
- •Глава 11
- •Ко всем переменным, используемым в инструкциях ввода и вывода, обращение происходит без использования имени структурной переменной.
- •Глава 12
- •Файл заголовков называется stdio.H, а не stdio.C. Указатель на файл должен определяться со звездочкой перед именем: *fp. В цикле while
- •Приложение II
Использование массивов
Представьте себе, что вы являетесь менеджером в отеле, и в вашем ведении находятся помещения для проведения заседаний. У вас есть десять комнат для совещаний, каждая из которых рассчитана на опре- деленное количество человек. Вам нужна программа, которая будет выполнять следующие три функции:
составлять таблицу, содержащую сведения о номере и максимальной вместимости каждой комна- ты;
предоставлять информацию о максимальной вместимости определенной комнаты;
выводить список комнат, имеющих определенную вместимость.
Есть несколько способов создания такой программы. Вы можете использовать массив, состоящий из 20 элементов, содержащих как номер комнат, так и количество мест, на которое каждая из них рассчитана. Массив будет выглядеть примерно так:
int room[20] = {102, 12, 107, 43...
то есть нечетные элементы отображают номера комнат, а четные— вместимость. Комната 102 рассчитана на 12 человек, комната 107 может вместить 43 человека и так далее. Определив элемент, содержащий номер комнаты, вы знаете, что значение максимальной вместимости этой комнаты представлено следую- щим элементом массива.
Другой вариант связан с использованием двухмерного массива. Такие массивы мы рассмотрим позже, ко- гда будем обсуждать строки.
Третьей возможностью является использование двух параллельных массивов. Параллельные массивы— это два независимых массива, которые можно соотнести друг с другом. Как это выглядит? Представьте себе две линии выпускников колледжа в актовый день. Когда две колонны достигают входа, ученики рас- полагаются друг напротив друга. Первый человек в правом ряду войдет в зал в паре с первым человеком из левого ряда и так далее. Если расположить учеников произвольно, то никаких отношений между пра- вым и левым рядом не будет. Но можно составить ряды в таком порядке, чтобы при встрече рядов образо- вались определенные пары.
Когда вы используете параллельные массивы, то создаете два независимых массива, порядок расположе- ния элементов в которых, тем не менее, находится в соответствии. То есть первый элемент одного массива каким-то образом соотносится с первым элементом другого массива и так далее.
В Листинге 10.4 приведен текст программы, в которой проблемы с распределением комнат решаются пу- тем использования параллельных массивов. Массив room содержит список номеров комнат, которые на- ходятся в вашем распоряжении, а в массиве max записаны данные о количестве мест, на которые рассчи- тана каждая комната. Если мы знаем, что номер комнаты хранится в пятом элементе массива room, то нам известно, что вместимость этой комнаты находится также в пятом элементе, только массива max.
Листинг 10.4. Использование двух параллельных массивов.
/*rooms.c*/
int room[10] = {102, 107, 109, 112,
115, 116, 123, 125, 127, 130};
int max[10] = {12, 43, 23, 12, 20, 15, 16,
23, 12, 15};
main()
{
int index, choice, num, rooms, flag, found; rooms = 10;
puts("1. Показать вместимость всех комнат\n"); puts("2. Определить вместимость
определенной комнаты\n");
puts("3. Найти комнату определенной вместимости\n"); printf("Введите Ваш выбор от 1 до 3: ");
scanf("%d", &choice); if (choice == 1)
{
for (index = 0; index < rooms; index++) printf("Комната #%d рассчитана на
%d мест\n", room[index], max[index]);
}
if (choice == 2)
{
printf("введите номер комнаты: "); scanf("%d", &num); index = 1;
found = 0;
while (! found && index < rooms)
if (room[index] == num)
found = 1;
if (! found)
else
index++;
puts("Комнаты с таким номером нет в списке\n");
else
printf("Комната #%d
рассчитана на %d мест\n", room[index], max[index]);
}
if (choice == 3)
{
flag = 0;
printf("Введите минимальное желательное количество мест:");
scanf("%d", &num);
for (index = 0; index < rooms; index++) if (max[index] >= num)
{
flag = 1; printf("Комната #%d
рассчитана на %d мест\n", room[index], max[index]);
}
if (flag == 0)
puts("Комнат с
таким количеством мест нет\n");
}
}
В этой программе максимальное значение индекса массива присваивается переменной rooms, а затем на экран выводится меню. Выбор одного из пунктов меню определяет, какая из функций будет выполняться. Это осуществляется с помощью последовательности из трех инструкций if. Аналогичную программу можно было написать с использованием инструкции switch или вложенных инструкций if...else.
Первая процедура в цикле for выводит список всех комнат и их вместимость. Здесь необходима только одна индексная переменная, которая используется в качестве индекса как для массива room, так и для массива max.
Вторая процедура просматривает массив в поисках элемента, имеющего значение, соответствующее но- меру комнаты, введенному пользователем.
В третьей процедуре выполняется поиск номеров комнат, которые могут обеспечить определенную вме- стимость, указанную пользователем. Но после обнаружения первого подходящего варианта поиск не ос- танавливается. Просмотр массива происходит до конца с целью составления списка всех комнат, удовле- творяющих указанному условию. Переменная flag используется для индикации того, что не обнаружено ни одной подходящей комнаты.
Строки
Строкой называется массив символов. При определении строки вы присваиваете ей имя и указываете максимальное количество символов, которое может в ней содержаться. Однако не забывайте о том, что один элемент массива всегда резервируется для нулевого символа (\0), вследствие чего при определении строки следует указывать количество элементов на единицу больше действительно предполагаемой мак- симальной длины строки.
Си и Си++ позволяют осуществлять ввод и вывод массива символов в виде некой целостности— строки. В то же время, каждый символ является отдельным независимым элементом массива (рис.10.7). Например, с помощью следующей программы можно ввести строку, а затем отобразить составляющие ее отдельные символы:
main()
{
char name[20]; int index;
printf("Введите Ваше имя: "); scanf("%s", name);
for (index = 0; index < 20; index++)
printf("%c\n", name[index]);
}
Рис. 10.7. Каждый из символов, составляющих строку, в действительности является отдельным элементом массива
Если в действительности было введено меньше двадцати символов, элементы массива, следующие за ну- левым символом, содержат случайные величины.
Если бы в языке Си отсутствовала функция gets(), то ввод строки можно было осуществить путем после- довательного ввода символов и присваивания их в качестве значения отдельным элементам массива, как это продемонстрировано в Листинге10.5.
Листинг 10.5. Имитация функции gets().
/*getstr.c*/ main()
{
char name[10], letter; int index;
index = 0;
puts("Введите имя, по окончании нажмите Enter\n"); do
{
letter = getchar(); name[index] = letter; index++;
}
while (letter !='\r' && index < 9); name[index] = '\0';
putchar('\n'); puts(name);
}
К счастью, язык Си расценивает строки как особую разновидность массивов, позволяя осуществлять ввод и вывод строк как единого целого. Однако какие-либо дополнительные приемы обращения со строками в языке Си отсутствуют. В то же время, использование строк настолько распространено в программирова- нии, что большинство Си и Си++ компиляторов имеют специальные функции для работы со строками. Ко- нечно, для этих целей можно написать и собственные функции, но использование стандартных библиотек представляется более эффективным. В табл.10.2 приведены типичные функции работы со строками, кото- рые содержатся в библиотеках Си и Си++.
Таблица 10.2. Функции работы со строками.
В качестве примера мы обсудим несколько функций работы со строками и посмотрим, какие инструкции следует написать, чтобы выполнить те же действия без использования библиотечных функций.
