Programiranje v Pythonu

Ko tudi učitelj ne more pomagati...
Odgovori
meteorologinja
Prispevkov: 8
Pridružen: 11.8.2012 18:06

Programiranje v Pythonu

Odgovor Napisal/-a meteorologinja »

Živjo!
Spisati moram kodo, ki vrne identično matriko v Pythonu, pri tem pa definiramo matrike kot seznam seznamov.
Spisala sem kodo, za katero menim, da je ustrezna. Vem pa tudi, da je nekje napaka, ker mi vrne same 1. Prosim za pomoč! Aja, sama nisem nek strašen programer in se zavedam, da je to dokaj osnova. :oops:
Koda:
def identiteta(n):
i=0
j=0
if i==j:
return [[1 for i in range(n)]for j in range(n)]
else: return[[0 for i in range(n)]for j in range(n)]
Hvala!

meteorologinja
Prispevkov: 8
Pridružen: 11.8.2012 18:06

Re: Programiranje v Pythonu

Odgovor Napisal/-a meteorologinja »

Ok, tole mi je uspelo rešiti sami v eni vrstici. Hvala vseeno!
bi pa obdržala temo odprto, za nadaljne probleme :$

problemi
Prispevkov: 4931
Pridružen: 24.8.2009 1:20

Re: Programiranje v Pythonu

Odgovor Napisal/-a problemi »

Mislim, da ti glede teme ni potrebno skrbeti, ker se jih ne zaklepa, razen ob opravičenih razlogih, kar pa se v tvojem primeru mislim, da ne more zgoditi. Zdaj pa dosti, da ti ne smetim tu. :)

meteorologinja
Prispevkov: 8
Pridružen: 11.8.2012 18:06

Re: Programiranje v Pythonu

Odgovor Napisal/-a meteorologinja »

No, pojavil se je problem, kako transponirati matriko (matrike so še vedno seznami seznamov). S pomočjo kolegice sem prišla do tega, da mi transponira kvadratno matriko, problem pa je pri nxm matrikah...

koda:


def transponiraj(mat):
#if len(mat)-1!=len(mat[0]):
#mat1=[]
for i in range(len(mat)-1):
for j in range(len(mat)):
## if (len(mat)-1)!=(len(mat)):
## for k in range(len(mat)-1):
## mat1.append([])

mat[j],mat[j]=mat[j],mat[j]


return mat

Možne so napake. Pomoč, prosim!

Pa lepe praznike vsem! :)

markich
Prispevkov: 47
Pridružen: 28.5.2008 10:48

Re: Programiranje v Pythonu

Odgovor Napisal/-a markich »

Pozdravljena,
Seveda imaš že pakete, ki to delajo samodejno, ampak za vajo je fajn, da jo spišeš sama...
Jaz sem ti naredil na "človeški" način in ne po Pythonsko v stilu [blabla for i in range(n) if pogoj1 else pogoj2]. Seveda lahko to čudo še gnezniš, tako da načeloma lahko narediš funkcijo v eni vrstici, ampak je zelo nepregledno.

Koda: Izberi vse

def transponiraj(mat):
    "Matrika dimenzije n × m je podana kot seznam seznamov"

    trans = []
    n = len(mat)
    m = len(mat[0])
    for j in range(m):
        vrstica = []
        for i in range(n):
            vrstica += [mat[i][j]]
        trans += [vrstica]
    return trans

meteorologinja
Prispevkov: 8
Pridružen: 11.8.2012 18:06

Re: Programiranje v Pythonu

Odgovor Napisal/-a meteorologinja »

Hvala! :D

markich
Prispevkov: 47
Pridružen: 28.5.2008 10:48

Re: Programiranje v Pythonu

Odgovor Napisal/-a markich »

aja, glede prvega vprašanja pa...
Morda ti bo kdaj prav prišla takšna "pythonska" koda, zato sem ti prvo nalogo rešil, kljub temu, da si jo pogruntala že sama...

Koda: Izberi vse

def identiteta(n):
    "vrne n × n identično matriko"
    return [[(1 if i==j else 0) for i in range(n)] for j in range(n)]

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

Re: Programiranje v Pythonu

Odgovor Napisal/-a fmf »

Živjo, lepo prosim za pomoč pri naslednji nalogi:
Sestavi funkcijo pravokotnika(a1x, a1y, b1x, b1y, a2x, a2y, b2x, b2y),
ki bo izračunala obseg in površino unije dveh pravokotnikov. Stranice
pravokotnikov so vzporedne koordinatnima osema. Vsak pravokotnik je
podan s koordinatami (katerihkoli) dveh nasprotnih si oglišč.

Primer:

>>> pravokotnika(1, 1, 5, 5, 6, 8, 8, 3)
(30, 26)
>>> pravokotnika(1, 1, 5, 5, 4, 8, 8, 3)
(28, 34)

Moja koda:
def pravokotnika(a1x,a1y,b1x,b1y,a2x,a2y,b2x,b2y):
a1x, b1x = min(a1x, b1x), max(a1x, b1x)
a1y, b1y = min(a1y, b1y), max(a1y, b1y)
a2x, b2x = min(a2x, b2x), max(a2x, b2x)
a2y, b2y = min(a2y, b2y), max(a2y, b2y)
obseg1 = 2*(b1x-a1x) + 2*(b1y-a1y)
ploscina1 = (b1x-a1x) * (b1y-a1y)
obseg2 = 2*(b2x-a2x) + 2*(b2y-a2y)
ploscina2 = (b2x-a2x) * (b2y-a2y)

t=min(presekIntervalov(a1x, b1x, a2x, b2x))
v=max(presekIntervalov(a1x, b1x, a2x, b2x))
z=min(presekIntervalov(a1y, b1y, a2y, b2y))
y=max(presekIntervalov(a1y, b1y, a2y, b2y))
(t,v)=presekIntervalov(a1x, b1x, a2x, b2x)
(z,y)=presekIntervalov(a1y, b1y, a2y, b2y)



sirina = v-t
visina = y-z


obsegmali = 2*sirina + 2*visina
ploscinamali = sirina*visina
if a2x>b1x and a2y>b1y:
return(obseg1+obseg2,ploscina1+ploscina2)
else:

return (obseg1+obseg2-obsegmali, ploscina1+ploscina2-ploscinamali)

Napiše mi 'bool' object is not iterable. Se bi dal komu mal kodo prečekirat pa pogledat, kaj je narobe.....funkcija presekIntervalov je iz prejšnje naloge pravilno definirana
Hvala lepa

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

Re: Programiranje v Pythonu

Odgovor Napisal/-a Aniviller »

sklepam, da ti crkne v primeru, da je presek intervalov prazen. Takrat najbrz vrnes False namesto spiska dveh stevil, in potem jasno min in max ne delata, pa odstevanje najbrz tudi ne bi bilo zadovoljno. Te posebne primere moras preverjat.

styppen
Prispevkov: 6
Pridružen: 27.3.2013 22:54

Re: Programiranje v Pythonu

Odgovor Napisal/-a styppen »

Bi lahko mogoče vseeno prilepila funkcijo presekIntervalov?

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

Re: Programiranje v Pythonu

Odgovor Napisal/-a fmf »

Presek intervalov je pomoje prav zapisano:
def presekIntervalov(a1,b1,a2,b2):
if a2>b1 or b2<a1:
return False
else:
return(max(a1,a2), min(b1,b2))

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

Re: Programiranje v Pythonu

Odgovor Napisal/-a fmf »

Aniviller, se strinjam s tabo, samo, kako naj zdej to popravim. Maš kakšno idejo?

styppen
Prispevkov: 6
Pridružen: 27.3.2013 22:54

Re: Programiranje v Pythonu

Odgovor Napisal/-a styppen »

Hja... je in ni pravilno napisano.

Načeloma je praksa, da funkcije vračajo samo en podatkovni tip. V tvojem primeru lahko funkcija vrne tip bool ali pa tuple.

Koda: Izberi vse

t=min(presekIntervalov(a1x, b1x, a2x, b2x))
v=max(presekIntervalov(a1x, b1x, a2x, b2x))
z=min(presekIntervalov(a1y, b1y, a2y, b2y))
y=max(presekIntervalov(a1y, b1y, a2y, b2y))
(t,v)=presekIntervalov(a1x, b1x, a2x, b2x)
(z,y)=presekIntervalov(a1y, b1y, a2y, b2y)
Problem se pojavi v teh vrsticah. Kot je že Aniviller dejal prej pride do napake, če funkcija presekIntervalov vrne False (se pravi je pogoj a2>b1 or b2<a1 v presekIntervalov izpolnjen). V tem primeru pride do situacije, da iščeš nato min/max spremenljivke tipa bool kar pa vrne bool is not iterable napako.

Problem lahko odpraviš na dva načina. Prvi je tak, da smiselno popraviš funkcijo presekIntervalov, da v obeh primerih vrača tuple. Ali pa popraviš zgornjo kodo tako, da bo preverjala kakšen podatkovni tip je vrnila funkcija presekIntervalov.
Najbolj pravilna je prva rešitev, ker načeloma vračanje različnih tipov iz ene funkcije ni smatrano kot dobra praksa.

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

Re: Programiranje v Pythonu

Odgovor Napisal/-a fmf »

Hvala...kako bi torej popravil funkcijo presekIntervalov?

styppen
Prispevkov: 6
Pridružen: 27.3.2013 22:54

Re: Programiranje v Pythonu

Odgovor Napisal/-a styppen »

Ne vem, če bi bila ravno najboljša rešitev ampak je ustrezna moji koncentraciji ob takšni uri.

Funkcija bi v primeru, da je presek prazen nek "indikator" tuple oz. tuple, ki ni mogoč in nakazuje, da je interval prazen.

Koda: Izberi vse

def presekIntervalov(a1,b1,a2,b2):
    if a2>b1 or b2<a1:
        return (-1, -1) 
    else:
        return(max(a1,a2), min(b1,b2))
Nato bi bilo potrebno popraviti še vse klice presekIntervalov, da bi se preverjalo, če je vrnjen rezultat (-1, -1) in v primeru, da je ustrezno urgiraš.
Bo šlo?

EDIT: Predpostavljam, da se celotna zadeva izvaja samo v I. kvadrantu koordinatnega sistema (?)

Odgovori