<?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=%2FCw1</id>
	<title>/Cw1 - 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=%2FCw1"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=/Cw1&amp;action=history"/>
	<updated>2026-04-18T15:56:42Z</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=/Cw1&amp;diff=2038&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot;= TI:WTBD/Ćwiczenia 1 =  Do zabawy używaliśmy m. in. plików Plik:PanTadeusz1.txt i Plik:PanTadeusz1_Latin2.txt.  Dla rozgrzewki i jako narzędzie do dals...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=/Cw1&amp;diff=2038&amp;oldid=prev"/>
		<updated>2015-05-23T14:53:44Z</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;/Ćwiczenia 1 =  Do zabawy używaliśmy m. in. plików &lt;a href=&quot;/edu/index.php/Plik:PanTadeusz1.txt&quot; title=&quot;Plik:PanTadeusz1.txt&quot;&gt;Plik:PanTadeusz1.txt&lt;/a&gt; i &lt;a href=&quot;/edu/index.php/Plik:PanTadeusz1_Latin2.txt&quot; title=&quot;Plik:PanTadeusz1 Latin2.txt&quot;&gt;Plik:PanTadeusz1_Latin2.txt&lt;/a&gt;.  Dla rozgrzewki i jako narzędzie do dals...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= [[TI:WTBD]]/Ćwiczenia 1 =&lt;br /&gt;
&lt;br /&gt;
Do zabawy używaliśmy m. in. plików [[Plik:PanTadeusz1.txt]] i [[Plik:PanTadeusz1_Latin2.txt]].&lt;br /&gt;
&lt;br /&gt;
Dla rozgrzewki i jako narzędzie do dalszej zabawy napisaliśmy moduł z funkcjami: konwertującą liczbę (''int'') na &amp;quot;bity&amp;quot; (jej zapis dwójkowy jako napis składający się z zer i jedynek), i funkcję do niej odwrotną. Oto pełny tekst kodu modułu:&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;
# util.py&lt;br /&gt;
&lt;br /&gt;
def tobits(N):&lt;br /&gt;
    s = list()&lt;br /&gt;
    while N:&lt;br /&gt;
        N, r = N / 2, N % 2&lt;br /&gt;
        s.append('%i' % r)&lt;br /&gt;
    s.reverse()&lt;br /&gt;
    return ''.join(s)&lt;br /&gt;
&lt;br /&gt;
def frombits(bits):&lt;br /&gt;
    res = 0&lt;br /&gt;
    for c in bits:&lt;br /&gt;
        if c not in '01':&lt;br /&gt;
            raise ValueError('not bits!')&lt;br /&gt;
        res *= 2&lt;br /&gt;
        res += int(c)&lt;br /&gt;
    return res&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkcji tych użyliśmy do przyjrzenia się, jak wyglądają sekwencje wielobajtowe reprezentujące znaki spoza zakresu ASCII w kodowaniu UTF-8. Informacje o zasadzie kodowania UTF-8 można znaleźć np. w podręczniku systemowym (''man utf-8'').&lt;br /&gt;
&lt;br /&gt;
Oczywiście tak naprawdę nie było potrzeby pisania tych funkcji samemu. Proszę znaleźć sposób uzyskania tych konwersji wprost za pomocą wbudowanych funkcji/metod.&lt;br /&gt;
&lt;br /&gt;
Napisaliśmy dwie funkcje odtwarzające zasadniczą funkcjonalność standardowego polecenia ''wc'', różnią się one sposobem wykonania operacji wejścia. Obie nic nie wiedzą o kodowaniach tekstu, traktując zawartość pliku jako strumień bajtów.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def wc0(plik):&lt;br /&gt;
    '''zwraca (linie, słowa, znaki);&lt;br /&gt;
    ta wersja wc nic nie wie o kodowaniach, po prostu liczy bajty.&lt;br /&gt;
    '''&lt;br /&gt;
    try:&lt;br /&gt;
        s = plik.read()&lt;br /&gt;
    except AttributeError:&lt;br /&gt;
        s = open(plik).read()&lt;br /&gt;
    #return len(s.split('\n')), len(s.split()), len(s)&lt;br /&gt;
    # tradycyjne wc liczy wystąpienia '\n', co często nie zgadzałoby się o 1&lt;br /&gt;
    return s.count('\n'), len(s.split()), len(s)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def wc1(plik):&lt;br /&gt;
    '''na sposób linijka-po-linijce'''&lt;br /&gt;
    try:&lt;br /&gt;
        f = open(plik)&lt;br /&gt;
    except TypeError:&lt;br /&gt;
        f = plik&lt;br /&gt;
    l, w, c = 0, 0, 0&lt;br /&gt;
    for line in f:&lt;br /&gt;
        l += 1&lt;br /&gt;
        w += len(line.split())&lt;br /&gt;
        c += len(line)&lt;br /&gt;
    return l, w, c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warto czasami sprawdzić, czy &amp;quot;ulepszona&amp;quot; implementacja nie daje innych wyników, niż oryginalna. Zwłaszcza, że z komentarza w pierwszej wersji ''wc'' wynika, że czasami wyniki tych funkcji mogą różnić się o 1 (dla liczby linijek) -- w jakich okolicznościach, i jak to poprawić?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def test(plik):&lt;br /&gt;
    if wc0(plik) == wc1(plik):&lt;br /&gt;
        print 'OK'&lt;br /&gt;
    else:&lt;br /&gt;
        print 'ERROR!'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kolejna wersja zakłada, że plik jest zapisem tekstu w kodowaniu UTF-8.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def wc(plik, enc='utf-8'):&lt;br /&gt;
    '''ta wersja zakłada że plik jest w kodowaniu utf-8&lt;br /&gt;
    '''&lt;br /&gt;
    try:&lt;br /&gt;
        s = plik.read()&lt;br /&gt;
    except AttributeError:&lt;br /&gt;
        s = open(plik).read()&lt;br /&gt;
    s = s.decode(enc)&lt;br /&gt;
    return s.count('\n'), len(s.split()), len(s)&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Ta wersja cierpi na tę słabość, że rzuci wyjątkiem jeśli treść pliku nie jest legalnym strumieniem UTF-8. &lt;br /&gt;
&lt;br /&gt;
Jeżeli chcemy stworzyć program bezpośrednio wykonywalny, to potrzebny jest jeszcze blok mówiący o tym, co ma się stać w wyniku jego wywołania. Do tego musimy oczywiście dołączyć jeszcze w treści pliku programu którąś z wersji definicji funkcji ''wc''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    from sys import argv, stdin&lt;br /&gt;
    args = argv[1:]&lt;br /&gt;
    if args:&lt;br /&gt;
        reslines = list(wc(plik) + (plik,) for plik in args)&lt;br /&gt;
    else:&lt;br /&gt;
        reslines = [wc(stdin) + ('-',)]&lt;br /&gt;
    if len(reslines) &amp;gt; 1:&lt;br /&gt;
        reslines.append(tuple(sum(t) for t in zip(*reslines)[:3]) + ('RAZEM',))&lt;br /&gt;
    #print reslines # jeszcze trzeba to umiejętnie sformatować&lt;br /&gt;
    reslines = list(tuple(str(x) for x in line) for line in reslines)&lt;br /&gt;
    maxl = tuple(max(len(s) for s in col) + 1 for col in zip(*reslines))&lt;br /&gt;
    fmt = '%%%ds%%%ds%%%ds %%s' % maxl[:3]&lt;br /&gt;
    for line in reslines:&lt;br /&gt;
        print fmt % line&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Co tu się dzieje?&lt;br /&gt;
&lt;br /&gt;
# Dobieramy się do listy argumentów z linii poleceń (pomijając zerowy, będący nazwą samego programu) i traktujemy te argumenty jako nazwy plików.&lt;br /&gt;
# Iterujemy po elementach listy argumentów jeśli jest niepusta. WPP czytamy zawartość ''stdin'' i pracujemy na niej. Uwaga, iteracja jest wykonana nie za pomocą pętli ''for'', a generatora.&lt;br /&gt;
# W przypadku gdy lista wynikowa ma długość &amp;gt; 1, dołączamy jeszcze jeden wiersz z podsumowaniem.&lt;br /&gt;
# Formatujemy wynik w zgrabną tabelkę o wyrównanych kolumnach. W tym celu obliczamy, jaką szerokość trzeba zarezerwować na każdą z 3 pierwszych kolumn, i na tej podstawie tworzymy ''napis formatujący'' '''fmt''', służący do sformatowania linijek.&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>