Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Mikä on tietyn pituinen kenttä Pythonissa?

Jaska [17.10.2013 22:32:52]

#

Opiskelen Pythonia avoimessa yliopistossa, ja jouduin ongelmiin terminologian kanssa. Tehtävänä oli seuraava:

Kirjoita ohjelma, joka kysyy käyttäjältä luvun, ja tulostaa sen 20:n merkin levyiseen kenttään viiden desimaalin tarkkuudella.

Ongelma on se, että en ole varma, mikä on kenttä. Kokeilin seuraavaa, joka toimi kai oikein jos ymmärsin mitä kentällä tarkoitetaan:

'{0:20.5f}'.format(3)

Kuitenkin seuraava tuottaa liian pitkän kentän:

'{0:20.5f}'.format(3343434332423432434443)

Miten tuollainen luvun vieminen vakiopituiseen kenttään pitäisi toteuttaa?

Metabolix [18.10.2013 13:10:46]

#

Kenttä (field) tarkoittaa tällaisessa yhteydessä luvulle varattua tilaa tekstissä. Se on ilmeinen esimerkiksi taulukkoa tulostettaessa:

for i in range(1, 11):
	print("|", end = "")
	for j in range(1, 11):
		print(" %4d |" % (i * j), end = "")
	print()

On todennäköistä, että tehtävän laatija ei ole miettinyt asiaa siltä kannalta, että luvussa voi olla enemmän numeroita. Veikkaan, että haettu ratkaisu on juurikin 20.5f. Toinen mahdollisuus on 20.5e, jolloin luku ilmoitetaan kymmenpotenssimuodossa kuuden merkitsevän numeron tarkkuudella. Ei pidä takertua yksityiskohtiin, kun selvästi olet joka tapauksessa saavuttanut tehtävän tavoitteen.

Jaska [23.10.2013 12:43:34]

#

Hmm. Samanlaisesta tehtävästä tuli nolla pistettä. Voinen kai paljastaa koko tehtävän, kun sen arvosteluaika meni jo.

Tutkitaan seuraavaa ohjelmakoodia:

luku = input("Anna luku: ")
luku = 3.14159 * luku
print("" %(luku))

Millainen merkkijono ohjelmakoodin lopussa olevalle tulostuskomennolle pitäisi kirjoittaa, jotta se tulostaisi muuttujan luku sisällön kolmen desimaalin tarkkuudella siten, että lukuesitys tulostetaan 15:n merkin levyiseen kenttään?

Vastauksen on oltava täsmällinen, siinä ei saa olla ylimääräisiä merkkejä (ylimääräisiä välilyöntejä tms.). Kirjoita merkkijonolle lainausmerkit "..."

Vastaukseni oli "{0:15.3f}", oikea vastaus kuulemma "%15.3f", ja omalla koneellani koodi kaatuu toisella rivillä:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'float'

Olenkohan katkera tai jotain, mutta mielestäni on aika hassua muotoilla rivillä kolme tulostusta jos ohjelma kaatuu rivillä kaksi?

Metabolix [23.10.2013 12:58:48]

#

Käytätkö edes oikeaa Pythonin versiota? Tehtävä on ehkä laadittu versiolle 2, jossa inputilta tuleva data evaluoidaan ja luvuista tulee siis lukuja, kun taas versiossa 3 input palauttaa aina tekstiä.

Vastauksesi on joka tapauksessa väärä, koska %-operaattori ei käsittele noita aaltosulkumerkintöjä.

Jaska [23.10.2013 13:05:59]

#

Metabolix kirjoitti:

Käytätkö edes oikeaa Pythonin versiota?

Kurssin sivulla lukee:

kurssisivu kirjoitti:

HUOM! Tällä kurssillä käytetään Python kielen versiota 3. Python 2 ja 3 eivät ole suoraan keskenään yhteensopivia. Lataa siis koneellesi uusin 3.3.2 versio Pythonista.

Omalla koneellani oleva Python:

jaakko@jaakko-VPCEB1S1E:~$ python3
Python 3.3.2+ (default, Oct  9 2013, 14:56:03)
[GCC 4.8.1] on linux
Type "help", "copyright", "credits" or "license" for more information.

The Alchemist [23.10.2013 13:11:24]

#

Amiston kursseja? Kuulostaa joltain kansalaisopiston python-kurssilta valmistuneelta tuo vetäjä. Pistä reklamaatiota väärästä tehtävästä.

Jaska [23.10.2013 13:21:36]

#

The Alchemist kirjoitti:

Amiston kursseja?

Itä-Suomen avoimessa yliopistossa käyn tätä kurssia. Palautteen pistinkin menemään.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta