<?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=%2FKolPopr</id>
	<title>/KolPopr - 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=%2FKolPopr"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=/KolPopr&amp;action=history"/>
	<updated>2026-04-17T07:05:37Z</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=/KolPopr&amp;diff=2057&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot;== TI:WTBD/Kolokwium Poprawkowe ==  === zadanie 1 ===  Medianę sekwencji liczb można zdefiniować za pomocą następującego kodu: &lt;source lang=&quot;python&quot;&gt;     def m...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=/KolPopr&amp;diff=2057&amp;oldid=prev"/>
		<updated>2015-05-23T15:08:34Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;== &lt;a href=&quot;/edu/index.php/TI:WTBD&quot; title=&quot;TI:WTBD&quot;&gt;TI:WTBD&lt;/a&gt;/Kolokwium Poprawkowe ==  === zadanie 1 ===  Medianę sekwencji liczb można zdefiniować za pomocą następującego kodu: &amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;     def m...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== [[TI:WTBD]]/Kolokwium Poprawkowe ==&lt;br /&gt;
&lt;br /&gt;
=== zadanie 1 ===&lt;br /&gt;
&lt;br /&gt;
Medianę sekwencji liczb można zdefiniować za pomocą następującego kodu:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def median(x):&lt;br /&gt;
        xx = sorted(x)&lt;br /&gt;
        if not xx:&lt;br /&gt;
            return None&lt;br /&gt;
        if len(xx) == 1:&lt;br /&gt;
            return xx[0]&lt;br /&gt;
        if len(xx) == 2:&lt;br /&gt;
            return sum(xx)/2.&lt;br /&gt;
        else:&lt;br /&gt;
            return median(xx[1:-1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
(kod ten służy wprowadzeniu definicji mediany, nie jest to optymalna ani nawet&lt;br /&gt;
szczególnie dobra implementacja obliczania mediany w praktyce!)&lt;br /&gt;
&lt;br /&gt;
Niech T będzie tabelą, zawierającą (między innymi) kolumnę &amp;quot;X float not null&amp;quot;.&lt;br /&gt;
Napisać zapytanie SQL zwracające medianę wartości z kolumny X.&lt;br /&gt;
Napisać program do testowania tego zapytania, tworzący tabelę z 10 000 liczb&lt;br /&gt;
losowych (w pamięci) i porównujący medianę obliczoną za pomocą zapytania SQL &lt;br /&gt;
z wynikiem rachunku w Pythonie na tych samych liczbach (ulepszając algorytm &lt;br /&gt;
z powyższej definicji).&lt;br /&gt;
&lt;br /&gt;
==== przykład rozwiązania: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#! /usr/bin/python&lt;br /&gt;
# coding: utf-8&lt;br /&gt;
&lt;br /&gt;
def py_median(x):&lt;br /&gt;
    xx = sorted(x)&lt;br /&gt;
    if not xx:&lt;br /&gt;
        return None&lt;br /&gt;
    limit, offset = 2 - len(xx) % 2, (len(xx) - 1) / 2&lt;br /&gt;
    middle = xx[offset:offset+limit]&lt;br /&gt;
    return sum(middle) / float(limit)&lt;br /&gt;
&lt;br /&gt;
def sql_median(x):&lt;br /&gt;
    from sqlite3 import connect&lt;br /&gt;
    conn = connect(':memory:')&lt;br /&gt;
    conn.execute('create table T (X float not null)')&lt;br /&gt;
    conn.executemany('insert into T values (?)', zip(x)) #((X,) for X in x))&lt;br /&gt;
    ((res,), ) = conn.execute('''&lt;br /&gt;
    select avg(X)&lt;br /&gt;
    from (&lt;br /&gt;
        select X&lt;br /&gt;
        from T&lt;br /&gt;
        order by X&lt;br /&gt;
        limit 2 - (select count(*) from T)%2&lt;br /&gt;
        offset ((select count(*) from T) - 1)/2&lt;br /&gt;
        )'''&lt;br /&gt;
    )&lt;br /&gt;
    conn.close()&lt;br /&gt;
    return res&lt;br /&gt;
&lt;br /&gt;
def test_median(N=10000):&lt;br /&gt;
    from numpy.random import rand&lt;br /&gt;
    x = rand(N)&lt;br /&gt;
    m1 = py_median(x)&lt;br /&gt;
    m2 = sql_median(x)&lt;br /&gt;
    delta = m1 - m2&lt;br /&gt;
    return delta&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    from sys import argv&lt;br /&gt;
    N = 10000&lt;br /&gt;
    if len(argv) == 2:&lt;br /&gt;
        N = int(argv[1])&lt;br /&gt;
    print 'py_median - sql_median = {}'.format(test_median(N))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== zadanie 2 ===&lt;br /&gt;
&lt;br /&gt;
Posługując się gotową bazą SQLite zawartą w pliku [http://bobo.fuw.edu.pl/~rjb/pl_lud.db pl_lud.db] napisać program, który:&lt;br /&gt;
* w odpowiedzi na argument 'q1' wypisuje listę nazw województw, po jednym na linijkę, i w tej samej linijce dla każdego z nich podaje liczbę powiatów, należących do danego województwa;&lt;br /&gt;
* w odpowiedzi na argument 'q2' wypisuje listę nazw 10 powiatów o największym zaludnieniu w kraju, obok jego nazwy wypisując liczbę ludności i nazwę województwa, do którego należy;&lt;br /&gt;
* w odpowiedzi na argument 'q3' wypisuje średnią i odchylenie standardowe liczby ludności obliczone dla wszystkich powiatów w kraju.&lt;br /&gt;
&lt;br /&gt;
==== przykład rozwiązania: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#! /usr/bin/python&lt;br /&gt;
# coding: utf-8&lt;br /&gt;
&lt;br /&gt;
QUERIES = {&lt;br /&gt;
'q1' : '''&lt;br /&gt;
select w.NAZWA as WOJEWODZTWO, count(*) as ILE_POWIATOW&lt;br /&gt;
from WOJEWODZTWA w&lt;br /&gt;
    join POWIATY p on w.ID=p.W_ID&lt;br /&gt;
group by w.NAZWA&lt;br /&gt;
order by w.NAZWA&lt;br /&gt;
''',&lt;br /&gt;
'q2' : '''&lt;br /&gt;
select p.NAZWA as POWIAT, p.LUDNOSC, w.NAZWA as WOJEWODZTWO&lt;br /&gt;
from POWIATY p&lt;br /&gt;
    join WOJEWODZTWA w on w.ID=p.W_ID&lt;br /&gt;
order by p.LUDNOSC desc&lt;br /&gt;
limit 10&lt;br /&gt;
''',&lt;br /&gt;
'q3' : '''&lt;br /&gt;
select sum(LUDNOSC)/count(*), sum(LUDNOSC*LUDNOSC)/count(*)&lt;br /&gt;
from POWIATY;&lt;br /&gt;
'''&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
def main(baza, arg):&lt;br /&gt;
    from sqlite3 import connect&lt;br /&gt;
    conn = connect(baza)&lt;br /&gt;
    cursor = conn.execute(QUERIES[arg])&lt;br /&gt;
    if arg in ('q1', 'q2'):&lt;br /&gt;
        rows = list()&lt;br /&gt;
        rows.append(tuple(r[0] for r in cursor.description))&lt;br /&gt;
        for r in cursor:&lt;br /&gt;
            rows.append(tuple(unicode(x) for x in r))&lt;br /&gt;
        for r in rows:&lt;br /&gt;
            print u' | '.join(r).encode('utf-8')&lt;br /&gt;
            #print r&lt;br /&gt;
    elif arg == 'q3':&lt;br /&gt;
        avg, avg2 = cursor.fetchall()[0]&lt;br /&gt;
        stddev = (avg2 - avg**2)**0.5&lt;br /&gt;
        print u'średnia: {}; sigma: {}'.format(avg, round(stddev)).encode('utf-8')&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    from sys import argv&lt;br /&gt;
    baza = 'pl_lud.db'&lt;br /&gt;
    try:&lt;br /&gt;
        arg = argv[1]&lt;br /&gt;
    except IndexError:&lt;br /&gt;
        print u'{}: wymaga dokładnie jednego argumentu.'.format(__file__).encode('utf-8')&lt;br /&gt;
        exit(1)&lt;br /&gt;
    if arg in ('q1', 'q2', 'q3'):&lt;br /&gt;
        main(baza, arg)&lt;br /&gt;
    else:&lt;br /&gt;
        print u'{0}: {1}: nieznany argument.'.format(__file__, arg).encode('utf-8')&lt;br /&gt;
        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== zadanie 3 ===&lt;br /&gt;
&lt;br /&gt;
Napisać program, który na podstawie pliku tekstowego kodowanego w UTF-8&lt;br /&gt;
stworzy indeks słów występujących w tym pliku, w postaci tabeli SQLite zawierającej&lt;br /&gt;
kolumny ''slowo'' (tekst słowa), ''wiersz'' (nr wiersza w którym wystąpiło) i&lt;br /&gt;
''kolumna'' (pozycja w wierszu).&lt;br /&gt;
Sprawdzić działanie tego programu na podstawie pliku z tekstem 1. księgi Pana&lt;br /&gt;
Tadeusza ([[Plik:PanTadeusz1.txt]]).&lt;br /&gt;
&lt;br /&gt;
  ''W sformułowaniu tego zadania kryje się niestety pewna niejednoznaczność, której''&lt;br /&gt;
  ''z początku nie zauważyłem: ,,pozycja w wierszu&amp;quot; może oznaczać numer kolejny słowa''&lt;br /&gt;
  ''w wierszu, lub pozycję w wierszu początku tego słowa jako numer kolejny znaku w wierszu -- ''&lt;br /&gt;
  ''ta druga interpretacja była zamierzona, ale oceniając traktowałem obie jako poprawne. ''&lt;br /&gt;
  ''Również jako równie poprawne traktowałem zaczynanie numeracji od zera lub od jedynki.''&lt;br /&gt;
&lt;br /&gt;
==== przykład rozwiązania: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#! /usr/bin/python&lt;br /&gt;
# coding: utf-8&lt;br /&gt;
&lt;br /&gt;
import re&lt;br /&gt;
import sqlite3&lt;br /&gt;
&lt;br /&gt;
def words(plik):&lt;br /&gt;
    wordrx = re.compile(r'\b\w+\b', re.UNICODE)&lt;br /&gt;
    f = open(plik)&lt;br /&gt;
    for num, line in enumerate(f):&lt;br /&gt;
        line = line.decode('utf-8')&lt;br /&gt;
        ## to jeśli kolumnę rozumieć jako nr słowa w linii&lt;br /&gt;
        #for pos, word in enumerate(wordrx.findall(line)):&lt;br /&gt;
            #yield word, num, pos&lt;br /&gt;
        ## a teraz wersja gdy kolumna oznacza pozycję początku słowa w znakach&lt;br /&gt;
        m = wordrx.search(line)&lt;br /&gt;
        while m:&lt;br /&gt;
            yield m.group(0), num, m.start()&lt;br /&gt;
            m = wordrx.search(line, m.end())&lt;br /&gt;
    f.close()&lt;br /&gt;
&lt;br /&gt;
def create(dbplik, plik):&lt;br /&gt;
    db = sqlite3.connect(dbplik)&lt;br /&gt;
    db.execute('''&lt;br /&gt;
        drop table if exists indeks_slow&lt;br /&gt;
        ''')&lt;br /&gt;
    db.execute('''&lt;br /&gt;
        create table indeks_slow (slowo text, wiersz int, kolumna int, primary key (wiersz, kolumna))&lt;br /&gt;
        ''')&lt;br /&gt;
    db.executemany('''&lt;br /&gt;
        insert into indeks_slow (slowo, wiersz, kolumna) values (?, ?, ?)&lt;br /&gt;
        ''', words(plik))&lt;br /&gt;
    db.commit()&lt;br /&gt;
    ((n,),) = db.execute('''&lt;br /&gt;
        select count(*) from indeks_slow&lt;br /&gt;
        ''')&lt;br /&gt;
    return n&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    from sys import argv&lt;br /&gt;
    try:&lt;br /&gt;
        plik = argv[1]&lt;br /&gt;
    except IndexError:&lt;br /&gt;
        print (u'{}: wymaga argumentu - nazwy pliku tekstowego w UTF-8.'.&lt;br /&gt;
                    format(__file__).encode('utf-8')&lt;br /&gt;
              )&lt;br /&gt;
        exit(1)&lt;br /&gt;
    dbplik = plik + '.sqlite3'&lt;br /&gt;
    print u'tworzę tabelę indeks_slow w pliku {} ...'.format(dbplik).encode('utf-8')&lt;br /&gt;
    nrows = create(dbplik, plik)&lt;br /&gt;
    print u'wstawiono {} wierszy.'.format(nrows).encode('utf-8')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>