Шпаргалка по языку СИ. Конспект Лекций «программирование На Языке Высокого Уровня Си» П. Конспект лекций для студентов высших учебных заведений, обучающихся по специальности 230102. 65 Автоматизированные системы обработки информации и управления
Скачать 1.25 Mb.
|
ГОСТ 19.701-90 (соответствует ISO 5807-85) – это стандарт, описывающий схемы алгоритмов, программ, данных и систем. Стандарт действует с января 1992 года. Схема алгоритмов программ данных и систем состоит из имеющих заданное значение символов, краткого пояснительного текста и соединяющих линий. Схемы могут использоваться на различных уровнях детализации. Причем 38 уровней зависит от размеров и сложности задачи обработки данных. Уровень детализации должен быть таким, чтобы различались части, и связи между ними были понятными в целом. Стандарт предусматривает использование обозначений в следующих частях документации: • в схемах данных; • в схемах программ; • в схемах работы системы; • в схемах взаимодействия программ; • в схемах ресурсов системы. Схема данных Отображает путь данных при решении задач и определяет этапы обработки, а так же различные применяемые носители данных. Схема данных состоит из символов данных, символов процессов, которые следует выполнять над данными, символов линий, указывающие потоки данных между носителями, специальных символов, используемых для удобочитаемости. Символы данных предшествуют и следуют за символами процессов. Схемы данных начинаются и заканчиваются символами данных. Схемы программ Состоят из символов процесса, указывают фактические этапы обработки данных (определяет путь в зависимости от логических условий); из линейных символов, указывающих поток управления; специальных символов, для облегчения читаемости. Схема программы отображает последовательность операций в примере. Схема работы системы Схема работы системы отражает управление операциями и потоком данных системы. Схема работы системы состоит: 39 • из символов данных, указывающий на наличие данных; • из символов процесса, указывающих операций, которые необходимо выполнять над данными, а так же определяющих путь их выполнения; • из линейных символов, указывающих потоки данных между процессами или носителями данных, а также указывающих поток управления между процессами; • из специальных символов, используемых для облегчения чтения процесса. Схема взаимодействия программ Схема взаимодействия программ показывает путь, в соответствии, с которым активизируется программа, а так же отображающие взаимодействия этих программ с данными. Каждая программа в схеме взаимодействия программ только 1-раз. Схема взаимодействия программ состоит из: • символов данных, указывающих на наличие данных; • символов процесса, указывающих на операции, которые следует выполнять над данными; • линейных символов, отображающих поток между процессами и данными, а так же указывающих точки или моменты времени инициализации процесса; • специальных символов. Схема ресурсов системы Отображает конфигурацию блоков данных и обрабатывающих блоков, которые требуются для решения задач или набора задач. Схема ресурсов системы состоит из: • символов данных изображающих входные и запоминающиеся устройства; • символов процесса, отображающих процессы; 40 • линейных символов, отображающих передачу данных между процессами и устройствами ввода/вывода, а так же передачу управления между процессами; • специальных символов для облегчения чтения схем. Символы данных В символах, указанных ниже, размер a должен выбираться из ряда 10, 15, 20 мм. Допускается увеличивать размер a на число, кратное 5. Размер b равен 1.5a, но для некоторых символов допускается устанавливать b равным 2a. Документ Ручной код Данные Запоминаемые данные или неавтономная память 41 Отображает данные на носителе в удобочитаемой форме (бумага, документ для оптического или магнитного считывания, рулон ленты, бланки ввода данных и т.д. ). В схемах алгоритмов обозначает операции ввода-вывода данных. Отображает данные, вводимые в ручную, во время обработки с устройств любого типа (клавиатура, переключатели, кнопки, световое перо, полоски со штрих кодом и т.д.). Символ отображает данные, носитель которых не определен. В схемах алгоритмов и программ этот символ обозначает операцию ввода-вывода и применяется для преобразования данных в форму пригодную для обработки (ввод) или для отображения (вывод). Символ отображает хранимые данные в виде, пригодном для обработки. Носитель данных не определен. В схемах алгоритмов он предназначен для обозначения ввода-вывода данных в случае использования запоминающего устройства, управляемого процесса. 0.5 a 0.5 a R R b R=a a Оперативная память Запоминающее устройство с последовательным доступом Запоминающее устройство с прямым доступом Карта Бумажная лента Дисплей 42 Символ отображает данные, хранящиеся в ОЗУ. В схемах алгоритмов применяется для операции ввода- вывода информации, носителем которой является ОЗУ. Символ отображает данные, хранящиеся в запоминающем устройстве с последовательным доступом (магнитная лента). В схемах алгоритмов используется для обозначения операций ввода-вывода запоминающего устройства с последовательным доступом. Отображение ввода-вывода для носителей прямого доступа (диски). Представляет данные, хранящиеся на носителе в виде картриджей (перфокарта, магнитные карты, карты со считываемыми метками, карты с отрывным ярлыком, карты со сканированными метками и т.д.). Символ отображает данные, представленные на носителе в виде бумажной ленты (например, кассовые аппараты). Символ отображает данные, представленные на носителе в видеотображающего устройства (экран, индикатор). В схемах алгоритмов используется для ввода-вывода данных. a Символы процесса Процесс Предопределенный процесс Ручная операция Подготовка или модификация Решение Граница цикла 43 Символ отображает функцию обработки данных любого вида (выполнение определенной операции или группы операций, приводящих к изменению значения формы или размещению информации или к определению, по которому из нескольких направлений потока следует двигаться). Символ отображает предопределенный процесс, состоящий из одной или нескольких операций или шагов программы, которые определены в другом месте (в подпрограмме, модуле и т.д.). Символ отображает любой процесс, выполняемый человеком. Символ отображает модификацию команды или группу команд с целью воздействия на некоторую последующую функцию (установка переключателя, модификация индексного регистра и т. д.). Символ отображает решение или функцию переключательного типа, имеющей один вход и ряд альтернативных выходов, один и только один из которых может быть активизирован после вычисления условий, определенных внутри этого символа, соответствующие результаты вычислений могут быть записаны по соседству с линиями, отображающее эти пути. Символ, состоящий из двух частей, отображает начало и конец цикла. Обе части символа должны иметь один и тот же идентификатор цикла. Условие для приращения, инициализации, завершения, размещаются внутри символа. Имя цикла Имя цикла, условие завершения С постусловием Имя цикла, условие завершения Имя цикла С предусловием Параллельные действия Символ отображает синхронизацию двух или более параллельных операций. Символы линий Символ линия Передача управления Канал связи Пунктирная линия Символ отображает альтернативную связь между двумя или более символами, кроме того, символ используется для обведения аннотированного участка. Если один из ряда альтернативных выходов использует в качестве входа процесс, либо для выхода использует процессы, эти символы соединяют пунктирными линиями. 44 Символ отображает поток данных или управления, при необходимости или для повышения удобочитаемости, могут быть добавлены стрелки указателя. Отображает непосредственно передачу управления от одного процесса другому, иногда с возможностью прямого возвращения инициирующему процессу после того, как инициированный процесс завершит свои функции. Так передачи управления должен быть назван внутри символа (запрос, вызов, событие). Символ отображает передачу данных по каналу связи. Специальные символы Символ-соединитель Терминатор Комментарий Символ-пропуск Правила применения символов в схемах Символ предназначен для графической идентификации функции, которую он отображает, независимо от текста внутри этого символа. Символы в схеме должны быть расположены равномерно. Следует придерживаться разумной длины соединений и минимального числа длинных линий. Большинство символов дают возможность включения текста внутри символа. 45 Символ отображает выход в часть системы схемы и вход из другой части схемы. Используется для обрыва линий и продолжения ее в другом месте. Соответствующие символы-соединители должны содержать одно и то же уникальное обозначение. Символ отображает выход во внешнюю среду и вход из внешней среды (начало или конец схемы программы, внешнее использование и источник или пункт назначения данных). Символ используют в схемах для отображения пропуска символа или группы символов, которых не определены ни тип, ни число символов. Его используют только в символах линий или между ними. Символ используется для добавления описательных комментариев или пояснительных записей в целях объяснения или примечания. Пунктирные линии связаны с соответствующим символом или могут обводить группу символов. Текст комментариев или примечаний должен быть помещен около ограничивающей фигуры. ∅ 0.5a Формы символов, установленные данным стандартом, должны служить руководством для фактически используемых символов. Не должны изменяться углы и другие параметры, влияющие на соответствующую формулу символов. Символы должны быть по возможности одного размера. Символы могут быть начерчены в любой ориентации, но предпочтительнее в горизонтальной ориентации. Зеркальное изображение формы символов обозначает ту же функцию, но не является предпочтительным. Минимальное количество текста, необходимое для понимания функции данного символа, следует помещать внутри данного символа. Текст, для чтения должен записываться слева направо и сверху вниз независимо от направления потока. Если не хватает места для описания функционирования символа внутри, то используется комментарий. Если использование комментариев может запутать или разрушить ход схемы, то текст следует помещать на отдельном листе и давать перекрывающую ссылку на символ. В схемах может использоваться идентификатор символов. Это связанный с данным символом идентификатор, который определяет символ для использования в справочных целях в других элементах документации (например, в листинге). Идентификатор символа должен располагаться слева над символом (рис.10). Рис. 10. Расположение идентификаторов над символами В схемах может использоваться описание символа. Например, отображения специального применения символа с перекрывающей ссылкой или 46 YYY…Y XXX…X для улучшения понимания функции, как части схемы. Описание символа должно быть расположено справа над символом. В схемах работы системы символов, отображаются носители данных, во многих случаях представляют способы ввода-вывода. Для использования в качестве ссылки на документацию, текст на схеме для символов, отображающих способы ввода, должен размещать справа над символом, а текст на схеме для символов, отображающих способы ввода, должны размещать справа под символом (рис.11). Рис. 11. Расположение ссылок около символов В схемах может использоваться подробное представление, которое обозначается с помощью символа с полоской для процесса или данных. Символ с полоской (рис.12) указывает, что в этом же комплекте документации, в другом месте имеется более подробное представление. Символ с полоской представляет собой любой символ, внутри которого в верхней части проведена горизонтальная линия. Между этой линией и верхней линией символа помещен идентификатор, указывающий на подробное представление данного символа. В качестве первого и последнего символа подробного представления должен быть использован символ указателя конца. ХВЧ ХВЧ НАЧАЛО ХВЧ КОНЕЦ Символ с полосой Подробное представление Рис. 12.Символ с полосой и его подробное представление 47 ZZZ…Z XXX…X YYY…Y XXX…X ZZZ…Z Первый символ указателя конца должен содержать ссылку, которая имеется также в символе с полосой. Правила выполнения соединений Потоки данных или управления в схемах показывается линиями. Направление потока слева направо и сверху вниз считается стандартным. В случаях, когда необходимо внести большую ясность, на линиях используются стрелки. Если поток имеет отличное направление от стандартного, стрелки должны указывать это направление. В схемах следует избегать пересечения линий. Пересекающиеся линии не имеют логической связи между собой, поэтому изменения направления в точках пересечения не допускаются. Две или больше входящих линий могут объединяться в одну исходящую линию. Место объединения должно быть смещено (рис.13). Рис. 13.Объединение линий Линии в схемах должны подходить к символу либо слева, либо сверху, а исходить либо справа, либо снизу. Линии должны быть направлены к центру символов. При необходимости линии в схемах следует разрывать для избежания излишних пересечений или слишком длинных линий, а также, если схема состоит из нескольких страниц. Соединитель в начале разрыва называется внешним соединителем, в конце внутренним (рис.14). Ссылки и страницы могут быть приведены совместно символом комментария для их соединителей. Внешний соединитель λ 1 К стр. 3 Рис. 14.Использование символов соединителей 48 Из стр. 1 Внутренний соединитель λ 1 Специальные условные обозначения Несколько выходов из символа следует показывать (рис.15): 1. Несколькими линиями от данного символа к другим символам. 2. Одной линией от данного символа, которая затем разветвляется в соответствующее число линий. Каждый выход из символа должен сопровождаться соответствующими значениями условий, чтобы показать логический путь, который он представляет с тем, чтобы эти условия и соответствующие ссылки были идентифицированы. Повторяющиеся представления Вместо символа, с соответствующим текстом может использоваться несколько символов с перекрытием изображения, каждый из которых содержит описание текст. Когда несколько символов представляют упорядоченное множество, это упорядочение должно располагаться от переднего (самого первого) к заднему (последнему) (рис.16). Линии могут входить или исходить из любой точки перекрытых символов, при этом должны соблюдаться все правила прорисовки линий. Приоритет и последовательный порядок нескольких символов не изменяется посредством точки, в которой линия входит или из которой выходит. Пример 7. Нарисуем в соответствии ГОСТ 19.701-90 блок-схему алгоритма решения задачи табулирования функции на основе цикла с постусловием (рис.17). Сравнить А, В А>В А<В А=В А MOD В 0 1 2 3 >3 Рис. 15. Пример использования символа с несколькими выходам 49 текст Рис.16. Повторяющийся символ Тема 4. Язык программирования высокого уровня Си Общие сведения о языке Си Язык Си, созданный Денисом Ритчи в начале 70-х годов в Bell Laboratory американской корпорации AT&T, является одним из универсальных языков программирования. Язык Си считается языком системного программирования, хотя он удобен и для написания прикладных программ. Среди преимуществ языка Си следует отметить переносимость программ на компьютеры различной архитектуры и из одной операционной системы в другую, лаконичность записи алгоритмов, логическую стройность программ, а также возможность получить программный код, сравнимый по скорости выполнения с программами, написанными на языке ассемблера. Последнее связано с тем, что хотя Си является языком высокого уровня, имеющим полный набор конструкций структурного программирования, он также обладает набором низкоуровневых средств, обеспечивающих доступ к аппаратным средствам компьютера. С 1989 года язык Си регламентируется стандартом Американского института Цикл x Конец a, b, h x ← a s i n ( * ) f x x x − ᆲ вычислить f(x) х, f вывести х и f(x) x ← x + h Цикл x x > b ввести a, b, h Начало 0 1 2 3 3.1 3.2 3.3 3.4 4 Рис. 17. Блок-схема алгоритма табулирования функции в соответствии ГОСТ 19.701-90 50 национальных стандартов ANSI С. В настоящее время, кроме стандарта ANSI C разработан международный стандарт ISO C (International Standard Organization C). Алфавит языка Си Алфавит – совокупность символов, которые можно использовать в программах на языке Си. В алфавит языка входят: 1. Большие и маленькие латинские буквы: A, B,..Z; a, b,..z и символ подчеркивания ( '_' ). Далее будем обозначать <буква>. 2. Десятичные цифры: 0, 1,..9. Далее будем писать просто <цифра>. 3. Специальные символы: , . ; : ? ‘ ! | / \ * + - ( ) { } < > [ ] # % & ^ = “ 4. Управляющие и разделительные символы. К той группе символов относятся: пробел, символы табуляции, перевода строки, возврата каретки, новая страница и новая строка. Эти символы отделяют друг от друга объекты, определяемые пользователем, к которым относятся константы и идентификаторы. Последовательность разделительных символов рассматривается компилятором как один символ (последовательность пробелов). 5. Кроме выделенных групп символов в языке Си широко используются так называемые, управляющие последовательности, т.е. специальные символьные комбинации, используемые в функциях ввода и вывода информации. Управляющая последовательность строится на основе использования обратной дробной черты (\) (обязательный первый символ) и комбинацией латинских букв и цифр (табл.5). Таблица 5. Управляющие последовательности языка Си. Управляющая последовательность Наименование \a Звонок \b Возврат на шаг \t Горизонтальная табуляция \n Переход на новую строку \v Вертикальная табуляция 51 \r Возврат каретки \f Перевод формата \” Кавычки \’ Апостроф \0 Ноль-символ \\ Обратная дробная черта \ddd Символ набора кодов ПЭВМ в восьмеричном представлении \xddd Символ набора кодов ПЭВМ в шестнадцатеричном представлении Примечание: 1. Каждая буква, цифра, специальный символ и служебное слово – это самостоятельная, неделимая конструкция языка. 2. В реализации языка на отечественных ЭВМ в алфавит добавляются большие и маленькие русские буквы и дополнительные знаки препинания. Однако эти дополнительные символы можно использовать только в символьных и строковых константах. 3. В языке Си буквы нижнего регистра (а,...,z) отличаются от букв верхнего регистра (А,...,Z). Это означает, что следующие идентификаторы считаются разными: name, NaMe, NAME и т.д. Грамматика для описания языка, синтаксические диаграммы Символы алфавита являются элементарными синтаксическими конструкциями языка, из которых строятся более сложные конструкции (константы, имена, описания, выражения и операторы). Существует два способа описания синтаксиса языка программирования: 1) с использованием формальных грамматик; 2) с использованием синтаксических диаграмм. Способ описания синтаксиса языка программирования на основе формальных грамматик базируется на следующих конструкциях: 1) Вводится множество терминальных символов, которые заключаются в одиночных кавычках. Под терминальным символом понимается неделимый символ языка, например ‘Begin’, ‘Program’, ‘1’, ‘5’. Иногда для сокращения кавычки можно опускать, если смысл конструкции при этом остается понятным. 52 2) Вводится множество нетерминальных символов, которые заключаются в треугольных скобках. Под нетерминальным символом понимается такая конструкция языка, которая может быть разложена на более мелкие составляющие части, т.е. состоит из различных частей, например <вещественное число>, <идентификатор>. 3) Вводится операция «=::» (или «→»), которая читается, как: «это есть», «является», «состоит из» и предназначено для уточнения состава нетерминальных символов. 4) Для обозначения альтернативных вариантов написания терминов в языке вводится синтаксическая конструкция «альтернатива», которая обозначается вертикальной чертой «|» и может читаться как союз «или», например, такая конструкция «<операция> → ‘*’ | ‘/’ | ‘–‘ | ‘+’» обозначает следующее: «нетерминальный символ <операция> это есть терминальный символ ‘*’, или символ ‘/’, или символ ‘–‘ или, символ ‘+’». 5) Для необязательных конструкций языка, которые в одном случае могут присутствовать, а в другом могут отсутствовать используется конструкция «квадратные скобки». Ими обрамляются необязательные символы, например такое описание «<целое число> → [+] | – <цифры>» обозначает, что «конструкция <целое число> есть <цифры>, перед которыми необязательно присутствует знак ‘+’, либо обязательно знак ‘–‘». 6) Для повторяющихся конструкций используется два вида записи: либо с помощью многоточия «…» (если очевидно какая конструкция повторяется), либо повторяющиеся конструкции берутся в фигурные скобки. Иногда такая конструкция называется «итерация» или «повторение», например «< целое число> → [+] | – {<цифра>}», либо «<целое число>→ [+] | – <цифра><цифра>… ». Для наглядности изображения способа построения одних синтаксических конструкций из других используются синтаксические диаграммы (СД). 53 Синтаксическая диаграмма состоит из кружков, овалов, прямоугольников и стрелок. В кружках или овалах записываются неделимые (терминальные) конструкции языка или их обобщённые имена. В прямоугольниках записываются ссылки на другие объекты, синтаксические диаграммы (нетерминальные символы). Стрелки указывают возможные направления движения по СД при построении синтаксической конструкции. Пример 8. СД для понятия “целое число” (целое со знаком) (рис.18). При построении СД используется 5 основных конструкций: 1) Последовательность (рис.19). Порождает синтаксическую конструкцию (иногда говорят цепочку символов) C 1 C 2 C 3 …C N 2) Альтернатива (рис.20). Цифра – + Целое число Рис. 18. СД «Целое число со знаком» С 1 С N С 2 … Рис. 19. Типовая конструкция СД «Последовательность» 54 3) Альтернатива с пустой цепочкой (рис.21). 4) Итерация с пустой цепочкой (рис.22). 5) Итерация без пустой цепочки (рис.23). Синтаксические диаграммы и формальные грамматики позволяют формально описать только синтаксис конструкций языка. Семантику (смысл) будем описывать неформально, т.е. русским языком и на примерах. С 1 С 2 С N … … … Порождает цепочку C 1 , или цепочку C 2 , или цепочку C 3 , …, или цепочку C N С Порождает или пустую цепочку или цепочку С. Рис. 21. Типовая конструкция СД «Альтернатива с пустой цепочкой» С Порождает или пустую цепочку или цепочку С, или цепочку СС, и т.д. Рис. 22. Типовая конструкция СД «Итерация с пустой цепочкой» С Рис. 23. Типовая конструкция СД «Итерация без пустой цепочки» 55 Порождает или цепочку С, или цепочку СС, и т.д. Рис. 20. Типовая конструкция СД «Альтернатива» Структура программы на языке Си В языке Си исходные файлы бывают двух типов: • заголовочные, или h-файлы; • файлы реализации, или Cи-файлы. Имена заголовочных файлов имеют расширение ".h". Имена файлов реализации имеют расширения ".c" для языка Си и ".cpp", ".cxx" или ".cc" для языка C++. Заголовочные файлы содержат только описания. Прежде всего, это прототипы функций. Прототип функции описывает имя функции, тип возвращаемого значения, число и типы ее аргументов. Сам текст функции в h- файле не содержится. Также в h-файлах описываются имена и типы внешних переменных, константы, новые типы, структуры и т.п. В общем, h-файлы содержат лишь интерфейсы, т.е. информацию, необходимую для использования программ, уже написанных другими программистами (или тем же программистом раньше). Заголовочные файлы лишь сообщают информацию о других программах. При трансляции заголовочных файлов, как правило, никакие объекты не создаются. Файлы реализации, или Cи-файлы, содержат тексты функций и определения глобальных переменных. Говоря упрощенно, Си-файлы содержат сами программы, а h-файлы - лишь информацию о программах. Представление исходных текстов в виде заголовочных файлов и файлов реализации необходимо для создания больших проектов, имеющих модульную структуру. Заголовочные файлы служат для передачи информации между модулями. Файлы реализации - это отдельные модули, которые разрабатываются и транслируются независимо друг от друга и объединяются при создании выполняемой программы. В общем случае программа на языке Си имеет следующую структуру: • раздел описания подключаемых библиотек; • функция main; • раздел описания процедур и функций. 56 Обязательным являются все разделы. В разделе описания подключаемых библиотек после ключевого слова #include указывается имя подключаемого к программе библиотечного модуля. Имя модуля заключается в треугольные кавычки − <имя модуля>. В этих модулях содержатся необходимые программе стандартные и пользовательские процедуры и функции, например, «#include Любая программа, каков бы ни был ее размер, состоит из одной или более "функций", указывающих фактические операции компьютера, которые должны быть выполнены. В языке Си − это функция main. Обычно функциям можно давать любые имена, но main − это особое имя; выполнение программы начинается сначала с функции main. Это означает, что каждая программа должна в каком-то месте содержать функцию с именем main. Для выполнения определенных действий функция main обычно обращается к другим функциям, часть из которых находится в той же самой программе, а часть − в библиотеках, содержащих ранее написанные функции. В разделе описания процедур и функций описываются нестандартные (пользовательские) процедуры и функции. Процедура или функция – это подпрограмма, т.е. специальным образом оформленная часть программы, которая выполняет необходимое в программе действие. Подробнее о процедурах и функциях рассказывается в разделе 8. Обобщая все вышесказанное, структура программы на языке Си в упрощенном виде выглядит следующим образом: #include <модуль 1> #include <модуль 2> . . . #include <модуль n> //список подключаемых модулей void main() //функция MAIN { <операторы> //выполняемые операторы } 57 int <имя процедуры/функции> // раздел описания процедур и функций { <основная часть процедуры/функции >; } Как видно из приведенного примера, текст программы на языке Си состоит из строк. Символы в строке записываются на одном уровне без надстрочных и подстрочных индексов. Для разделения некоторых конструкций языка используются пробелы. Пробелы формируются с помощью клавиш «пробел» и «Tab» на клавиатуре компьютера. Пробелы нельзя использовать внутри имён, чисел, специальных символов и служебных слов. По крайней мере 1 пробел должен быть между двумя последовательными именами, числами и служебными словами. Во всех других случаях наличие или отсутствие пробела не влияет на смысл программы. В том месте, где можно использовать 1 пробел, можно использовать любое количество пробелов. Конец строки считается пробелом, поэтому текст программы можно прерывать и переносить на другую строку в любом месте, где можно использовать пробел. Пробелы позволяют выделять структурные блоки программы и делают ее более наглядной, программа без такого структурирования плохо читаема и не понятна. Поэтому существует правило табулирования текста программы – выделения с помощью пробелов, символов табуляции и переводов строк вложенных блоков, циклов, условий. Операторы разделяются между собой символом точка с запятой («;»). Пустым оператором считается оператор, который не выполняет никаких действий. На языке Си это может быть пробел с последующей точкой запятой. Для пояснения текста программы используется комментарии. Комментарии имеют вид (//текст) или (/*текст*/). Комментарий может охватывать несколько строк (используется форма «/*текст*/»), либо помещаться в одной строке (точнее, до конца строки), тогда используется форма: «// комментарий до конца строки». Внутри комментария можно располагать любые символы, в том числе символы, не входящие в алфавит языка. Комментарии можно использовать везде, где применяется пробел. Наличие или отсутствие комментария не влияет 58 на работу программы. Комментарии к программе делают ее более наглядной и понятной, поэтому рекомендуется использовать комментарии как можно чаще. Существует негласное правило хорошего тона программирования: как минимум одна строка комментария на три строки кода программы. Имена объектов в программе Имена (идентификаторы) – условные обозначения для используемых в программе констант, типов, переменных, процедур и функций. Имя начинается с буквы и состоит из букв и цифр, т.е. в виде грамматики: <имя> =:: <буква>{<буква> | <цифра>}, или в виде синтаксической диаграммы (рис.25): Примечание: 1. Во многих реализациях языка количество символов в имени ограничено. 2. В качестве имен нельзя использовать служебные слова языка Си. 3. К буквам относится также символ «_» (подчёркивание). 4. В языке определены стандартные имена, которые можно использовать только в строго определенном смысле. Эти имена используются для обозначения стандартных констант, типов, файлов, процедур и функций. Приведем перечень некоторых стандартных имён: abs – абсолютное значение целого; acos – арккосинус; asctime – дать время; atan, atan2 – арктангенс; atof, atoi, atol – преобразовать в плавающее; close – закрыть файл; цифра буква буква Имя Рис. 24. Синтаксическая диаграмма имени (идентификатора) 59 creat – создать файл; difftime – определить отрезок времени; div – делить; ecvt – преобразовать число в строку; exit, _exit – завершить выполнение программы; exp – экспонента; fclose – закрыть файл; fcvt – преобразовать double в строку с фиксированной точкой; feof – проверка признака конца файла; fgetc – взять байт из файла; fgets – взять строку из файла; filesize – дать размер файла; findfirst, findnext – поиск файлов по шаблону; floor – целая часть; fmod – остаток от деления двух чисел; fopen – открыть файл; fprintf – форматный вывод в файл; fputc – запись байта в файл; fputs – запись строки в файл; fread – читать из файла; free – освободить память; freopen – открыть файл повторно; frexp – экспоненциальное представление; fscanf – форматный ввод из файла; fseek – позиционировать файл; 60 ftell – дать позицию в файле; fwrite – писать в файл; getc, getchar, getche, getch – взять байт из файла; getcwd – дать текущий каталог; gets – ввод строки; index – найти литеру в строке; inp, inpw – ввод из порта; itoa – представление целого; kbhit – проверка ввода с клавиатуры; labs – абсолютное значение длинного; ldexp – экспонента; ldiv – деление чисел типа long; localtime – дать местное время; log, log10 – логарифм; lseek – изменить позицию в файле; mkdir – создать каталог; mktime – преобразовать время; modf – дробная и целая часть числа; open – открыть файл; outp, outpw – вывод в порт; pow – степень; printf, fprintf, sprintf – форматный вывод; puts – вывод строки в файл; rand – случайная величина; read – читать блок из файла; 61 rename – переименовать файл; rewind – установить указатель файла в начало; rmdir – удалить каталог; scanf – форматный ввод; sin, sinh – синус, синус гиперболический; spawn – создать процесс; sprintf – форматный вывод в буфер; sqrt – квадратный корень; srand – инициализация случайной величины; sscanf – форматный вывод из буфера; strlen – дать длину строки; strlwr – привести к нижнему регистру; strspn – дать длину совпадающей подстроки; strstr – найти подстроку; time – дать время; vprintf, vfprintf, vsprintf – форматный вывод; write – писать в файл. Выражения, операции и приоритеты Выражение состоит из операндов, символов операций и круглых скобок. Операнды – объекты, к которым применяются операции. В процессе вычисления выражения получается результат определенного типа. Тип выражения – это тип его результата, который определяется той операцией, которая выполняется последней. В качестве операндов могут выступать переменные, константы, элементы массивов, массивы, записи, поля записей, результаты вычислений стандартных и нестандартных функций и других выражений. Нестандартными, называются функции, которые создаются в программе пользователем. Стандартные функции 62 – это функции языка Си, которые имеются в стандартных подключаемых модулях и библиотеках. Запись вызова функции в выражении осуществляется указанием имени функции и списком аргументов (параметров), указанных в круглых скобках через запятую. В частном случае допустим вызов функции без параметров (между круглыми скобками при этом ничего не ставится, даже пробел). При вызове функции (обращении к функции) сначала вычисляются выражения, задающие аргументы функции, затем вызывается соответствующая подпрограмма и ей передаются вычисленные значения аргументов функции, далее подпрограмма по заданным аргументам вычисляет значение функции и, наконец, это значение возвращается в вызывающую программу и подставляется в выражение, в точку вызова. Выполнение операций в языке Си подобно встроенным функциям языка. Можно выделить следующие группы операций: • арифметические операции (+, –, *, /, %); • операции отношения (= =, !=, <, >, =>, =<); • логические операции (&&, ||, !); • логические поразрядные операции (&, \!, ^, <<, >>, \^, \, ); • операции со строками (*, +=); • операции с указателями (&, *, ++, ==, !=); • операции присваивания (=, *=, /=, %=, -=, +=, <<=, >>=, &=, |=, ^=); • операция переименования типов данных (typedef); • операция преобразования типов ((тип) выражение). Каждая из указанных операций рассматривается подробно в разделах, посвященным структурам данных в языке Си. Операнды, участвующие в операции должны быть строго одного типа. Для операций +, –, *, / один операнд может быть целым, а другой вещественным, в этом случае результат – вещественного типа. В сложных выражениях последовательность выполнения операций определяется скобками, старшинством операций и их ассоциативностью. Если подряд идет несколько операций, не разделенных скобками, то 63 последовательность их вычисления определяется приоритетом операций. По приоритету операции разделяются на четыре уровня (табл.6): Таблица 6. Операции и их приоритеты Операция Приоритет (), [], -> Первый (наивысший) !, \^, ++, --, -, (TYPE) * & SIZEOF Второй *, /, % Третий +, - Четвертый <<, >> Пятый <, >, <=, >= Шестой (низший) Операции с более высоким приоритетом выполняются в первую очередь, далее выполняются операции с более низким приоритетом. Если же подряд следует несколько операций с равным приоритетом, то последовательность вычислений определяется ассоциативностью, которая у всех операций в Си одинакова – слева направо, кроме операций, имеющих приоритет 2 − они выполняются справа налево. Приведем примеры выражений на языке Си: • (a || b) && !c; • sin(x*y / 3) / (x+cos(y % 2)); • ((x>2.03) || (x<1.1)) && (y>0). |