Практические занятия по курсу ОиМП/Группа 101 1 — различия между версиями

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск
(Оценки)
 
(не показаны 43 промежуточные версии 2 участников)
Строка 78: Строка 78:
 
<br>
 
<br>
 
Также советую еще раз попробовать осознать, что происходит вот в этом фрагменте кода:
 
Также советую еще раз попробовать осознать, что происходит вот в этом фрагменте кода:
<syntaxhighlight lang="python" line start="100" highlight="5">
+
<syntaxhighlight lang="python" line start="1" highlight="5">
 
+
   class MyType(type):
   1 class MyType(type):
+
          def __new__(cls, name, bases, dict):
  2        def __new__(cls, name, bases, dict):
+
                  print("New instance of %s created with name %s, bases %s and params %s"                 
  3                print("New instance of %s created with name %s, bases %s and params %s"                 
+
                          % (cls.__name__, name, str(bases), str(dict)))
  4                        % (cls.__name__, name, str(bases), str(dict)))
+
                  return type.__new__(cls, name, bases, dict)
  5                return type.__new__(cls, name, bases, dict)
+
          def __init__(cls, name, bases, dict):
  6        def __init__(cls, name, bases, dict):
+
                  print("Instance of %s with name %s and bases %s initialized with params %s"                           
  7                print("Instance of %s with name %s and bases %s initialized with params %s"                           
+
                          % (cls.__name__, name, str(bases), str(dict)))
  8                        % (cls.__name__, name, str(bases), str(dict)))
+
                  return super(MyType, cls).__init__(name, bases, dict)
  9                return super(MyType, cls).__init__(name, bases, dict)
+
 
10
+
  MyObject = MyType("MyObject", (), {})
11 MyObject = MyType("MyObject", (), {})
+
 
12
+
  class MyClass(MyObject):
13 class MyClass(MyObject):
+
          def __init__(self, s):
14        def __init__(self, s):
+
                  print(s)
15                print(s)
+
 
16
+
  mc = MyClass("parameter")
17 mc = MyClass("parameter")
+
 
+
 
</syntaxhighlight>
 
</syntaxhighlight>
 
Вкратце, примерно следующее: мы объясняем Python3, что у нас будет новый тип классов --- MyType.<br>
 
Вкратце, примерно следующее: мы объясняем Python3, что у нас будет новый тип классов --- MyType.<br>
Строка 104: Строка 102:
  
 
Вот что этот пример выводит:<br>
 
Вот что этот пример выводит:<br>
 
+
<syntaxhighlight lang="python" line start="1" highlight="5">
   1 New instance of MyType created with name MyObject, bases () and params {}
+
   New instance of MyType created with name MyObject, bases () and params {}
   2 Instance of MyObject with name MyObject and bases () initialized with params {}
+
   Instance of MyObject with name MyObject and bases () initialized with params {}
   3 New instance of MyType created with name MyClass, bases (<class '__main__.MyObject'>,) and params  
+
   New instance of MyType created with name MyClass, bases (<class '__main__.MyObject'>,) and params  
   4 {'__init__': <function MyClass.__init__ at 0x100771d08>, '__module__': '__main__', '__qualname__': 'MyClass'}
+
   {'__init__': <function MyClass.__init__ at 0x100771d08>, '__module__': '__main__', '__qualname__': 'MyClass'}
   5 Instance of MyClass with name MyClass and bases (<class '__main__.MyObject'>,) initialized with params  
+
   Instance of MyClass with name MyClass and bases (<class '__main__.MyObject'>,) initialized with params  
   6 {'__init__': <function MyClass.__init__ at 0x100771d08>, '__module__': '__main__', '__qualname__': 'MyClass'}
+
   {'__init__': <function MyClass.__init__ at 0x100771d08>, '__module__': '__main__', '__qualname__': 'MyClass'}
   7 parameter
+
   parameter
 
+
</syntaxhighlight>
 
Почему так?<br>
 
Почему так?<br>
 
Вначале честно вызываются __new__ и __init__ при создании MyObject. Python смотрит вверх по дереву и ищет __new__ и __init__ от MyType и сразу же у него их и находит - выводит первые две строки и создает объект, как и написано в коде.<br>
 
Вначале честно вызываются __new__ и __init__ при создании MyObject. Python смотрит вверх по дереву и ищет __new__ и __init__ от MyType и сразу же у него их и находит - выводит первые две строки и создает объект, как и написано в коде.<br>
Строка 133: Строка 131:
  
 
Начнем мы с самого простого приложения "Hello, world!":<br>
 
Начнем мы с самого простого приложения "Hello, world!":<br>
 
+
<syntaxhighlight lang="python" line start="1" highlight="5">
   1 from tkinter import *
+
   from tkinter import *
   2
+
    
   3 tk = Tk()
+
   tk = Tk()
   4
+
    
   5 entry = Entry(tk)
+
   entry = Entry(tk)
   6 entry.pack()
+
   entry.pack()
   7 entry.insert(0, "Hello, world!")
+
   entry.insert(0, "Hello, world!")
   8
+
    
   9 tk.mainloop()
+
   tk.mainloop()
 
+
</syntaxhighlight>
 
Здесь в 3ей строке создается новое приложение, в 5ой - новое текстовое поле, в 6ой строке оно укладывается в окно, в 7ой изменяется его содержимое, а в 9ой мы запускаем цикл обработки событий окна.<br>
 
Здесь в 3ей строке создается новое приложение, в 5ой - новое текстовое поле, в 6ой строке оно укладывается в окно, в 7ой изменяется его содержимое, а в 9ой мы запускаем цикл обработки событий окна.<br>
 
Entry - это виджет библиотеки tkinter, который позволяет отображать одну строку текста.<br>
 
Entry - это виджет библиотеки tkinter, который позволяет отображать одну строку текста.<br>
Строка 207: Строка 205:
 
=== Первое домашнее задание ===
 
=== Первое домашнее задание ===
 
Контест с задачами:<br>
 
Контест с задачами:<br>
http://contest.yandex.ru/contest/689/standings/<br>
+
http://official.contest.yandex.ru/contest/689/<br>
 
Распределение задач осуществляется по простому правилу:<br>
 
Распределение задач осуществляется по простому правилу:<br>
 
* всего есть пять типов задач;
 
* всего есть пять типов задач;
Строка 230: Строка 228:
 
# Посчитайте скалярное произведение двух векторов размерности n. Чтобы не тратиться время на их ввод из файла, генерируйте их в программе по какой-нибудь простой формуле. Например, a_i = 1 / i.
 
# Посчитайте скалярное произведение двух векторов размерности n. Чтобы не тратиться время на их ввод из файла, генерируйте их в программе по какой-нибудь простой формуле. Например, a_i = 1 / i.
 
# Реализуйте обе предыдущие задачи, не компонуя ответ по результаты выполнения всех задач, а заполняя ответ из ветвей, используя локи.
 
# Реализуйте обе предыдущие задачи, не компонуя ответ по результаты выполнения всех задач, а заполняя ответ из ветвей, используя локи.
 +
 +
=== Введение в С++ ===
 +
Ссылка на контест:<br>
 +
http://official.contest.yandex.ru/contest/719/<br>
 +
Задачки очень простые, поэтому решаем все, чтобы набить руку.
 +
 +
Также предлагается следующая задача на подумать: дан массив из N элементов и число K. Нужно найти K минимальных чисел. С каким асимптотическим потреблением памяти и времени вы умеете решать эту задачу?
 +
 +
Для тех, кто участвовал в четверть-финале прошлого года: дан массив из N элементов и числа L и R. Нужно найти число подотрезков этого массива, сумма которых лежит в отрезке от L до R.
 +
 +
=== Функции в C++ ===
 +
Ссылка на контест:<br>
 +
http://official.contest.yandex.ru/contest/735/<br>
 +
Задачки простые, подумать надо (или не надо) только над последней, поэтому решаем все задачки подряд.
 +
 +
=== Классы в C++ ===
 +
Ссылка на контест:<br>
 +
http://official.contest.yandex.ru/contest/746/<br>
 +
Вы эти задачи уже решали, так что проблем с семантикой быть не должно.
 +
Важно правильно реализовать все необходимые структуры, методы и операторы.
 +
 +
=== Шаблонные функции и классы в C++ ===
 +
Ссылка на контест:<br>
 +
http://official.contest.yandex.ru/contest/784/<br>
 +
Задачки простые, решаются и без шаблонов, но наша задача - потренироваться в их написании.
 +
 +
=== Второе домашнее задание ===
 +
Контест с задачами:<br>
 +
http://official.contest.yandex.ru/contest/763/<br>
 +
Распределение задач такое же, как и в первой домашней работе.
 +
 +
=== Наследование и интерфейсы в C++ ===
 +
Контест с задачами:<br>
 +
http://official.contest.yandex.ru/contest/797/<br>
 +
Первую задачу надо решить. Вторую - если хватит сил и времени.
 +
 +
=== Контрольная №1 ===
 +
Контест:<br>
 +
http://official.contest.yandex.ru/contest/828/<br>
 +
 +
=== Итераторы в C++ ===
 +
Контест с задачами:<br>
 +
http://official.contest.yandex.ru/contest/806/<br>
 +
 +
=== StyleGuide ===
 +
Ссылка на Google StyleGuide, на примере которого мы разбираем общие правила написания кода<br>
 +
http://google-styleguide.googlecode.com/svn/trunk/cppguide.html
 +
 +
=== Домашние работы 3 и 4 ===
 +
Ссылка на контест:<br>
 +
http://official.contest.yandex.ru/contest/946/<br>
 +
Распределение задач старое, как на первых двух домашках.
 +
 +
=== OpenGL и физика ===
 +
Ссылка на пример кода:<br>
 +
http://pastebin.com/JeuXPV9Z<br>
 +
Компилировать его надо строкой<br>
 +
g++ main.cpp -lGL -lGLU -lglut -std=c++0x<br>
 +
Задача на семинар - попытаться сымитировать физику двух атомов.<br>
 +
Они должны притягиваться, если отлетели далеко друг от друга, и отталкиваться, если приблизились слишком сильно.<br>
 +
Если это получится, попробуйте построить из них кристаллическую решетку.<br>
 +
Если решетка не развалится сама, попробуйте задать начальные скорости нескольким атомам и посмотреть, что будет :)<br>
 +
 +
=== Сетевые приложения ===
 +
Ссылка на код сервера:<br>
 +
http://pastebin.com/fzF8yR6W<br>
 +
Сслыка на архив с сервером астероидов:<br>
 +
https://yadi.sk/d/4JCWLAIZdQQXs<br>
 +
Старая ссылка на архив с клиентом:<br>
 +
https://yadi.sk/d/CtPlQDGRdVnxZ
 +
 +
=== Пробный экзамен ===
 +
На странице [[Основы_и_методологии_программирования|основы и методологии программирования]] есть ссылки на пробный экзамен и его решения.<br>
 +
 +
=== Оценки ===
 +
На данный момент результаты такие:
 +
{| class="wikitable"
 +
|-
 +
! !!Фамилия !! Имя !! Отчество !! ДЗ-1 !! ДЗ-2 !! КР !! ДЗ-3 !! ДЗ-4 !! Accum !! Exam !! Sum
 +
|-
 +
| 1 || Гущенко-Чеверда || Иван || Ильич || 10 || 10 || 10 || 10 || 9 || 9,8 || 9 || 9,6
 +
|-
 +
| 2 || Деркач || Денис || Анатольевич || 10 || 10 || 10 || 10 || 8 || 9,6 || 9 || 9,45
 +
|-
 +
| 3 || Исхаков || Тимур || Рашидович || 10 || 10 || 10 || 10 || 10 || 10 || 10 || 10
 +
|-
 +
| 4 || Кузнецов || Георгий || Алексеевич || 6 || 8 || 10 || 5 || 7 || 7,2 || 9 || 7,65
 +
|-
 +
| 5 || Мельниченко || Пётр || Валерьевич || 10 || 4 || 10 || 0 || 0 || 4,8 || 10 || 6,1
 +
|-
 +
| 6 || Носков || Степан || Алексеевич || 10 || 8 || 10 || 5 || 5 || 7,6 || 10 || 8,2
 +
|-
 +
| 7 || Пособин || Глеб || Игоревич || 10 || 10 || 10 || 10 || 10 || 10 || 10 || 10
 +
|-
 +
| 8 || Пролеев || Лев || Николаевич || 10 || 10 || 10 || 10 || 5 || 9 || 9 || 9
 +
|-
 +
| 9 || Рябушев || Антон || Федорович || 10 || 10 || 10 || 10 || 9 || 9,8 || 9 || 9,6
 +
|-
 +
| 10 || Сайранов || Айдар || Дамирович || 10 || 8 || 10 || 10 || 5 || 8,6 || 10 || 8,95
 +
|-
 +
| 11 || Святокум || Полина || Олеговна || 8 ||10 || 10 || 10 || 5 || 8,6 || 10 || 8,95
 +
|-
 +
| 12 || Султанов || Арсен || Русланович || 10 || 10 || 10 || 0 || 0 || 6 || 10 || 7
 +
|-
 +
| 13 || Трофимов || Иван || Андреевич || 2 || 8 || 10 || 10 || 8 || 7,6 || 10 || 8,2
 +
|}

Текущая версия на 14:49, 27 декабря 2014

Консольные команды Linux

  • man <cmd> вывести помощь по команде (выход из помощи - :q)
  • python3 <file> запустить скрипт на языке python3
  • ls выводит содержимое текущей директории
  • cd <path> переходит в указанную директорию
  • mkdir <dirname> создает директорию
  • mv <old_name> <new_name> переместить или просто переименовать файл
  • rm <file> удаляет файл
  • less <file> открыть просмотр файла в less (выход - :q)
  • touch <file> создать пустой файл
  • echo <str> вывести строку
  • cat <file> вывести содержимое файла
  • head <file> вывести начало файла
  • tail <file> вывести конец файла

Немного о файловой системе

  • "~" - ваша домашняя директория
  • "." - текущая директория
  • ".." - родительская директория
  • "/" - корень диска

Таким образом, "~/./any_dir/../" --- это то же самое, что и "~/any_dir/..", и "~/", и "~", "/home/guest-.../", и "~/../guest-...". Здесь "..." обозначают какую-то строку, которая может меняться в силу текущих настроек Linux.

Перенаправление потоков

Каждая команда в Linux принимает поток stdin и генерирует два потока - поток вывода stdout и поток ошибок stderr.
Для перенаправления этих потоков служат символы "<", ">", ">>".
Например, команда "python3 script.py > output.txt" перенаправит stdout вашего скрипта в файл output.txt.
А команда "python3 script.py < input.txt" направит в ваше решение содержимое файла input.txt.
Конечно же, их можно комбинировать. Важно заметить, что при использовании ">" уже имеющийся output.txt будет удален и появится новый output.txt.
Если вы хотите просто дописать строки в конец имеющегося файла, используйте ">>".

Конвейеры Linux

Один из наиболее мощных инструментов в консоли. Позволяет направить stdout предыдущей команды в stdin следующей. Пример:
cat sample.txt | grep -v "Test" | python3 solve.py >> result.txt
Здесь из файла sample.txt будут выброшены все строки, содержащие слово Test, а остальные будут направлены в ваш скрипт, после чего его результат допишется в конец файла result.txt.

Теперь приведу пример цикла:
for i in {1..10}; do echo $i | python3 solve.py; done
Этот цикл запустит ваше решение на всех числах от 1 до 10.

Пробный контест по вводу-выводу

http://official.contest.yandex.ru/contest/654/
Группы задач:

  • 0 (Hello, world!)
  • 1-6 (простые арифметические вычисления)
  • 7-12 (условный оператор)
  • 13-17 (циклы и делимость 1)
  • 18-24 (циклы и делимость 2)
  • 25-30 (системы счисления)
  • 31-35 (прочее по циклам)
  • 36-41 (форматированный вывод)

Из каждой группы надо решить по две задачи, а нулевую задачу нужно решить всем.

Контест по геометрии

Цель контеста --- знакомство с типами и перегрузкой операторов в Python.
http://official.contest.yandex.ru/contest/664/
Необходимо сдать хотя бы две задачи.

Контест по наследованию

Простейшие задачи на наследование в Python3.
Цель здесь --- это не решить эти задачи, а попробовать реализовать наследование.
http://official.contest.yandex.ru/contest/667/
Необходимо сдать обе задачи.

Контест по обработке текстов

Контест, связанный с лекционными материалами.
http://official.contest.yandex.ru/contest/669/
Группы задач:

  • 0-8
  • 9-14

Из каждой группы необходимо решить по две задачи.

Обратите внимание, что в этом контесте работает проверка PEP8!

Множественное наследование и генераторы

http://official.contest.yandex.ru/contest/675/
Всем нужно сдать задачу номер 0, а также любые другие две задачи.

Также советую еще раз попробовать осознать, что происходит вот в этом фрагменте кода:

  1.   class MyType(type):
  2.            def __new__(cls, name, bases, dict):
  3.                    print("New instance of %s created with name %s, bases %s and params %s"                 
  4.                            % (cls.__name__, name, str(bases), str(dict)))
  5.                    return type.__new__(cls, name, bases, dict)
  6.            def __init__(cls, name, bases, dict):
  7.                    print("Instance of %s with name %s and bases %s initialized with params %s"                           
  8.                            % (cls.__name__, name, str(bases), str(dict)))
  9.                    return super(MyType, cls).__init__(name, bases, dict)
  10.  
  11.   MyObject = MyType("MyObject", (), {})
  12.  
  13.   class MyClass(MyObject):
  14.           def __init__(self, s):
  15.                   print(s)
  16.  
  17.   mc = MyClass("parameter")

Вкратце, примерно следующее: мы объясняем Python3, что у нас будет новый тип классов --- MyType.
Создаем аналог object для этого типа объектов. Именно от него мы будем наследовать все наши новые классы.
Унаследуем от него новый класс MyClass.

Вот что этот пример выводит:

  1.   New instance of MyType created with name MyObject, bases () and params {}
  2.   Instance of MyObject with name MyObject and bases () initialized with params {}
  3.   New instance of MyType created with name MyClass, bases (<class '__main__.MyObject'>,) and params 
  4.   {'__init__': <function MyClass.__init__ at 0x100771d08>, '__module__': '__main__', '__qualname__': 'MyClass'}
  5.   Instance of MyClass with name MyClass and bases (<class '__main__.MyObject'>,) initialized with params 
  6.   {'__init__': <function MyClass.__init__ at 0x100771d08>, '__module__': '__main__', '__qualname__': 'MyClass'}
  7.   parameter

Почему так?
Вначале честно вызываются __new__ и __init__ при создании MyObject. Python смотрит вверх по дереву и ищет __new__ и __init__ от MyType и сразу же у него их и находит - выводит первые две строки и создает объект, как и написано в коде.
Далее, при создании MyClass мы создаем новый объект, а потому вызываются метод __new__ и __init__ для того класса, которому он принадлежит - MyObject. И мы получаем вывод 4, 5, 6 и 7 строчек - Python дополняет список параметров и передает их в наши методы __new__ и __init__ объекта MyObject.

Замыкание и декораторы

http://official.contest.yandex.ru/contest/687/
Нужно решить обе приведенные задачи.
Во второй задаче возможны проблемы с правильным ответом.
Если вы по необъяснимым причинам получаете WA, просто попробуйте сдать еще раз.

Графика

Основным руководством для нас будет вот эта вики страничка
http://ru.wikiversity.org/wiki/%CA%F3%F0%F1_%EF%EE_%E1%E8%E1%EB%E8%EE%F2%E5%EA%E5_Tkinter_%FF%E7%FB%EA%E0_Python
Наша основная задача на сегодняшнее занятие - написать графическое-приложение калькулятор.
Нужно это, чтобы познакомиться с графической библиотекой tkinter и основными ее методами.

Важно отметить, что в зависимости от версии Python на вашем ноутбуке, вам нужно писать Tkinter вместо tkinter в названии модуля.
Если пример не работает и python3 ругается на отсутствие библиотеки, просто измените регистр первой буквы в названии модуля, все должно заработать.

Начнем мы с самого простого приложения "Hello, world!":

  1.   from tkinter import *
  2.  
  3.   tk = Tk()
  4.  
  5.   entry = Entry(tk)
  6.   entry.pack()
  7.   entry.insert(0, "Hello, world!")
  8.  
  9.   tk.mainloop()

Здесь в 3ей строке создается новое приложение, в 5ой - новое текстовое поле, в 6ой строке оно укладывается в окно, в 7ой изменяется его содержимое, а в 9ой мы запускаем цикл обработки событий окна.
Entry - это виджет библиотеки tkinter, который позволяет отображать одну строку текста.

Теперь давайте попробуем сделать кнопку в нашем приложении:

 1 from tkinter import *
 2 
 3 tk = Tk()
 4 
 5 button = Button(tk, text="Hello, world!")
 6 button.pack()
 7 
 8 tk.mainloop()

Но пока эта кнопка ничего не делает. Давайте сделаем так, чтобы при нажатии на кнопку в консоль писалось бы "Hello, world!". Для этого мы должны передать в конструктор кнопки функцию, которая будет вызвана при нажатии:

 5 def hello():
 6         print("Hello!")
 7 
 8 button = Button(tk, text="Hello, world!", command=hello)

В конструкторе кнопки добавился аргумент command, который указывает Pythonу, какая функция будет реагировать на нажатие кнопки.

Теперь давайте поговорим о том, как размещаются элементы на экране.
Pack - это очень простой упаковщик. Он может поместить виджет только в одно из крайних положений "top", "bottom", "left", "right". Делается это так:

 1 from tkinter import *
 2 
 3 tk = Tk()
 4 
 5 b1 = Button(tk, text="Left")
 6 b1.pack(side="left")
 7 
 8 b2 = Button(tk, text="Right")
 9 b2.pack(side="right")
10 
11 tk.mainloop()

Это дает возможность размещать элементы в определенном порядке, но особой свободы не дает.

Перейдем к упаковщику grid, который позволяет разбить окно на ячейки таблицы и размещать элементы в них. Простой пример:

 1 from tkinter import *
 2 
 3 tk = Tk()
 4 
 5 b1 = Button(tk, text="Left top")
 6 b1.grid(row=0, column=0)
 7 
 8 b2 = Button(tk, text="Right bottom")
 9 b2.grid(row=1, column=1)
10 
11 tk.mainloop()

Это уже значительно более общий метод.

Теперь вы знаете все необходимое для того, чтобы составить из кнопок простой калькулятор и добавить текстовое поле для вывода результата.
Попробуйте, используя все ваши знания про Python, написать теперь простой калькулятор.

Удачи!

Первое домашнее задание

Контест с задачами:
http://official.contest.yandex.ru/contest/689/
Распределение задач осуществляется по простому правилу:

  • всего есть пять типов задач;
  • из каждого типа задач надо решить ровно одну задачу;
  • номер задачи в группе определяется по какой-то букве:
1 2 3 4
АДЗЛПУЧЫЯ БЕИМРФШЬ ВЁЙНСХЩЭ ГЖКОТЦЪЮ
  • для первых трех групп задач эти буквы - это первые три буквы вашего полного имени;
  • для последних двух групп задач эти буквы - это первые две буквы вашей фамилии.

Таким образом я, Павел Мельничук, должен был бы решить задачи A1 (П), B1 (А), C3 (В), D2 (М) и E2 (Е).

Параллельные вычисления

Контеста в этот раз нет, поскольку Яндекс.Контест не поддерживает многопроцессорные приложения.
Так что наша задача - научиться выполнять параллельные вычисления и решить с их помощью несколько задач, не сдавая их в тестирующую систему.

  1. Ускорьте выполнение задачи про сумму k-ых степеней. Вход программы - числа k и n. Вывод - сумма k-ых степеней чисел от 0 до n - 1. Какой максимальный коэффициент ускорения вы смогли получить? Почему он именно такой?
  2. Посчитайте скалярное произведение двух векторов размерности n. Чтобы не тратиться время на их ввод из файла, генерируйте их в программе по какой-нибудь простой формуле. Например, a_i = 1 / i.
  3. Реализуйте обе предыдущие задачи, не компонуя ответ по результаты выполнения всех задач, а заполняя ответ из ветвей, используя локи.

Введение в С++

Ссылка на контест:
http://official.contest.yandex.ru/contest/719/
Задачки очень простые, поэтому решаем все, чтобы набить руку.

Также предлагается следующая задача на подумать: дан массив из N элементов и число K. Нужно найти K минимальных чисел. С каким асимптотическим потреблением памяти и времени вы умеете решать эту задачу?

Для тех, кто участвовал в четверть-финале прошлого года: дан массив из N элементов и числа L и R. Нужно найти число подотрезков этого массива, сумма которых лежит в отрезке от L до R.

Функции в C++

Ссылка на контест:
http://official.contest.yandex.ru/contest/735/
Задачки простые, подумать надо (или не надо) только над последней, поэтому решаем все задачки подряд.

Классы в C++

Ссылка на контест:
http://official.contest.yandex.ru/contest/746/
Вы эти задачи уже решали, так что проблем с семантикой быть не должно. Важно правильно реализовать все необходимые структуры, методы и операторы.

Шаблонные функции и классы в C++

Ссылка на контест:
http://official.contest.yandex.ru/contest/784/
Задачки простые, решаются и без шаблонов, но наша задача - потренироваться в их написании.

Второе домашнее задание

Контест с задачами:
http://official.contest.yandex.ru/contest/763/
Распределение задач такое же, как и в первой домашней работе.

Наследование и интерфейсы в C++

Контест с задачами:
http://official.contest.yandex.ru/contest/797/
Первую задачу надо решить. Вторую - если хватит сил и времени.

Контрольная №1

Контест:
http://official.contest.yandex.ru/contest/828/

Итераторы в C++

Контест с задачами:
http://official.contest.yandex.ru/contest/806/

StyleGuide

Ссылка на Google StyleGuide, на примере которого мы разбираем общие правила написания кода
http://google-styleguide.googlecode.com/svn/trunk/cppguide.html

Домашние работы 3 и 4

Ссылка на контест:
http://official.contest.yandex.ru/contest/946/
Распределение задач старое, как на первых двух домашках.

OpenGL и физика

Ссылка на пример кода:
http://pastebin.com/JeuXPV9Z
Компилировать его надо строкой
g++ main.cpp -lGL -lGLU -lglut -std=c++0x
Задача на семинар - попытаться сымитировать физику двух атомов.
Они должны притягиваться, если отлетели далеко друг от друга, и отталкиваться, если приблизились слишком сильно.
Если это получится, попробуйте построить из них кристаллическую решетку.
Если решетка не развалится сама, попробуйте задать начальные скорости нескольким атомам и посмотреть, что будет :)

Сетевые приложения

Ссылка на код сервера:
http://pastebin.com/fzF8yR6W
Сслыка на архив с сервером астероидов:
https://yadi.sk/d/4JCWLAIZdQQXs
Старая ссылка на архив с клиентом:
https://yadi.sk/d/CtPlQDGRdVnxZ

Пробный экзамен

На странице основы и методологии программирования есть ссылки на пробный экзамен и его решения.

Оценки

На данный момент результаты такие:

Фамилия Имя Отчество ДЗ-1 ДЗ-2 КР ДЗ-3 ДЗ-4 Accum Exam Sum
1 Гущенко-Чеверда Иван Ильич 10 10 10 10 9 9,8 9 9,6
2 Деркач Денис Анатольевич 10 10 10 10 8 9,6 9 9,45
3 Исхаков Тимур Рашидович 10 10 10 10 10 10 10 10
4 Кузнецов Георгий Алексеевич 6 8 10 5 7 7,2 9 7,65
5 Мельниченко Пётр Валерьевич 10 4 10 0 0 4,8 10 6,1
6 Носков Степан Алексеевич 10 8 10 5 5 7,6 10 8,2
7 Пособин Глеб Игоревич 10 10 10 10 10 10 10 10
8 Пролеев Лев Николаевич 10 10 10 10 5 9 9 9
9 Рябушев Антон Федорович 10 10 10 10 9 9,8 9 9,6
10 Сайранов Айдар Дамирович 10 8 10 10 5 8,6 10 8,95
11 Святокум Полина Олеговна 8 10 10 10 5 8,6 10 8,95
12 Султанов Арсен Русланович 10 10 10 0 0 6 10 7
13 Трофимов Иван Андреевич 2 8 10 10 8 7,6 10 8,2