Stran 1 od 11

Programiranje v Pythonu

Objavljeno: 13.12.2012 9:48
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!

Re: Programiranje v Pythonu

Objavljeno: 13.12.2012 9:53
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 :$

Re: Programiranje v Pythonu

Objavljeno: 13.12.2012 10:00
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. :)

Re: Programiranje v Pythonu

Objavljeno: 28.12.2012 15:34
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! :)

Re: Programiranje v Pythonu

Objavljeno: 28.12.2012 16:48
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

Re: Programiranje v Pythonu

Objavljeno: 29.12.2012 14:27
Napisal/-a meteorologinja
Hvala! :D

Re: Programiranje v Pythonu

Objavljeno: 29.12.2012 16:29
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)]

Re: Programiranje v Pythonu

Objavljeno: 28.3.2013 21:52
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

Re: Programiranje v Pythonu

Objavljeno: 28.3.2013 22:10
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.

Re: Programiranje v Pythonu

Objavljeno: 28.3.2013 22:12
Napisal/-a styppen
Bi lahko mogoče vseeno prilepila funkcijo presekIntervalov?

Re: Programiranje v Pythonu

Objavljeno: 28.3.2013 22:24
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))

Re: Programiranje v Pythonu

Objavljeno: 28.3.2013 23:02
Napisal/-a fmf
Aniviller, se strinjam s tabo, samo, kako naj zdej to popravim. Maš kakšno idejo?

Re: Programiranje v Pythonu

Objavljeno: 28.3.2013 23:05
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.

Re: Programiranje v Pythonu

Objavljeno: 28.3.2013 23:07
Napisal/-a fmf
Hvala...kako bi torej popravil funkcijo presekIntervalov?

Re: Programiranje v Pythonu

Objavljeno: 28.3.2013 23:15
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 (?)