Programiranje v Pythonu

Ko tudi učitelj ne more pomagati...
Odgovori
anjaD
Prispevkov: 81
Pridružen: 23.8.2010 13:04

Re: Programiranje v Pythonu

Odgovor Napisal/-a anjaD »

Ne deluje. Kar koli na ta način mi ne dela. Sem probala tudi za string pa ne deluje. Ker program mora vse ostale znake ignorirat.

Uporabniški avatar
Aniviller
Prispevkov: 7263
Pridružen: 15.11.2004 18:16

Re: Programiranje v Pythonu

Odgovor Napisal/-a Aniviller »

Aja saj res, ti imaš string in tukaj dobiš kar error če ni število (int() se ne pritoži, če mu daš realno število, ampak ga samo zaokroži, če pa mu daš besedilo, pa zateži...). Ampak to lahko porabiš sebi v prid. Uporabiš "try" varianto, in ignoriraš kadar je error.

Koda: Izberi vse

def preberiDat(dat='dn1.txt'):
    with open(dat) as f:
        vrstice = f.read()
        vrstice=vrstice.split()
        seznam = []
        for i in vrstice:
            try:
                stevilo=int(i)
                seznam.append(stevilo)
            except ValueError:
                continue  #ignoriramo
    return seznam
Sem pomislil, če obstaja še kakšna pametna funkcija, ki bi to testirala sama po sebi, ampak sodeč po temle
http://stackoverflow.com/questions/1265 ... try-except
je tole zgoraj kar edini pregleden način.

anjaD
Prispevkov: 81
Pridružen: 23.8.2010 13:04

Re: Programiranje v Pythonu

Odgovor Napisal/-a anjaD »

Jaaaa dela. :) uffff joj na to pa sploh nisem pomoslila, pa tako enostavno je. Najlepša hvala za pomoč. :)

anjaD
Prispevkov: 81
Pridružen: 23.8.2010 13:04

Re: Programiranje v Pythonu

Odgovor Napisal/-a anjaD »

Pozdravljeni!

Imam majhno težavo pri programiranju naloge. In sicer moram sestaviti algoritem za urejanje števil v seznamu od najmanjšega do največjega. Izbrala sem si urejanje z mehurčki. Napisati moram dva algoritma. Enega, ki spreminja dani seznam in drugega, ki ustvari nov urejen seznam,dani pa ostane nespremenjen. No prvo algoritem sem napisala brez težav. Pri drugem pa se mi je zataknilo.
To je koda prvega algoritma:

Koda: Izberi vse

def urejanje(seznam):
    zamenjava = True
    while zamenjava:
        zamenjava = False
        for i in range(0,len(seznam)-1):
            if seznam[i] > seznam[i+1]:
                zamenjava = True
                seznam[i], seznam [i+1] = seznam[i+1], seznam[i]
    return seznam

Uporabniški avatar
Aniviller
Prispevkov: 7263
Pridružen: 15.11.2004 18:16

Re: Programiranje v Pythonu

Odgovor Napisal/-a Aniviller »

No, če ne drugega bi se dalo samo kopirat in tole klicat. Ampak tam je bolj tipični primer urejanje z vstavljanjem. Vsakič najdeš najmanjšega, ga vstaviš v drugi seznam, najdeš naslednjega najmanjšega, vendar večjega od zadnjega vstavljenega v drugem seznamu...

Jasno ne tale ne mehurčki ne spadata med resne algoritme (oba imata zahtevnost n^2).

anjaD
Prispevkov: 81
Pridružen: 23.8.2010 13:04

Re: Programiranje v Pythonu

Odgovor Napisal/-a anjaD »

Jaz potrebujem ta isti algoritem,torej urejanje z mehurčki,vendar napisan tako, da bo ustvaril in vrnil nov urejen seznam,dani seznam pa se ne bo spremenil. Ne razumem tega s klicanjem. Vendar pa bi rada algoritem spremenila/dopolnila,da bi delal tudi na drugi način ampak ne vem kako.

Uporabniški avatar
Aniviller
Prispevkov: 7263
Pridružen: 15.11.2004 18:16

Re: Programiranje v Pythonu

Odgovor Napisal/-a Aniviller »

Ja najbolj direkten način za to je kar, da na začetku rečeš
novseznam=seznam
delaš vmes z novim in na koncu return novseznam
:)

anjaD
Prispevkov: 81
Pridružen: 23.8.2010 13:04

Re: Programiranje v Pythonu

Odgovor Napisal/-a anjaD »

To ni vredu,saj na koncu dobim urejen tudi prvotni seznam,ta pa bi moral biti nespremenjen.

Uporabniški avatar
Aniviller
Prispevkov: 7263
Pridružen: 15.11.2004 18:16

Re: Programiranje v Pythonu

Odgovor Napisal/-a Aniviller »

Aja saj res, Python :D

novseznam = copy.deepcopy(seznam)

"copy" modul ima posebej funkcijo, ki dejansko naredi nov array, ne pa samo naredi link na starega.

anjaD
Prispevkov: 81
Pridružen: 23.8.2010 13:04

Re: Programiranje v Pythonu

Odgovor Napisal/-a anjaD »

Tega se pa nebi spomnila nikoli. :) Bi se mogoče dalo tudi kako drugače?Jaz sem razmišljala nekaj v tej smeri, da ko je izpolnjen if stavek, da elementa dodamo v nov seznam v obratnem vrstnem redu(se pravi najprej manjšega potem večjega) pa ne gre skozi.. :/

Uporabniški avatar
Aniviller
Prispevkov: 7263
Pridružen: 15.11.2004 18:16

Re: Programiranje v Pythonu

Odgovor Napisal/-a Aniviller »

Ja potem si kmalu nazaj na insertion sort, ki je naraven kadar vstavljaš v prazno tabelo... pri večini sort algoritmih ti je to, da moraš original ohranjat, pišeš pa drugam, samo v breme in se torej tega hitro odkrižaš tako, da narediš kopijo.

V eni potezi jasno ne bo šlo - po prvi potezi imaš že v drugem arrayu, potem moraš pa itak tam nadaljevat kot da ni nič. V najboljših algoritmih moraš ~log(n)-krat skozi celo stvar, in ko je delno sortirano, si z originalom ne moreš več nič pomagat. Pri mehurčkih greš n-krat skozi (lahko sicer vsakič testiraš en par manj, ker vsakič je zadnji že na pravem mestu, ampak to samo razpolovi število primerjav), in po prvi potezi ni še nič kaj podobno pravemu rezultatu, nadaljevanje bi pa spet moralo biti tako kot zdaj. Tako da je najbolj smiselno kar naredit kopijo in nadaljevat.

fmf
Prispevkov: 210
Pridružen: 28.6.2012 16:02

Re: Programiranje v Pythonu

Odgovor Napisal/-a fmf »

Kaj je pri tej rešitvi naloge narobe, prosim za malce pomoči...

MiniLogo
#
# MiniLogo je okrnjena izvedba programskega jezika Logo, ki premore le
# štiri ukaze: F, B, R in L. S temi štirimi ukazi upravljamo
# želvo. Želva se nahaja v ravnini, ki je opremljena z običajnim
# koordinatnim sistemom (prva koordinata narašča proti desni, druga
# koordinata pa narašča navzgor). Želva se na začetku nahaja v točki
# $(0, 0)$ in gleda navzgor (proti "severu"). Z ukazom F želvi povemo,
# naj naredi en korak naprej (v tisti smeri, kamor je trenutno obrnjena).
# Z ukazom B povemo, naj naredi želva korak nazaj. Ukaz R pomeni, naj
# se želva zavrti v desno (tj. v smeri urinega kazalca) za 90°. Ukaz L pa
# pomeni, naj se želva zavrti za 90° v levo (tj. v nasprotni smeri urinega
# kazalca).
#
# Program, ki upravlja z želvo, je torej niz v katerem nastopajo zgornji
# štirje znaki. Primer: 'FFLFRFRFFFLBRBLBBLF'.
#######################################################################@@#



##################################################################@001194#
# 1) Sestavite funkcijo kam_pa_kam(ukazi), ki kot argument dobi niz ukazi.
# Ta niz vsebuje ukaze za želvo, kot je opisano zgoraj. Funkcija naj izračuna
# in vrne koordinati tiste točke, kjer se želva ustavi.
#
# >>> kam_pa_kam('LFF')
# (-2, 0)
# >>> kam_pa_kam('FRFLFRFLFRFLFRF')
# (4, 4)
##################################################################001194@#

def kam_pa_kam(ukazi):
i=0
x,y = 0,0
for i in ukazi:
if i== 'F':
y += 1
elif i == 'R':
x += 1
elif i =='L' :
x += -1
else :
y += -1

return (x,y)

Uporabniški avatar
Aniviller
Prispevkov: 7263
Pridružen: 15.11.2004 18:16

Re: Programiranje v Pythonu

Odgovor Napisal/-a Aniviller »

Ti se obračaš glede na absolutni koordinatni sistem (glede na kompas), FBRL pa se nanašajo glede na želvo! Načinov je več, lahko imaš tudi blazno grde if stavke... predlagam recimo tole, bo še najlažje: prevedeš FBRL v kote, podane v četrtinkah polnega kroga (F=0, L=1, B=2, R=3), spraviš trenutno smer želve, in potem je nova smer želve vsota stare smeri in ukaza (po modulu 4). If-stavek za premik pa imaš zdaj namesto po črkah kar po številkah...

fmf
Prispevkov: 210
Pridružen: 28.6.2012 16:02

Re: Programiranje v Pythonu

Odgovor Napisal/-a fmf »

Kako pa zgleda koda pri vaši rešitvi?

Uporabniški avatar
Aniviller
Prispevkov: 7263
Pridružen: 15.11.2004 18:16

Re: Programiranje v Pythonu

Odgovor Napisal/-a Aniviller »

Hehe, misliš, da sem kodo pisal? :) Ma nekaj v tem stilu, recimo da prevajanje v številko narediš kar s slovarčkom...

Koda: Izberi vse

prevod={'F': 0, 'L': 1, 'B': 2, 'R': 3} #no lahko to tudi z if stavki, ki so lahko notri, ali pa v pomožni funkciji
i=0
x,y=0,0
smer=0 #na začetku gre gor
for i in ukazi:
  smer += prevod[i]
  if smer==0:
     y+=1
in tako dalje...

Odgovori