- •Содержание
- •Как пользоваться данной книгой
- •Благодарности
- •Введение
- •Что вам даст эта книга
- •Программные средства
- •Глава 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
Вопросы
В чем смысл выражения «чистый вход— чистый выход»?
Почему после ввода с использованием функции getchar() нет необ- ходимости нажимать клавишу Enter?
Назовите два способа использования функции getchar().
Что такое оператор получения адреса?
Какие преимущества дает использование функции scanf()?
Что такое преобразователи символов?
Почему для ввода строки лучше использовать функцию gets(), а не
scanf()?
В чем преимущества и недостатки форматированного ввода при по- мощи scanf()?
Является ли необходимым присваивание всем переменным началь- ных значений?
Какие трудности могут возникнуть при использовании функции
scanf() для ввода значения переменной типа char?
Упражнения
Напишите программу, в которой вводится, а затем отображается на экране монитора в одной строке ваше имя и номер телефона.
Напишите программу, в которой вводится число, а затем на экран выводится адрес области памяти, куда было записано это число.
Напишите программу, в которой вводятся три числа, а затем эти числа отображаются на экране в порядке, обратном тому, в котором их вводили.
Напишите программу, в которой используются функции getchar(), gets() и scanf().
Объясните, почему следующая программа написана неправильно:
6. main()
7. {
char initial;
initial = gets();
puts(initial);
}
Глава 6
ОПЕРАТОРЫ
Не возникло ли у вас впечатления, что кое-что пропущено? В пятой главе вы узнали, как данные вводятся в компьютер, а в четвертой— как информация выводится на дисплей. Вероятно, пора рассказать о том, что происходит в промежутке между этими двумя событиями— об обработке данных.
В процессе обработки программа превращает данные, которые мы вводили в компьютер, в информацию, которую компьютер представляет нам. Различие между данными и информацией трудноуловимо, но очень существенно. «Данные»— это, так сказать, исходный материал, символы и числа, которые не могут быть использованы как конечный продукт. «Информация»— это конечный продукт, ради получения которого и была написана программа.
Превращение данных в информацию может осуществляться различными способами. Для чисел, например, обработка зачастую включает некоторые математические операции. Скажем, вам надо умножить стои- мость заказанных товаров на ставку налога, а затем добавить полученную сумму налога к сумме заказа. Эти две операции показаны на рис.6.1, они могут быть описаны как:
налог на продажи = стоимость заказа Ф ставка налога общая сумма заказа = стоимость заказа + сумма налога
Рис. 6.1. Процесс вычисления общей суммы заказа
Для
того
чтобы выполнить
вычисления,
превращающие данные
в
информацию,
необходимы
операторы.
Оператором
называется
символ,
который
говорит
компьютеру,
как
следует
обрабатывать
данные.
В
этой
главе
вы
познакомитесь
с
арифметическими
операторами,
операторами
приращения и
операторами
при-
сваивания.
Арифметические операторы
При математических вычислениях используются следующие арифметические операторы: Оператор Функция оператора
+ сложение
– вычитание
умножение
/ деление
% получение остатка от деления нацело
Обратите внимание, что процедура умножения обозначается символом «звездочка» (а не символом «x»),
а процедура деления— символом «прямая косая черта» (а не обратная «\»).
Операторы часто используются в инструкциях, требующих выполнения математических операций и при- сваивания полученного результата переменной в качестве значения. Ниже приводится пример расчета
накладных расходов с помощью арифметических операторов. В этом примере не имеет смысла присваи- вать переменной точное значение в виде литерала, например:
sales_tax = 4500;
напротив, величину накладных расходов требуется вычислить. При записи математических операций имя переменной всегда помещают слева от знака «равно», а арифметические операторы— справа:
sales_tax = amount * tax_rate; price = cost + shipping + insurance; per_unit = total / count;
Эти инструкции говорят компилятору, что следует выполнить три операции:
присвоить переменной sales_tax значение, полученное в результате умножения значения пере- менной amount на значение переменной tax_rate;
присвоить переменной price значение, полученное из суммы значений трех переменных: cost, shipping и insurance;
присвоить переменной per_unit значение, полученное в результате деления total на count.
Компьютер выполнит математические операции, указанные в правой части, а потом присвоит полученное значение переменной в левой части. Что касается правой части выражения, то она может содержать лю- бые комбинации переменных, констант и литералов, например:
sales_tax = amount * 0.06; price = 56.90 + shipping + 7.87; per_unit = 156.65 / 12.50;
Листинг 6.1 демонстрирует использование операторов в программе. В приведенном фрагменте необходи- мо ввести имя и адрес покупателя, а также стоимость его заказа. Затем программа рассчитывает стои- мость транспортировки (10процентов от суммы заказа) и налог на продажи (6 процентов от суммы зака- за). Наконец, весь список накладных расходов отображается на экране с помощью функций puts() и printf().
Листинг 6.1. Программа расчета и отображения накладной.
/*invoice.c*/
#define TAX_RATE 0.06
#define SHIPPING 0.10 main()
{
char name[15], address[20], city[15], state[3], zip[6];
float order, total, tax, ship; printf("Имя покупателя: "); gets(name);
printf("Адрес: "); gets(address); printf("Город: "); gets(city); printf("Штат: "); gets(state); printf("Индекс:"); gets(zip);
printf("Сумма заказа: "); scanf("%f", &order);
tax = order * TAX_RATE; ship = order * SHIPPING; total = order + tax + ship; puts("\n\n\n\n");
puts(" НАКЛАДНАЯ\n"); printf("%s\n%s\n%s, %s %s\n", name, adress, city, state, zip);
printf("\t\t\t\t%-10s\t%10.2f\n", "Заказ:", order); printf("\t\t\t\t%-10s\t%10.2f\n", "Налог:", tax); printf("\t\t\t\t%-10s\t%10.2f\n", "Транспортировка:", ship);
printf("\t\t\t\t\t\t_ \n); printf("\t\t\t\t%-10s\t%10.2f","Всего: ",total);
}
Деление нацело
Оператор % используется для расчета остатка от деления нацело. Если вы используете оператор деления (/) для целочисленных данных, то результат деления тоже всегда будет целым числом. Например, при делении 12 на 5 (12/5) вы получите 2, а не 2.4. Дробная часть, равная в данном случае 0.4, при делении целых чисел отбрасывается.
Разумеется, нередко возникает необходимость узнать значение остатка от деления. Пока мы имеем дело с целыми числами, мы не можем использовать значение 0.4, так как это число относится к типу float. Мы же определили результат деления как целое. В этом случае получается, что число 12 состоит из двух чисел
5, а лишняя двойка просто игнорируется. Число 2 в данном случае является остатком от деления нацело, для получения которого и используется оператор %. Остаток от деления нацело также всегда является целым числом.
В качестве примера приведен Листинг 6.2. В этой программе подсчитывается количество банкнот достоин- ством в двадцать, десять, пять и один доллар, необходимых для уплаты определенной суммы. Наиболее существенным, на что следует обратить внимание в этом примере, является алгоритм, то есть способ ис- пользования операции деления нацело при выполнении задачи, решение которой в другом случае потре- бовало бы произведения более сложных расчетов. Как и все прочие алгоритмы, данный алгоритм выгля- дит очень простым, стоит только понять его основную идею.
Листинг 6.2. Программа, в которой используется оператор получения остатка от деления наце- ло.
/*change.c*/ main()
{
int amount, twenties, tens, fives, ones, r20, r10; printf("Введите необходимую сумму: "); scanf("%d", &amount);
twenties = amount / 20;
r20 = amount % 20; /*r20 - остаток от деления на двадцать*/ tens = r20 / 10;
r10 = r20 % 10; /*r10 - остаток от деления на десять*/ fives = r10 / 5;
ones = r10 % 5; putchar('\n');
printf("Для того чтобы дать %d \
долларов сдачи, используйте:", amount);
printf("%d банкнот(ы) достоинством 20 долларов", twenties); printf("%d банкнот(ы) достоинством 10 долларов", tens); printf("%d банкнот(ы) достоинством 5 долларов", fives); printf("%d банкнот(ы) достоинством 1 доллар", ones);
}
Если вы ввели, например, значение 57, то получите следующий результат:
