Язык Си - Уэйт, Прата, Мартин. M. уэит с. Прата д. Мартин
Скачать 4.69 Mb.
|
© 1984 The Waite Group, Inc © перевод на русский язык: Москва "Мир", 1988 M. УЭИТ С. ПРАТА Д. МАРТИН Перевод с английского Л. Н. Горинович и В. С. Явниловича под редакцией д-ра техн. наук Э. А. Трахтенгерца ББК 32.973 У97 УДК 681.3 ISBN 5-03-001309-1 /русск./ ISBN 0-672-22090-3 /англ./ Предисловие редактора перевода Предисловие Глава 1. Вступление Происхождение языка Си Достоинства языка Си Будущее языка Си Использование языка Си Использование текстового редактора для подготовки программы Исходные файлы и выполняемые файлы Компиляция Си программы в ОС UNIX Компиляция Си программы на IBM PC (компиляторы Microsoft С и Lattice С) Альтернативный способ трансляции Почему компиляция Некоторые соглашения Вид шрифта Цвет Устройство ввода и вывода Функциональные клавиши Наша вычислительния система Совет Глава 2. Введение в язык Си Пример простои программы на языке Си Пояснения Первый просмотр краткий обзор Второй просмотр детали Структура простой пpoграммы Несколько сонетов, как сделать программу читаемой Следующий шаг Дополнительный пример Что вы должны были узнать в этой главе Вопросы и ответы Упражнения Глава 3. Данные, язык Си и вы Данные: переменные и константы 1 Данные: типы данных Целые числа Числа с плавающей точкой Tипы данных в языке Си Типы int, short и long Описание данных целого типа Целые константы Инициализация переменных целого тина Рекомендации Тип данных unsigned Тип данных char Описание символьных переменных Символьные константы Программа Типы данных float и double Описание переменных с плавающей точкой Константы с плавающей точкой Другие типы Размеры данных Использование типов данных Что вы должны были узнать в этой главе Вопросы и ответы Глава 4. Символьные строки, директива #define, функции printf() и scanf() Символьные строки - введение Длина строки - функция strlen( ) Константы и препроцессор языка Си Язык Си - искусный фокусник: создание псевдоимен Изучение и использование функций printf( ) и scanf( ) Использование функции printf( ) Модификаторы спецификации преобразования, используемые в функции printf( ) Примеры Использование функции printf( ) для преобразования данных Применение функции scanf( ) Советы по применению Что вы должны были узнать в этой главе Вопросы и ответы Глава 5. Операции, выражения и операторы Основные операции Операция присваивания: = Операция сложения: + Операция вычитания: - Операция изменения знака: - Операция умножения: * Операция деления: / Порядок выполнения операций Некоторые дополнительные операции Операция деления по модулю: % Операции увеличення и уменьшения: ++ и - - Операция уменьшения: -- Старшинство операции Не будьте слишком умными Выражения и операторы Выражения Операторы Составные операторы (блоки) Преобразование типов Операция приведения Пример программы Что вы должны были узнать в этой главе Вопросы и ответы Упражнения Глава 6. Функции и переключение ввода-вывода Ввод и вывод одного символа: функции getchar( ) и putchar( ) Буферы Следующий шаг 2 Чтение одной строки Чтение одиночного файла Переключение и работа с файлами Операционная система UNIX Переключение вывода Переключение ввода Комбинированное переключение Операционные системы, отличные от ОС UNIX Комментарии Системно-зависимые средства: порты ввода-вывода микропроцессоров INTEL 8086/8088 Использование порта Резюме Использование скрытой мощности (в лошадиных силах) вашего компьютера Что вы должны были узнать в этой главе Вопросы н ответы Упражнения Глава 7. Выбор вариантов Оператор if Расширение оператора if с помощью else Выбор: Конструкция if-else Множественный выбор: конструкция else-lf Объединение операторов if и else Что важнее: операции отношения или выражения Что такое истина? Итак чему же все-таки соответствует истина? Осложнения с понятием "истина" Приоритеты операций отношения Логические операции Приоритеты Порядок вычислении Программа подсчета слов Программа, "рисующая" символами Анализ программы Длина строки Структура программы Форма данных Контроль ошибок Операция условия: ?: Множественный выбор: операторы switch и break Что вы должны были узнать в этой главе Вопросы и ответы Глава 8. Циклы и другие управляющие средства Цикл while Завершение цикла while Алгоритмы и псевдокод Цикл for Гибкость конструкции for Операция "запятая" Философ Зенон и цикл for Цикл с условием на выходе: do while Какой цикл лучше Вложенные цыклы Другие управляющие операторы: break, continue, goto Избегайте использовать goto Массивы Проблема ввода Резюме Что вы должны были узнать в этой главе Вопросы и ответы Упражнения Глава 9. Как правильно пользоваться функциями Создание и использование простой функции Аргументы функции Определение функции с аргументом: формальные аргументы Вызов функции с аргументом: фактические аргументы 3 Функция как "черный ящик" Наличие нескольких аргументов Возвращение значения функцией: оператор return Локальные переменные Нахождение адрссов: операция & Изменение переменных в вызывающей программе Указатели: первое знакомство Операция косвенной адресации: * Описание указателей Использование указателей для связи между функциями Использование наших знаний о функциях Описание типов функций В языке Си все функции равноправны Резюме Что вы должны были узнать в этой главе Вопросы и ответы Упражнения Глава 10. Классы памяти и разработка программ Классы памяти и область действия Автоматические переменные Внешние переменные Статические переменные Внешние статические переменные Регистровые переменные Какой класс памяти применять? Функция получения целых чисел: getlnt( ) План Поток информации для getint( ) Содержание getint( ) Преобразование строки в целое: stoi( ) Проверка Сортировка чисел Считывание числовых данных Выбор представления данных Завершение ввода Дальнейшие рассуждения main() и getarray() Разъяснения Сортировка данных Печать данных Результаты Обзор Что вы должны были узнать в этой главе Вопросы и ответы Упражнения Глава 11. Препроцессор языка Си Символические константы: #define Использование аргументов с #define Макроопределение или функция? Включение файла: #include Заголовочные файлы: Пример Замечания по программе Другие директивы #undef, #if, #ifdef, #ifndef, #else и endif Что вы должны были узнать и этой главе Вопросы и ответы Упражнение Глава 12. Массивы и указатели Массивы Инициализация массивов и классы памяти Указатели массивов Функции, массивы и указатели Использование указателей при работе с массивами Операции с указателями Многомерные массивы Инициализация двумерного массива 4 Указатели и многомерные массивы Функции и многомерные массивы Что вы должны были узнать в этой главе Вопросы и ответы Упражнения Глава 13. Символьные строки и функции над строками Определение строк в пpoграмме Строковые константы Массивы символьных строк и их инициализация Массив или указатель Явное задание размера памяти Массивы символьных строк Указатели и строки Ввод строк Выделение памяти Функция gets( ) Функция scanf( ) Вывод строк Функция puts( ) Функция printf( ) Создание собственных функции Функции, работающие со строками Функция strlen( ) Функция strcat( ) Функция strcrnpt( ) Функция strcpy( ) Пример: сортировка строк Аргументы командной строки Что вы должны были узнать в этой главе Вопросы и ответы Упражнения Глава 14. Структуры и другие типы данных Типовая задача: инвентаризация книг Установка структурного шаблона Определение структурных переменных Инициализация структуры Доступ к элементам структуры Массивы структур Описание массива структур Определение элементов массива структур Детализация программы Вложенные структуры Указатели на структуры Описание и инициализация указателя на структуру Доступ к элементу структуры при помощи указателя Передача информации о структурах функциям Использование элементов структуры Использование адреса структуры Использование массива Структуры: что дальше? Объединения - краткий обзор typedef - кpaткий обзор Что вы должны были узнать в этой главе Вопросы и ответы Упражнении Глава 15. Библиотека языка Си н фаилы ввода-вывода Доступ в библиотеку языка Си Автоматический доступ Включение файла Включение библиотеки Библиотечные функции, которые мы использовали Связь с файлами Что такое файл? Простые программы чтения файла: fopen(), fclose(), getc() и putc() Открытие файла: fopen( ) 5 Закрытие файла: fclose( ) Текстовые фаилы с буферизацией Ввод-вывод файла: getc( ) и putc( ) Простая программа сжатия файла Ввод-вывод файла: fprintf( ), fscanf( ), fgets( ) и fputs( ) Функции fprintf( ) и fscanf( ) Функция fgets( ) Функция fputs( ) Произвольный доступ: fseek( ) Проверка и преобразование символов Преобразования символьных строк: atoi( ), atof( ) Выход: exit( ) Распределение памяти: malloc( ) и са11ос( ) Другие библиотечные функции Заключение Что вы должны были узнать в этой главе Вопросы и ответы Упражнения Приложение А. Дополнительная литература Язык Си Программирование Операционная система UNIX Приложение Б. Ключевые слова языка Си Ключевые слова выполнения программы Приложение В. Операции языка Си Приложение Г. Типы данных и классы памяти Основные типы данных Как описать простую переменную Классы памяти Приложение Д. Управление ходом выполнения программы Оператор while Оператор tor Оператор do while Использование операторов if для выбора вариантов Множественный выбор при помощи switch Переходы и программе Приложение Е. Манипуляции разрядами: операции и поля Операции Поля Приложение Ж. Двоичные и другие числа Двоичные числа Двоичные числа с плавающей точкой Другие основания системы счисления Приложение 3. "Музыка" в системе IBM PC Функция tone( ) Использование функции tone( ) Приложение И. Расширение языка Си Структуры в качестве аргументов функции Перечислимые типы Приложение К. Таблица кодов ASCII ИСТОРИЯ СИ ДОСТОИНСТВА СИ ЯЗЫКИ КОМПИЛЯЦИИ Добро пожаловать в мир языка Си. В данной главе мы попробуем подготовить вас к изучению 6 этого мощного языка, завоевывающего все большую популярность. Что вам для этого нужно? Во-первых, интерес к Си, который, по-видимому, у вас уже есть. Но, чтобы усилить его, мы кратко обрисуем некоторые привлекательные стороны данного языка. Во-вторых, вы нуждаетесь в учебнике по языку Си - и учебником послужит вам эта книга. Кроме того, вам нужен доступ к какой- нибудь вычислительной системе, в которой имеется компилятор с языка Си. Это вы должны обеспечить себе сами. Наконец, вам необходимо научиться выполнять Си-программу на вашей вычислительной системе, и мы в конце главы дадим вам несколько советов по этому поводу. ПРОИСХОЖДЕНИЕ ЯЗЫКА СИ Далее Содержание Сотрудник фирмы Bell Labs Деннис Ритчи создал язык Си в 1972 г. во время совместной работы с Кеном Томпсоном над операционной системой UNIX. Ритчи не выдумал Си просто из головы - прообразом послужил язык Би, разработанный Томпсоном, который в свою очередь..., но это уже другая история. Важным моментом для нас является то, что язык Си был разработан как инструмент для программистов-практиков. В соответствии с этим главной целью его автора было создание удобного и полезного языка. Мы думаем, что критерий полезности принимался во внимание ПРИ разработке большинства языков программирования, но, кроме того, часто учитывались и другие потребности. Одной из главных Целей при создании языка Паскаль, например, было построение ПРОЧНЫХ основ обучения принципам программирования. Язык Бейсик создавался так, чтобы его синтаксис был близок к синтаксису английского языка; поэтому им легко могли пользоваться студенты, не знакомые с ЭВМ. Все эти цели тоже важны, но они не всегда совместимы с прагматическими, каждодневными требованиями. Предпосылки, послужившие основой создания языка Си как средства программирования, позволили разработать, кроме того, язык, облегчающий труд программиста. ДОСТОИНСТВА ЯЗЫКА СИ Далее Содержание Язык Си быстро становится одним из наиболее важных и популярных языков программирования. Его использование все более расширяется, поскольку часто программисты предпочитают язык Си всем другим языкам после первого знакомства с ним. Когда вы изучите язык Си достаточно хорошо, вы сможете оценить многие из его достоинств. Сейчас мы упомянем лишь некоторые из них. Си - современный язык. Он включает в себя те управляющие конструкции, которые рекомендуются теоретическим и практическим программированием. Его структура побуждает программиста 7 использовать в своей работе нисходящее проектирование, структурное программирование и пошаговую разработку модулей. Результатом такого подхода является надежная и читаемая программа. Си - эффективный язык. Его структура позволяет наилучшим образом использовать возможности современных ЭВМ. На языке Си программы обычно отличаются компактностью и быстротой исполнения. Си - переносимый, или мобильный, язык. Это означает, что программа, написанная на Си для одной вычислительной системы, может быть перенесена с небольшими изменениями (или вообще без них) на другую. Если модификации все-таки необходимы, то часто они могут быть сделаны путем простого изменения нескольких элементов в "головном" файле, который сопутствует главной программе. Конечно, структура большинства языков программирования подразумевает переносимость, но тот, кто переносил программу, написанную на Бейсике, с персональной ЭВМ IBM PC на машину Apple (они во многом, похожи) или пытался выполнить программу, написанную на Фортране для машины типа IBM, в системе UNIX, знает о многих возникающих при этом мучительных РИС. 1.1. Достоинства языка Си. проблемах. Язык Си предоставляет исключительные возможности для переноса программ. Компиляторы с данного языка реализованы почти на 40 типах вычислительных систем, начиная от- 8-разрядных микропроцессоров и кончая CRAY-1 одним из самых мощных в настоящее время 8 суперкомпьютеров. Си - мощный и гибкий язык (два излюбленных слова в литературе по вычислительной технике). Например, большая часть мощной и гибкой (!) операционной системы (ОС) UNIX написана на языке Си. Речь идет о компиляторах и интерпретаторах других языков, таких, как Фортран, АПЛ, Паскаль, Лисп, Лого и Бейсик. Поэтому, когда вы используете компилятор с Фортрана в системе UNIX, результирующая объектная программа в конечном счете получается с помощью некоторой программы, написанной на языке Си. Кроме того, программы, написанные на Си, используются для решения физических и технических проблем и даже для производства мультипликационных фильмов. Си обладает рядом замечательных конструкций управления, обычно ассоциируемых с ассемблером. Если вы остановите свой выбор на Си, то сможете реализовывать свои программы с максимальной эффективностью. Си - удобный язык. Он достаточно структурирован, чтобы поддерживать хороший стиль программирования, и вместе с тем не связывать вас смирительной рубашкой ограничений. Кроме уже упомянутых достоинств язык Си имеет и некоторые другие. У него, безусловно, есть и ряд недостатков, но вместо того чтобы далее углубляться в это, давайте обсудим еще один вопрос. БУДУЩЕЕ ЯЗЫКА СИ Далее Содержание Язык Си уже занимает доминирующее положение в мире мини-компьютеров, работающих под управлением ОС UNIX. Сейчас он распространяется на область персональных ЭВМ. Многие фирмы, производящие программное обеспечение, все чаще обращаются к Си, как к удобному языку для реализации своих проектов: программ обработки текстов, составления крупноформатных таблиц, компиляторов и т. д., поскольку известно, что Си позволяет получить компактные и эффективные программы. Что еще важнее, эти программы могут быть легко модифицированы и адаптированы к новым моделям ЭВМ. Другой причиной, способствующей проникновению Си в программное обеспечение персональных ЭВМ, является желание пользователей, работающих в системе UNIX, отлаживать свои программы дома. Поскольку уже созданы варианты компилятора с языка Си для некоторых моделей персональных ЭВМ, пользователи имеют возможность это делать. По нашему мнению, то, что подходит для фирм и программистов с большим опытом работы на Си, хорошо и для остальных пользователей. Все больше и больше программистов останавливают свой выбор на языке Си, чтобы воспользоваться его преимуществами. Поэтому вам совсем не обязательно быть. профессиональным программистом, чтобы следовать их примеру. Короче говоря, Си суждено стать одним из наиболее важных языков программирования в 80-90-е годы. Он уже применяется на мини-компьютерах и персональных ЭВМ. Он используется фирмами, производящими программное обеспечение, студентами, обучающимися программированию, и различными энтузиастами. И если вы хотите работать в сфере программотехники, то один из первых вопросов, на который вы должны будете отвечать "да", - "Умеете ли вы программировать на Си?". ИСПОЛЬЗОВАНИЕ ЯЗЫКА СИ Далее Содержание Си - язык "компилируемого" типа. Не огорчайтесь, если это звучит для вас пока как непонятный набор слов; вы поймете, что это значит, когда мы опишем этапы процесса создания работающей Си-программы. Если вы привыкли использовать какой-нибудь язык программирования компилируемого типа, например Паскаль или Фортран, вам будут понятны основные этапы "сборки" программ, написанных на Си. Но если ваш опыт основан на работе с такими языками 9 РИС. 1.2. Области применения языка Си. интерпретируемого типа, как Бейсик и Лого, или у вас совсем нет соответствующей подготовки, то процесс сборки может показаться вам поначалу необычным. К счастью, мы можем объяснить вам все детали этого процесса, и вы увидите, что на самом деле он достаточно понятен и прост. Чтобы дать вам первое представление о процессе создания программы, ниже приводится упрощенная схема того, что необходимо сделать - начиная от написания программы и кончая ее выполнением. 1. Используйте "редактор текстов" для создания программы на языке Си. 2. Попытайтесь осуществить трансляцию вашей программы с помощью удобного для вас компилятора. Он проведет проверку правильности вашей программы и, если обнаружит ошибки, выдаст сообщение об этом. В противном случае компилятор выполнит перевод программы в некоторый внутренний язык ЭВМ и поместит результат в новый файл. 3. Набрав имя этого нового файла на клавиатуре дисплея, вы можете запустить вашу программу. В некоторых вычислительных системах второй этап может быть разбитым на два или три шага, но его суть от этого не изменится. Давайте рассмотрим теперь каждый этап более подробно. |