<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FWst%C4%99p_do_programowania_obiektowego%2FZadania</id>
	<title>TI/Wstęp do programowania obiektowego/Zadania - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FWst%C4%99p_do_programowania_obiektowego%2FZadania"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Wst%C4%99p_do_programowania_obiektowego/Zadania&amp;action=history"/>
	<updated>2026-04-26T02:24:55Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Wst%C4%99p_do_programowania_obiektowego/Zadania&amp;diff=1814&amp;oldid=prev</id>
		<title>Jarekz: /* Sprawdzanie pokrycia kodu przez testy */</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Wst%C4%99p_do_programowania_obiektowego/Zadania&amp;diff=1814&amp;oldid=prev"/>
		<updated>2015-05-23T10:34:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Sprawdzanie pokrycia kodu przez testy&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Wersja z 10:34, 23 maj 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l327&quot; &gt;Linia 327:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 327:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    1. # -*- coding: utf-8 -*-&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    1. # -*- coding: utf-8 -*-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    {{color|green|2. class Wektor(object):&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    {{color|green|2. class Wektor(object):&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    3.     &amp;quot;&amp;quot;&amp;quot;Dwuwymiarowy wektor.&amp;quot;&amp;quot;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    3.     &amp;quot;&amp;quot;&amp;quot;Dwuwymiarowy wektor.&amp;quot;&amp;quot;&amp;quot;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    4.  &lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    4.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    {{color|green|5.     _ile_nas &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; 0&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    {{color|green|5.     _ile_nas &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; 0&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    6.  &lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    6.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    {{color|green|7.     def __init__(self, a, b):&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    {{color|green|7.     def __init__(self, a, b):&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    8.         self.a &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; a&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    8.         self.a &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; a&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    9.         self.b &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; b&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    9.         self.b &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; b&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   10.         Wektor._ile_nas &amp;lt;nowiki&amp;gt;+=&amp;lt;/nowiki&amp;gt; 1&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   10.         Wektor._ile_nas &amp;lt;nowiki&amp;gt;+=&amp;lt;/nowiki&amp;gt; 1&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   11.  &lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   11.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   {{color|green|12.     def dlugosc(self):&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   {{color|green|12.     def dlugosc(self):&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   13.         &amp;quot;&amp;quot;&amp;quot;Zwraca liczbę, długość Wektora.&amp;quot;&amp;quot;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   13.         &amp;quot;&amp;quot;&amp;quot;Zwraca liczbę, długość Wektora.&amp;quot;&amp;quot;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   {{color|red|14.         return (self.a**2 + self.b**2)**0.5&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   {{color|red|14.         return (self.a**2 + self.b**2)**0.5&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   # ...&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   # ...&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   # reszta pominięta&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   # reszta pominięta&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l355&quot; &gt;Linia 355:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 355:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* operator dodawania zdefiniowany tak, aby obiekt powstały w wyniku dodawania dwóch kwadratów miał pole równe sumie pól kwadratów składowych&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* operator dodawania zdefiniowany tak, aby obiekt powstały w wyniku dodawania dwóch kwadratów miał pole równe sumie pól kwadratów składowych&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Następnie napisz program testujący tęże klasę.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Następnie napisz program testujący tęże klasę.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Dodatki ===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Dodatki ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Wst%C4%99p_do_programowania_obiektowego/Zadania&amp;diff=1812&amp;oldid=prev</id>
		<title>Jarekz: /* Testowanie (na przykładzie klasy Wektor) */</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Wst%C4%99p_do_programowania_obiektowego/Zadania&amp;diff=1812&amp;oldid=prev"/>
		<updated>2015-05-23T10:32:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Testowanie (na przykładzie klasy Wektor)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Wersja z 10:32, 23 maj 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l187&quot; &gt;Linia 187:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 187:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;gt;       assert w1 + w2 == Wektor(4, 6)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;gt;       assert w1 + w2 == Wektor(4, 6)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  {{color|red|E       assert (&amp;lt;Wektor(1, 2) @140050567247696&amp;gt; + &amp;lt;Wektor(3, 4) @140050567248016&amp;gt;) &amp;lt;nowiki&amp;gt;==&amp;lt;/nowiki&amp;gt; &amp;lt;Wektor(4, 6) @140050567291216&amp;gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  {{color|red|E       assert (&amp;lt;Wektor(1, 2) @140050567247696&amp;gt; + &amp;lt;Wektor(3, 4) @140050567248016&amp;gt;) &amp;lt;nowiki&amp;gt;==&amp;lt;/nowiki&amp;gt; &amp;lt;Wektor(4, 6) @140050567291216&amp;gt;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  {{color|red|E        +  where &amp;lt;Wektor(4, 6) @140050567291216&amp;gt; &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Wektor(4, 6)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  {{color|red|E        +  where &amp;lt;Wektor(4, 6) @140050567291216&amp;gt; &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Wektor(4, 6)&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  wektor.py:73: AssertionError&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;}}&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  wektor.py:73: AssertionError&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  ===================== 1 failed, 2 passed in 0.06 seconds ======================&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  ===================== 1 failed, 2 passed in 0.06 seconds ======================&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Nie działa! Dlaczego?&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Nie działa! Dlaczego?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l360&quot; &gt;Linia 360:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 360:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[/wektor.py|końcowa wersja kodu]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[/wektor.py|końcowa wersja kodu]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [http://escher.fuw.edu.pl/~zbyszek/wektor_figleaf pełen wynik działania figleaf] poza tym wiki&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [http://escher.fuw.edu.pl/~zbyszek/wektor_figleaf pełen wynik działania figleaf] poza tym wiki&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Wczytywanie pliku raz jeszcze==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Wczytywanie pliku raz jeszcze==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Wst%C4%99p_do_programowania_obiektowego/Zadania&amp;diff=1810&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot; ==Boxcar== ===Model urządzenia pomiarowego===  &lt;figure id=&quot;uid1&quot; /&gt;  Modelujemy urządzenie typu ''boxcar'': układ pomiarowy dostarcza...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Wst%C4%99p_do_programowania_obiektowego/Zadania&amp;diff=1810&amp;oldid=prev"/>
		<updated>2015-05-23T10:30:03Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot; ==Boxcar== ===Model urządzenia pomiarowego===  &lt;a href=&quot;/edu/index.php/Plik:Boxcar.jpg&quot; title=&quot;Plik:Boxcar.jpg&quot;&gt;thumb|350px|&amp;lt;figure id=&amp;quot;uid1&amp;quot; /&amp;gt;&lt;/a&gt;  Modelujemy urządzenie typu &amp;#039;&amp;#039;boxcar&amp;#039;&amp;#039;: układ pomiarowy dostarcza...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
==Boxcar==&lt;br /&gt;
===Model urządzenia pomiarowego===&lt;br /&gt;
&lt;br /&gt;
[[Plik:boxcar.jpg|thumb|350px|&amp;lt;figure id=&amp;quot;uid1&amp;quot; /&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Modelujemy urządzenie typu ''boxcar'': układ pomiarowy dostarcza&lt;br /&gt;
próbki (liczby zmienno-przecinkowe) sekwencyjnie, a ''boxcar''&lt;br /&gt;
w każdym momencie przechowuje ostatnie &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; z nich i na żądanie zwraca&lt;br /&gt;
średnią i odchylenie standardowe.&lt;br /&gt;
&lt;br /&gt;
Jeśli pomiar dopiero się zaczął i próbek jest mniej niż &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, obliczenia&lt;br /&gt;
są wykonywane na mniejszej liczbie próbek.&lt;br /&gt;
&lt;br /&gt;
Nasz kod napiszemy w postaci klasy.&lt;br /&gt;
&lt;br /&gt;
====Etap 1: Przechowywanie danych====&lt;br /&gt;
&lt;br /&gt;
Poszczególne próbki będziemy przechowywać w strukturze danych, która pozwala na&lt;br /&gt;
dodanie nowego elementu na początek sekwencji i usunięcie starego elementu z końca sekwencji.&lt;br /&gt;
&lt;br /&gt;
W Pythonie jest już struktura, która zapewnia takie możliwości &amp;amp;mdash; zwykła lista (&amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;, klasa &amp;lt;tt&amp;gt;list&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Zapamiętanie nowej próbki realizujemy jej na początek sekwencji próbek. Po dodaniu nowego elementu&lt;br /&gt;
sprawdzamy, czy nie mamy zbyt dużo próbek. Jeśli jest ich więcej niż &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, to usuwamy najstarszy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
class Boxcar(object):&lt;br /&gt;
    def __init__(self, N):&lt;br /&gt;
         self.dane = []&lt;br /&gt;
         self.N = N&lt;br /&gt;
&lt;br /&gt;
    def nowy_pomiar(self, pomiar):&lt;br /&gt;
         self.dane.insert(0, pomiar)&lt;br /&gt;
         if len(self.dane) &amp;gt; self.N:&lt;br /&gt;
              self.dane.pop()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Konstruując naszą klasę w ten sposób zrealizowaliśmy jeden z postulatów programowania obiektowego:&lt;br /&gt;
nasze dane nie są bezpośrednio widoczne dla użytkowników naszej klasy &amp;lt;tt&amp;gt;Boxcar&amp;lt;/tt&amp;gt;. Również&lt;br /&gt;
za to w jaki sposób dane są przechowywane, za inicjalizację odpowiednich struktur odpowiada wyłącznie&lt;br /&gt;
klasa &amp;lt;tt&amp;gt;Boxcar&amp;lt;/tt&amp;gt;. Użytkownik klasy jedynie tworzy obiekt &amp;lt;tt&amp;gt;Boxcar&amp;lt;/tt&amp;gt; i wywołuje&lt;br /&gt;
na nim metodę &amp;lt;code&amp;gt;nowy_pomiar&amp;lt;/code&amp;gt;. To właśnie enkapsulacja i rozdzielenie obowiązków.&lt;br /&gt;
&lt;br /&gt;
====Etap 2: Obliczenia====&lt;br /&gt;
Do implementacji klasy Boxcar dodajmy metodę &amp;lt;tt&amp;gt;srednia&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def srednia(self):&lt;br /&gt;
        suma = sum(self.dane)&lt;br /&gt;
        liczba = len(self.dane)&lt;br /&gt;
        return suma/liczba&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zadanie 1====&lt;br /&gt;
Dodaj do klasy metodę &amp;lt;tt&amp;gt;dyspersja&amp;lt;/tt&amp;gt;, która zwróci odchylenie &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; pamiętanych próbek od średniej.&lt;br /&gt;
&lt;br /&gt;
Przypomnienie:&lt;br /&gt;
:&amp;lt;math&amp;gt;\sigma = \sqrt{\sum_1^N \frac{\left(x-\bar x\right)^2}{N(N-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
:gdzie średnia&lt;br /&gt;
:&amp;lt;math&amp;gt;\bar x = \sum_1^N \frac{x}{N}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Zadanie 2==== &lt;br /&gt;
Zaprojektuj tekstową reprezentację obiektu.&lt;br /&gt;
Dodaj do klasy metodę &amp;lt;tt&amp;gt;__str__&amp;lt;/tt&amp;gt;, która wypisze tekstową reprezentację obiektu klasy.&lt;br /&gt;
&lt;br /&gt;
====Zadanie 3==== &lt;br /&gt;
Sprawdź swoją implementację boxcara, wypełniając go liczbami losowymi z rozkładu płaskiego.&lt;br /&gt;
&lt;br /&gt;
===Etap 3: Wykorzystanie enkapsulacji===&lt;br /&gt;
&lt;br /&gt;
Lista nie jest idealną strukturą danych do przechowania pomiarów ponieważ operacja wstawienia&lt;br /&gt;
lub usunięcia elementu na początek listy jest operacją niewydajną.&lt;br /&gt;
&lt;br /&gt;
Poszczególne próbki powinniśmy przechowywać w strukturze danych, która pozwala na szybkie&lt;br /&gt;
dodanie nowego elementu na początek sekwencji i usunięcie starego elementu z końca sekwencji.&lt;br /&gt;
&lt;br /&gt;
W standardowej bibliotece Pythona jest już dostępna właśnie taka struktura: &amp;lt;tt&amp;gt;collections.deque&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Przykład użycia klasy &amp;lt;code&amp;gt;deque&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import collections&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; q = collections.deque()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; q.appendleft(1)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; q.appendleft(2)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; q.appendleft(3)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; q&lt;br /&gt;
deque([3, 2, 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zmodyfikujmy implementację klasy &amp;lt;tt&amp;gt;Boxcar&amp;lt;/tt&amp;gt; tak, by wykorzystać &amp;lt;tt&amp;gt;deque&amp;lt;/tt&amp;gt; zamiast &amp;lt;tt&amp;gt;list&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Interfejs klasy ani jej zachowanie nie mają prawa się zmienić!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
class Boxcar(object):&lt;br /&gt;
    def __init__(self, N):&lt;br /&gt;
         self.dane = collections.deque()&lt;br /&gt;
         self.N = N&lt;br /&gt;
&lt;br /&gt;
    def nowy_pomiar(self, pomiar):&lt;br /&gt;
         self.dane.appendleft(pomiar)&lt;br /&gt;
         if len(self.dane) &amp;gt; self.N:&lt;br /&gt;
              self.dane.pop()&lt;br /&gt;
&lt;br /&gt;
    # reszta klasy pozostaje bez zmian!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Istnieją dwa podstawowe sposoby wykorzystania kodu jednej klasy przy tworzeniu drugiej — dziedziczenie i kompozycja.&lt;br /&gt;
W tym wypadku do konstrukcji klasy &amp;lt;tt&amp;gt;boxcar&amp;lt;/tt&amp;gt; wykorzystaliśmy klasę &amp;lt;tt&amp;gt;list&amp;lt;/tt&amp;gt; a potem &amp;lt;tt&amp;gt;deque&amp;lt;/tt&amp;gt;.  Zrobiliśmy to poprzez kompozycję: dane są przechowywane w zmiennej &amp;lt;tt&amp;gt;self.dane&amp;lt;/tt&amp;gt;, natomiast klasa &amp;lt;tt&amp;gt;boxcar&amp;lt;/tt&amp;gt; wywołuje metody na tym obiekcie w miarę potrzeby. Alternatywą byłoby zastosowanie dziedziczenia — klasa &amp;lt;tt&amp;gt;boxcar&amp;lt;/tt&amp;gt; dziedziczyłaby po &amp;lt;tt&amp;gt;list&amp;lt;/tt&amp;gt; czy &amp;lt;tt&amp;gt;deque&amp;lt;/tt&amp;gt;. Te dwa rozwiązania możemy podsumować tak:&lt;br /&gt;
albo &amp;lt;tt&amp;gt;boxcar&amp;lt;/tt&amp;gt; '''ma''' kolejkę danych, albo &amp;lt;tt&amp;gt;boxcar&amp;lt;/tt&amp;gt; '''jest''' kolejką danych.&lt;br /&gt;
Dziedziczenie ma tę wadę, że nasza nowa klasa ma zupełnie niepotrzebne metody, np. &amp;lt;tt&amp;gt;reverse&amp;lt;/tt&amp;gt;, odziedzione po klasie macierzystej. O ile funkcjonalność jest podobna przy jednym i drugim rozwiązaniu, to kompozycja jest tutaj rozwiązaniem znacznie bardziej eleganckim. &lt;br /&gt;
Jest to zgodne z ogólną zasadą dobrego programowania obiektowego, że '''kompozycja jest lepsza niż dziedziczenie'''.&lt;br /&gt;
===Etap 4:tworzenie obiektu typu Boxcar, korzystając z iterowalnego kontenera z danymi===&lt;br /&gt;
Dokumentacja do obiektu &amp;lt;tt&amp;gt;collections.deque&amp;lt;/tt&amp;gt; pokazuje, że tego typu obiekty można inicjalizować, korzystając z obiektów, które są iterowalne (np. listy). Zmiana konstruktora klasy Boxcar tak, żeby można było wykorzystać tę własność &amp;lt;tt&amp;gt;deque&amp;lt;/tt&amp;gt; byłaby bardzo wygodna, bo umożliwiałaby tworzenie obiektów typu Boxcar w oparciu o istniejące już kontenery z danymi.&lt;br /&gt;
&lt;br /&gt;
====Zadanie 4====&lt;br /&gt;
Zmień konstruktor klasy Boxcar, tak by umożliwiał opcjonalne tworzenie obiektu w oparciu o istniejący już kontener z danymi. Uwzględnij sytuację, w której kontener ten zawiera więcej pomiarów niż założona długość bufora. Postaraj się zmienić kontruktor tak, by był jak najbardziej odporny na próby podania nieodpowiednich danych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testowanie (na przykładzie klasy Wektor)==&lt;br /&gt;
&lt;br /&gt;
Mamy klasę &amp;lt;tt&amp;gt;Wektor&amp;lt;/tt&amp;gt;. Jak wygodnie sprawdzić czy działa poprawnie? Odpowiedź: [http://codespeak.net/py/dist/test/ py.test].&lt;br /&gt;
&lt;br /&gt;
Ponieważ nasz moduł definiujący &amp;lt;tt&amp;gt;Wektor&amp;lt;/tt&amp;gt; jest króciusieńki, funkcje testujące możemy dodać do tego samego modułu. W&amp;amp;nbsp;przypadku dużych programów tworzy się nawet osobny podkatalog (często &amp;lt;tt&amp;gt;tests/&amp;lt;/tt&amp;gt;), tutaj nie warto.&lt;br /&gt;
Dopisuję więc fukcje sprawdzające mnożenie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = pycon&amp;gt;&lt;br /&gt;
# ...&lt;br /&gt;
# definicja klasy Wektor&lt;br /&gt;
# ...&lt;br /&gt;
def test_mul():&lt;br /&gt;
    w1 = Wektor(1, 2)&lt;br /&gt;
    w2 = Wektor(3, 4)&lt;br /&gt;
    assert w1 * w2 == 11&lt;br /&gt;
&lt;br /&gt;
def test_mul_with_zeros():&lt;br /&gt;
    w1 = Wektor(0, 2)&lt;br /&gt;
    w2 = Wektor(3, 0)&lt;br /&gt;
    assert w1 * w2 == 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby sprawdzić nasz kod, używamy polecenia &amp;lt;tt&amp;gt;py.test&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 {{color|teal|$ '''py.test wektor.py -v’’’}}&lt;br /&gt;
 ============================= test session starts =============================&lt;br /&gt;
 python: platform linux2 -- Python 2.6.4 -- pytest-1.1.1 -- /usr/bin/python&lt;br /&gt;
 test object 1: .../wektor/wektor.py&lt;br /&gt;
 &lt;br /&gt;
 wektor.py:60: test_mul {{color|green|PASS}}&lt;br /&gt;
 wektor.py:65: test_mul_zeros {{color|green|PASS}}&lt;br /&gt;
 &lt;br /&gt;
 ========================== 2 passed in 0.01 seconds ===========================&lt;br /&gt;
Działa!&lt;br /&gt;
&lt;br /&gt;
Teraz dodajmy funkcję testującą dodawanie:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# ...&lt;br /&gt;
# definicja klasy Wektor&lt;br /&gt;
# ...&lt;br /&gt;
# testy mnożenia&lt;br /&gt;
# ...&lt;br /&gt;
def test_add():&lt;br /&gt;
    w1 = Wektor(1, 2)&lt;br /&gt;
    w2 = Wektor(3, 4)&lt;br /&gt;
    assert w1 + w2 == Wektor(4, 6)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ponownie odpalmy &amp;lt;tt&amp;gt;py.test&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 {{color|teal|$ '''py.test wektor.py -v’’’}}&lt;br /&gt;
 ============================= test session starts =============================&lt;br /&gt;
 python: platform linux2 -- Python 2.6.4 -- pytest-1.1.1 -- /usr/bin/python&lt;br /&gt;
 test object 1: .../wektor/wektor.py&lt;br /&gt;
 &lt;br /&gt;
 wektor.py:60: test_mul {{color|green|PASS}}&lt;br /&gt;
 wektor.py:65: test_mul_zeros {{color|green|PASS}}&lt;br /&gt;
 wektor.py:70: test_add {{color|red|FAIL}}&lt;br /&gt;
 &lt;br /&gt;
 ================================== FAILURES ===================================&lt;br /&gt;
 __________________________________ test_add ___________________________________&lt;br /&gt;
 &lt;br /&gt;
     def test_add():&lt;br /&gt;
         w1 = Wektor(1, 2)&lt;br /&gt;
         w2 = Wektor(3, 4)&lt;br /&gt;
 &amp;gt;       assert w1 + w2 == Wektor(4, 6)&lt;br /&gt;
 {{color|red|E       assert (&amp;lt;Wektor(1, 2) @140050567247696&amp;gt; + &amp;lt;Wektor(3, 4) @140050567248016&amp;gt;) &amp;lt;nowiki&amp;gt;==&amp;lt;/nowiki&amp;gt; &amp;lt;Wektor(4, 6) @140050567291216&amp;gt;}}&lt;br /&gt;
 {{color|red|E        +  where &amp;lt;Wektor(4, 6) @140050567291216&amp;gt; &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Wektor(4, 6)&lt;br /&gt;
 &lt;br /&gt;
 wektor.py:73: AssertionError}}&lt;br /&gt;
 ===================== 1 failed, 2 passed in 0.06 seconds ======================&lt;br /&gt;
Nie działa! Dlaczego?&lt;br /&gt;
&lt;br /&gt;
Oczywiście w wyrażeniu &amp;lt;tt&amp;gt;w1 + w2 == Wektor(4, 6)&amp;lt;/tt&amp;gt; wykorzystujemy nie tylko operator &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;,&lt;br /&gt;
ale również operator &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt;, który [http://docs.python.org/reference/datamodel.html#object.__eq__ wywołuje]&lt;br /&gt;
metodę &amp;lt;tt&amp;gt;__eq__&amp;lt;/tt&amp;gt; obiektu z lewej strony. Ponieważ klasa &amp;lt;tt&amp;gt;Wektor&amp;lt;/tt&amp;gt; nie zawiera definicji &amp;lt;tt&amp;gt;__eq__&amp;lt;/tt&amp;gt;,&lt;br /&gt;
to zostaje wywołana domyślna wersja tej metody. Domyślna wersja nie wie nic o&amp;amp;nbsp;współrzędnych wektora&lt;br /&gt;
i&amp;amp;nbsp;po prostu wykonuje porównanie tożsamości obiektów (z grubsza &amp;lt;tt&amp;gt;is&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Aby test &amp;lt;tt&amp;gt;test_add&amp;lt;/tt&amp;gt; przeszedł, mamy dwie możliwości. Możemy zmienić funkcję testującą tak, żeby&lt;br /&gt;
po prostu samemu sprawdzała równość współrzędnych:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# ...&lt;br /&gt;
# definicja klasy Wektor&lt;br /&gt;
# ...&lt;br /&gt;
# testy mnożenia&lt;br /&gt;
# ...&lt;br /&gt;
def test_add():&lt;br /&gt;
       w1 = Wektor(1, 2)&lt;br /&gt;
       w2 = Wektor(3, 4)       &lt;br /&gt;
       wynik = w1 + w2&lt;br /&gt;
       assert wynik.a == 4 and wynik.b == 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Niestety nie jest to rozwiązanie zbyt eleganckie, w szczególności musimy wiedzieć ile jest współrzędnych oraz jak się nazywają.&lt;br /&gt;
&lt;br /&gt;
Drugą opcją jest dodanie implementacji porównywania wektorów do klasy &amp;lt;tt&amp;gt;Wektor&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Oczywiście ma to sens tylko wtedy, gdy uważamy, że chcemy mieć porównywanie obiektów niezależnie od testów. &lt;br /&gt;
Nie należy dodawać funkcjonalności do klasy tylko po to by ułatwić pisanie testów.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# ...&lt;br /&gt;
# definicja klasy Wektor&lt;br /&gt;
# ...&lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        return self.a == other.a and self.b == other.b&lt;br /&gt;
#&lt;br /&gt;
# testy mnożenia&lt;br /&gt;
#&lt;br /&gt;
def test_add():&lt;br /&gt;
    w1 = Wektor(1, 2)&lt;br /&gt;
    w2 = Wektor(3, 4)&lt;br /&gt;
    assert w1 + w2 == Wektor(4, 6)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ponowne uruchomienie &amp;lt;tt&amp;gt;py.test&amp;lt;/tt&amp;gt; skutkuje poprawnym wykonaniem trzech testów.&lt;br /&gt;
&lt;br /&gt;
=== Wykonywalne przykłady w dokumentacji ===&lt;br /&gt;
''Docstringi'' w &amp;lt;tt&amp;gt;Wektor&amp;lt;/tt&amp;gt; są nieco zbyt zwięzłe. Bardzo wygodne dla użytkownika są proste&lt;br /&gt;
wykonywalne przykłady, które można przekleić do interpretera i&amp;amp;nbsp;trochę poeksperymentować.&lt;br /&gt;
Zapisuje się je w&amp;amp;nbsp;''docstringu''. Znaczki &amp;gt;&amp;gt;&amp;gt; poprzedzają fragmenty do wykonania, a&amp;amp;nbsp;wyniki&lt;br /&gt;
wypisywane przez Pythona się po prostu poprzedza spacjami.&lt;br /&gt;
Łatwo się domyślić, że tak jest dlatego, że można po prostu przekleić wykonywane przykłady&lt;br /&gt;
z&amp;amp;nbsp;interaktywnej sesji, nie trzeba niczego wymyślać.&lt;br /&gt;
&lt;br /&gt;
Spróbujmy:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
class Wektor(object):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Dwuwymiarowy wektor.&lt;br /&gt;
&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; print Wektor(3, 5)&lt;br /&gt;
    (3, 5)&lt;br /&gt;
&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; print Wektor(3, 5) + Wektor(-1, -1)&lt;br /&gt;
    (2, 4)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # ...&lt;br /&gt;
    # reszta definicji klasy&lt;br /&gt;
    #&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Teraz osoba pisząca &amp;lt;tt&amp;gt;help(Wektor)&amp;lt;/tt&amp;gt; od razu zorientuje się jak można użyć tej klasy.&lt;br /&gt;
Polecenia &amp;lt;tt&amp;gt;print&amp;lt;/tt&amp;gt; użyłem zamiast po prostu wykonania wyrażenia tworzącego nowy &amp;lt;tt&amp;gt;Wektor&amp;lt;/tt&amp;gt;&lt;br /&gt;
po to, by uniknąć nieistotnych szczegółów, np. wypisywania adresu przez &amp;lt;tt&amp;gt;Wektor.__repr__&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Testowanie z wykorzystaniem docstringów ===&lt;br /&gt;
Jeśli ktoś postanawia skorzystać z wykonywalnych poleceń zapisanych w docstringach,&lt;br /&gt;
a&amp;amp;nbsp;nie działają one tak jak należy, zazwyczaj nie jest szczęśliwy. Dlatego&lt;br /&gt;
należy sprawdzać, czy zapisane przykłady zachowują się nadal tak, jak zachowywały się kiedy&lt;br /&gt;
osoba pisząca dokumentację wkleiła je do niej.&lt;br /&gt;
&lt;br /&gt;
Służy do tego moduł &amp;lt;tt&amp;gt;doctest&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;source lang = pycon&amp;gt;&lt;br /&gt;
$ python -m doctest -v wektor.py&lt;br /&gt;
Trying:&lt;br /&gt;
    print Wektor(3, 5)&lt;br /&gt;
Expecting:&lt;br /&gt;
    (3, 5)&lt;br /&gt;
ok&lt;br /&gt;
Trying:&lt;br /&gt;
    print Wektor(3, 5) + Wektor(-1, -1)&lt;br /&gt;
Expecting:&lt;br /&gt;
    (2, 4)&lt;br /&gt;
ok&lt;br /&gt;
15 items had no tests:&lt;br /&gt;
   # ...&lt;br /&gt;
   # lista funkcji bez testów pominięta&lt;br /&gt;
   # ...&lt;br /&gt;
1 items passed all tests:&lt;br /&gt;
   2 tests in wektor.Wektor&lt;br /&gt;
2 tests in 16 items.&lt;br /&gt;
2 passed and 0 failed.&lt;br /&gt;
Test passed.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Również &amp;lt;tt&amp;gt;py.test&amp;lt;/tt&amp;gt; pozwala na wykorzystanie wykonywalnych docstringów:&lt;br /&gt;
&amp;lt;source lang = pycon&amp;gt;&lt;br /&gt;
$ python -m doctest -v wektor.py&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Takie wywołanie również skutkuje modułu &amp;lt;tt&amp;gt;doctest&amp;lt;/tt&amp;gt; i&amp;amp;nbsp;daje identyczny efekt.&lt;br /&gt;
&lt;br /&gt;
=== Sprawdzanie pokrycia kodu przez testy ===&lt;br /&gt;
Uważa się, że w dobrze przetestowanym projekcie, liczba linii kodu w fukcjach testujących to 100-200% linii kodu w&amp;amp;nbsp;głównej części.&lt;br /&gt;
Na pewno nie jest łatwo odpowiedzieć na pytanie, czy nasze testy faktycznie sprawdzają wszystko co należy. Niemniej często łatwo jest powiedzieć czego ''nie'' sprawdzają &amp;amp;mdash; jeśli jakaś funkcja czy fragement kodu w&amp;amp;nbsp;trakcie testów nie jest wogóle uruchamiany,&lt;br /&gt;
to znaczy, że z całą pewnością nie jest testowany.&lt;br /&gt;
&lt;br /&gt;
Do sprawdzania pokrycia kodu przez testy w połączeniu z&amp;amp;nbsp;&amp;lt;tt&amp;gt;py.test&amp;lt;/tt&amp;gt; służy wtyczka [http://darcs.idyll.org/~t/projects/figleaf/doc/ figleaf]:&lt;br /&gt;
 {{color|teal|$ '''py.test wektor.py -v'''}}&lt;br /&gt;
 ============================= test session starts =============================&lt;br /&gt;
 python: platform linux2 -- Python 2.6.4 -- pytest-1.1.1 -- /usr/bin/python&lt;br /&gt;
 test object 1: .../wektor/wektor.py&lt;br /&gt;
 &lt;br /&gt;
 wektor.py:60: test_mul {{color|green|PASS}}&lt;br /&gt;
 wektor.py:65: test_mul_zeros {{color|green|PASS}}&lt;br /&gt;
 wektor.py:70: test_add {{color|green|PASS}}&lt;br /&gt;
 ----------------------------------- figleaf -----------------------------------&lt;br /&gt;
 Writing figleaf data to .../wektor/.figleaf&lt;br /&gt;
 Writing figleaf html to file://.../wektor/html&lt;br /&gt;
 &lt;br /&gt;
 ========================== 3 passed in 0.08 seconds ===========================&lt;br /&gt;
Wtyczka &amp;lt;tt&amp;gt;figleaf&amp;lt;/tt&amp;gt; powoduje wygenerowanie plików HTML zawierających kopię kodu&lt;br /&gt;
programu z&amp;amp;nbsp;liniami oznaczonymi kolorami.&lt;br /&gt;
: {{color|green|Zielony oznacza, że linia została wykonana w trakcie testów przynajmniej raz}}&lt;br /&gt;
: {{color|red|Czerwony oznacza, że linia nie była wogóle użyta}}&lt;br /&gt;
: {{color|black|Czarny oznacza, że linia nie zawiera wykonywalnego kodu, a np. komentarz czy ''docstring''.}}&lt;br /&gt;
&lt;br /&gt;
 source file: /home/zbyszek/python/wektor/wektor.py&lt;br /&gt;
 file stats: 33 lines, 24 executed: 72.7% covered &lt;br /&gt;
   1. # -*- coding: utf-8 -*-&lt;br /&gt;
   {{color|green|2. class Wektor(object):&lt;br /&gt;
   3.     &amp;quot;&amp;quot;&amp;quot;Dwuwymiarowy wektor.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
   4. &lt;br /&gt;
   {{color|green|5.     _ile_nas &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; 0&lt;br /&gt;
   6. &lt;br /&gt;
   {{color|green|7.     def __init__(self, a, b):&lt;br /&gt;
   8.         self.a &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; a&lt;br /&gt;
   9.         self.b &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; b&lt;br /&gt;
  10.         Wektor._ile_nas &amp;lt;nowiki&amp;gt;+=&amp;lt;/nowiki&amp;gt; 1&lt;br /&gt;
  11. &lt;br /&gt;
  {{color|green|12.     def dlugosc(self):&lt;br /&gt;
  13.         &amp;quot;&amp;quot;&amp;quot;Zwraca liczbę, długość Wektora.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
  {{color|red|14.         return (self.a**2 + self.b**2)**0.5&lt;br /&gt;
  # ...&lt;br /&gt;
  # reszta pominięta&lt;br /&gt;
  #&lt;br /&gt;
&lt;br /&gt;
Dzięki takiej pomocy możemy łatwo zobaczyć które fragmenty programu wymagają napisania więcej testów.&lt;br /&gt;
W tym przykładzie widać, że metoda &amp;lt;tt&amp;gt;Wektor.dlugosc&amp;lt;/tt&amp;gt; jest takim fragmentem.&lt;br /&gt;
&lt;br /&gt;
====Zadanie 1====&lt;br /&gt;
Dopisać program testujący powyższą klasę.&lt;br /&gt;
====Zadanie 2==== &lt;br /&gt;
Napisz klasę Kwadrat. Obiekty tej klasy powinny:&lt;br /&gt;
* przechowywać długość boku kwadratu&lt;br /&gt;
* posiadać reprezentację napisową&lt;br /&gt;
* posiadać metody zwracające pole i obwód kwadratu&lt;br /&gt;
* operator dodawania zdefiniowany tak, aby obiekt powstały w wyniku dodawania dwóch kwadratów miał pole równe sumie pól kwadratów składowych&lt;br /&gt;
Następnie napisz program testujący tęże klasę.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dodatki ===&lt;br /&gt;
* [[/wektor.py|końcowa wersja kodu]]&lt;br /&gt;
* [http://escher.fuw.edu.pl/~zbyszek/wektor_figleaf pełen wynik działania figleaf] poza tym wiki&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wczytywanie pliku raz jeszcze==&lt;br /&gt;
Czy pamiętasz [[TI/Zadanie_zabawa_z_sygnałem_rzeczywistym|zadanie, w którym należało wczytać pliki i narysować widmo z zadanego kanału]]?&lt;br /&gt;
&lt;br /&gt;
====Zadanie 1==== &lt;br /&gt;
Zaprojektuj własną klasę, która zapewni obsługę pliku binarnego, zawierającego multipleksowany sygnał o zadanej częstości próbkowania, liczbie kanałów, typie liczb. Zastanów się jakie jeszcze mogą być parametry takiego pliku. Zastanów się, jakie są jej niezbędne pola i napisz jej konstruktor i metodę &amp;lt;tt&amp;gt;__str__&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zastanów się, jak najwygodniej będzie leniwemu użytkownikowi korzystać z obiektów zaprojektowanej i zaimplementowanej przez siebie klasy. Zastanów się, czy nie warto jest wczytywać pliku od razu w konstruktorze klasy (przekazywać nazwę pliku, częstość próbkowania i liczbę kanałów, jako argumenty konstruktora klasy.&lt;br /&gt;
&lt;br /&gt;
Zastanów się, jak zaprojektować metodę &amp;lt;tt&amp;gt;__str__&amp;lt;/tt&amp;gt;, żeby nie wypisywała całego sygnału na ekran, ale wyświetlała najważniejsze o nim informacje.&lt;br /&gt;
&lt;br /&gt;
====Zadanie 2====&lt;br /&gt;
Do zaprojektowanej klasy dodaj następujące metody:&lt;br /&gt;
* zwracającą cały sygnał z wybranego kanału (możesz w konstruktorze dodać opisy kanałów, jeżeli dysponujesz opisem pliku i zawrzeć metodę, która zwraca sygnał z elektrody o odpowiedniej nazwie),&lt;br /&gt;
* zwracającą wybrany fragment sygnału z wybranej elektrody (np. sygnał od sekundy &amp;lt;math&amp;gt;t_1&amp;lt;/math&amp;gt; do sekundy &amp;lt;math&amp;gt;t_2&amp;lt;/math&amp;gt;),&lt;br /&gt;
* zwracającą wybrany fragment sygnału z wszystkich elektrod (np. od sekundy &amp;lt;math&amp;gt;t_1&amp;lt;/math&amp;gt; do sekundy &amp;lt;math&amp;gt;t_2&amp;lt;/math&amp;gt;),&lt;br /&gt;
* rysującą widmo wybranego fragmentu sygnału z wybranej elektrody,&lt;br /&gt;
* rysującą widmo fragmentu wszystkich sygnałów z wszystkich elektrod.&lt;br /&gt;
* zwracającą fragmenty sygnału o zadanej długości z wybranej elektrody, zaczynające się od kolejnych triggerów. Załóż, że w kanale z danym triggerem, wystąpienie triggera jest zaznaczone 1 (wartość 0, oznacza brak triggera),&lt;br /&gt;
* przygotuj się na możliwość występowania kanału specjalnego z triggerem (w takiej formie jak na Pracowni Sygnałów Bioelektrycznych). Dodaj metody uśredniające fragmenty sygnału o zadanej długości z wybranej elektrody, zaczynające się od kolejnych triggerów i rysujące ich widmo. Zastanów się jak najlepiej przekazywać informację o tym, że któryś kanał jest kanałem &amp;quot;specjalnym&amp;quot;, np. triggerem. Do przetestowania cięcia danych wg triggera można użyć [http://escher.fuw.edu.pl/~mm/KAMIL/ stąd] (wybrane pliki .raw), lub danych samodzielnie zebranych na pracowni,&lt;br /&gt;
*stwórz klasę, dziedziczącą po powyższej, przedefiniowującą metody do wczytywania danych tak, aby obsługiwać duże pliki. To znaczy nie trzymającą całych danych w pamięci, lecz umiejącą wczytać wskazany fragment danych &amp;amp;mdash; wybrany kawałek, od sekundy ''t''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, do ''t''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;, z kanałów podanych w liście kanalów. We wczytywaniu pliku nie korzystaj z metody &amp;lt;tt&amp;gt;fromfile&amp;lt;/tt&amp;gt;. Otwórz plik metodą &amp;lt;tt&amp;gt;open&amp;lt;/tt&amp;gt;, następnie wylicz do którego miejsca w pliku masz przejść używając metody &amp;lt;tt&amp;gt;seek&amp;lt;/tt&amp;gt; obiektu typu plik (podaj o ile bajtów ma się przesunąć) i wczytaj kolejne próbki metodą &amp;lt;tt&amp;gt;read&amp;lt;/tt&amp;gt;. Argumentem metody &amp;lt;tt&amp;gt;read&amp;lt;/tt&amp;gt; jest liczba bajtów do wczytania, upewnij się więc, czy pamiętasz, że liczby typu double zajmują 8 bajtów. Tak wczytane próbki musisz jeszcze zamienić ze stringów na liczby typu double (pamiętając o porządku zapisu bajtów), korzystając np. z funkcji &amp;lt;tt&amp;gt;unpack&amp;lt;/tt&amp;gt; modułu &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Zadanie 3====&lt;br /&gt;
Spróbuj przeciążyć metodę &amp;lt;tt&amp;gt;__init__&amp;lt;/tt&amp;gt;, tak żeby można było konstruować obiekty, korzystając z nazwy pliku (wczytując go w konstruktorze) albo z wektora z danymi.&lt;br /&gt;
&lt;br /&gt;
Szkic prostszej metody:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def __init__(self, dane=None, plik=None):&lt;br /&gt;
    if (dane is None) + (plik is None) != 1:&lt;br /&gt;
        ... #np. sys.exit(1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Szkic bardziej skomplikowanej metody (wykorzystującej dekoratory):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Dane(object):&lt;br /&gt;
    def __init__(self, dane):&lt;br /&gt;
        self.dane = dane&lt;br /&gt;
    @classmethod&lt;br /&gt;
    def fromfile(cls, name):&lt;br /&gt;
        return cls(np.fromfile(dane))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Zadanie 4====&lt;br /&gt;
Do klasy z dwóch pierwszych zadań dodaj przeciążony operator addycji (dodawania), który tworzyć będzie obiekt z sygnałem, składającym się z obu sygnałów. Pamiętaj o sprawdzeniu, że sygnały są tego samego typu &amp;amp;mdash; np. mają tyle samo kanałów i tę samą częstość próbkowania. Czy są jeszcze jakieś operatory, które warto w tej sytuacji przeładować?&lt;br /&gt;
&lt;br /&gt;
====Zadanie 5==== &lt;br /&gt;
Zaprojektuj klasę zapewniającą obsługę pliku z danymi kalibrującymi z [http://brain.fuw.edu.pl/~asia/BCICIV_calib_ds1a.mat IV BCI Competition]. Przypomnij sobie [http://bbci.de/competition/iv/desc_1.html opis tych danych]. Napisz konstruktor, w którym będziesz wczytywać plik i metodę &amp;lt;tt&amp;gt;__str__&amp;lt;/tt&amp;gt;, która będzie zwracać najważniejsze informacje na temat danych zawartych w pliku.&lt;br /&gt;
&lt;br /&gt;
====Zadanie 6====&lt;br /&gt;
Do zaprojektowanej przez siebie powyżej klasy, dodaj metody, które:&lt;br /&gt;
* zwrócą sygnał z wybranego kanału,&lt;br /&gt;
* zwroci listę wszystkich fragmentów sygnału odpowiadający danej klasie bodźca i danemu kanałowi,&lt;br /&gt;
* zwrócą uśredniony sygnał odpowiadający danej klasie bodźca i danemu kanałowi (uśredniamy &amp;quot;triale&amp;quot;),&lt;br /&gt;
* narysują i zapiszą do pliku widma z triali odpowiadających danej klasie bodźca i danemu kanałowi (w nazwie pliku ma się znaleźć informacja o tym dla którego triala, której klasy i którego kanału jest to widmo),&lt;br /&gt;
* narysują widmo po uśrednieniu widm ze wszystkich triali dla danej klasy bodźca.&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>