Лексические элементы языка
Стр 1 из 3Следующая ⇒ Лексические элементы языка 5 Типы данных 5 Область видимости 6 Операции и выражения 7 7. Директивы препроцессора 9 8. Данные вещественного типа 9 9. Ввод - вывод данных 9 10. Данные логического типа. 11 11. Инструкции if и if-else 11 Данные символьного типа 12 Программирование циклов 12 14. Оператор выбора Конструкция switch\case 14 Указатели 15 Массивы 16 17. Практические задания 19
1. ИСТОРИЯ ЯЗЫКА ПРОГРАММИРОВАНИЯ СИ++ История языка программирования Язык Си был создан в 1972 г. сотрудником фирмы Bell Laboratories в США Денисом Ритчи. По замыслу автора, язык Си должен был обладать противоречивыми свойствами. С одной стороны, это язык программирования высокого уровня, поддерживающий методику структурного программирования (подобно Паскалю). С другой стороны, этот язык должен обеспечивать возможность создавать такие системные программы, как компиляторы и операционные системы. До появления Си подобные программы писались исключительно на языках низкого уровня — Ассемблерах, Автокодах. Первым системным программным продуктом, разработанным с помощью Си, стала операционная система UNIX. Из-за упомянутой выше двойственности свойств нередко в литературе язык Си называют языком среднего уровня. Стандарт Си был утвержден в 1983 г. Американским национальным институтом стандартов (ANSI) и получил название ANSI С. В начале 1980-х гг. в той же фирме Bell Laboratories ее сотрудником Бьерном Строуструпом было разработано расширение языка Си, предназначенное для объектно-ориентированного программирования. По сути дела, был создан новый язык, первоначально названный «Си с классами», а позднее (в 1983 г.) получивший название Си++ (Си-плюс-плюс). Язык Си++ принято считать языком объектно-ориентированного программирования.
Из сказанного выше следует, что язык Си++ поддерживает как процедурную, так и объектно-ориентированную парадигмы программирования.
Объектно-ориентированное программирование
Основным отличием языка СИ++ от языка СИ является наличие в нем средств ООП. Базовые понятия ООП: это инкапсуляция, наследование, полиморфизм. В отличие от Паскаля, вместо понятия «объектный тип данных», в СИ++ используется понятие «класс». Объектно-ориентированное программирование — это программирование, сфокусированное на данных, причем данные и поведение неразрывно связаны. Вместе данные и поведение представляют собой класс, а объекты являются экземплярами класса. Например, многочлен имеет область значений, и она может изменяться такими операциями, как сложение и умножение многочленов. ООП рассматривает вычисления как моделирование поведения. То, что моделируется, является объектами, представленными вычислительной абстракцией. КЛАСС – это структурированный тип, включающий в себя в качестве элементов типизированные данные и функции, применяемые по отношению к этим данным. Таким образом, инкапсуляция (объединение параметров и методов), заложена в составе элемента класса: типизированные данные- это параметры, а методы реализованы через функции. ОБЪЕКТ – это экземпляр класса. ИНКАПСУЛЯЦИЯ – свойство класса, при котором класс замкнут, а его реализация (т.е. набор команд, элементов), скрыта от основной части программы. НАСЛЕДОВАНИЕ – 2-е фундаментальное понятие ООП. Механизм наследования позволяет формировать иерархии классов. Класс наследник получает свойства класса-предка. ПОЛИМОРФИЗМ - допускает использование функций с одним и тем же именем применительно к разным наборам аргументов и операндов, а также к разным их типам в зависимости от контекста программы. В СИ++ полиморфизм реализован через механизм перегрузки. Т.е внутри класса допускается существование нескольких функций с одинаковым именем, но различающихся типом результатов и наборами формальных параметров. Компилятор выбирает подходящий вариант в зависимости от количества и типов аргументов.
Преимущества объектно-ориентированного программирования Центральным элементом ООП является инкапсуляция совокупности данных и соответствующих им операций. Понятие класса с его функциями-членами и членами данных предоставляет программисту подходящий для реализации инкапсуляции инструмент. Переменные класса являются объектами, которыми можно управлять. Кроме того, классы обеспечивают сокрытие данных. Права доступа могут устанавливаться или ограничиваться для любой группы функций, которым необходим доступ к деталям реализации. Тем самым обеспечивается модульность и надежность. Еще одной важной концепцией ООП является поощрение повторного использования кода с помощью механизма наследования. Суть этого механизма — получение нового производного класса из существующего, называемого базовым. При создания производного класса базовый класс может быть дополнен или изменен. Таким путем могут создаваться иерархии родственных типов данных, которые используют общий код. При использовании ООП решение будет более модульным, следовательно, более понятным и простым для модификации и обслуживания. Кроме того, такое решение будет более пригодно для повторного использования. Например, если в программе нужен стек, то он легко заимствуется из существующего кода. В обычном процедурном языке программирования такие структуры данных часто «вмонтированы» в алгоритм и не могут экспортироваться.
Лексические элементы языка
В алфавит языка Си++ входят: • латинские буквы: от а до z (строчные) и от А до Z(прописные); • десятичные цифры: 0, 1, 2, 3, 4, 5, б, 7, 8, 9; • специальные символы: " { }, | []()+-/ % \; ':? < = >_!&#~^.* К специальным символам относится также пробел. В Си++ в качестве ограничителей комментариев могут использоваться как пары символов /* и */, принятые в языке Си, так и символы //, используемые только в Си++.
Из символов алфавита формируются лексемы — единицы текста программы, которые при компиляции воспринимаются как единое целое и не могут быть разделены на более мелкие элементы. К лексемам относятся идентификаторы, служебные слова, константы, знаки операций, разделители.
Идентификаторы. Последовательность латинских букв, цифр, символов подчеркивания (_), начинающаяся с буквы или символа подчеркивания, является идентификатором.
Например: В12 rus hard_RAM_disk MAX ris_32 В отличие от Паскаля в Си/Си++ различаются прописные и строчные буквы.
Служебные (ключевые) слова. Как и в Паскале, служебные слова в Си — это идентификаторы, назначение которых однозначно определено в языке. Они не могут быть использованы как свободно выбираемые имена.
4. Типы данных Разнообразие типов данных в Си++ меньше, чем в Турбо Паскале. В Си/Си++ имеется четыре базовых арифметических (числовых) типа данных. Из них два целочисленных — char, int — и два плавающих (вещественных) — float и double. Кроме того, в программах можно использовать некоторые модификации этих типов, описываемых с помощью служебных слов – модификаторов. Существуют два модификатора размера – short(короткий) long(длинный) и два модификатора знаков signed (знаковый) unsigned (беззнаковый). Знаковые модификаторы применяются только к целым типам.
Таблица 4.1
Описание переменных в программах на Си/Си++ имеет вид: имя_типа список_переменных; Примеры описаний: char symbol,се; unsigned char code; int number,row; double e,b4; Одновременно с описанием можно задать начальные значения переменных. Такое действие называется инициализацией переменных.
Константы. Запись целых констант. Целые десятичные числа, начинающиеся не с нуля, например: 4, 356, -128. Целые восьмеричные числа, запись которых начинается с нуля, например: 016, 077. Целые шестнадцатеричные числа, запись которых начинается с символов 0х, например: 0x1A, 0x253, 0xFFFF. Запись вещественных констант. Если в записи числовой константы присутствует десятичная точка (2.5) или экспоненциальное расширение (1E-8), то компилятор рассматривает ее как вещественное число и ставит ей в соответствие тип double. Примеры вещественных констант: 44. 3.14159 44Е0 1.5Е-4. Использование суффиксов. Программист может явно задать тип константы, используя для этого суффиксы. Существуют три вида суффиксов: F (f) —float; U(u) -unsigned; L(l) — long (для целых и вещественных констант). Кроме того, допускается совместное использование суффиксов U и L в вариантах ul или lu. Примеры: 3.14159F — константа типа float, под которую выделяется 4 байта памяти; Запись символьных и строковых констант. Символьные константы заключаются в апострофы. Например:'А','а','5',' + '. Строковые константы, представляющие собой символьные последовательности, заключаются в двойные кавычки. Например: "rezult", "введите исходные данные". Особую разновидность символьных констант представляют так называемые управляющие символы. Они не имеют графического представления. ' \n' — переход на новую строку; ' \t' — горизонтальная табуляция; ‘\а' — подача звукового сигнала. Именованные константы (константные переменные). Как и в Паскале, в программе на Си/Си++ могут использоваться именованные константы. Употребляемое для их определения служебное слово const принято называть модификатором доступа const float pi=3.14159; const int MIN=l, MAX=1000; Определение констант на стадии препроцессорной обработки программы. Еще одной возможностью ввести именованную константу является использование препроцессорной директивы #define в следующем формате: #define <имя константы> <значение константы> Например: #define iMIN 1 Константы перечисляемого типа. Данное средство языка позволяет определять последовательность целочисленных именованных констант. Описание перечисляемого типа начинается со служебного слова enum, а последующий список констант заключается в фигурные скобки. Например: enum {A,B,C,D}; enum {А=10,В,С,D};
В результате будут установлены следующие соответствия: А=10, В=11, С=12, D=13. Если перечисляемому типу дать имя, то его можно использовать в описании переменных. Этот вариант аналогичен использованию перечисляемого типа данных в Паскале (см. разд. 3.4). Например:
enum metal {Fe,Co,Na,Cu,Zn}; metal Metl,Met2; // после такого описания в программе возможны следующие операторы Met1=Na; Met2=Zn;
5. Область видимости
В базовом языке существует два основных вида области видимости (scope): локальная область видимости и область видимости файла. Локальная область видимости относится к блоку. Тело функции — это пример блока; оно содержит набор объявлений, включая параметры функции. В область видимости файла входят имена, которые являются внешними (глобальными). Правила для области видимости класса мы обсудим позднее. Основное правило области видимости состоит в том, что идентификаторы доступны только внутри блока, в котором они объявлены. Они не известны за границами блока. Например: int a = 2; //а вне блока cout «a << endl; //напечатается 2 { //вход во внутренний блок int а = 7; //а внутри блока cout «а «endl; //напечатается 7 } //выход из внутреннего блока cout «++а «endl; //напечатается 3 Внешнее по отношению к блоку имя действительно до тех пор, пока оно не переопределено внутри блока. Если оно переопределено, то внешнее имя скрывается от внутреннего блока. В C++ объявления могут встречаться в любом месте блока. Область видимости идентификатора начинается сразу после его объявления и продолжается до конца самого внутреннего блока, в котором он объявлен.
Операции и выражения
Во всех языках программирования под выражением подразумевается конструкция, составленная из констант, переменных, знаков операций, функций, скобок. Напомним, что операция, применяемая к одному операнду, называется унарной, а операция с двумя операндами — бинарной. Арифметические операции. К арифметическим операциям относятся: - вычитание или унарный минус; + сложение или унарный плюс; * умножение; / деление; % деление по модулю (аналог Mod в Паскале); ++ унарная операция увеличения на единицу (инкремент); унарная операция уменьшения на единицу (декремент).
Все операции, кроме деления по модулю, применимы к любым числовым типам данных. Операция % применима только к целым числам. Рассмотрим особенности выполнения операции деления. Если делимое и делитель — целые числа, то и результат — целое число. Операции инкремента и декремента. Операция ++ увеличивает значение переменной на единицу, операция - - уменьшает значение переменной на единицу. Оба знака операции могут записываться как перед операндом (префиксная форма), так и после операнда (постфиксная форма), например: ++х или х++, - -а или а- -. пример: а=3; b=2; с=а++*b++; В результате выполнения переменные примут етедующие значения: а =4, b = 3, с= 6. Второй пример: а=3; b=2; с=++а*++Ь; Результаты будут такими: а = 4, b = 3, с = 12. Одинаковые по старшинству операции выполняются в порядке слева направо. Как и в Паскале, для изменения порядка выполнения операций в выражениях могут применяться круглые скобки. Операции отношения. <, >, <=, >=, ==,!= Hезультатом операции отношения является целое число: если отношение истинно — то 1, если ложно — то 0. Примеры отношений Логические операции. Три основные логические операции в языке Си записываются иначе, чем в Паскале. ! операция отрицания (НЕ), && конъюнкция, логическое умножение (И), I | дизъюнкция, логическое сложение (ИЛИ). Правила их выполнения определяются таблицей истинности (см. табл. 3.5). Операция присваивания. То, что присваивание в Си является операцией, а не оператором, оказывается, наверное, самой большой неожиданностью для знатоков Паскаля. А между тем это действительно так! Знак операции присваивания =. Следствием отмеченного факта является то, что присваивание, как любой другой знак операции, может несколько раз входить в выражение. Например: а=b=с=х+у; Операция присваивания — правоассоциативная. Это значит, что несколько подряд расположенных присваиваний выполняются справа налево. Поэтому в приведенном выше выражении первой выполнится операция сложения, затем переменной с присвоится значение суммы, затем это значение присвоится переменной b и в конце — переменной а. Операции присваивания, совмещающие присваивание с выполнением других операций: +=, -=, /=, *=, %=. Приоритет у них такой же, как и у простого присваивания. Примеры использования этих операций: а+=2 эквивалентно а=а+2, Заметим, что вместо выражения а=а+2 предпочтительнее писать в программе а+=2, поскольку второе выражение будет вычисляться быстрее. Операция явного преобразования типа (операция «тип»). Применение этой операции имеет следующий формат: (имя_типа) операнд Операндом могут быть константа, переменная, выражение. В результате значение операнда преобразуется к указанному типу. Примеры использования преобразования типа: (long)8, (float)I, (int)x%2
Операция sizeof. Эта операция имеет две формы записи: sizeof(тип) и sizeof(выражение) Результатом операции является целое число, равное количеству байтов, которое занимает в памяти величина явно указанного типа или величина, полученная в результате вычисления выражения. sizeof (int) результат — 2 Операция «запятая». Эта необычная операция используется для связывания нескольких выражений в одно. Несколько выражений, разделенных запятыми, вычисляются последовательно слева направо. В качестве результата такого совмещенного выражения принимается значение самого правого выражения. Например, если переменная х имеет тип int, то значение выражения (Х=3, 5*Х) будет равно 15, а переменная х примет значение 3. Операция «условие?:». Это единственная операция, которая имеет три операнда. Формат операции: выражение1? выражение2: выражениеЗ Данная операция реализует алгоритмическую структуру ветвления. Алгоритм ее выполнения следующий: первым вычисляется значение выражения 1, которое обычно представляет собой некоторое условие. Если оно истинно, т.е. не равно 0, то вычисляется выражение 2 и полученный результат становится результатом операции. В противном случае в качестве результата берется значение выражения 3. Пример 3. Заменить большее значение из двух переменных а и b на единицу: (a>b)?a:b=l; Правила языка в данном случае позволяют ставить условную операцию слева от знака присваивания. Операции () и [ ]. В языке Си круглые и квадратные скобки рассматриваются как операции, причем эти операции имеют наивысший приоритет. Структура программы
директивы_препроцессора определение_функции_1 определение_функции_2 ....... определение_функции_N void main() { определения_объектов; исполняемые_опера торы; } Любое выражение, после которого стоит точка с запятой, воспринимается компилятором как отдельный оператор.
Таблица 4.3 Математические функции (заголовочный файл math. h)
7. Директивы препроцессора Препроцессор – макропроцессор, используемый для обработки исходного текста программы на нулевой фазе компиляции. Директивы препроцессора – указание препроцессору по преобразованию текста программы. Директивы позволяют заменять часто используемые в тексте константы, ключевые слова идентификаторами, добавлять в исходный файл содержимое других файлов, запретить компиляцию отдельных участков программы и т.д. Директива подключения Подставляет в текст программы содержимое другого файла. # include <имя файла> # include “имя файла” Если имя файла задано в < >, то поиск файла осуществляется в системном каталоге, если имя файла указано в “ ”, то поиск осуществляется сначала в текущем каталоге, а затем в системном. Например: #include <stdio.h> //подключаем файл, содержащий функции стандартного ввода - вывода Директива подстановки. #define <идентификатор> <текст>
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|