<?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-10-27T23:17:56Z</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ę (&amp;#039;&amp;#039;int&amp;#039;&amp;#039;) 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(&amp;#039;%i&amp;#039; % r)&lt;br /&gt;
    s.reverse()&lt;br /&gt;
    return &amp;#039;&amp;#039;.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 &amp;#039;01&amp;#039;:&lt;br /&gt;
            raise ValueError(&amp;#039;not bits!&amp;#039;)&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 (&amp;#039;&amp;#039;man utf-8&amp;#039;&amp;#039;).&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 &amp;#039;&amp;#039;wc&amp;#039;&amp;#039;, 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;
    &amp;#039;&amp;#039;&amp;#039;zwraca (linie, słowa, znaki);&lt;br /&gt;
    ta wersja wc nic nie wie o kodowaniach, po prostu liczy bajty.&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;&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(&amp;#039;\n&amp;#039;)), len(s.split()), len(s)&lt;br /&gt;
    # tradycyjne wc liczy wystąpienia &amp;#039;\n&amp;#039;, co często nie zgadzałoby się o 1&lt;br /&gt;
    return s.count(&amp;#039;\n&amp;#039;), 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;
    &amp;#039;&amp;#039;&amp;#039;na sposób linijka-po-linijce&amp;#039;&amp;#039;&amp;#039;&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 &amp;#039;&amp;#039;wc&amp;#039;&amp;#039; 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 &amp;#039;OK&amp;#039;&lt;br /&gt;
    else:&lt;br /&gt;
        print &amp;#039;ERROR!&amp;#039;&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=&amp;#039;utf-8&amp;#039;):&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;ta wersja zakłada że plik jest w kodowaniu utf-8&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;&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(&amp;#039;\n&amp;#039;), 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 &amp;#039;&amp;#039;wc&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&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) + (&amp;#039;-&amp;#039;,)]&lt;br /&gt;
    if len(reslines) &amp;gt; 1:&lt;br /&gt;
        reslines.append(tuple(sum(t) for t in zip(*reslines)[:3]) + (&amp;#039;RAZEM&amp;#039;,))&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 = &amp;#039;%%%ds%%%ds%%%ds %%s&amp;#039; % 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ść &amp;#039;&amp;#039;stdin&amp;#039;&amp;#039; i pracujemy na niej. Uwaga, iteracja jest wykonana nie za pomocą pętli &amp;#039;&amp;#039;for&amp;#039;&amp;#039;, 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 &amp;#039;&amp;#039;napis formatujący&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;fmt&amp;#039;&amp;#039;&amp;#039;, służący do sformatowania linijek.&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>