Н.Н. МАНУЙЛОВ
Ю.А. МЕДВЕДЕВ
ОСНОВЫ
ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ C++
ВЛАДИМИР
2011
Министерство образования и науки РФ Государственное образовательное учреждение высшего профессионального образования Владимирский государственный
гуманитарный университет
Н.Н. МАНУЙЛОВ
Ю.А. МЕДВЕДЕВ
ОСНОВЫ ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ C++
(Структурное программирование)
Владимир
2011 УДК 681.3.06:51(076)
ББК[32.81+22.18]я7
М34 Мануйлов Н.Н., Медведев Ю.А.
Основы программирования на языке C++ (Структурное программирование). Учебно-методическая разработка по дисциплине «Программирование». – Владимир: ВГГУ, 2011. – 48 с. Работа предназначена для проведения лекционных и семинарских занятий со студентами специализированных факультетов по дисциплине «Программирование», а также может быть использована преподавателями непрофильных специальностей при самостоятельном освоении языка С++. В работу включен теоретический материал по 5 темам и 7 семинарских занятий. Табл. 1. Библиогр. 16 наим. Рецензент: профессор, доктор физико-математических наук Алхутов Ю.А.
Ответственный за выпуск: доцент Наумова С.Б. Печатается по решению редакционно-издательского совета ВГГУ УДК 681.3.06:51(076)
ББК[32.81+22.18]я7 © Владимирский государственный
гуманитарный университет, 2011
© Мануйлов Н.Н., Медведев Ю.А., 2011
ОБЩАЯ ХАРАКТЕРИСТИКА ЯЗЫКА
В любом алгоритмическом языке можно выделить четыре основных элемента: алфавит языка, лексемы, выражения, операторы.
Алфавит языка, или его символы — это основные неделимые знаки, с помощью которых пишутся все тексты на языке.
Лексема, или элементарная конструкция, - минимальная единица языка, имеющая самостоятельный смысл.
Выражение задает правило вычисления некоторого значения.
Оператор задает законченное описание некоторого действия.
Лексемы образуются из символов, выражения - из лексем и символов, а операторы — из символов, выражений и лексем.
Алфавит С++ включает:
прописные и строчные латинские буквы и знак подчеркивания;
арабские цифры от 0 до 9;
специальные знаки: + - * / < > = | & ! \ ~ ' @ # $ % ? _ : ; , . () [] {}".
пробельные символы: пробел, символы табуляции, символы перехода на новую строку.
Из символов алфавита формируются лексемы языка: идентификаторы, ключевые (зарезервированные) слова, знаки операций, константы, разделители (скобки, точка, запятая, пробельные символы).
Границы лексем определяются другими лексемами, такими, как разделители или знаки операций.
Идентификатор — это имя программного объекта.
В идентификаторе могут использоваться латинские буквы, цифры и знак подчеркивания.
Имена идентификаторов чувствительны к регистру (MyIdentificator, myidentificator и MYIDENTIFICATOR — три различных имени).
Первым символом идентификатора может быть буква или знак подчеркивания, но не цифра.
Пробелы внутри имен не допускаются.
Идентификатор не должен совпадать с ключевыми словами и именами используемых стандартных объектов языка.
Ключевые слова — это зарезервированные идентификаторы, которые имеют специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены.
Константами называют неизменяемые величины. Различают: целые, вещественные, символьные, строковые константы. Компилятор относит константу к одному из типов по ее внешнему виду.
Целые константы:
Десятичный формат записи числа: последовательность десятичных цифр, начинающаяся не с нуля (если не 0). Например, 8, 0, 12345.
Восьмеричный формат: 0, за которым следуют восьмеричные цифры. Например, 01,029, 07453.
Шестнадцатеричный формат: 0x или 0X, за которым следуют шестнадцатеричные цифры. Например, 0xA, 0xBc14F, 0X00FF.
Вещественные константы:
Десятичный формат: [цифры].[цифры]. Например, 5.6, -1.32, 13., .002. Квадратными скобками здесь и далее обозначена необязательная часть в записи.
Экспоненциальный формат: [цифры][.][цифры]{E|e}{[+]|-}[цифры]. Например, 0.5Е7, 300е-5. Здесь и далее фигурными скобками будем обозначать выбор одного из вариантов, разделенных знаком |, в записи.
Символьные константы: Один или два символа в апострофах. Например, ‘B’, ’b’, ’+’, ’\0’, ’\n’, ’\07’, ’\0xFF’. Отметим, что используется байтовая кодировка символов. Пустая символьная константа недопустима.
Строковые константы: Последовательность символов в кавычках. Например, “hello world”, “X=100\tY=200\n”
Последовательности символов, начинающиеся с обратной косой черты, называют экранированными или escape-последовательностями. Эти последовательности используются для представления неотображаемых символов, зарезервированных символов (апостроф, кавычки, слеш и т.п.), символов через их коды (используется ASCII таблица), например \86, \0xFF.
Таблица 1. Escape-последовательности для непечатаемых символов. \a
| Звуковой сигнал
| \t
| Табуляция
| \b
| Возврат
| \v
| Вертикальная табуляция
| \n
| Перевод строки
| \\
| Обратный слеш
| \r
| Возврат каретки
| \”
| Кавычки
| \’
| Апостроф
| \?
| Знак вопроса
| В C++ используются «нуль-терминированные» строки – в конце строки стоит нулевой символ '\0'.
Комментарий начинается либо с символов // до конца строки (однострочный), либо заключается между символами-скобками /* и */ (многострочный).
Операторы, операции и выражения:
Выражение - это вычисляемая и возвращающая свое результирующее значение комбинация операндов и операций над ними, выполняемых в порядке их приоритета.
Операция - это знак, группа знаков или функция, то есть некая определенная конструкция, объединяющая свои операнды в выражение и обозначающая какое-либо действие над ними.
Операнд представляет собой элемент-участник операции. Операндами могут быть константы, именованные константы, переменные, вызовы функций и выражения.
По количеству принимаемых операндов в C++ различают унарные операции (один операнд), бинарные операции (два операнда), тернарные операции (три операнда).
Переменная — это область памяти, в которой находятся данные, которыми оперирует программа.
Именованная константа – константа, имеющая идентификатор.
Основные арифметические операции:
+, -,*,/ бинарные операции сложения, вычитания, умножения и деления.
Важно помнить, что при целых операндах результат деления получается целым. Например, 33/15 = 2, 33/15.0=2.2.
| % остаток от деления одного целого числа на второе. Например, 33%15=3.
+,- унарные операции знака числа. Например, -x+y.
= бинарная операция простого присваивания. В результате ее работы операнд стоящий относительно присваивания справа получает значение левого операнда. Например, D=b*b-4*a*c. Кроме того различают множественное присваивание. Выполняется оно справа налево. Например, результатом присваивания x=y=z=0 будет нулевое значение переменных x,y,z.
Остальные операции C++, их приоритет и порядок выполнения приведены методическом пособии «Лабораторный практикум по изучению языка C++».
Операнды в выражениях, могут иметь как адрес и значение, так и только значение. Для того, чтобы отличать выражения, обозначающие объекты с адресом и значением, от выражений, обозначающих только значения, вводятся понятие lvalue и rvalue.
lvalue и и rvalue являются свойством не объектов и/или функций, а выражений.Например, i — lvalue, ++i — lvalue, *&i — lvalue, a[5] — lvalue, a[i] — lvalue, 10 — rvalue, i + 1 — rvalue, i++ — rvalue и т.д. ТИПЫ ДАННЫХ C++
Тип данных определяет внутреннее представление данных в памяти компьютера; множество значений, которые могут принимать величины этого типа; операции и функции, которые можно применять к величинам этого типа.
В языке С++ выделяют следующие категории типов: базовые типы данных, производные (определяемые) типы.
Базовые типы:
имеют имена, которые являются ключевыми словами языка;
к базовым типам относятся: скалярные типы и пустой тип void;
скалярные типы делятся на целочисленные и вещественные типы. Логический и символьный тип являются целочисленным типом.
Целочисленные базовые типы: int – Целый знаковый
| char – Символьный
| bool Логический
| wchar_t Расширенный символьный
| К типу int можно указывать спецификаторы: short (короткий), long (длинный), signed (знаковый), unsigned (беззнаковый). При описании типа допускается указывать только спецификатор. Например, long int эквивалентно long, unsigned int эквивалентно unsigned и эквивалентно int. Спецификатор unsigned может быть применен и к символьному типу.
Вещественные типы: float (вещественный), double (вещественный с двойной точностью). Для типа double может быть использован спецификатор long.
Логические переменные типа bool могут принимать одно из двух значений: false (ложь) или true (истина). По определению значение false равно 0, a true не равно 0.
В стандарте языка С++ явным образом не определены размеры типов, однако для любой реализации компилятора и любой платформы должны выполнятся соотношения:
8>=sizeof(char)<=sizeof(short)<=sizeof(int)<=sizeof(long)>=32
sizeof(float)<=sizeof(double)<=sizeof(long double)
sizeof(T)==sizeof(signed T)==sizeof(unsigned T),
где операция sizeof() – определяет размер памяти, которая соответствует идентификатору, типу или выражению..
При работе с адресной арифметикой целесообразно пользоваться псевдонимами беззнаковых целочисленных типов size_t и ptrdiff_t. Размер типа выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива. На 32-битной системе типы будут занимать 32-бита, на 64-битной - 64-бита. Тип size_t является результатом выполнения операции sizeof. Тип ptrdiff_t является результатом выражения, где один указатель вычитается из другого.
| Производные типы строятся на основе базовых типов и делятся на. скалярные (перечисления (enum), указатели, ссылки) и структурные (массивы, структуры (struct), объединения (union), классы (class)).
Переменная — это именованная область памяти, в которой хранятся данные определенного типа. Переменная должна иметь идентификатор (имя переменной). Значение переменной можно изменять. Перед использованием переменная должна быть описана:
[класс памяти] [const] тип имя [инициализатор];
Модификатор const задает именованную константу, значение которой изменить нельзя. Константу необходимо инициализировать при объявлении.
Переменную можно инициализировать выражением с помощью присваивания либо с указанием выражения в скобках. В одном операторе можно описать несколько переменных одного типа, разделяя их запятыми. Например, int k, i =10; k=1; const int j(i+10-k); float с = 0.25, x(3.3), sum;
Область действия идентификатора (ОДИ) — это часть программы, в которой память, связанная с идентификатором существует. Различают:
локальная область, когда переменная определена внутри блока (область действия от точки описания до конца блока, включая вложенные блоки);
глобальная область, когда переменная определена вне любого блока (областью действия - файл, в котором она определена).
Областью видимости идентификатора (ОВИ) часть программы, из которой допустим доступ к значению переменной через идентификатор. ОДИ=ОВИ, кроме случая, когда во вложенном блоке описана переменная с именем, аналогичным имени переменной во внешнем блоке. Внешняя переменная во вложенном блоке не видна.
int main(){ int i=10;
{int i=20; }// вывод i даст число 20
// вывод i даст число 10
}
Класс памяти определяет время жизни переменной и ОВИ переменной. Используются следующие спецификаторы:
auto — автоматическая переменная.
По умолчанию ничем не инициализируется.
Время жизни – от описания до конца блока.
Для глобальных переменных не используется
Для локальных auto используется по умолчанию
register аналогичен auto, но память выделяется по возможности в регистрах процессора.
extern —переменная определяется в другом месте программы (в другом файле или дальше по тексту). Используется для создания переменных, доступных во всех модулях программы, в которых они объявлены.
static — статическая переменная.
Определяемый объект располагается по фиксированному адресу. Время жизни — постоянное.
Инициализируется один раз при первом выполнении оператора, содержащего определение переменной. По умолчанию базовые типы инициализируются нулем.
Локальные статические переменные видны только внутри своего блока.
Глобальные статические переменные видны только в том модуле, в котором они описаны.
Основной файл
| Файл value.cpp (1 вариант)
| #include
#include "value.h"
using namespace std;
int a; //глобальная переменная а
// в первом варианте pi видно, во втором нет
extern double pi;
void f(); // экспортируем функцию из другого модуля
int main(){
// переменная x определена ниже
extern int x;
a = 1; // присваивание глобальной переменной
//локальная переменная а, аналогично auto int a;
int a;
a = x; // присваивание локальной переменной
::a = 3;// присваивание глобальной переменной
//для второго варианта получим ошибку
cout< f();
f();//предыдущее значение i сохранено, выведет 6,28
return 0; }
int x = 4; // определение и инициализация
| #include
double pi=3.14;
void f(){
static int i; i++;
std::cout << i*pi<< std::endl;}
| Файл value.cpp (2 вариант)
| #include
static double pi=3.14;
void f(){
static int i; i++;
std::cout << i*pi<< std::endl;}
|
БАЗОВЫЕ КОНСТРУКЦИИ СТРУКТУРНОГО ПРОГРАММИРОВАНИЯ
В теории программирования доказано (Боймом и Якопини в 1966), что программу для решения задачи любой сложности можно составить только из трех структур, называемых следованием, ветвлением и циклом.
Следованием называется конструкция, представляющая собой последовательное выполнение двух или более операторов (простых или составных).
Ветвление задает выполнение либо одного, либо другого оператора в зависимости от выполнения какого-либо условия.
Цикл задает многократное выполнение оператора Программирование ветвлений.
Условный оператор if используется для разветвления процесса вычислений на два направления:
if ( выражение ) оператор1; [else оператор2;]
Порядок выполнения: вычисляется выражение, если оно имеет значение true (не равно нулю), выполняется первый оператор, иначе второй. После этого управление передается на оператор, следующий за условным. В качестве операторов можно использовать составные операторы. В выражении можно использовать описание типов переменных и составные логические выражения.
Примеры:
If (а<0) b = 1;
if (ad || a==0)) b++; else {b= a; a = 0;}
If (a if (a++) b++;
if (b>a) max = b; else max = a;
Без использования фигурных скобок во вложенных ветвлениях ключевое слово else относится к ближайшему еще не связанному if.
int a=1,b=2,c=3;
if (a==3)if (b==3) cout<< b; else cout<< c; else cout<<"yyy";
Эквивалентно: if (a==3){
if (b==3) cout<< b; else cout<< c;}
else cout< Операция условия ?:
(условное выражение) ? выражение1 : выражение2;
Порядок выполнения: если условное выражение истинно, то вычисляется выражение1, если ложно — выражение2.
Пример. Максимум из двух чисел х и у.
mах=(х>у)?х:у; cout<<“max=“< В большинстве случаев операцию условия ?: можно реализовать конструкцией if-else. Использование ?: оправдано, например, при вычислении параметров метода или функции
int a=10; cout<< (a==10?"OK" : "NOT OK");
либо при создании и инициализации объектов
string s1("OK"), s2("NOT OK"); bool f=true;
string str = f ? s1 : s2 ;
| Оператор switch.
Оператор switch предназначен для разветвления процесса вычислений на несколько направлений.
Формат оператора:
switch ( выражение ){
case константное_выражение_1: [список_операторов_1]
case константное_выражение_2: [список_операторов_2]
…
case константное_выражение_n: [список_операторов_n]
[default: операторы ]
}
Порядок выполнения:
вычисляется выражение (оно должно быть целочисленным);
управление передается первому оператору из списка, помеченного константным выражением, значение которого совпало с вычисленным;
если выход из переключателя явно не указан, последовательно выполняются все остальные ветви;
выход из переключателя выполняется с помощью операторов break (выход из внутреннего блока) или return (выход из функции);
в теле switch не допускаются одинаковые константные выражения;
несколько меток могут следовать подряд;
если совпадения не произошло, выполняются операторы, расположенные после слова default (а при его отсутствии управление передается следующему за switch оператору).
int a=1;
switch (a){
case 1: cout<< 1;
case 2: cout << 2;
default: cout << 10;}
//результат 1210
| int a=2;
switch (a){
case 1: cout<< 1;break;
case 2: cout << 2;break;
default: cout << 10; }
//результат 2
| int a=2;
switch (a){
case 1: cout<< 1;break;
case 2:
case 3: cout << 2;break;
}//результат 2
| int a=2; b;
switch (a){
case 1: b=a;break;
case 1: b=a;break;
case 3: b=a;break;}
//ошибка
|
Программирование циклов
Для организации циклов в С++ используются следующие три оператора: while, for , do … while.
Цикл for: Цикл for в я зыке C++ несмотря на синтаксическую схожесть с циклом со счетчиком является циклом с предусловием.
Синтаксис:
for ( раздел объявления и инициализации;
условие продолжения цикла;
раздел модификации) тело цикла
|