- •А. Нейбауэр.
- •Глава 1. Основы программирования 11
- •Глава 3. Переменные и константы 39
- •Глава 6. Операторы 103
- •Глава 13. Как собрать все вместе 253
- •Благодарности
- •Введение
- •Что вам даст эта книга
- •Программные средства
- •Глава 1. Основы программирования
- •Компьютерная программа
- •Языки программирования
- •Компиляторы
- •Интерпретатор
- •Скорость
- •Переносимость
- •Структурирование
- •Библиотеки функций
- •Необходимые пояснения
- •Что такое объектно-ориентированное программирование
- •Что Си может и чего не может
- •Этапы программирования
- •План программы
- •Текст программы
- •Компиляция программы
- •Компоновка программы
- •Тестирование программы
- •Изучение основ программирования
- •Что нужно, чтобы писать программы
- •Структура программы
- •Прописные и строчные символы
- •Инструкция return
- •Использование комментариев
- •Понятие параметров
- •Директива #include
- •Проектирование программы
- •Глава 3. Переменные и константы
- •Символьные данные
- •Целочисленные величины
- •Вещественные числа
- •Почему надо использовать целые числа?
- •Константы и переменные
- •Имена констант и переменных
- •Определение констант
- •Почему используют константы?
- •Определение переменных
- •Присваивание значения
- •Определение строковой переменной
- •Типы данных и функции
- •Литералы
- •Проектирование программы
- •Функция puts()
- •Функция putchar()
- •Двойственность символьных переменных
- •Управляющие коды
- •Код «новая строка»
- •Код «табуляция»
- •Код «возврат каретки»
- •Код «возврат на шаг»
- •Код «перевод страницы»
- •Отображение специальных символов на экране монитора
- •Многогранная функция printf()
- •Вывод чисел
- •Перевод строки
- •Преобразование типов данных
- •Форматированный вывод
- •Выбор правильных средств вывода информации
- •Проектирование программы
- •Функция 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()
- •Приложение I Ответы и решения Глава 1. Основы программирования.
- •Глава 3. Переменные и константы.
- •Глава 6. Операторы.
- •Глава 7. Для чего нужны функции.
- •Глава 8. Позвольте компьютеру принимать решения.
- •Глава 9. Циклы.
- •Глава 10. Массивы и строки.
- •Глава 11. Струтуры и указатели.
- •Глава 12. Вывод на диск и принтер.
- •Приложение II Прикладная программа
Скорость
Можно сказать, что Си является языком более близким к ассемблеру, чем другие языки высокого уровня, так как многие инструкции Си адресованы непосредственно аппаратной части компьютера. Поэтому программа на Си выполняется очень быстро. Фактически, она работает настолько быстро, что Си может быть использован для написания операционных систем, коммуникационных и инженерных приложений и даже компиляторов.
Кроме того, большинство компиляторов Си генерируют высоко оптимизированные коды. Вы помните, что компьютеру необходимы двоичные коды? Чем меньше этих кодов генерирует компилятор, тем более оптимизированным является код и тем быстрее работает программа. Многие компиляторы других языков генерируют менее оптимизированные коды, так что их программы работают медленнее.
Переносимость
Разумеется, можно создавать очень быстро работающие программы, если писать их на ассемблере. Однако мнемонические ассемблерные коды не одинаковы для каждого семейства микропроцессоров. Если бы вы написали на ассемблере программу для IBM PC или совместимого с ним компьютера, а затем решили выполнить те же самые процедуры на Apple Macintosh, вам пришлось бы переписать всю программу.
Си использует стандартные наборы ключевых слов. В общем случае вы пишете программу один раз, безотносительно того на какой платформе (с каким компьютером или операционной системой) собираетесь ее использовать. Тем не менее, хотя исходный файл сохраняется без изменений, необходимы два компилятора: один, чтобы перевести программу в двоичные коды, которые понимает IBM, другой, чтобы перевести программу в двоичные коды для Apple. Но сам текст программы вы создали раз и навсегда.
Вышесказанное также означает, что раз уж вы изучили Си, то вам не надо изучать другие языки, чтобы программировать на других компьютерах. Вы легко перенесете свои навыки с одной платформы на другую без переобучения. В конце концов, трудно предсказать заранее, куда вас заведет только что начатое изучение программирования, и лучше быть готовым ко всему.
Структурирование
Каким бы легким для изучения ни был язык Си, у него есть свои требования. Делая программу на интерпретирующем языке BASIC, можно сидеть у компьютера и писать текст прямо «из головы». В Си это не так-то просто. Язык Си имеет свою структуру и правила создания программы, которые заставляют программиста мыслить логически. Можно обойтись без серьезного структурирования и быстро написать «корявую» программу, сравнительно простую и небольшого размера, но чтобы создать действительно серьезную программу на Си, требуется прежде всего хорошо подумать. Необходимость структурирования, однако, далеко не является обузой. Благодаря этому качеству программу на Си очень легко проектировать, поддерживать и отлаживать.
Библиотеки функций
Язык Си как таковой содержит небольшое количество операций. В отличие от других языков, Си не имеет встроенных средств ввода и вывода информации или работы со строками (строка — это последовательность символов, образующих слово или фразу). Например, первоначальный стандарт языка Си имел только 27 ключевых слов (keywords) или команд*.
Вся мощь языка Си обеспечивается библиотеками функций, которые поставляются вместе с компилятором. Функцией называют последовательный набор инструкций для решения специальной задачи. Библиотека — это отдельный файл, прилагающийся к компилятору и содержащий функции для решения распространенных задач.
Например, Си не имеет средств для отображения информации на экране. В то же время это настолько распространенная задача, что несколько функций вывода информации всегда поставляются в библиотеке Си и вместо того, чтобы писать функцию самостоятельно, можно использовать одну из них.
Ранее уже говорилось, что каждая функция имеет имя, например, функция puts(). Поэтому, вместо того чтобы писать все инструкции по выполнению данной процедуры, достаточно только ввести имя функции с необходимым синтаксисом (позже вы узнаете, как использовать имена функций).
Некоторые библиотечные файлы содержат предварительно откомпилированные коды. Когда компилятор сталкивается с именем функции из такой библиотеки, ему не приходится заниматься преобразованием информации в двоичные коды, так как это преобразование уже выполнено. Во время процесса компоновки программы (проиллюстрированного на рис.1.7) двоичные коды функции (инструкции для выполнения функции, содержащиеся в библиотеке) объединяются с объектным файлом и создается исполняемая программа. Поскольку функции были откомпилированы заранее, они представляют собой очень эффективные коды. Производитель компилятора уже «очистил» функции, так что они полностью оптимизированы.
Рис. 1.7. Инструкции, обеспечивающие выполнение функцииберутся из библиотеки в процессе компоновки программы
__________________________________
* Использование автором термина «команда» в качестве синонима термина «ключевое слово» не является традиционным. (Прим.перев.)
Существуют функции, которые используются так часто, что вместе со многими компиляторами поставляются их исходные тексты. Они содержатся в файлах, которые называются файлами заголовков (header file) и обычно имеют расширение .H. Файлы заголовков также содержат директивы компилятору и инструкции, указывающие использовать конкретные определения. Во время процесса компиляции содержимое файла заголовков добавляется к вашей собственной программе и для него также создаются объектные коды.
Рис. 1.8 кратко иллюстрирует процесс компиляции/компоновки.
Рис. 1.8. Процесс компиляции/компоновки
Файлы заголовков, в отличие от библиотечных файлов, не откомпилированы. Так же как и ваш исходный файл с текстом программы на Си, их можно читать, печатать на принтере и редактировать. Однако вам следует остерегаться вносить изменения в файлы заголовков, поставляемые с компилятором. Если вы сделаете ошибку, то компилятор больше не сможет генерировать для них объектные коды.
В дополнение к библиотекам, поставляемым с компилятором, можно приобрести специализированные библиотеки, например, построения баз данных, графические, коммуникационные и многие другие. Чем больше функций имеется у вас в библиотеках, тем меньше работы придется делать вам лично.
Вы можете даже создать собственную библиотеку функций, которые часто используются в ваших программах. Например, в нескольких программах, которые вы пишете, нужно выполнить процедуры A, B, а затем C. Вы пишете функции, которые выполняют эти задачи, и помещаете в свою собственную библиотеку, а потом, всякий раз, когда возникнет необходимость использовать их снова, они уже готовы, то есть написаны и откомпилированы.
Именно использование библиотечных файлов делает Си легко переносимым. Компилятор для IBM-совместимых компьютеров поставляется с библиотечными файлами, содержащими двоичные коды для IBM. Компилятор для Mac поставляется с библиотечными файлами, содержащими двоичные коды для Mac. А вы просто пишете программу на Си и используете два компилятора, чтобы создать программы для обеих машин.