Алфавит и идентификаторы
В тексте на любом естественном языке можно выделить четыре основных элемента: символы, слова, словосочетания и предложения. Подобные элементы содержит и алгоритмический язык, только слова называют лексемами (элементарными конструкциями), словосочетания — выражениями, а предложения - операторами. Лексемы образуются из символов, выражения - из лексем и символов, а операторы — из символов, выражений и лексем.
Алфавит языка – это символы, которые можно использовать для записи программы на данном языке. Содержание алфавита составляют латинские буквы и арабские цифры 0… 9, дополненные знаками операций (+, -, *, & и др.), разделительными и специальными символами (/, \, [, {, % и др.). В комментариях можно использовать русские буквы. Буквы (латинские и русские) могут быть строчными и заглавными.
Лексема, или элементарная конструкция, — минимальная единица языка, имеющая самостоятельный смысл.
Выражение задает правило вычисления некоторого значения.
Оператор задает законченное описание некоторого действия.
Идентификаторы – это имена, которые присваиваются переменным, функциям, операторам и т.д. Идентификатор образуется из набора букв и цифр. Первым должна быть буква; знак подчеркивания (_) считается буквой. Длина идентификатора не должна превышать 31 символ. В идентификаторах различаются заглавные и строчные буквы.
Примеры:
Правильно | Неправильно | Причина |
as | kod 2 | Содержит пробел |
V_Ivanov | 535_alt | Начинается с цифры |
ist_11 | а2Я | Содержит запрещенный символ |
bottle | int | Стандартное слово языка С++ |
Ключевые слова – это идентификаторы, которые зарезервированы в языке С++, где они выполняют определенное назначение и в другом значении использоваться не могут.
Примеры: int, cout, void, и др.
Типы данных и переменные
Компьютерные программы предназначены для обработки данных. Элементарными данными в программе являются числа и символы. Числа, в свою очередь, разделяются на целые и дробные. Исходя из такого деления, в языке Си используется три основных типа данных, для которых применяются следующие обозначения (ключевые слова):
§ char – символ;
§ int – целое число;
§ float – дробное (вещественное) число.
Тип данных определяет:
• внутреннее представление данных в памяти компьютера;
• размер памяти, отводимой под данный тип (множество значений, которые могут принимать величины этого типа);
• операции и функции, которые можно применять к величинам этого типа.
Целые числа в С++ представляются следующими типами:
int – целое,
long – длинное целое,
short – короткое целое,
unsigned – беззнаковое целое.
Размер памяти, отводимый под каждый тип данных, зависит от типа используемого компьютера. Если, например, машинное слово 2 байта (16 бит), то под int отводится 2 байта, под short – 2 байта, под long – 4 байта, под unsigned – 2 байта.
Вещественные (дробные) числа представлены тремя типами:
float – вещественное,
double – вещественное с двойной точностью,
long double – длинное дробное.
Под float обычно отводится в два раза больше памяти, чем под int. Для double отводится в два раза больше памяти, чем под float.
В С++ имеется ещё логический тип данных – bool. Величины логического типа могут принимать только значения true и false, являющиеся зарезервированными словами. Внутренняя форма представления значения false - 0 (нуль). Любое другое значение интерпретируется как true.
Кроме простых типов данных в языке С++ используются составные (пользовательские) типы данных, которые будут рассмотрены в заключительной части конспекта лекций.
В любой программе требуется производить вычисления. Для вычисления значений используются выражения. Выражением называется совокупность операторов, операндов и знаков пунктуации, выстроенная для вычисления какого-либо значения. Выражение, за которым стоит точка с запятой образует инструкцию языка (оператор программы):
выражение;
Операнды задают данные для вычислений. Операции задают действия, которые необходимо выполнить. Каждый операнд является, в свою очередь, выражением или одним из его частных случаев, например, константой или переменной.
Переменная – это именованная область памяти, в которой хранятся данные определенного типа. У переменной есть имя и значение. Имя служит для обращения к области памяти, в которой хранится значение. Во время выполнения программы значение переменной можно изменять. Перед использованием любая переменная должна быть описана (объявлена). Для этого, вначале указывается тип данных переменной, а затем через пробел – идентификатор, обозначающий её имя. Объявление заканчивается точкой с запятой.
Примеры:
float a1; // объявлена переменная а1 для работы с дробными числами
int two; // объявлена целочисленная переменная two
char s; // объявлена символьная переменная s.
Для объявления нескольких однотипных переменных их разделяют запятыми после указания типа данных.
Примеры:
int a,b,c; //объявлены три целочисленные переменные
float a1,b1; // объявлены две вещественные переменные.
Составим небольшую программу, в которой вычислим сумму двух целых чисел.
#include<iostream>
Int main()
{
int a; // объявление целочисленной переменной а
int b; // объявление целочисленной переменной b
int c; // объявление целочисленной переменной с
a=24; // занесение числа 24 в переменную а
b=46; // занесение числа 46 в переменную b
c=a+b; // вычисление суммы и занесение её в с
cout << c; // вывод на экран значения переменной с
return 0;
}
Константы
Простые программные объекты являются переменными, либо константами. В предыдущем примере были объявлены переменные величины, которые могут изменяться при выполнении программы. Неизменяемые величины называются константами; это - числа либо символы, используемые в программе.
Типы констант, их форматы и примеры написания приведены в расположенной ниже таблице. Из неё следует в частности, что целая и дробная часть вещественных чисел разделяется точкой (а не запятой), целые числа в восьмеричной системе счисления начинаются с нуля, а целые числа в шестнадцатеричной системе счисления начинаются с комбинации 0X (0x), символы заключаются в апострофы, а символьные строки – в кавычки.
Константа | Формат | Примеры |
Целая | Десятичный: последовательность десятичных цифр, начинающаяся не с нуля, если это не число нуль. Восьмеричный: нуль, за которым следуют восьмеричные цифры (0,1,2,3,4,5,6,7). Шестнадцатеричный: Ох или ОХ, за которым следуют шестнадцатеричные цифры (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F). | 8, 0, 199226 01, 020, 07155 0хА, 0x1 В8, 0X00FF |
Вещественная | Десятичный. Экспоненциальный. | 5.7,.001, 35. 0.2Е6,.15е-З, 5Е10 |
Символьная | Один или два символа, заключенных в апострофы. | 'А', 'f', '*', 'db', '\n', |
Строковая | Последовательность символов, заключенная в кавычки. | "Texet", "Rezult = " |
В языке С++ существуют ещё управляющие константы. Их называют также escape-последовательностями. Они управляют выводимой информацией и выполняют другие функции.
Управляющие константы и их значения приведены в следующей таблице.
Изображение | Наименование |
\а | Звуковой сигнал |
\b | Возврат на шаг |
\f | Перевод страницы (формата) |
\n | Перевод строки |
\r | Возврат каретки |
\t | Горизонтальная табуляция |
\v | Вертикальная табуляция |
Рассмотрим небольшой пример с использованием строковых констант и управляющих последовательностей.
#include<iostream>
int main()
{
cout <<”Abra”;
cout <<”Kadabra”;
return 0;
}
После выполнения данной программы, на экран будет выведено:
AbraKadabra
Т.е. компьютер будет последовательно заполнять экран выводимой информацией, несмотря на то, что операторы вывода расположены в разных строках программы.
Чтобы слова располагались на соседних строчках экрана надо использовать соответствующую управляющую константу (\n). Тогда программа примет следующий вид.
#include<iostream>
int main()
{
cout <<”Abra”<<’\n’;
cout <<”Kadabra”;
return 0;
}
После выполнения программы получим:
Abra
Kadabra
Если константа длинная и встречается в тексте программы неоднократно, то для удобства ее использования, а также для лучшего восприятия программы, константе присваивается осмысленное имя с помощью директивы препроцессора #define, после которой указывается имя константы и через пробел – её значение, например:
#define E “Error”
#define M 4206005,246921
После записи директивы точка с запятой не ставится.
Чтобы не путать таким образом определенные константы с переменными, их имена обычно пишут заглавными буквами.
Директива #define помещается в начале программы вслед за директивой #include.
Рассмотрим пример, в котором вычисляется длина окружности.
#include <iostream>
#define PI 3.14159 // задание именованной константы
Int main()
{
float r = 5.25; // объявление вещественной переменной r и
float len; // одновременная её инициализация
len = 2 * PI * r; // вычисление значения длины окружности
cout<<len; // вывод результата на экран
return 0;
}
В данной программе значение числа π присвоено именованной константе PI, которая затем используется для вычисления длины окружности.
Операторы
Для обработки данных язык С++ располагает широким набором операций. Операция представляет собой некоторое действие, выполняемое над одним или несколькими операндами, результатом которого является возвращаемое значение. Например, запись в программе
z = x + y;
обязывает компьютер сложить числа x и y (выполнить правую часть равенства), а затем результат (возвращаемое значение операции сложения) присвоить переменной z.
Оператор «=» называется оператором присваивания и, как было отмечено, выполняется справа налево. Остальные операторы выполняются обыкновенным образом – слева направо.
Арифметические операторы и их обозначения приведены в следующей таблице.
Сложение | + | c=a+b; |
Вычитание | - | d=a-b; |
Умножение | * | s=a*b; |
Деление | / | p=a/b; |
Деление по модулю (остаток от деления) | % | int a=19; int b=8; D=a % b; // D=3 |
Пример.
#include<iostream>
int main()
{
int x,y,z; // объявление целочисленных переменных x,y,z
x=20;
y=5;
z=x/y; // выполнение операции деления
cout<< z <<’\n’; // вывод на экран результата деления
cout<<x*y; // вывод на экран результата умножения
return 0;
}
В данном примере выполняются две арифметические операции – умножение и деление – и результаты операций выводятся на экран. Особенность вывода результата умножения состоит в том, что возвращаемое значение операции умножения нигде не сохраняется, а сразу выводится на экран. В то время как результат деления сохраняется в переменной z.
Логические операторы. Результатом логических операций может быть либо «ложь» (0), либо «истина» (1). Логическими операторами являются:
· логическое отрицание (инверсия):!
Пример: a=!b; если b=0, то a=1;
· логическое «или» (дизъюнкция): ||
· логическое «и» (конъюнкция): &&.
Операторы сравнения приведены в следующей таблице.
Оператор | Название |
< | Меньше |
<= | Меньше или равно |
> | Больше |
>= | Больше или равно |
== | Равно |
!= | не равно |
Результатом операций сравнения также как и логических операций может быть либо «ложь» (0), либо «истина» (1).
Пример.
#include<iostream >
Int main()
{
int a,b,c,d;
a=34;
b=12;
c=12;
d = c = = b; // сравнение на равенство переменных c и b
cout<<d<<'\n'; // вывод результата сравнения
d = b > a; // b больше a?
cout << d <<'\n'; // вывод результата сравнения
return 0;
}
В данном примере объявляются четыре целочисленные переменные и трём из них присваиваются значения. Четвертая переменная используется для хранения результата сравнения переменных. В первом случае сравниваются c и b. Так как c и b равны,то d =1. Во втором случае сравниваются b и a (b > a). Результатом будет 0.
Вид экрана:
1
0
При программировании часто используются унарные (применимые к одному операнду) операторы инкремента и декремента. Инкремент (++) увеличивает значение операнда на единицу. Декремент (- -) уменьшает значение операнда на единицу.
Пример.
#include<iostream >
Int main()
{
int a,x,y,z;
a=2;
x=3;
y=a-x++; // сначала вычисляется a-x, а затем осуществляется x++
cout<<'Y'<<" "<<'X'<<'\n';
cout<<y<<" "<<x<<'\n';
y=a+x- -; // сначала вычисляется a+x, а затем осуществляется x- -
cout<<y<<" "<<x<<'\n';
return 0;
}
В этом примере после объявления и инициализации переменных выполняется оператор y=a-x++; в следующей последовательности: сначала вычисляется a-x, а затем значение х увеличивается на единицу. После этого на экран выводятся через пробел символы Y и X, а после перевода строки – значения переменных y и x, которые равны соответственно -1 и 4. Затем выполняется оператор y=a+x- -; аналогичным порядком и снова выводятся на экран значения переменных y и x, которые будут равны соответственно 6 и 3.
Вид экрана:
Y X
-1 4
6 3
В выражении порядок выполнения операторов определяется их приоритетом. Первыми выполняются операции с наивысшим приоритетом. Цепочка приоритетов в С++ выглядит так:
!, *, /, %, +, -, && , || , = .
Например, в выражении
x+y*pol /z
сначала выполнится умножение, затем – деление и в последнюю очередь – сложение.
Для изменения порядка выполнения операций в выражении применяются круглые скобки. Например, (x+y)*pol /z. Теперь первой будет выполнена операция сложения.
Понятие массива и составного оператора
Программирование на первом этапе своего развития было искусством, т. е. осуществлялось по большей части интуитивно. Прошло немало лет пока специалисты не поняли (а затем и доказали), что любая программа состоит из набора элементарных алгоритмических конструкций. Их всего три: линейная, ветвление и цикл. Освоив существо этих элементов можно разработать программу любой сложности.
Это – важный психологический и методический момент. Первый проявляется в том, что человек, не обладающий четким логическим мышлением или считающий программирование сложным и запутанным делом, получает психологическую поддержку, узнав, что для успешного программирования следует изучить и использовать лишь две «вещи»: а) состав языка программирования и б) структуру и синтаксис операторов ветвления и цикла. И тогда не страшны никакие преграды.
Методический момент состоит в том, что эти две «вещи» являются доминирующими в процессе изучения языка, фундаментом в здании учебной дисциплины. Им должно уделяться превалирующее внимание.
Перед тем, как приступить к рассмотрению конструкций ветвлений и циклов, необходимо коснуться двух небольших вопросов, которые понадобятся в дальнейшем.
Понятие массива
Массив относится к составному типу данных. Он представляет собой набор простых однотипных данных. Они расположены в памяти вплотную друг за другом. При объявлении массива после его имени в скобках указывается количество элементов массива.
Объявляют массивы так:
float mass[20]; // массив из двадцати дробных чисел
int m[100]; // сто - элементный целочисленный массив
char s[25]; // массив из двадцати пяти символов
При использовании массива в программе число в скобках указывает номер элемента массива и называется индексом. Индекс всегда начинается с нуля.
Рассмотрим пример, в котором объявляется символьный массив, присваиваются значения элементам массива и некоторые из них выводятся на экран.
#include<iostream>
Int main()
{
char mass[6];
int k, l, m;
cout<<”Insert 3 numbers(0-5)”;
cin>>k>> l>>m;
mass[0]=’e’;
mass[1]=’o’;
mass[2]=’n’;
mass[3]=’p’;
mass[4]=’r’;
mass[5]=’d’;
cout<<mass[k]<<mass[l]<<mass[m];
return 0;
}
В данном примере объявлен символьный массив из шести элементов mass[6] и три целочисленные переменные k, l, m. Сначала на экран выводится сообщение, которое информирует пользователя о том, что следует ввести три целых числа в диапазоне от нуля до пяти. Эти числа будут использованы в качестве номеров элементов массива. После того как числа введены происходит инициализация (присваивание начальных значений) элементов массива символьными константами. Затем на экран выводятся три из них, номера которых пользователь ввел с клавиатуры.
Составной оператор
Программа на С ++ состоит из операторов (инструкций). Каждый оператор заканчивается точкой с запятой. Например:
...
х=0; // присваивание нулевого значения переменной
х++; // увеличение значения переменной на единицу
сout <<х; // вывод на экран
...
Часто возникают случаи, когда несколько операторов необходимо рассматривать единым блоком – как один оператор.Для этого в С++ применяется составной оператор, в котором входящие в него простые операторы заключаются в фигурные скобки. Например:
...
{ // начало составного оператора
х=0; // присваивание нулевого значения переменной
х++; // увеличение значения переменной на единицу
сout <<х; // вывод на экран
} // конец составного оператора
...
Компилятор воспринимает такую конструкцию как один оператор. После закрывающейся скобки точка с запятой не ставится.
Условные операторы
Все рассмотренные ранее примеры программ исполнялись в порядке следования операторов. На практике возможности таких программ весьма ограничены. Большинство задач требует принятия решения в зависимости от складывающейся ситуации. Язык С++ обладает полным набором конструкций, позволяющим управлять порядком выполнения отдельно взятых ветвей программы. Можно передавать управление в ту или иную часть программы в зависимости от результатов проверки некоторого условия. Для осуществления ветвлений используются так называемые условные операторы.