1    # Takze co jsme delali dneska, tedy domaci ukoly, trocha rekurze a trocha seznamu:
   2    
   3    # Nejdriv domaci ukoly, zacneme s tim jednoduzsim, tedy mate cislo a vypsat ho
   4    # po cifrach. Ukazeme si tri zpusoby - prvni je ten, ke kterymu se nekteri z vas
   5    # skoro dostali, druhej je "elegantnejsi" zapsani tehoz a treti je pak rekurzivne
   6    
   7    def digits1(n):
   8      """ Vypise cifry cisla od te s nejmensi vahou po tu s nejvetsi vahou. """
   9      y=10 # ze jsme v 10tkove soustave, neni nutne
  10      while (x>y): # dokud je x vetsi nez y (tedy dokud ma alespon 2 cifry)
  11        r=x%y # zjistime si zbytek po deleni zakladem, tedy posledni cifru
  12        print r # tu vypiseme
  13        x=(x-r)/y # a x vydelime zakladem (je zbytecne odecitat od x r, kdyz si uvedomite, ze x/y je celociselne deleni)
  14      print x # a jeste musime vytisknout posledni cifru
  15      
  16    def digits2(n):
  17      """ Vypise cifry cisla, trosku upravenejsi verze."""
  18      while (n>0): # dokud je v N alespon jedna cifra
  19        print n%10 # vypiseme posledni cifru
  20        n=n/10 # posuneme se o cifru dal
  21        
  22    def digits_recursive(n):
  23      """ Vypise cifry cisla, tentokrat rekurzivne."""
  24      print n%10 # zase vypiseme posledni cifru
  25      if (n>9): # a jestli to nebyla posledni cifra, tedy jestli ma n aspon 2 cifry
  26        digits_recursive(n/10) # zavolame vypsani cifer znova, ale o cislo bez posledni cifry
  27        
  28    # takze to bychom meli vypisovani cifer. Ted na ten domecek. Ukolem je udelat
  29    # funkci co nakresli domecek o zadane velikosti z hvezdicek. Tady je kod: Ta
  30    # funkce je hodne dlouha, ale jedna se vlastne o nekolik kroku po sobe:
  31    #   1) nejdriv nakreslime strechu
  32    #   2) pak si udelame pruh z hvezdicek (ten pouzijeme na strop a na zaklad domecku)
  33    #   3) a nakonec si udelame pruh z mezer co ma nazacatku a na konci hvezdicku, to je vypln baracku
  34    #   4) ted nakreslime s pomoci 2) a 3) ten ctverec
  35    
  36    def domecek(n):
  37      """ Nakresli domecek z hvezdicek. """
  38      i=n/2 # tohle je pocet mezer u nejvyssi casti strechy
  39      while (i>=0):
  40        s="" # do s dame prazdny retezec
  41        j=0 # s j jdeme od nuly
  42        while (j<i):
  43          s=s+" "
  44          j=j+1 # dokud si do s nenastradame potrebny pocet mezer
  45        s=s+"*" # ted do s pridame prvni hvezdicku ve strese
  46        if (i==n/2): # kdyz jsme na nejvyssim radku strechy, je to jedina hvezdicka
  47          i=i-1
  48          if (n%2==0): # kdyz je velikost domecku suda, jsou na horni casti strechy hvezdicky 2
  49            s=s+"*"
  50          print s # vypiseme radek strechy
  51          continue # a pokracujeme dalsim provedenim cyklu
  52        # ted jdeme na mezery co jsou mezi pravou a levou hvezdickou strechy
  53        s=s+" " # je tam minimalne jedna za horni radek
  54        if (n%2==0): # kdyz je velikost domecku suda,
  55          s=s+" " # jsou tam mezery 2 (po dvou hvezdickach)
  56        j=i # ted jdeme od radku hvezdicky, kterej se snazime nakreslit
  57        while (j<n/2-1): # az do posledniho radku kde se jeste pripisuji  nove mezery (druhy odshora)
  58          s=s+"  " # a za kazdy radek pridame 2 hvezdicky
  59          j=j+1
  60        s=s+"*" # nakonec pridame pravou hvezdicku
  61        print s # pripraveny radek vytiskneme
  62        i=i-1 # a posuneme se o radek dolu
  63      i=0 # vynulujeme citac
  64      cara_z_hvezdicek="" # a budeme delat caru z hvezicek
  65      while (i<n): # takze nkrat pridame k care jednu hvezdicku
  66        cara_z_hvezdicek=cara_z_hvezdicek+"*"
  67        i=i+1
  68      i=0 # vynulujeme citac
  69      prostredek="*" # a dame si do retezce hvezdicku
  70      while (i<n-2): # ted pridame n-2 mezer (2 hvezdicky uz mame po stranach)
  71        prostredek=prostredek+" "
  72        i=i+1
  73      prostredek=prostredek+"*" # a pridame ukoncovaci hvezdicku
  74      # ted uz mame vsechny komponenty
  75      print cara_z_hvezdicek # vytiskneme strop
  76      i=0
  77      while (i<n-2): # n-2 krat vytiskneme stredni cast domecku
  78        print prostredek
  79        i=i+1
  80      print cara_z_hvezdicek # a cele to zakoncime podlahou
  81      
  82    # Co jsme delali dneska byly seznamy. Pouzivaji se k tomu, kdyz chcete ulozit
  83    # do jedne promenne vic hodnot. Inicializuji se pres hranate zavorky, ve kterych
  84    # je seznam prvku seznamu:
  85    
  86    seznam=[1,2,3]
  87    
  88    #  muzete si zjistit delku seznamu (=pocet prvku)
  89    
  90    print len(s) # vypise 3
  91    
  92    # muzete menit libovolny prvek seznamu pres index prvku (prvni prvek ma index 0!!!!)
  93    
  94    s[1]=55 # seznam ted je [1, 55 3]
  95    
  96    # muzete prvek smazat (zadate zase index prvku ke smazani)
  97    
  98    del s[0] # seznam ted je [55, 3]
  99    
 100    # a muzete prvek pridat
 101    
 102    s.append(66) # seznam ted je [55, 3, 66]
 103    
 104    # takze tohle jsou zakladni operace se seznamem. Ted si ukazeme nektere funkce
 105    # ktere muzeme k seznamu udelat. Ta prvni nam vrati True nebo False podle toho,
 106    # jestli dany prvek v seznamu je nebo neni:
 107    
 108    def member(seznam,prvek):
 109      """Vrati True, pokud je prvek v seznamu, jinak vrati False."""
 110      i=0 # pojedeme od prvniho prvku
 111      while (i<len(seznam)): # do posledniho
 112        if (seznam[i]==prvek): # kdyz prvek s indexem i je rovnej prvku, nasli jsme co jsme hledali
 113          return True # takze vratime true
 114        i=i+1 # posuneme se na dalsi prvek
 115      return False # kdyz jsme se dostali az sem, prosli jsme cely pr
 116    
 117    # takze to bychom meli. Ted zkusime dalsi funkci. Ta si vezme jako parametr
 118    # dva seznamy (musi mit stejnou delku) a vytvori novej seznam podle nasledujiciho
 119    # pravidla:
 120    #     vysledek[i]=max(seznam1[i],seznam2[i])
 121    
 122    def maxList(seznam1,seznam2):
 123      """ Vrati seznam maximalnich prvku ze seznamu v parametrech."""
 124      if (len(seznam1)!=len(seznam2)): # kdyz neni delka stejna
 125        print "Seznamy musi mit stejnou delku" # zarveme
 126        return [] # a vratime prazdny seznam
 127      result=[] # vysledek je zatim prazdny seznam, naplnime ho
 128      i=0 # a zacneme prvnimi prvky
 129      while (i<len(seznam1)): # az do poslednich
 130        result.append(max(seznam1[i],seznam2[i])) # ucte se pouzivat uz existujici funkce;-)
 131        i=i+1 # posun na dalsi prvek
 132      return result # vratime co jsme vyrobili
 133    
 134    # a do tretice si ukazeme funkci, ktera vrati prunik dvou seznamu. Tedy vrati jen ty prvky,
 135    # co jsou v obou seznamech: Pouzijeme v ni funkci member, co uz jsme si naprogramovali driv:
 136    
 137    def intersection(seznam1,seznam2):
 138      """ Vrati prunik dvou seznamu. """
 139      result=[] # vysledek je zase prazdny seznam co pozdeji naplnime
 140      i=0 # a zaciname od prvniho prvku prvniho seznamu
 141      while (i<len(seznam1)): # a projedeme cely prvni seznam
 142        if (member(seznam2,seznam1[i])): # jestli je dany prvek prvniho seznamu i v druhem seznamu
 143          result.append(seznam1[i]) # pridame ho k vysledku
 144        i=i+1 # posuneme se na dalsi prvek
 145      return result # vraime, co jsme vypocitali
 146      
 147      
 148    
 149      
 150      
 151      
 152      
 153      
 154      
 155      
 156