<?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-10-27T23:18:31Z</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(&amp;#039;:memory:&amp;#039;)&lt;br /&gt;
    conn.execute(&amp;#039;create table T (X float not null)&amp;#039;)&lt;br /&gt;
    conn.executemany(&amp;#039;insert into T values (?)&amp;#039;, zip(x)) #((X,) for X in x))&lt;br /&gt;
    ((res,), ) = conn.execute(&amp;#039;&amp;#039;&amp;#039;&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;
        )&amp;#039;&amp;#039;&amp;#039;&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__ == &amp;#039;__main__&amp;#039;:&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 &amp;#039;py_median - sql_median = {}&amp;#039;.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 &amp;#039;q1&amp;#039; 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 &amp;#039;q2&amp;#039; 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 &amp;#039;q3&amp;#039; 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;
&amp;#039;q1&amp;#039; : &amp;#039;&amp;#039;&amp;#039;&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;
&amp;#039;&amp;#039;&amp;#039;,&lt;br /&gt;
&amp;#039;q2&amp;#039; : &amp;#039;&amp;#039;&amp;#039;&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;
&amp;#039;&amp;#039;&amp;#039;,&lt;br /&gt;
&amp;#039;q3&amp;#039; : &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
select sum(LUDNOSC)/count(*), sum(LUDNOSC*LUDNOSC)/count(*)&lt;br /&gt;
from POWIATY;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&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 (&amp;#039;q1&amp;#039;, &amp;#039;q2&amp;#039;):&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&amp;#039; | &amp;#039;.join(r).encode(&amp;#039;utf-8&amp;#039;)&lt;br /&gt;
            #print r&lt;br /&gt;
    elif arg == &amp;#039;q3&amp;#039;:&lt;br /&gt;
        avg, avg2 = cursor.fetchall()[0]&lt;br /&gt;
        stddev = (avg2 - avg**2)**0.5&lt;br /&gt;
        print u&amp;#039;średnia: {}; sigma: {}&amp;#039;.format(avg, round(stddev)).encode(&amp;#039;utf-8&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
    from sys import argv&lt;br /&gt;
    baza = &amp;#039;pl_lud.db&amp;#039;&lt;br /&gt;
    try:&lt;br /&gt;
        arg = argv[1]&lt;br /&gt;
    except IndexError:&lt;br /&gt;
        print u&amp;#039;{}: wymaga dokładnie jednego argumentu.&amp;#039;.format(__file__).encode(&amp;#039;utf-8&amp;#039;)&lt;br /&gt;
        exit(1)&lt;br /&gt;
    if arg in (&amp;#039;q1&amp;#039;, &amp;#039;q2&amp;#039;, &amp;#039;q3&amp;#039;):&lt;br /&gt;
        main(baza, arg)&lt;br /&gt;
    else:&lt;br /&gt;
        print u&amp;#039;{0}: {1}: nieznany argument.&amp;#039;.format(__file__, arg).encode(&amp;#039;utf-8&amp;#039;)&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 &amp;#039;&amp;#039;slowo&amp;#039;&amp;#039; (tekst słowa), &amp;#039;&amp;#039;wiersz&amp;#039;&amp;#039; (nr wiersza w którym wystąpiło) i&lt;br /&gt;
&amp;#039;&amp;#039;kolumna&amp;#039;&amp;#039; (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;
  &amp;#039;&amp;#039;W sformułowaniu tego zadania kryje się niestety pewna niejednoznaczność, której&amp;#039;&amp;#039;&lt;br /&gt;
  &amp;#039;&amp;#039;z początku nie zauważyłem: ,,pozycja w wierszu&amp;quot; może oznaczać numer kolejny słowa&amp;#039;&amp;#039;&lt;br /&gt;
  &amp;#039;&amp;#039;w wierszu, lub pozycję w wierszu początku tego słowa jako numer kolejny znaku w wierszu -- &amp;#039;&amp;#039;&lt;br /&gt;
  &amp;#039;&amp;#039;ta druga interpretacja była zamierzona, ale oceniając traktowałem obie jako poprawne. &amp;#039;&amp;#039;&lt;br /&gt;
  &amp;#039;&amp;#039;Również jako równie poprawne traktowałem zaczynanie numeracji od zera lub od jedynki.&amp;#039;&amp;#039;&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&amp;#039;\b\w+\b&amp;#039;, re.UNICODE)&lt;br /&gt;
    f = open(plik)&lt;br /&gt;
    for num, line in enumerate(f):&lt;br /&gt;
        line = line.decode(&amp;#039;utf-8&amp;#039;)&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(&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
        drop table if exists indeks_slow&lt;br /&gt;
        &amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
    db.execute(&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
        create table indeks_slow (slowo text, wiersz int, kolumna int, primary key (wiersz, kolumna))&lt;br /&gt;
        &amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
    db.executemany(&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
        insert into indeks_slow (slowo, wiersz, kolumna) values (?, ?, ?)&lt;br /&gt;
        &amp;#039;&amp;#039;&amp;#039;, words(plik))&lt;br /&gt;
    db.commit()&lt;br /&gt;
    ((n,),) = db.execute(&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
        select count(*) from indeks_slow&lt;br /&gt;
        &amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
    return n&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&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&amp;#039;{}: wymaga argumentu - nazwy pliku tekstowego w UTF-8.&amp;#039;.&lt;br /&gt;
                    format(__file__).encode(&amp;#039;utf-8&amp;#039;)&lt;br /&gt;
              )&lt;br /&gt;
        exit(1)&lt;br /&gt;
    dbplik = plik + &amp;#039;.sqlite3&amp;#039;&lt;br /&gt;
    print u&amp;#039;tworzę tabelę indeks_slow w pliku {} ...&amp;#039;.format(dbplik).encode(&amp;#039;utf-8&amp;#039;)&lt;br /&gt;
    nrows = create(dbplik, plik)&lt;br /&gt;
    print u&amp;#039;wstawiono {} wierszy.&amp;#039;.format(nrows).encode(&amp;#039;utf-8&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>