Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Platonov Sergey
Предлагаемый подход позволяет без труда получить параллельную асинхронную обработку данных без явного использования средств синхронизации, по максимуму задействуя доступные вычислительные ресурсы. Использование сопрограмм значительно упрощает написание многопоточного кода. Это дает возможность сконцентрироваться непосредственно на задаче обработки данных, не занимаясь вопросами синхронизации различных операций, включая асинхронную работу с сетью.
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
За время работы над проектом был разработан удобный фреймворк для написания асинхронного кода. В докладе будет рассмотрено то, как он устроен и как со временем эволюционировал. Разберемся, как с помощью наших примитивов решать проблемы, часто встречающиеся в асинхронном программирование; будут примеры удачного и неудачного использования. Отдельно остановимся на сравнении получившихся средств с тем, что было добавлено в С++11.
Доклад о дизайне кода в функциональном стиле на C++, представленный вниманию плюсовиков на C++ User Group Novosibirsk 2014.
В качестве демонстрационного проекта была реализована игра "Амбер" по мотивам "Хроник Амбера" Р. Желязны.
https://github.com/graninas/Amber
Со времён С++98 стандартные контейнеры и идиома RAII позволяли избегать использования оператора delete, что делало код более безопасным. С приходом С++11 и умных указателей отпала необходимость использовать оператор new, что позволило практически полностью переложить управление памятью на плечи компилятора. В докладе объясняется идеология управления памятью и ресурсами в современном С++.
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Platonov Sergey
Предлагаемый подход позволяет без труда получить параллельную асинхронную обработку данных без явного использования средств синхронизации, по максимуму задействуя доступные вычислительные ресурсы. Использование сопрограмм значительно упрощает написание многопоточного кода. Это дает возможность сконцентрироваться непосредственно на задаче обработки данных, не занимаясь вопросами синхронизации различных операций, включая асинхронную работу с сетью.
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
За время работы над проектом был разработан удобный фреймворк для написания асинхронного кода. В докладе будет рассмотрено то, как он устроен и как со временем эволюционировал. Разберемся, как с помощью наших примитивов решать проблемы, часто встречающиеся в асинхронном программирование; будут примеры удачного и неудачного использования. Отдельно остановимся на сравнении получившихся средств с тем, что было добавлено в С++11.
Доклад о дизайне кода в функциональном стиле на C++, представленный вниманию плюсовиков на C++ User Group Novosibirsk 2014.
В качестве демонстрационного проекта была реализована игра "Амбер" по мотивам "Хроник Амбера" Р. Желязны.
https://github.com/graninas/Amber
Со времён С++98 стандартные контейнеры и идиома RAII позволяли избегать использования оператора delete, что делало код более безопасным. С приходом С++11 и умных указателей отпала необходимость использовать оператор new, что позволило практически полностью переложить управление памятью на плечи компилятора. В докладе объясняется идеология управления памятью и ресурсами в современном С++.
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JSFestUA
During the presentation, we will consider what advantages a front-end developer will get from knowledge of algorithms and data structures.
We will analyze real-world examples where this knowledge simplified logic and accelerated applications dramatically.
And finally we will understand the most necessary things that will allow us to determine the effectiveness of the code and easily improve it.
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
Евгений Крутько, НИЦ «Курчатовский институт».
В докладе на примере программы моделирования динамики движения конструкций по методу конечных элементов рассматриваются возможности и практика распараллеливания вычислений. Речь в нём пойдёт как о технике создания новых вычислительных потоков, так и об использовании стандартов openMP и MPI.
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JSFestUA
During the presentation, we will consider what advantages a front-end developer will get from knowledge of algorithms and data structures.
We will analyze real-world examples where this knowledge simplified logic and accelerated applications dramatically.
And finally we will understand the most necessary things that will allow us to determine the effectiveness of the code and easily improve it.
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
Евгений Крутько, НИЦ «Курчатовский институт».
В докладе на примере программы моделирования динамики движения конструкций по методу конечных элементов рассматриваются возможности и практика распараллеливания вычислений. Речь в нём пойдёт как о технике создания новых вычислительных потоков, так и об использовании стандартов openMP и MPI.
2. Задача 1. Олимпиада MCA. 100 баллов.
• Входной файл test.in
• Выходной файл test.out
Всякому известен регламент ACM, по этому регламенту
проходит Всероссийская командная олимпиада
школьников по программированию и информатике.
Менее известен альтернативный регламент MCA. Согласно
этому регламенту каждая задача оценивается
определённым количеством баллов. Правильно решённая
задача даёт команде именно столько баллов. Выигрывает
команда, набравшая наибольшее количество баллов. Если
две или более команд набирают одинаковое количество
баллов, то выигрывает команда, решившая наименьшее
количество задач. Если и таких команд оказывается
несколько, то выигрывает команда, имеющая
наименьшее количество попыток сдать задачи (как
успешных, так и безуспешных). Если по-прежнему
победитель не определился, то выигрывает команда с
наименьшим номером. Ваша задача - по итогам MCA
турнира составить итоговую таблицу.
3. • Формат входного файла.
• В первой строке входного файла содержатся два целых числа
T - количество команд и P - количество задач (1 ≤ T ≤ 10, 1 ≤ P ≤
10). Команды пронумерованы от 1 до T, задачи названы
первыми P заглавными буквами латинского алфавита. Во
второй строке записаны P целых чисел из отрезка *1,100+ -
количество баллов, которым оценены задачи. Третья строка
содержит одно целое число S (1 ≤ S ≤ 200) - суммарное
количество сдач за время турнира. В следующих S строках
записаны результаты сдач в формате
• <номер команды> <код задачи> A|R
• буква A (Accepted) означает, что задача принята, буква R
(Rejected) означает, что задача не принята. Данные в этих
строках разделены ровно одним пробелом.
• Формат выходного файла.
• Запишите в выходной файл итоговую таблицу турнира. Таблица
должна занимать T строк, в каждой из которых должен быть
записан номер команды и набранное командой количество
баллов.
4.
5. • var a,b:integer;
• result:longint; Шаг 1
• f, g:text; Создаем файл шаблон, который умеет работать с
• procedure readdata; входными и выходными файлами
• begin
• assign(f,'test.in'); Создаем файлы:
• reset(f); Входной файл test.in
• read(f,a); Выходной файл test.out
• read(f,b); Протестируем программу
• close(f);
• end;
• procedure outdata;
• begin
• assign(g, 'test.out');
• rewrite(g);
• write(g,result);
• close(g);
• end;
• procedure run;
• begin
• result:=a+b;
• end;
• begin
• readdata;
• run;
• outdata;
• end.
6. • Редактируем файл Shablon.pas:
• Var
• T, P: 1..10; {кол-во команд, количество задач}
• B: 1..100; {количество баллов}
• S: 1..200; {количество сдач}
• i:integer; {счетчик для массива}
• MB :array[1..100] of 1..10; {массив для баллов}
• MT :array[1..200] of 1..10; {массив для номеров команд}
• MP :array[1..200] of string; {массив кода задач}
• MAR :array[1..200] of string; {массив для A,R}
• MR :array[1..10] of integer; {массив для
результирующих баллов}
• N :array[1..10] of 1..200; {количество сдач для
каждой команды}
• f, g:text;
7. • Procedure readdata;
Read - читает
• … Readln - читает и
• Readln(f, T , P); переходит на
• For i:=1 to P do новую строку
• Read(f, MB[i]);
• Readln(f, S);
• For i:=1 to S do
• Readln(f, MT[i], MP[i], MAR[i] );
• …
8. • Procedure outdata;
• …
• For i:=1 to T do
• writeln(g, MT[i], ’ ‘, MR[i]);
• …
9. • Итак, наша программа, умеет считать и
выводить нужные данные, теперь наша
задача, научить её обрабатывать их, т.е:
• Подсчитать количество баллов для каждой
задачи, нужно суммировать баллы задач
каждой команды с пометкой
A(Accepted), попутно подсчитывать
количество сдач каждой команды
• В конце выполнить многоуровневую
сортировку сначала по количеству
баллов, потом по количеству сдач, и
наконец, по номеру команды.
10. • Например, если
имеется следующие
результаты
• То, после сортировки
получим таблицу
11. Подсчет баллов и сдач
• {перебираем все сдачи}
• for i:=1 to s do
• Begin
• {подсчитываем количество сдач для каждой
команды}
• for j:=1 to T do
• If MT[i]=j then inc(N[j])
• {подсчитываем количество баллов задач для
каждой команды}
• for k:=1 to P do
• If MP[j]=chr(64+k) then MR[k]:=MB[k]
• End;
13. Задача A. Детали
• Имеется N кг металлического сплава. Из него изготавливают
заготовки массой K кг каждая. После этого из каждой заготовки
вытачиваются детали массой M кг каждая (из каждой заготовки
вытачивают максимально возможное количество деталей).
Если от заготовок после этого что-то остается, то этот материал
возвращают к началу производственного цикла и сплавляют с
тем, что осталось при изготовлении заготовок. Если того сплава,
который получился, достаточно для изготовления хотя бы
одной заготовки, то из него снова изготавливают заготовки, из
них – детали и т.д.
• Напишите программу, которая вычислит, какое количество
деталей может быть получено по этой технологии из
имеющихся исходно N кг сплава.
• Формат входных данных
• Вводятся N, K, M. Все числа натуральные и не превосходят 200.
• Формат выходных данных
• Выведите одно число — количество деталей, которое может
получиться по такой технологии.
15. N
сплав
KZ OZ
K
Заготовка 1 Заготовка 2 Заготовка 3 ост
M
д1 д2 д3 ост1 ост2 ост3
KD
OD
KZ- количество заготовок
OZ- масса остатка от заготовок
KD- количество деталей
OD- масса остатков от деталей
16. Формализация
• Ввод M, N, K
• Нц пока N>=K
• KZ=N div K
• OZ=N mod K
• нц для i от 1 до KZ
• OD=OD+K mod M KD=KD+K div M
• кц
• N=OD+OZ
• кц
• Вывод KD
18. Procedure run Тестирование(отладка
Begin программы)
while n>=k do 10 5 2
begin 4 (!)
KZ:=N div K;
OZ:=N mod K; 13 5 3
for i:=1 to KZ do 18517(?)
begin
OD:=OD+K mod M; 14 5 3
KD:=KD+K div M 19153 (?)
end;
N:=OD+OZ 13 9 4
end; 2 (!)
End;
19. Ручное
N=13 K=5 M=3
тестирование
N цикла N>=K? N KZ OZ OD KD
1 ДА 13 2 3 4 2
2 ДА 7 1 2 6(!) 3
20. Procedure run Тестирование
Begin 10 5 2
while n>=k do 4 (!)
begin
KZ:=N div K; 13 5 3
OZ:=N mod K; 3 (!)
for i:=1 to KZ do
begin 14 5 3
OD:=OD+K mod M; 4 (!)
KD:=KD+K div M
end; 13 9 4
N:=OD+OZ ; OD :=0 2 (!)
end;
End;
21. Анализ
• В процедуре readdata проверять
выполнение условий
• N>K>M
• 0<N≤200, 0<M≤200, 0<K≤200
22. Задача B. Налог
• В некоторой стране инфляция достигла таких размеров, что
доходы граждан стали выражаться числами, количество знаков
в десятичной записи которых доходит до 200. Это сильно
усложнило задачу взимания налогов.
• Один из налогов на доходы составляет 1%. Напишите
программу, которая по введенному числу D (величине дохода
гражданина) вычислит этот налог.
• При этом применяются следующие правила округления:
• Если налог выражается целым числом, то он не округляется.
• Если налог выражается дробным числом, то он округляется в
сторону большего целого (в пользу государства).
• Формат входных данных
• Вводится одно число D (натуральное, 105 ≤ D < 10200) – величина
дохода гражданина.
• Формат выходных данных
• Выведите одно натуральное число – величину налога.
23. моделирование
• N- налог
• D – доход
• Dr – дробная часть
• N = D div 100
• Dr = D mod 100
• пример:
• 13459 div 100 = 134
• 13459 mod 100 = 59
24. формализация
• Ввод D
• N = D div 100
• Dr = D mod 100
• Если Dr>0 то N= N+1
• Вывод N
25. Проблема!
• В ПК нельзя хранить числа с количеством
200 знаков!
• Решение:
• Представим цифры числа как массив
символов ‘0’, ’1’ и т. д.
• 12735387348946353849473663
• Чтобы выделить из строки подстроку будем
использовать функции copy, delete, length
26. • S – длинное число(тип string)
• K:=Length(s) - длина числа
• Dr:=copy(s,k-2,2) – выделить подстроку
• N:=delete(s,k-2,2) – удалить подстроку
• G:= copy(s,k-3,1)
• Val(G,x,code) преобразование символа в
число
• Если Dr<>’00’ то inc(x)
• Str(x,g) преобразование числа в символ
• N := N+g
27. Задача D. Строительство школы
• В деревне Интернетовка все дома расположены вдоль одной
улицы по одну сторону от нее. По другую сторону от этой улицы
пока ничего нет, но скоро все будет – школы, магазины,
кинотеатры и т.д.
• Для начала в этой деревне решили построить школу. Место для
строительства школы решили выбрать так, чтобы суммарное
расстояние, которое проезжают ученики от своих домов до
школы, было минимально.
• План деревни можно представить в виде прямой, в некоторых
целочисленных точках которой находятся дома учеников.
Школу также разрешается строить только в целочисленной
точке этой прямой (в том числе разрешается строить школу в
точке, где расположен один из домов – ведь школа будет
расположена с другой стороны улицы).
• Напишите программу, которая по известным координатам
домов учеников поможет определить координаты места
строительства школы.
30. • Анализируя схему можно прийти к выводу,
что, школа должна быть построена где-то в
середине
или
ш ш
ш
31. • Порядковый номер K школы можно найти
по формуле
• N div 2 + 1,
• где N – количество домов
• Например
• Для N =3 → 3 div 2 + 1 → К=2
• Для N =4 → 4 div 2 + 1 → К=3
• Для N =5 → 5 div 2 + 1 → К=3
32. формализация
Ввод
координат
• Ввод N
• нц для i от 1 до N ввод m[i] кц
• K=N div 2+1
• Вывод m[К]
33. программирование
• Var N: longint;
• K, i:integer;
• m:array[1..100] of longint;
• Procedure readdata;
• …
• Readln(f,N);
• For i:=1 to N do Read(f,m[i]);
• …
• Procedure outdata;
• …
• write(g, m[K]);
• …