для 1 курса.ppt
- Количество слайдов: 78
Основы программирования ¢ ¢ Лафоре Р. Объектно-ориентированное программирование в С++ – СПб. : Питер, 2003. Павловская Т. А. C/C++ Программирование на языке высокого уровня. – СПб. : Питер, 2003. Подбельский В. В. Язык С++: Учебное пособие. – М. : Финансы и статистика, 2000. Страуструп Б. Язык программирования С++. – СПб. : Бином, 2002.
Программирование – это деятельность по созданию программного обеспечения. Программирование включает в себя разработку алгоритмов решения различных практических задач и их реализацию в виде компьютерных программ.
Алгоритм ¢ ¢ Алгоритм – понятное и точное предписание исполнителю совершить последовательность действий, направленных на достижение поставленной цели. Алгоритм имеет исходные данные – вход алгоритма и выдает некоторый результат. Условие алгоритмической задачи включает в себя входные данные и необходимый результат.
Свойства алгоритма ¢ ¢ ¢ Дискретность. алгоритм разбивается на последовательность отдельных шагов(предписаний), четко отделенных друг от друга. Только выполнив один шаг, можно приступить к выполнению следующего. Понятность. Все шаги алгоритма должны содержаться в системе команд исполнителя. Детерминированность – не должно быть шагов, смысл которых может восприниматься неоднозначно. На каждом шаге исполнитель должен получить четкую команду и должно быть ясно, какая команда будет выполняться следующей. Результативность. Алгоритм должен прекратиться за конечное число шагов и должен получиться определенный результат Массовость – алгоритм должен решать не конкретную задачу а целый класс однотипных задач, отличающихся параметрами. (исходными данными)
Способы записи алгоритмов ¢ ¢ Словесная – алгоритмический язык, кулинарный рецепт, инструкция, правила выполнения операций. Графическая – блок-схемы. Блок-схема- ориентированный граф, указывающий порядок исполнения команд алгоритма.
Основные виды вершин на блок-схемах ¢ ¢ ¢ Функциональная (действие) – один вход, один выход Предикатная- один вход, два выхода – в зависимости от условия O - объединяющая вершина – от каждого из двух входов к выходу.
Основные алгоритмические конструкции ¢ Следование ¢ Ветвление
Повторение ¢ Цикл с предусловием ¢ Цикл с постусловием
Теорема Бёма-Джакопини Любой алгоритм может быть записан с помощью композиции основных алгоритмических конструкций 1967 г.
Язык программирования Специальный язык для записи алгоритмов для последующего автоматического выполнения ¢ Программа – запись алгоритма для выполнения на компьютере ¢
Программирование до создания компьютеров ¢ ¢ Впервые принцип программирования предложен Бэббиджем для автоматического ткацкого станка, построенного Жаккардом. Теоретически управляющие конструкции – ветвление и цикл описала ученица Бэббиджа - Ада Лавлейс. Теоретическим фундаментом для программирования стала созданная в 30 -е годы прошлого века теория алгоритмов (Тьюринг, Черч, Пост, Клини). С появлением в 40 -е годы прошлого века ЭВМ программирование превратилось в практическую деятельность человека.
Машинный язык Первоначально программы записывались на машинном языке – языке команд процессора в виде цифровых кодов операций и адресов операндов и результатов. Все данные – двоичные числа. Разные ЭВМ, разные процессоры имеют свои системы команд. Процесс очень трудоемкий. Пример: сложение двух ячеек памяти 0100 0011 0100 ADD (0010), (0011), (0100) ¢
Ассемблер – набор имен для машинных команд. ¢ Ассемблер зависит от типа процессора, требует полного учета особенностей конкретной ЭВМ. Такие языки относят к языкам низкого уровня. ¢ Программа на Ассемблере не может непосредственно выполняться на компьютере. Выполнение требует двух этапов. 1. Автоматический перевод программ на язык машинных команд (трансляция). При этом выделяется необходимые ресурсы – память и т. д. 2. Выполнение оттранслированной программы. ¢
Способы трансляции ¢ ¢ Компиляция. Специальная программа (компилятор) анализирует текст программы, выявляет синтаксические ошибки и после этого создает программу из машинных инструкций, готовую к выполнению. Интерпретация – программа-интерпретатор транслирует каждое предложение программы и тут же его выполняет.
Языки высокого уровня Новый этап в развитии дисциплины программирования связан с разработкой языков высокого уровня. ¢ Языки высокого уровня 1) более выразительны и наглядны (близки к естественным языкам), что повышает наглядность и понятность текста 2) независимы от типа ЭВМ, набор операций выбирается из соображений удобства программиста 3) Поддерживают различные типы данных, а не только числа. ¢ Первый ЯВУ для научных применений Фортран (переводчик формул) разработан в 1954 г. программистами фирмы IBM. ¢ Существует множество различных языков программирования, ориентированных на разные применения. Неоднократно были попытки создать универсальный язык, но такой язык всегда получался очень сложным, перегруженным конструкциями. (PL/1 – IBM 1967, ADA, 1979 г. ). ¢
Парадигмы программирования ¢ ¢ ¢ Процедурное программирование –требует точного описания алгоритма как последовательности выполняемых команд (Pascal, C, Basic). Объектно-ориентированное программирование – реализация обработки информации как взаимодействия множества объектов. Хорошо подходит для разработки больших и сложных программных комплексов (Delphi, C++, C#, Java). Декларативное – алгоритм не строится, специальным образом описываются исходные данные и результат, а исполняющая система сама выбирает и выполняет алгоритм (Prolog – логическое, LISP – функциональное)
История и эволюция C++ ¢ ¢ ¢ Язык С. 1972 г. Денис Ритчи (Bell) цель – системное программирование (UNIX) Язык С++. 1983 г. Бьерн Страуструп (Bell) цель – реализация методологии ООП Язык Java. 1994 г. Патрик Наутон, Билл Джой, Джеймс Гослинг (Sun) цель – переносимость и надежность Язык C#. 2000 г. Андерс Хейлсберг и др. (Microsoft) цель – удобство и надежность Perl, PHP. цель – простота использования
Компоненты языка ¢ ¢ Алфавит -- это фиксированный для данного языка набор основных символов, т. е. "букв алфавита", которые используются для написания текстов на языке. Любые другие символы - недопустимы. Синтаксис - система правил, определяющих допустимые конструкции из букв алфавита. Для каждой последовательности символов синтаксис позволяет ответить на вопрос, является ли она текстом на данном языке или нет. Семантика - система правил истолкования отдельных языковых конструкций, позволяющих (при заданных исходных данных) однозначно воспроизвести процесс обработки данных по заданной программе. Лексема – минимальная единица языка, имеющая собственный смысл (семантику)
Этапы создания программы Текстовый редактор Исходный текст модуля (. сpp) Включ. файлы (. h) Препроцессор Полный текст модуля (. сpp) … Компилятор Объектный модуль (. obj) Компоновщик (редактор связей) Библиотеки (. lib) Программа (. exe)
Пример программы #include <iostream. h> int main() { int a, b; //описание переменных cin >> a >> b; //ввод cout << “сумма” << a+b; //вывод return 0; //возврат }
Описание синтаксиса (БНФ) Для описания синтаксиса используется язык формул Бэкуса-Наура (БНФ). ¢ С помощью БНФ определяются все понятия языка, начиная с простейших и заканчивая понятием программный файл. <понятие> : : = формула : : = - есть по определению | - выбор элемента { } – многократное повторение ¢
Примеры формул БНФ <буква> : : = A | B <слово> : : = <буква> | <буква> Какие слова включает язык? <длинное слово> : : = <буква> {<буква>} <другое слово> : : = <буква> | <буква> <другое слово>
Алфавит языка С++ (БНФ) <буква> : : = A|B|…|Z|a|b|…|z|_ Прописные и строчные буквы отличаются. Русские – только в комментариях и строковых константах. <цифра> : : = 0|…|9 <знак> : : = “|{| }|, |||[|]|(|)|+|-|*|/|%||; |‘|: |? |<|=|>|!| |&|~|^|. |# <разделитель> : : = пробел | перевод строки| табуляция <символ> : : = <буква> | <цифра>|<знак>| <разделитель>
Алфавит языка С++ Прописные и строчные латинские буквы (различаются в именах), знак подчеркивания l Цифры (0… 9) l Специальные знаки “ { } , | [ ] ( ) + - * / % ; ‘ : ? < = > ! & ~ ^. # l Разделители (пробел, табуляция, перевод строки) l
Комментарии Могут быть в любом месте, где есть разделитель Виды комментариев: однострочные // комментарий ¢ многострочные /* длинные */ ¢
Лексемы С++ Лексема – минимальная единица языка, имеющая самостоятельный смысл. ¢ Служебные (зарезервированные) слова ¢ Имена или идентификаторы ¢ Знаки операций (одно и двухсимвольные) ¢ Константы ¢ Разделители
Зарезервированные слова Служебное слово - неделимое образование с фиксированным смыслом. Онo используется только в том значении, которое заранее установлено в языке. Например: int, if, while, case.
Имена Имя (идентификатор) служит для обозначения каких-либо объектов. В языке C++ различают два вида имен: стандартные имена и имена, даваемые пользователем. Стандартные имена используются в языке для обозначения стандартных объектов (типов, констант, функций). Рассмотрим имена, даваемые пользователем. Следует отметить, что в качестве имени нельзя использовать служебные слова. Имя – это последовательность латинских букв и цифр, начинающаяся с буквы. Пробелы в идентификаторах не допускаются. <имя>: : = <буква>{<буква>|<цифра>} ПРИМЕР. ¢ Правильные имена: ABC, A 12, My. First. Var, Massiv_slov. ¢ Неправильные имена: 1 AB, A 1, My-First-Var, Massiv{}slov, level. 4, for
Константы ¢ Целые: десятичные 123, 0, 98 l восьмеричные 01, 015 l шестнадцатиричные 0 x. A 1, 0 X 00 FF l Вещественные 5. 8, . 2 e-3 ¢ Символьные ‘A’, ‘xy’, ‘n’, ‘123’, ‘\’ ¢ Строковые “привет”, “ 1 n 2” ¢
Переменные Переменная - это данное, значение которого может меняться в процессе выполнения программы. С каждой переменной связана некоторая область оперативной памяти компьютера. ¢ Значения переменных устанавливаются при описании, либо с помощью операции присваивания. ¢ Одной из важнейших характеристик переменной является ее тип данных. ¢
Тип данных - характеристика константы, переменной, выражения, определяющая ¢ множество значений, которые может она принимать; ¢ множество операций, которые можно над ней выполнять; ¢ количество и структура памяти, выделяемой для ее хранения.
Типы данных С++ Типы Простые (скалярные) Целые Вещественные Логический (С++) Указатели Составные массивы структуры классы объединения
Базовые типы C/C++ Целые char unsigned char short int (short) unsigned short long int (long, int) unsigned long Вещест. float double long double Диапазон -128… 127 0… 255 -32768… 32767 0… 65535 -231… 231 -1 0… 232 -1 7 -8 знач. цифр 15 -16 знач. цифр 19 -20 знач. цифр Память 1 байт 2 байта 4 байта 8 байт 10 байт
Специальные типы bool – логический (true/false) – в С++ В С целое значение =0 – ложь, не равно 0 - истина ¢ void – пустой. Используется для обозначения функций без значений и нетипизированных указателей ¢
Описание переменных [класс памяти] [const] тип имя [инициализатор] Модификатор const используется при описании констант. Инициализатор задает начальное значение переменной в виде “= значение” или в круглых скобках “(значение)”. Примеры: long int n =1000, k; char c(‘A’); const float pi = 3. 1415926; Классы памяти будут рассмотрены позднее.
Классы памяти Класс памяти определяет область видимости и время жизни переменной. Область видимости может быть локальной (внутри блока) и глобальной (во всем файле). Время жизни – временным (до конца блока) и постоянным (до выхода из программы). Класс auto (по умолчанию) – автоматическая переменная. Локальная и временная. Класс register – регистровая. Аналог auto, только переменная хранится в регистре процессора. Класс static– статическая переменная. Постоянная. Может быть локальной и глобальной. Класс extern– внешняя переменная. Определяется в другом файле программы.
Выражения Из набора переменных и констант, описанных в программе, можно составлять более сложные структуры - выражения. Выражение состоит из операндов (констант и переменных) и объединяющих их операторов и знаков операций. При составлении выражений можно использовать скобки. Выражение определяет правило вычисления какого-либо значения, причем: 1. Для большинства операций вычисление производится слева направо, для некоторых (присваивание) – справа налево 2. Операции выполняются в порядке их старшинства (приоритета).
Арифметические операции ¢ ¢ ¢ + - * / - деление для целых аргументов производится нацело ( cout << 2/3; cout << 2. 0/3) % - остаток от деления для целых аргументов. Преобразования целого в действительное и наоборот автоматические. Если необходимо явное преобразование – (<имя типа>) выражение Увеличение и уменьшение ++ -префиксное (++a) возвращает новое значение, постфиксное (a++) возвращает старое значение.
Операции отношения и логические операции Отношения < > <= >= == != Результат – true(истина) или false (ложь) Логические: ¢ && (и) a&&b == true, если a == true и b==true ¢ ||(или) a||b == true, если a == true или b==true ¢ ! (отрицание) !a == true, если a == false
Операция присваивания <имя переменной> = <выражение> Результат операции может использоваться далее в выражении. c = (a=1)+(b=2); Выполняется справа налево: a = b = c = 5 Тип выражения должен быть совместим с типом переменной (должно существовать автоматическое преобразование одного в другой).
Присваивание с операцией += *= и т. д. a+=b эквивалентно a = a + b a = 2; cout << a+=a+=a+=a; ¢
Дополнительные операции ¢ ¢ Последовательное выполнение , результат - самое правое выражение cout << (2+3, 4*5); Условная операция условие ? выр. 1 : выр. 2 max = (a>b) ? a : b;
Вещественные числа Представление вещественных чисел в ПК приближенное, поэтому и арифметические действия над ними выполняются приближенно. При подключении <math. h> можно использовать функции fabs(x) - модуль, sqrt(x) - квадратный корень, exp(x) - экспонента, log(x) – натуральный логарифм, log 10(x) – десятичный логарифм, sin(x), cos(x), tan(x), acos(x), asin(x), atan(x) – тригонометрические функции M_PI – число пи floor(x) – наибольшее целое, не превосходящее x ceil (x) – наименьшее целое, превосходящее x rand() – целое псевдослучайное число
Структура программы <директивы препроцессора> <функции> Функция имеет вид <тип> <имя> (<список параметров>) { <операторы> } Выполнение начинается с функции main
Операторы Оператор – предложение, описывающее некоторое действие в программе. Виды: ¢ Выражение ¢ Условный ¢ Выбора ¢ Циклы ¢ Передачи управления В конце оператора всегда ставится ;
Блок – группа операторов, заключенные в фигурные скобки { } ¢ Блок есть единое целое и может находиться в любом месте программы, где синтаксис допускает наличие оператора. ¢ Переменные, описанные в блоке существуют до выхода из него. ¢
Условный оператор if (выражение) оператор 1; else оператор 2; Если выражение – истинно, то выполняется оператор 1, иначе – оператор 2. Затем управление передается следующему оператору. Краткая форма: if (выражение) оператор 1; Если необходимо выполнить несколько операторов, они объединяются в блок.
Вложенные if if (выражение 1) if (выражение 2) оператор 1; else оператор 2; Else относится к ближайшему if. Для лучшего понимания структуры программы используются отступы.
Пример. Найти максимум и минимум из двух чисел. int main() { int a, b, min, max; cin >> a >> b; if (a<b) { min = a; max = b; } else {min = b; max = a; } cout << min << max; return 0; }
Условный оператор. Типичные ошибки ¢ ¢ ¢ Отсутствие фигурных скобок if (a<b) min = a; max = b; Использование = вместо == if (a=5) cout << a; Проверка диапазона if (-1 <= x <=1) cout << “есть arcsin”; Правильно так: if (-1 <= x && x <=1) cout << “есть arcsin”;
Оператор выбора switch (выражение) { case конст. 1: список операторов 1 case конст. 2: список операторов 2 … default: операторы } Производит переход на первый оператор из списка, соответствующего константе, равной значению выражения. Операторы из нижестоящих списков будут выполняться, если не сделать выход оператором break.
Пример на оператор выбора По номеру месяца определить время года … switch (m) { case 1: case 2: case 12: cout<<“Зима”; break; case 3: case 4: case 5: cout<<“Весна”; break; case 6: case 7: case 8: cout<<“Лето”; break; default: cout<<“Осень”; }
Цикл с предусловием while (выражение) оператор Цикл выполняется так: 1. Вычисляется выражение 2. Если оно истинно (не 0) выполняется оператор 3. Снова вычисляется выражение 4. Если оно ложно – выход из цикла. Пример: вычисление факториала n f = k = 1; while (k<=n) f *= k++;
Пример. Пример: поиск делителей числа n int d = 2; while (d * d <= n) { if (! (n % d)) cout << d <<“ “<< n/d << “ “; d++; }
Цикл с постусловием do оператор while (выражение) Цикл выполняется так: 1. Выполняется оператор 2. Вычисляется выражение 3. Если оно истинно (не 0) снова выполняется оператор 4. Если оно ложно – выход из цикла. Пример: вычисление факториала n f = k = 1; do f *= k++; while (k<=n);
Пример: поиск разложения n на простые int d = 2; do if (! (n % d)) { cout << d << “ “; n /= d; } else d++; while (n > 1);
Цикл с параметром for (инициализация; условие выполнения; модификация) оператор; Инициализация выполняется перед началом цикла Модификация - в конце каждой итерации Пример: вычисление факториала for (int k = f = 1; k<=n; k++) f *= k; либо for (int k = f = 1; k<=n; f *= k++); Бесконечный цикл for ( ; ; ) { …. }
Операторы передачи управления goto метка; //переход Помеченный оператор – метка: оператор; ¢ break; выход из цикла или оператора выбора ¢ continue; переход к следующей итерации цикла ¢ return [выражение]; выход из функции с возвратом значения ¢
Указатели Cодержит адрес памяти, в которой хранятся данные определенного типа (4 байта) тип * имя; Звездочка относится к имени int a, *b, c; Безтиповый указатель void *p;
Инициализация указателей с помощью операции & (адрес) int a=5; int * p = &a; ¢ значением другого указателя int * r = p; ¢ пустым значением (нулем) int * r = 0; ¢
Динамические переменные Создание int *n = new int; int *m = new int (10); // *m=10 Удаление delete n;
int *p = float *r int *q = //delete new int (10); = new float(0. 5); p, a = 10, b = 5; p; Stack Managed Heap 0. 5 b=5 10 a=10 q r p
Константные указатели Модификатор const относится либо к указателю, либо к значению int i; const int c = 1; const int *pc = &c; //указатель на константу int* const pc = &i; //указательконстанта
Операции с указателями доступ к переменной, на которую указывает указатель * *n=100; cout << *p; ¢
Арифметические операции Прибавление константы, уменьшение и увеличение приводят к сдвигу указателя на несколько ячеек в памяти с учетом размера данных p++; // увеличивает r на 4 p-3 // уменьшает r на 12 Вычитание указателей – определяет количество ячеек между адресами q = p + 3; cout << q – p ;
Ссылки Ссылка – синоним имени, указанного при ее инициализации тип & имя; int a; int &b=a;
Массивы Массив – тип данных, содержащий последовательность значений одного и того же типа. Массивы в языке С++ описываются следующим образом: тип_элементов имя [размер]; Размер массива задается константным выражением. Доступ к элементам производится с указанием номера (индекса). Индексы элементов – целые числа, начиная с нуля. Например, объявление int a[100]; определяет массив a c элементами a[0], a[1], …, a[99]. Переменная типа массив является константным указателем на первый элемент массива. Выражения a[i] и *(a+i) эквивалентны.
Инициализация массивов При описании массива можно указать начальные значения элементов через запятую в фигурных скобках. При инициализации размер массива можно не указывать. Например, int p[] = {0, 1, 2, 3, 4, 5}; К элементам массива можно обратиться, указав имя и в квадратных скобках индекс. Контроль выхода за пределы массива не производится. Вывод на экран for (int i=0; i<100; i++) cout <<a[i]<<” ”;
Типичные операции с массивами 1. Ввод с клавиатуры for (int i=0; i<n; i++) cin >> a[i]; 2. Заполнение случайными числами for (int i=0; i<n; i++) a[i] = rand()%100; 3. Суммирование элементов массива for (int i=s=0; i<n; i++) s+=a[i];
Поиск минимального элемента в массиве int min = a[0]; for (int i=0; i<n; i++) if (min > a[i]) min = a[i];
Сортировка (метод выбора) for (int i=0; i<n-1; i++) { // ищем минимальный элемент среди элементов от i до n; int m = i; for (int j=0; j<n; j++) if (a[j] < a[m]) then m = j; // меняем местами I и m элементы int t = a[i]; a[i] = a[m]; a[m] = t; }
Многомерные массивы описываются как массивы, элементами которых также являются массивы. Следующий пример описывает матрицу из m строк и n столбцов. const int m = 4, n = 5; float matr[m][n]; Инициализация int mas [3][2] = { {1, 1}, {0, 2}, {1, 0}}; Обработка for (i=0; i<m; i++) { for (j=0; j<n; j++) cout << a[i][j] <<‘ ‘; cout << endl; }
Динамические массивы Массивы, размер которых меняется во время выполнения программы, описываются как указатели и создаются с помощью операции new. Следующий фрагмент программы описывает создание массива, размер которого вводится с клавиатуры. int *a, k; cin >> k; a = new int [k]; for (int i=0; i<k; i++) >>a[i]; delete[] a; cin
Строки Специальный строковый тип в языке Си отсутствует. Строка в Си представляется одномерным массивом элементов типа char; последним элементом массива должен быть символ ‘ ’ (такой массив называется ASCIIZ – строкой). Строки можно вводить и выводить с помощью стандартных потоков или функций ввода-вывода gets(s) и puts(s). Следующий пример демонстрирует ввод и вывод строк char s[100], p[]=”Введено ”; cin >>s; cout <<p<<s; Строка может быть описана как указатель на char и размещена в динамической памяти.
Функции для работы со строками Некоторые функции работы со строками (Заголовочный файл <string. h>) 1. Длина строки int strlen(char*< строка>) 2. Конкатенация. char* strcat(char*< строка-приемник>, char*< строка-источник>) 3. Копирование char* strcpy(char*< строка-приемник>, char*< строка-источник>) 4. Сравнение int strcmp(char*< строка 1>, char*< строка 2>) 0, если <строка 1> совпадает со <строкой 2>, Возвращает: число <0, если <строка 1> < <строки 2>, число >0, если <строка 1> > <строки 2>. 5. Поиск символа в строке. Возвращает указатель на найденный символ. char* strchr(char*< строка>, int <символ>) 6. Поиск подстроки в строке. Возвращает указатель на найденную строку. char* strchr(char*< строка>, char*< подстрока>)
Функции преобразования Некоторые функции преобразования данных “строка ↔ число” (Заголовочный файл <stdlib. h>) Преобразование строки в double, int, long double atof (char*< строка>) int atoi (char*< строка>) long atol (char*< строка>)
Преобразование int, long, unsigned long в строку char* itoa (int <число>, char*< строка>, int <основание сист. сч. >) char* ltoa (long <число>, char*< строка>, int <основание сист. сч. >) char* ultoa (unsigned long <число>, char*< строка>, int <основание сист. сч. >)
Работа со строками как с указателями Пример: копирование строки s в строку t Неэффективный способ for (int i = 0; i<=strlen(s); i++) t[i] = s[i]; Эффективный способ char *st = s, *dt = t; while (*st != 0) *dt++ = *st++; *dt=0;
для 1 курса.ppt