Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: raw_input ja lukuarvot

Sivun loppuun

Skibiliano [28.05.2008 20:17:33]

#

Ei kyllä kauan kestänyt ennenkuin tulen tänne toisen ongelman kanssa.

plussa = str(raw_input("Turn + counting on? 1 = yes, 0 = no"))
miinus = str(raw_input("Turn - counting on? 1 = yes, 0 = no"))
import time
from time import *


def laskuri(eka, toka):
    if plussa == 1 and miinus == 0:
        print eka, '+', toka, '=', eka + toka
    if miinus == 1 and plussa == 0:
        print eka, '-', toka, '=', eka - toka
    if miinus == 1 and plussa == 1:
        print "Please restart this Python program and put 1 to other and 0 to other, you cannot put 1's to both or 0's to both"
        print "This program will quit in 5 seconds automaticly"
        sleep(5)
        quit
    if miinus == 0 and plussa == 0:
        print "Please restart this Python program and put 1 to other and 0 to other, you cannot put 1's to both or 0's to both"
        print "This program will quit in 5 seconds automaticly"
        sleep(5)
        quit


eka = str(raw_input("First number?"))
toka = str(raw_input("Second number?"))

laskuri(eka, toka)

answer = str(raw_input("There's the answer, another calculation yes, exit no. other plus or minus numbers reset"))
if answer is reset:
    plussa = str(raw_input("+ counting 1 or 0?"))
    miinus = str(raw_input("- counting 1 or 0?"))
    answer = yes
if answer is yes:
    eka = str(raw_input("First number?"))
    toka = str(raw_input("Second number?"))
    laskuri(eka, toka)
    sleep(2)
    quit
if answer is no:
    answer2 = str(raw_input("you are going to quit this, are you sure? y/n"))
    if answer2 is 'y':
        quit
    if answer2 is 'n':
        eka = str(raw_input("First number?"))
        toka = str(raw_input("Second number?"))
        laskuri(eka, toka)
        answer = str(raw_input("There's the answer, another calculation yes, exit no, other plus or minus numbers type reset"))
        if answer is reset:
            plussa = str(raw_input("+ 1 or 0"))
            miinus = str(raw_input("- 1 or 0"))
            answer = yes
        if answer is yes:
            eka = str(raw_input("First number?"))
            toka = str(raw_input("Second number?"))
            laskuri(eka, toka)
            answer = str(raw_input("There's the answer, you have reached the limit of answers."))
            print("This program will shut down itself, amount of answers given will be increased in next versions")
            print("This program shuts down in 8 seconds")
            sleep(8)
            quit
        if answer is no:
            quit

Koitin tässä tehdä plus ja miinuslaskukonetta raw_inputteja käyttäen. Mutta tulee virhe lähes joka kohdasta, siis miten tuollaisia oikein tehdään?

Pekka Karjalainen [29.05.2008 08:50:22]

#

Pari huomiota.

Pythonissa funktioita kutsutaan sulkumerkinnällä. Jos lähdekoodissa lukee pelkkä quit, sitä ei kutsuta. Sen nimeen vain viitataan, mutta se viittaus ei tee mitään. Merkintä quit() kutsuisi tätä funktiota, mutta sitäpä ei taida olla olemassa. Kutsu funktiota exit() sen sijaan.

Merkkijonojen yhtäsuuruutta testataan ==-operaattorilla.

>>> "peruna" == "peruna"
True
>>> "peruna" == "peruna "
False
>>> "peruna" == "  peruna  ".strip()
True

Merkkijono.strip() poistaa siis ylimääräiset välilyönnit merkkijonon laidoilta, jolloin vertailu ei erehdy niiden takia.

Jos pitkä ohjelma ei toimi, ota siitä lyhyt osa, ja selvitä miksi se ei toimi. Nyt kysymyksestäsi ei käynyt ilmi, mitä kaikkia ongelmia ja virheitä tuli vastaan, joten en kerennyt tehdä muuta kuin tarttua näihin kahteen asiaan.

Viimeiseen kysymykseesi voisi myös vastata, että Pythonissa ei tarvitse tehdä laskimia ollenkaan, koska Python-tulkki on jo laskin. Mutta jos teet harjoituksena, niin jatka vaan. Yritä nyt aluksi saada syötteen luku toimimaan ihan erikseen, kun nyt selvisi miten testata merkkijonoja, joita raw_inputista saa.

Metabolix [29.05.2008 13:16:45]

#

Kannattaa myös muistaa tekstin ja lukujen ero.

>>> a, b = "12", "34"
>>> a + b
'1234'
>>> int(a) + int(b)
46

Skibiliano [29.05.2008 14:08:44]

#

Juu kiitti Pekka ja Metabolix, ensimmäistä kertaa en ole Python IDLE:ssä tekemässä mitään simppeliä.

En tiedä missä kohdassa tuossa on virhe.
mutta tuo ohjelma tekee vähän oudosti.

Se ekaksi kysyy että mikä on miinus (laitoin 0) ja plussa (laitoin 1)
sitten se kysyy ensimmäisen numeron (62)
sitten toinen numero (52)
Tässä on vastauksesi........ (yes)
ja ohjelma sammui heti.

vastausta ei näkynyt, ja yes, no ja reset komennot lopettivat ohjelman heti vaikka kaikkien niiden komentojen jälkeen tulee yksi raw_input.

Metabolix [29.05.2008 14:14:38]

#

Aja ohjelmasi jotenkin niin, että ohjelman loppuessa jää näkyville, mikä kiikastaa. Esimerkiksi erikseen avattu komentorivi (cmd.exe) on Windowsissa tähän hyvä vaihtoehto.

Kohdista if answer is reset: puuttuu selvästi lainausmerkit, ohjelma varmasti kaatuu juuri tähän, kun reset-nimistä muuttujaa ei ole olemassa. Lisäksi yhtäsuuruusvertailussa oikea merkintä on == eikä is. Sama ongelma on muutamassa sijoituslauseessa noiden sisällä. Tarkistapa nyt siis, että kaikki tekstit on kirjoitettu lainausmerkkeihin mutta muuttujia ei.

Skibiliano [29.05.2008 14:38:38]

#

Juu, en nyt keksi ollenkaan itse mikä kiikastaa, ja en tajunnut oikein tuosta, lisäsin tuossa jo vähän aikaa sitten lainausmerkit kaikkiin kohtiin,
if answer is reset: -> if answer is "reset":
mutta sama vika yhä, kaikissa on kyllä lainausmerkit, mutta ei ole
"answer" = ....
vaan
answer = ....

EDIT: cmd.exessä se vain lopettaa sen ohjelman, siis se ei lopeta sitä cmd.exeä, vaan sen mun "laskurin"
Python IDLEssä se tekee saman.

EDIT2:tein tälläisen testikoodin tässä äsken

answer = str(raw_input("kirjoita 1")) #testauksessa laitoin pelkän 1 numeron tuohon
if answer is "1":
    print("helloworld")
    pass
if answer is 1:
    print("helloworld2")
    pass
else:
    print("ei toimi")
    pass

se laittoi:
helloworld
ei toimi

Pekka Karjalainen [29.05.2008 14:54:57]

#

Jälleen muistutan, että == on yhtäsuuruustestaus. Is testaa objektien identiteettiä, ja aiheuttaa mm. tällaista päänvaivaa (oman koneeni Python 2.5):

>>> 256 is 16*16
True
>>> 289 is 17*17
False

Tuo EI ole yhtäsuuruustestausta. Se antaa kurkata Python-tulkin sisuksiin, ja kertoo jotain pienten kokonaislukujen sisäisestä esitystavasta.

289 == 17*17 on ihan eri juttu.

Ja tässä koko koodi elif-rakenteen kanssa, jolloin vain yksi if-lauseen sisältö suoritetaan kerralla. Se on lyhenne sanoista else if.

answer = str(raw_input("kirjoita 1"))

if answer == "1":
    print("helloworld")
    pass
elif answer == 1:
    print("helloworld2")
    pass
else:
    print("ei toimi")
    pass

Elifejä voi laittaa peräkkäin useampia.

Skibiliano [29.05.2008 15:24:45]

#

Pekka Karjalainen kirjoitti:

.....paljon tekstiä.....

Tuo auttoi paljon! Menen katselemaan niitä oppaita vielä että saisin ne vastauksetkin näkymään siinä.
Korjailin vähän mutta nyt ilmeni uusi ongelma.

eka = str(raw_input("First number?")) #600 laitoin
toka = str(raw_input("Second number?")) #600 tähänkin
if laskutapa == "+":
    vastaus = eka, '+', toka, '=', eka + toka
    pass
elif laskutapa == "-":
    vastaus = eka, '-', toka, '=', eka - toka
    pass
print(laskuri(eka, toka))

600 + 600 = 600600 antoi tulokseksi.

eiku ei mitään, vaihoin str -> int.
Mutta yksi pieni haitta, se antaa tulokseksi
600 + 600 = 1200
None

Chiman [29.05.2008 16:22:16]

#

Se tulostaa "None", koska tulostat laskuri-funktion paluuarvon, mutta laskuri-funktiossa ei ole return-lausetta. Tällöin paluuarvo on aina None.


Sivun alkuun

Vastaus

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

Tietoa sivustosta