Vaje 2 - Nizi, Tabele
===================================================================================================================================================================================
Spremeni, dopolni, popravi ...
Pek
Na prejšnjih vajah ste med drugim reševali nalogo o (morebiti) goljufivem peku. Ena vaših rešitev je sicer v redu, a žal jo je Moodle povsem "oblikovno pokvaril. Ustrezno jo "polepšaj" (skopiraj in poskusi kar uporabiti ustrezne ukaze v okolju Visual Studio)
Console.Write("Vnesi predpisano tezo hlebca: "); double tezaPredpis = double.Parse(Console.ReadLine()); Console.Write("Vnesi stevilo hlebcev v pekarni: ");
int steviloHlebcev = int.Parse(Console.ReadLine());
int stevecNapacnih = 0;
double minTeza=tezaPredpis*0.8; double maxTeza=tezaPredpis*1.2; for(int i = 1; i < steviloHlebcev; i++) { Console.Write("Vnesi tezo: " + i + ". hlebca ");
double dejanskaTeza = double.Parse(Console.ReadLine());
//Če je teža hlebca 20% manjša od predpisa, ga štej med napačne hlebce
if ((dejanskaTeza < minTeza) || (dejanskaTeza > maxTeza)) stevecNapacnih++; }
//računamo ali bo pek pil vodo
if (stevecNapacnih > steviloHlebcev * 0.15) Console.WriteLine("Peka v vodo takoj!!!!"); else Console.WriteLine("Pek ima dobro mero");
potem pa pretvori tako, da uvedeš dve funkciji - prva poskrbi za branje podatkov o vseh težah, druga pa za odločitev glede goljufivosti. V glavni fukciji (Main) potem le poskrbi za klice teh metod. Morda ti utegne prav priti postopek, kjer del kode označiš in potem v Edit izbereš Refactor in tam Extract Method!
Opiši, kako si to naredil in kako ti je uspelo! Koliko je bilo "ročnega" dela? Ali znaš napisati navodila za to vajo tako, da točno opišeš postopek, ki naj se ga kolega drži, da bo uspešno rešil vajo (in veš, da je kolega "malo neroden" in mu moraš res natančno napisati korake postopka!)
Piton na obisku
Pika je našla naslednji programček, napisan v Pythonu:
def prestej(s, t): # s in t sta niza
c = [s.count(z) for z in t]
m = max(c)
u = [t[i] for i in range(len(t)) if c[i] == m]
return ''.join(u)
print(prestej('neznani tekst', 'taei'))
Kaj ta program naredi? Poskusi ugotoviti, ne da bi zagnal Python! Če ne bo šlo, si lahko pomagaš tudi z vizualizacijo različnih primerov na www.pythontutor.com. Prepiši ga v C#.
Vsote
Spodaj napisani program naj bi rešil naslednjo nalogo: "za dani seznam in naravno število k izračunaj seznam vsot vseh strnjenih podseznamov dolžine k." seveda je to izdelek študentov "nekega čudnega faksa, ki ni FMF" in je zato brez komentarjev, s "kriptičnimi" imeni spremenljivk. Pa še Janezek ga je polil s kavo in ... Zadevo prepiši v spodoben C# program in ga seveda opremi tudi z ustreznimi testnimi programi!
def vk(s, k):
if k > len(s): return []
v = 0
... KAVNA PACKA ...
for i in range(k, len(s)):
v = v - s[i-k] + s[i]
sv.append(v)
return sv
Hammingova razdalja
Recimo, da imamo tri binarne nize mediana(a, b, c), ki vrne mediano nizov a, b in c. Na primer:
>>> mediana('0000', '1100', '1010')
'1000'
>>> mediana('10101', '11010','00011')
'10011'
Funkcija je
def mediana(x, y, z):
'''Vrne mediano treh nizov'''
mediana = ''
for tx, ty, tz in zip(x, y, z):
prestejEnke = (tx + ty + tz).count('1')
if prestejEnke > 1:
mediana += '1'
else:
mediana += '0'
return mediana
Sedaj pa naj bo je_medianska(TN), ki vrne True, če je tabela TN medianska in False v nasprotnem primeru. Na primer:
>>> je_medianska(['111','110','100','000'])
True
>>> je_medianska(['010', '100','001'])
False
===================================================================================================================================================================================
"Čisto" pogramiranje
Pri teh nalogah pa imamo "luksuz", da lahko zadeve zakodiramo "z nule" ...
Teža niza
Preberi niz in izračunaj koliko tehta. Pri tem uporabi bodisi slovensko, bodisi angleško tehtnico! Pri angleški tehtnici je teža črke kar enaki kodi znaka (mali a ima torej težo 97, mali b 98, mali c 99, mali č 269, mali d 100 ...). Znake, ki niso črke prezremo (imajo težo 0)!
Pri slovenski "tehtnici" pa malim črkam od a do ž daš težo od 1 do 25, velikim črkam od A do Ž pa od 51 do 75. Ostale znake pri tehtanju prezri. Za radovedne dodaj še izračun. Namig - tu morda prav pride metoda IndexOf!
Vnesi niz: Žaba Ana
Tehntnica: slovenska
Teža niza: 146
Račun: 75 + 1 + 2 + 1 + 0 + 51 + 15 + 1 = 146
Presledki in besede
Preberi niz in preštej, koliko presledkov in koliko besed je v njem. (Beseda je v tem primeru strnjeno zaporedje znakov, ki ne vsebuje presledka). Nato izpiši niz na štiri načine:
- brez presledkov
- brez zaporednih presledkov (tj. več zaporednih presledkov izpiši kot enega)
- odstrani vse začetne in končne presledke
- V nadaljevanju pa izpiši še niz po besedah ter poišči še najkrajšo in najdaljšo besedo. Če je takšnih besed več, izpiši vse.
Vnesi niz: ␣Danes␣␣␣je␣␣en␣lep␣␣dan!␣␣
Število presledkov v nizu: 11.
Število besed v nizu: 5.
Niz brez presledkov: "Danesjeenlepdan!"
Niz brez zaporednih presledkov: "␣Danes␣je␣en␣lep␣dan!␣"
Niz brez začetnih, končnih in zaporednih presledkov: "Danes␣je␣en␣lep␣dan!"
Niz, izpisan po besedah:
1. beseda: Danes
2. beseda: je
3. beseda: en
4. beseda: lep
5. beseda: dan!
Najdaljša beseda: Danes
Št. črk: 5
Najkrajša beseda: je, en
Št. črk: 2
Hišne številke
Prebivalci Krive ulice so si zaželeli lepe nove hišne številke. Ker je potrebno vsako števko naročiti posebej, je potrebno izračunati, koliko posameznih števk potrebujemo.
Vnesi prvo številko: 72
Vnesi zadnjo številko: 132
Potrebujemo naslednje števke:
0: 16x
1: 49x
2: 17x
...
9: 16x
Gremo v krog
Napiši program, ki prebere prebere nekaj števil in jih shrani v tabelo. Nato prebere število n (pomik) in vsako število v tabeli krožno premakne za n mest v levo (tj. če pademo čez levi rob, štejemo spet od konca; seveda je lahko število n tudi negativno). Program naj izpiše tabelo pred in po premiku. Uporabiš lahko le eno dodatno tabelo, še bolje pa je brez nje (zadostuje le ena dodatna spremenljivka). Seveda pripravi in uporabi ustrezne metode: eno za branje tabele, eno za izpis tabele, eno za premik, ...
Vnesi elemente tabele: 12 7 9 1 2
Vnesi pomik: 3
Tabela pred pomikom: 12 7 9 1 2
Tabela po pomiku: 1 2 12 7 9
Tabela naključnih nizov
Naključno generiraj tabelo nizov iz malih črk slovenske abecede. Število nizov naj uporabnik vnese, dolžine posameznih nizov pa naj bodo naključne, uporabnik vnese največjo in najmanjšo možno dolžino niza. Na koncu izriši histogram pogostnosti posameznih črk. Tudi tu zadevo razbij na ustrezne metode.
Vnesi število nizov: 12
Vnesi najmanjšo dolžino nizov: 5
Vnesi največjo dolžino nizov: 10
Naključne besede so
1: ldoeak
2: rožasnx
....
12: ečr
Pogostnost posameznih črk:
# ...
# ...
# # # ...
# # # ... #
---------------
a b c č ... ž
Med stolpci naj bo en presledek. Če stolpcev ne znaš izpisati navpično, jih najprej poskusi izpisati vodoravno:
a: ##
b: ####
c:
č: ##
.....
ž: #
Naključni niz različnih znakov
Napiši program, ki prebere niz znakov in naključno generira besedo iz nekaj različnih znakov vnešenega niza. Pazi, da bo program deloval (primerno hitro) v vseh primerih. Namig: najprej sestavi metodo, ki iz niza naredi niz iz samih različnih znakov.
| Vnesi niz znakov: abeceda Vnesi dolžino naključnega niza: 3 Naključni niz: bca |
Vnesi niz znakov: abeceda Vnesi dolžino naključnega niza: 7 V nizu ni dovolj različnih znakov. |
Polinomi
Polinom ene spremenljivke predstavimo s tabelo njegovih koeficientov. Element na mestu z indeksom i je koeficient pri xi. Za zapis polinoma stopnje n potrebujemo tabelo dolžine n + 1. Vodilni koefocient mora biti različen od 0. Polinom 0 obravnavamo kot polinom stopnje -1 (predstavimo ga s prazno tabelo).
Sestavi program, ki bo izračunal vsoto in produkt danih dveh polinomov. Polinoma sta lahko različnih stopenj. Pri seštevanju polinomov enakih stopenj moraš paziti, saj se lahko vodilna koeficienta (ali več koeficientov) seštejejo v 0.
Koeficienti prvega polinoma: -1 0 1
Koeficienti drugega polinoma: 2 -3 0 2
Vsota: 1 -3 1 2
Produkt: -2 3 2 -5 0 2