Similar presentations:
Программирование на С++. Общая характеристика и основные понятия языка С++
1.
ПРОГРАММИРОВАНИЕ НА С++Тема 1. Основы структурного программирования
Лекция №1
Общая характеристика
и основные понятия языка С++
Лохвицкий Владимир Александрович,
заместитель начальника кафедры
«Математического и программного обеспечения»,
доктор технических наук, доцент
2.
Учебный план программы повышения квалификации№ п/п
Наименование разделов и тем
2
Всего,
часов
Теория
Практика
1.
Тема 1. Основы структурного
программирования
10
4
6
2.
Тема 2. Динамические структуры данных
6
2
4
3.
Тема 3. Объектно-ориентированное
программирование
8
4
4
4.
Тема 4. Обработка исключительных
ситуаций
6
2
4
5.
Тема 5. Основы разработки приложений
с использованием библиотеки Qt
8
2
6
6
2
4
16
2
30
6.
7.
Тема 6. Разработка приложений с
использованием архитектуры MVC
Итоговая аттестация
Итого:
2
46
3.
Цели и учебные вопросы лекции3
Цели:
1. Изучение основ разработки и компиляции программ на языке
C++.
2. Изучение основных алгоритмических конструкций.
3. Изучение возможностей средств языка C++ для работы
с простыми и сложными данными в программе.
Учебные вопросы:
1.
2.
3.
4.
5.
Структура программы на C++. Компиляция.
Типы данных.
Разветвления и циклы.
Массивы.
Указатели и ссылки.
4.
Рекомендуемая литература4
5.
Рекомендуемая литература5
6.
Общая характеристика языка C++ (уровень языка)6
Язык C++ универсальный (общего назначения), так как в
нем реализованы возможности как низкоуровневых языков, так
и языков высокого уровня.
Язык C++, как и C, позволяет работать напрямую
с ресурсами компьютера:
позволяет
писать
низкоуровневые
системные
+ язык
приложения (например, драйверы операционной системы);
- неаккуратное обращение с системными ресурсами может
привести к «падению» программы.
В C++ отсутствует автоматическое управление памятью:
+ язык позволяет программисту получить полный контроль
над программой;
- возникает необходимость заботиться об освобождении
памяти.
7.
Общая характеристика языка C++ (типизация данных)C++ является статически типизированным языком:
каждая сущность в программе (переменная, функция и пр.)
имеет свой тип;
этот тип определяется на момент компиляции.
Статическая типизация позволяет:
вычислить размер памяти, который будет занимать каждая
переменная в программе;
определить, какая функция будет вызываться в каждом
конкретном месте.
Всё это определяется на момент компиляции и “зашивается”
в скомпилированную программу. В машинном коде никаких
типов уже нет — там идёт работа с последовательностями байт.
7
8.
8Вопрос №1.
Структура программы на C++.
Компиляция.
9.
Структура программы на C++9
Программа на языке C++ состоит из функций, описаний и директив
препроцессора.
Препроцессор – это программа, которая выполняет обработку файла
исходного кода перед началом компиляции.
Пример простейшей программы («Hello, World!»)
Директивы препроцессора:
#include <iostream>
using namespace std;
включение файлов библиотеки
потокового ввода/вывода
Задание используемого
по умолчанию пространства имен
int main()
Главная функция программы
{
– точка входа в программу
cout << "Hello World!" << endl;
return 0;
Корректный выход
}
из программы
10.
Схема создания компилируемой программы10
11.
Компиляция программыЯзык
C++
является
программирования.
компилируемым
11
языком
Для того, чтобы запустить программу на C++, её нужно
сначала скомпилировать.
Компиляция — преобразование текста программы на языке
программирования в машинный код.
Особенности компилируемых программ:
отсутствуют накладные расходы при выполнении программы;
при компиляции можно выявить некоторые ошибки;
требуется компилировать для каждой платформы отдельно.
12.
Общая схема компиляции программы на C++12
Компиляция
file_1.cpp
file_1.o
Линковка
file_2.cpp
file_2.o
…
…
file_n.cpp
file_n.o
programm
13.
Плюсы и минусы компилируемости программы13
Плюсы:
эффективность: программа компилируется и оптимизируется
для конкретного процессора;
нет необходимости устанавливать сторонние приложения
(такие как интерпретатор или виртуальная машина).
Минусы:
нужно компилировать отдельно для каждой платформы;
сложность внесения изменений в программу – нужно
перекомпилировать заново.
Важно: компиляция – преобразование одностороннее, нельзя
восстановить исходный код.
14.
Этапы компиляции: 1. Препроцессор14
Особенности работы препроцессора:
язык
препроцессора
–
это
специальный
программирования, встроенный в C++;
язык
препроцессор работает с кодом на C++ как с текстом;
команды языка препроцессора называют
все директивы начинаются со знака #;
директивами,
директива #include позволяет подключать заголовочные
файлы к файлам кода:
1. #include <func.h> – библиотечный заголовочный файл.
2. #include “bar.h” – локальный заголовочный файл.
препроцессор заменяет директиву
на содержимое файла bar.h.
#include
“bar.h”
15.
Этапы компиляции: 2. Компиляция15
Особенности работы компилятора:
на вход компилятору поступает код на C++ после обработки
препроцессором;
каждый файл с кодом компилируется отдельно и независимо
от других файлов с кодом;
компилируются только файлы с кодом (т.е. *.cpp);
заголовочные файлы отдельно не компилируются, только
в составе файлов с кодом;
на выходе компилятора из каждого файла с кодом
получается «объектный файл» – бинарный файл
со скомпилированным кодом (с расширением .o или .obj).
16.
Этапы компиляции: 3. Линковка (компоновка)16
Особенности работы компоновщика:
все объектные файлы объединяются в один исполняемый
(или библиотечный) файл;
при этом происходит подстановка адресов функций в места
их вызова;
по каждому объектному файлу строится таблица всех
функций, которые в нем определены;
имена функций изменяются таким образом, что в их имени
кодируются их параметры. Например, компилятор GCC
превратит имя функции func
void func(int, double) {}
в _Z3funcid.
17.
Точка входа в программу17
Точка входа – это функция, вызываемая при запуске
программы. По умолчанию – это функция main:
int main()
{
return 0;
}
или
int main(int argc, char ** argv)
{
return 0;
}
18.
18Вопрос №2.
Типы данных
19.
Типы данныхЦелочисленные:
1. char (символьный тип данных), 1 байт.
2. short int, 2 байта.
3. int, 4 байта.
4. long int, 8 байт.
Могут быть беззнаковыми (unsigned).
Числа с плавающей точкой:
1. float, 4 байта, 7 значащих цифр.
2. double, 8 байт, 15 значащих цифр.
Логический тип данных bool.
Пустой тип void.
19
20.
ЛитералыЛитералы (константы) – это фиксированные значения,
которые не могут быть изменены программой.
Целочисленные:
1. ‘a’ – код буквы ‘a’, тип char.
2. 42 – все целые числа по умолчанию типа int.
3. 1234567890L – суффикс ‘L’ соответствует типу long.
4. 1703U – суффикс ‘U’ соответствует типу unsigned int.
5. 2128506UL – соответствует типу unsigned long.
Числа с плавающей точкой:
1. 3.14 – все числа с точкой по умолчанию типа double.
2. 2.71F – суффикс ‘F’ соответствует типу float.
3. 3.0E8 – соответствует 3.0 ∙ 108 .
true и false – значения типа bool.
Строки задаются в двойных кавычках: “Text string”.
20
21.
ПеременныеПри определении переменной указывается её тип.
При определении можно сразу задать начальное значение
(инициализация переменной).
int
short
bool
i = 10;
j = 20;
b = false;
unsigned long l = 123123;
double x = 13.5, y = 3.1415;
float z;
Рекомендуется всегда инициализировать переменные.
Нельзя определить переменную пустого типа void.
21
22.
22Вопрос №3.
Разветвления и циклы
23.
Условный операторif (условие)
оператор1;
else оператор2;
if (условие)
{ оператор1;
оператор2;
…
}
else
{ оператор3;
оператор4;
…
}
23
24.
Условный оператор24
Операции сравнения:
==
!=
<
<=
>=
>
if (x > 0) y = 1;
равно
else
не равно
меньше
меньше, либо равно
больше, либо равно
больше
y = -1;
25.
Условный операторЛогические операции:
!
||
&&
не
или (дизъюнкция)
и (конъюнкция)
В математике: 0 < x < 1,
в языке C/C++ так нельзя!
В языке С/С++ пишут
if ( (x>0) && (x<1) ) …
25
Таблицы истинности
A\B
T
F
T
T
F
F
F
F
A\B
T
F
T
T
T
F
T
F
A
!A
T
F
F
T
И &&
ИЛИ ||
НЕ !
26.
Цикл с предусловием26
while (условие) do оператор;
while (условие) do
{
оператор;
оператор;
оператор;
}
Условие
Операторы
27.
Цикл с постусловием27
do оператор while (условие);
do
{
оператор;
оператор;
оператор;
} while (условие);
Операторы
Условие
28.
Цикл со счетчиком28
for (инициализация; проверка условия; изменение)
оператор;
for (int i=0; i<10; i++)
cout<<i<<endl;
i=1,N
операторы
29.
Оператор множественного выбора29
#include <iostream>
using namespace std;
int main()
{ int n = 0;
while(1)
{
cout << "Enter mark:" << endl;
cin>>n;
switch (n)
{
case 2: cout << "Bad\n" << "You are expelled\n"; break;
case 3: cout << "Satisfactorily\n"; break;
case 4: cout << "Good\n"; break;
case 5: cout << "Perfect\n"; break;
default: cout << "Invalid score\n";
}
if (n == 0) break;
}
return 0;
}
30.
30Вопрос №4.
Массивы
31.
Массивы31
Массив — это набор однотипных элементов, расположенных
в памяти друг за другом, доступ к которым осуществляется
по индексу.
Формальное определение массива:
тип_переменной название_массива [длина_массива]
Например, определим массив целых чисел из 10 элементов:
int m[10];
При определении можно выполнить инициализацию массива
с помощью перечисления значений в фигурных скобках:
// массив 1 2 3 4 5 0 0 0 0 0
int m[10] = {1, 2, 3, 4, 5};
32.
Массивы32
Если размер массива не указан явно, то он выводится из
количества инициализаторов:
int numbers[] = {1, 2, 3, 4, 5, 6};
Инициализация символьных массивов: можно передать
символьному массиву как набор инициализаторов, так и строку:
char s1[] = {'h', 'e', 'l', 'l', 'o'};
char s2[] = "world";
Индексация массива начинается с 0, последний элемент
массива длины n имеет индекс n-1.
// доступ к элементам массива по индексу
for (int i=0;i<10;i++)
cout << m[i] << ‘ ‘;
cout << endl;
33.
Массивы33
Есть и еще одна форма цикла for, которая предназначена
специально для работы с коллекциями, в том числе с массивами.
Эта форма имеет следующее формальное определение:
for(тип переменная : коллекция)
{
инструкции;
}
Пример:
#include <iostream>
int main()
{
int numbers[4] = {1,2,3,4};
for(int number : numbers)
std::cout << number << std::endl;
return 0;
}
34.
Многомерные массивы34
C++ позволяет определять многомерные массивы:
int m2d[2][3] = { {1, 2, 3}, {4, 5, 6} };
for(int i=0; i!=2; i++)
{
for(int j=0; j!=3; j++)
{
cout << m2d[i][j] << ‘ ‘;
}
cout << endl;
}
Элементы массива m2d располагаются в памяти “по строчкам”.
Размерность массивов может быть любой, но на практике редко
используют массивы размерности > 4.
int m4d[2][3][4][5] = {};
35.
35Вопрос №5.
Указатели и ссылки
36.
Указатели36
Указатели — это особый вид объектов, предназначенных
для хранения информации о местоположении в памяти других
объектов. Значением объекта-указателя является адрес другого
объекта.
Указатели бывают следующих видов:
• на функцию;
• на объект;
• на void.
Указатель на функцию содержит адрес в сегменте кода,
по которому располагается исполняемый код функции. Формат:
тип (*имя) ( список_типов_аргументов );
Пример:
int (*fun) (double, double);
37.
Указатели37
Указатель на объект содержит адрес области памяти,
в которой хранятся данные определенного типа:
тип *имя;
Присваивание
указателю ptr адреса
объекта x
38.
Указатели38
Примеры создания указателей на объекты:
int *a, b, *c;
int i;
//объявление указателей a и c
// целая переменная
const int ci = 1;
int * pi;
//целая константа
//указатель на целую переменную
const int * pci;
//указатель на целую константу
int * const cp = &i;
//ук.-константа на целую переменную
const int * const cpc = &ci; // ук.-конст. на целую конст.
39.
Инициализация указателей39
1.Присваивание указателю адреса существующего объекта:
с помощью операции получения адреса:
int a = 5;
int* p = &a;
int* p (&a);
// целая переменная
//в указатель записывается адрес a
//то же самое другим способом
с помощью значения другого инициализированного указателя:
int* r = p;
с помощью имени массива или функции:
int b[10]; // массив
int* t = b; //присваивание адреса начала массива
void f(int a ){ /* ... */ } //определение функции
void (*pf)(int); //указатель на функцию
pf = f;
//присваивание адреса функции
40.
Инициализация указателей40
2. Присваивание указателю адреса области памяти в явном виде:
char* vp = (char *)0xB8000000;
3.Присваивание пустого значения:
int* s = NULL;
int* k = 0;
4. Выделение участка динамической памяти и присваивание
ее адреса указателю:
•с помощью операции new:
int* n = new int;
int* m = new int (10);
int* q = new int [10];
• с помощью функции malloc:
int* u = (int *)malloc(sizeof(int));
41.
Указатели41
Основные операции с указателями:
• разадресация – взятие значения по адресу (оператор *);
• присваивание;
• сложение с константой;
• вычитание;
• инкремент (++), декремент (– –);
• сравнение;
• приведение типов;
При работе с указателями часто используется операция
получения адреса (& - амперсанд).
Унарная
операция
получения
адреса & применима к величинам,
имеющим имя и размещенным
в оперативной памяти.
int a = 5;
int* p = &a;
42.
Связь массивов с указателями42
43.
Связь массивов с указателями43
44.
Недостатки указателей44
45.
Ссылки45
Для того, чтобы исправить некоторые недостатки указателей,
в С++ были введены ссылки. Ссылки являются «красивой
оберткой» над указателями.
Пример:
Формат: тип & имя;
int count;
int& size = count;
Особенности использования ссылок:
1. Переменная-ссылка должна явно инициализироваться
при ее описании, кроме некоторых особых случаев.
2. После инициализации ссылке не может быть присвоена
другая переменная.
3. Тип ссылки должен совпадать с типом величины, на которую
она ссылается.
4. Не разрешается определять указатели на ссылки, создавать
массивы ссылок и ссылки на ссылки.
46.
Отличия ссылок от указателей46
47.
Отличия ссылок от указателей47
48.
ЗаключениеВопросы для самопроверки:
1. Перечислите основные типы данных в языке С++.
2. Какие управляющие конструкции языка С++ вы знаете?
3. Что такое цикл?
4. Перечислите и охарактеризуйте виды циклов в С++.
5. Что такое условный оператор?
6. Дайте определение функции.
7. В чем отличие формальных параметров функции от фактических?
8. Дайте определение рекурсивной функции.
9. В чем заключается перегрузка функций?
10. Что такое указатель?
11. Перечислите основные виды указателей.
12. Что такое ссылка?
13. Каким образом выполняется инициализация указателей?
14. Какие основные операции с указателями вы знаете?
15. Дайте определение массиву.
48