Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
Описываются возможности C++ по работе с наследованием (virtual, override, final). Описываются механизмы работы с константными переменными и методами (const, mutable, constexpr). Описываются возможности по перегрузке операторов (operator).
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Рассмотрены известные автору подходы к реализации как lock-free, так и fine-grained lock-based set/map: хеш-таблицы, деревья. Что из подходов STL может быть реализовано в lock-free манере, а что принципиально нет. Подводные камни lock-free и их нейтрализация.
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...OdessaFrontend
Дмитрий Ховрич рассказывает как использовать строгую типизацию TypeScript и писать надёжный код в функциональном стиле. А также делится знаниями как использовать функторы и монады в ежедневной фронтенд разработке.
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
Статический анализ появился почти 40 лет назад. В своём докладе мы хотим показать, чему за это время научились статические анализаторы. Мы рассмотрим различные методики анализа, как они появлялись и какие ошибки можно найти с помощью них. Посмотрим на примеры ошибок, найденных PVS-Studio в Open Source проектах. Поговорим о том, чем статический анализатор отличается от "линтеров" и некоторых других инструментов, а также какие проблемы решает современный статический анализатор C++ кода, помимо собственно анализа кода.
Павел Беликов
@PVS-Studio, Тула, Россия
В лекции подробно рассмотрены тонкие моменты языка JavaScript, с которыми часто возникают основные проблемы. Наглядные примеры и рецепты помогают лучше понять его особенности.
Клиент-сайд изобилует кучей различных транспортов, и зачастую непонятно, какой взять для решения той или иной задачи. В данной лекции рассказывается об особенности каждого транспорта и области применимости.
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
Описываются возможности C++ по работе с наследованием (virtual, override, final). Описываются механизмы работы с константными переменными и методами (const, mutable, constexpr). Описываются возможности по перегрузке операторов (operator).
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Рассмотрены известные автору подходы к реализации как lock-free, так и fine-grained lock-based set/map: хеш-таблицы, деревья. Что из подходов STL может быть реализовано в lock-free манере, а что принципиально нет. Подводные камни lock-free и их нейтрализация.
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...OdessaFrontend
Дмитрий Ховрич рассказывает как использовать строгую типизацию TypeScript и писать надёжный код в функциональном стиле. А также делится знаниями как использовать функторы и монады в ежедневной фронтенд разработке.
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
Статический анализ появился почти 40 лет назад. В своём докладе мы хотим показать, чему за это время научились статические анализаторы. Мы рассмотрим различные методики анализа, как они появлялись и какие ошибки можно найти с помощью них. Посмотрим на примеры ошибок, найденных PVS-Studio в Open Source проектах. Поговорим о том, чем статический анализатор отличается от "линтеров" и некоторых других инструментов, а также какие проблемы решает современный статический анализатор C++ кода, помимо собственно анализа кода.
Павел Беликов
@PVS-Studio, Тула, Россия
В лекции подробно рассмотрены тонкие моменты языка JavaScript, с которыми часто возникают основные проблемы. Наглядные примеры и рецепты помогают лучше понять его особенности.
Клиент-сайд изобилует кучей различных транспортов, и зачастую непонятно, какой взять для решения той или иной задачи. В данной лекции рассказывается об особенности каждого транспорта и области применимости.
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
В докладе будет рассказано о тех фундаментальных причинах, приводящих к неоптимальному коду в продукте, будет предложен подход, лишённый найденных недостатков.
Докладываемый подход опирается на технологию Expression Templates, которая позволяет уменьшить количество действий и объём ресурсов, которые требуются для выполнения неких промежуточных действий в процессе формирования каждой записи в журнал. Эта технология используется для уменьшения количества промежуточных операций при вычислении сложных математических выражений. Новизна докладываемого подхода в том, что тот же самый принцип, на котором основана технология Expression Templates можно применить для того, чтобы целенаправленно исключить те промежуточные действия, которые в конечном итоге приводят к неоптимальному коду.
Завершается доклад обсуждением полученного эффекта, путей возможного дальнейшего развития и возможностей применения этой же технологии в других задачах.
Презентация посвящена вопросам использования параллельных алгоритмов для создания современных эффективных программных решений. Актуальность данной тематики обусловлена снижением темпов роста тактовой частоты микропроцессоров и возрастанием внимания к использованию всех возможностей многоядерных и многопроцессорных систем. В работе рассмотрен ряд базовых параллельных алгоритмов, таких как умножение матриц, параллельная сортировка Бэтчера, метод Гаусса решения систем линейных алгебраических уравнений и так далее. Приведена реализация этих алгоритмов c использованием языка программирования Си++.
Многим читателя понравилась моя статья "Последствия использования технологии Copy-Paste при программировании на Си++ и как с этим быть" [1]. Обратил на неё внимание и Scott Meyers [2] и задал вопрос о том, как же собственно статический анализ помог выявить описанные в статье ошибки.
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеAlexander Byndyu
В докладе рассматривается использование популярных фреймворков в разработке ASP.NET MVC приложения, как сделать его наиболее гибким. Будет затронута тема минимизации дублирования и повторное использование кода, применение методов метапрограммирования отображений; уменьшение логики в контроллерах; применение принципов SOLID и GRASP для разработки доменной модели приложения.
По материалам конференции .NET разработчиков http://www.dotnetconf.ru/Materialy/Asp_net_mvc_kak_postroit_gibkoe_web_prilozenie
1. Лекция №3-4 для дисциплин: «Прикладное программирование» и «Языки
программирования»
1
Лекция 3-4 (4 часа)
3.4. Логические выражения и оператор if
3.4.1 Условные конструкции. Пример условных конструкций
Условные конструкции позволяют в зависимости от условия выполнять блок
операторов, заключенный в фигурные скобки.
if( условие )
{
блок операторов;
}
Если условие удовлетворено, то
"блок операторов" в теле if
выполняется.
Если условие не удовлетворяется,
то "блок операторов"в теле if не
выполняется.
if( условие )
{
блок операторов 1;
}
else
{
блок операторов 2;
}
Если условие выполняется, то
выполняется "блок операторов 1".
Если условие не удовлетворено,
то выполняется "блок операторов
2".
Условия в операторах if могут быть образованы с помощью операций равенства и
отношений. В примере несколько операторов if сравнивают два вводимых
пользователем числа. Если в каком-либо из этих операторов условие удовлетворяется
(равно true) – выполняется связанный с данным if оператор вывода.
Если внутри условия только один оператор, допустимо не использовать
фигурные скобки. Если операторов 2 и более – использование фигурных скобок
обязательно.
// подключение библиотеки ввод-вывода
#include <iostream>
// подключение стандартного пространства имен для использования библиотек
using namespace std;
/////////////////////////////////////////////////////////////////////////////
// функция main начинает исполнение программы
void main()
{
// объявление переменных
int x,y;
2. Лекция №3-4 для дисциплин: «Прикладное программирование» и «Языки
программирования»
2
cout<<"Enter two integers to compare: "; // запросить ввод
cin>>x>>y; // прочитать два введенных числа
if(x == y) // число x равно числу y ?
cout<<x<<" == "<<y<<endl;
if(x != y) // число x не равно числу y?
cout<<x<<" != "<<y<<endl;
if(x < y) // число x меньше числа y ?
cout<<x<<" < "<<y<<endl;
if(x > y) // число x больше числа y ?
cout<<x<<" > "<<y<<endl;
if(x <= y) // число x меньше либо равно числу y ?
cout<<x<<" <= "<<y<<endl;
if(x >= y) // число x больше либо равно числу y ?
cout<<x<<" >= "<<y<<endl;
}
/////////////////////////////////////////////////////////////////////////////
3.4.2 Логические выражения. Логические операции И, ИЛИ, НЕ (пример 5)
Выражение, находящееся внутри круглых скобок оператора if – логическое
выражение. Логическое выражение может принимать два значения – true (истинно)
или false (ложно). Рассмотрим еще один пример, который определяет, попала ли точка
с координатами x, y в прямоугольник:
// подключение библиотеки ввод-вывода
#include <iostream>
// подключение стандартного пространства имен для использования библиотек
using namespace std;
/////////////////////////////////////////////////////////////////////////////
// функция main начинает исполнение программы
void main()
{
// объявление переменных
double x,y;
cout<<"Enter point coordinate (x,y): "; // запросить ввод
cin>>x>>y; // прочитать два введенных числа
// первый вариант решения
// если точка находится внутри прямоугольника
if(x<2 && x>-2 && y>-1 && y<1)
cout<<"Point inside"<<endl;
else
3. Лекция №3-4 для дисциплин: «Прикладное программирование» и «Языки
программирования»
3
cout<<"Point outside"<<endl;
// второй вариант решения
// если точка находится внутри прямоугольника
bool x_inside=x<2 && x>-2;
bool y_inside=y<1 && y>-1;
if(x_inside && y_inside)
cout<<"Point inside"<<endl;
else
cout<<"Point outside"<<endl;
}
/////////////////////////////////////////////////////////////////////////////
В C++ предусмотрены логические операции, которые используются для
образования более сложных условий путем комбинирования простых. Логическими
операциями являются:
· && - логическое И
· || - логическое ИЛИ
· ! - логическое НЕ
В данном примере, для определения попадания точки внутрь прямоугольника
нам надо проверить условие, которое математически можно записать как -1 < x < 1.
При записи этого выражения на С++ нам придется воспользоваться операцией &&
(логического И) для объединения двух условий:x<2&&x>-2. Это условие равно true в
том и только том случае, когда оба простых условия равны true. Логические операции
И, ИЛИ и НЕ имеют более высокий приоритет чем операции сравнения, поэтому
скобки не являются необходимыми. Однако, для удобства чтения можно добавить
круглые скобки:
(x<2)&&(x>-2).
Если бы нам надо было определить, что точка НЕ попадает внутрь
прямоугольника, нам потребовалась бы использовать оператор ИЛИ (координата x
либо меньше -2, либо больше 2):
(x >2)||(x<-2)
Либо можно было бы воспользоваться оператором НЕ (координата x НЕ лежит
внутри прямоугольника):
!( (x <2)&&(x >-2) )
Таблица показывает все четыре возможных комбинации значений false и true для
операций И и ИЛИ с двумя выражениями.
4. Лекция №3-4 для дисциплин: «Прикладное программирование» и «Языки
программирования»
4
выражение
1
выражение
2
(выражение 1) &&
(выражение 2)
(выражение 1) ||
(выражение 2)
true true true true
true false false true
false true false true
false false false false
При написании выражений, содержащих много операций, справляйтесь с
таблицей старшинства и ассоциативности (приложение ?). Если вы не уверены
относительно порядка оценки в сложном выражении, используйте для задания
нужного порядка круглые скобки, как в алгебраических выражениях.
3.4.3 Типичные ошибки
if(x==1) //
правильно!
{
y=x+3;
z=y*5;
}
if(x=1) //
неправильно!
// выполняется
всегда!
{
y=x+3;
z=y*5;
}
ошибочное
употребление
операции
присваивания = вместо
операции равенства ==
if(x==1); //
неправильно!
// выполняется
всегда!
{
y=x+3;
z=y*5;
}
эквивалентно коду:
if(x==1)
{
[пустой
оператор];
}
y=x+3;
z=y*5;
if(x==1) //
неправильно!
y=x+3;
z=y*5;
отсутствуют фигурные
скобки, хотя в условии
задумано больше
одного оператора
эквивалентно коду:
if(x==1)
{
y=x+3;
}
z=y*5;
3.4.4 Вложенные условия
Для вложенных условий, когда одно условие находится внутри другого очень
важно соблюдать правильную последовательность операторов и правильно
расставлять фигурные скобки.
Например:
5. Лекция №3-4 для дисциплин: «Прикладное программирование» и «Языки
программирования»
5
if( х > 5 )
if( У > 5 )
cout<<"x and у are > 5";
else
cout<<"x is <= 5";
Судя по отступам, в данном примере ожидается, что оператор else относится к
условию x>5. На самом же деле оператор else всегда относится к ближайшему к нему
оператору if. Данный пример будет выполняться так:
if( х > 5 )
if( У > 5 )
cout<<"x and у are > 5";
else
cout<<"x is <= 5";
Чтобы вложенный оператор if... else выполнялся так, как предполагалось сначала,
мы должны написать его следующим образом:
if( х > 5 )
{
if( У > 5 )
cout<<"x and у are > 5";
}
else
cout<<"x is <= 5";
3.5. Арифметический логический оператор
Арифметический логический оператор позволяет присвоить переменной одно из двух значений в
зависимости от выполнения условия:
[переменная] = [условие] ? [значение1] : [значение2];
Например:
int i=3;
int j=(i>0) ? 1 : -1; // j=1
Те же самые действия можно было бы записать более длинным способом при помощи
оператора if:
if(i>0)
{
j=1;
}
else
{
j=-1;
}
6. Лекция №3-4 для дисциплин: «Прикладное программирование» и «Языки
программирования»
6
3.6. Селективные конструкции
3.6.1 Селективные конструкции. Пример определения оценки в зависимости от
количества баллов (пример 6)
Селективные конструкции позволяют осуществлять выбор блока операторов,
который будет выполняться в зависимости от условий. Селективную конструкцию
можно реализовать при помощи операторов if – if else – else или при помощи
оператора switch.
if( условие 1 )
{
блок операторов 1;
}
else if( условие 2 )
{
блок операторов 2;
}
else
{
блок операторов 3;
}
switch ( переменная )
{
case константа 1:
{
блок операторов 1;
break;
}
case константа 2:
{
блок операторов 2;
break;
}
default:
{
блок операторов 3;
}
}
Рассмотрим пример определения оценки в зависимости от количества баллов
// подключение библиотеки ввод-вывода
7. Лекция №3-4 для дисциплин: «Прикладное программирование» и «Языки
программирования»
7
#include <iostream>
// подключение строковой библиотеки
#include <iostream>
// подключение стандартного пространства имен для использования библиотек
using namespace std;
/////////////////////////////////////////////////////////////////////////////
// функция main начинает исполнение программы
void main()
{
// количество баллов
int studentGrade;
// оценка (строка символов)
string studentMark;
// ввод баллов
cout<<"Please, input your grade: ";
cin>>studentGrade;
// определение оценки
if ( studentGrade >= 90 ) // 90 и более баллов - оценка 5А
studentMark="5А";
else if ( studentGrade >= 83 ) // 83-89 - оценка 4В
studentMark="4А";
else if ( studentGrade >= 74 ) // 74-83 - оценка 4С
studentMark="4С";
else if ( studentGrade >= 67 ) // 67-74 - оценка 3D
studentMark="3D";
else if ( studentGrade >= 60 ) // 60-67 - оценка 3D
studentMark="3E";
else // менее 60 - не сдано
studentMark="FX";
// вывод оценки на экран
// для вывода строки необходимо преобразовать ее в набор символов при помощи
функции c_str()
cout<<"Your mark is "<<studentMark.c_str()<<endl;
}
/////////////////////////////////////////////////////////////////////////////
В этом примере условие проверяется последовательно – вначале больше ли
studentGrade чем 90, если нет – проверяется следующее условие. Если ни одно из
условий не выполнено, выполняется блок else.
Если пропустить последний блок else – возможна ситуация когда ни одно из
условий не выполнится.
3.6.2 Оператор Switch. Пример меню с выбором действия
Оператор множественного выбора switch упрощает выполнение нескольких
различных действий в зависимости от возможных значений переменной или
выражения. Каждое действие выполняется в зависимости от значения некоторого
целого значения, которое может принимать переменная или выражение, проверяемое
в операторе switch.
8. Лекция №3-4 для дисциплин: «Прикладное программирование» и «Языки
программирования»
8
// подключение библиотеки ввод-вывода
#include <iostream>
// подключение стандартного пространства имен для использования библиотек
using namespace std;
/////////////////////////////////////////////////////////////////////////////
// функция main начинает исполнение программы
void main()
{
// описание переменных
double a,b; // два вещественных числа для вычислений
int menu_number; // номер выбранного пункта меню
// ввод данных
cout<<"Enter two numbers: "; // запросить ввод
cin>>a>>b; // прочитать два введенных числа
// вывод меню
cout<<endl<<endl<<"Enter number of menu item: ";
cout<<"1. a+b"<<endl;
cout<<"2. a-b"<<endl;
cout<<"3. a*b"<<endl;
cout<<"4. a/b"<<endl;
// ввод номера пункта меню
cin>>menu_number;
// оператор выбора по номеру пункта меню
switch(menu_number)
{
// если menu_number==1
case 1:
{
cout<<"a+b="<<a+b<<endl;
// выход из оператора switch
break;
}
// если menu_number==2
case 2:
{
cout<<"a-b="<<a-b<<endl;
// выход из оператора switch
break;
}
// если menu_number==2
case 3:
{
cout<<"a*b="<<a*b<<endl;
// выход из оператора switch
break;
}
// если menu_number==2
case 4:
{
cout<<"a/b="<<a/b<<endl;
// выход из оператора switch
break;
}
// если ни один из предыдущих case не сработал
9. Лекция №3-4 для дисциплин: «Прикладное программирование» и «Языки
программирования»
9
default :
{
cout<<"Wrong menu item"<<endl;
// оператор break не нужен, т.к. switch закончился
}
}
}
/////////////////////////////////////////////////////////////////////////////
Когда поток управления достигает оператора switch, программа оценивает
следующее за switch управляющее выражение (в данном случае menu _ number).
Оператор switch сравнивает значение управляющего выражения с каждой из меток
case. Оператор break заставляет программу перейти к первому оператору после
оператора switch.
Если в операторе switch не найдется ни одной метки case, совпадающей со
значением управляющего выражения, исполняется вариант default. В операторе switch,
не содержащем варианта default, программное управление в этом случае просто
перешло бы к первому оператору после switch.
Те же самые действия можно было бы описать и при помощи операторов if – else
if – else:
switch(menu_number)
{
case 1:
{
cout<<"a+b="<<a+b<<endl;
break;
}
case 2:
{
cout<<"a-b="<<a-b<<endl;
break;
}
case 3:
{
cout<<"a*b="<<a*b<<endl;
break;
}
case 4:
{
cout<<"a/b="<<a/b<<endl;
break;
}
default :
{
cout<<"Wrong menu
item"<<endl;
}
}
if(menu_number==1)
{
cout<<"a+b="<<a+b<<endl;
}
else if(menu_number==2)
{
cout<<"a-b="<<a-b<<endl;
}
else if(menu_number==3)
{
cout<<"a*b="<<a*b<<endl;
}
else if(menu_number==4)
{
cout<<"a/b="<<a/b<<endl;
}
else
{
cout<<"Wrong menu item"<<endl;
}
10. Лекция №3-4 для дисциплин: «Прикладное программирование» и «Языки
программирования»
10
Без операторов break всякий раз, когда в операторе switch обнаруживается
соответствие, будут исполняться операторы и всех последующих меток case, пока не
встретится оператор break или не будет достигнут конец switch.
switch(menu_number)
{
case 1:
{
cout<<"a+b="<<a+b<<endl;
}
case 2:
{
cout<<"a-b="<<a-b<<endl;
break;
}
case 3:
{
cout<<"a*b="<<a*b<<endl;
break;
}
case 4:
{
cout<<"a/b="<<a/b<<endl;
break;
}
default :
{
cout<<"Wrong menu
item"<<endl;
}
}
if(menu_number==1)
{
cout<<"a+b="<<a+b<<endl;
}
if(menu_number==1 || menu_number==2)
{
cout<<"a-b="<<a-b<<endl;
}
else if(menu_number==3)
{
cout<<"a*b="<<a*b<<endl;
}
else if(menu_number==4)
{
cout<<"a/b="<<a/b<<endl;
}
else
{
cout<<"Wrong menu item"<<endl;
}