Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Лексические элементы языка




Лексические элементы языка 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   -128... + 127 signed char
Int 2/4 зависит от системы signed, signed int
unsigned char   0...255 нет
unsigned int 2/4 зависит от системы unsigned
short int   -32768...32767 short, signed short int
unsigned short   0... 65535 unsigned short int
long int   -2 147483648... 2 147483647 long, signed long int
unsigned long int   0... 4294967295 unsigned long
float   ±(3.4Е-38...3.4Е+38) нет
double   ±(1.7Е-308...1.7Е+308) нет
long double   ±(3.4Е-4932...1.1Е+4932) нет

 

Описание переменных в программах на Си/Си++ имеет вид:

имя_типа список_переменных;

Примеры описаний:

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)

 

Обращение Тип аргумента Тип результата Функция
abs (x) int int абсолютное значение целого числа
acos (x) double double арккосинус (радианы)
asin (x) double double арксинус (радианы)
atan (x) double double арктангенс (радианы)
ceil (x) double double ближайшее целое, не меньшее х
cos (x) double double косинус (х в радианах)
exp (x) double double е* — экспонента от х
fabs (x) double double абсолютное значение вещественного х
floor (x) double double наибольшее целое, не превышающее х
fmod (x, у) double double double остаток от деления нацело х на у
log (x) double double логарифм натуральный — 1пх
logl0 (x) double double логарифм десятичный — Igx
pow (x, y) double double double х в степени у — ху
sin (x) double double синус (х в радианах)
sinh (x) double double гиперболический синус
sqrt (x) double double корень квадратный (положительное значение)
tan (x) double double тангенс (х в радианах)
tanh (x) double double гиперболический тангенс

 

7. Директивы препроцессора

Препроцессор – макропроцессор, используемый для обработки исходного текста программы на нулевой фазе компиляции.

Директивы препроцессора – указание препроцессору по преобразованию текста программы. Директивы позволяют заменять часто используемые в тексте константы, ключевые слова идентификаторами, добавлять в исходный файл содержимое других файлов, запретить компиляцию отдельных участков программы и т.д.

Директива подключения

Подставляет в текст программы содержимое другого файла.

# include <имя файла>

# include “имя файла”

Если имя файла задано в < >, то поиск файла осуществляется в системном каталоге, если имя файла указано в “ ”, то поиск осуществляется сначала в текущем каталоге, а затем в системном.

Например:

#include <stdio.h> //подключаем файл, содержащий функции стандартного ввода - вывода

Директива подстановки.

#define <идентификатор> <текст>

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...