Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Apuja tarvitaan Pythonin kanssa

Sivun loppuun

gronler [02.07.2015 20:54:27]

#

Heippa,
Pitäisi tehdä seuraavanlainen koodi:

Lähdekooditiedoston kanssa samaan hakemistoon on tallennettuna tiedosto "merkkijonoja.txt". Tämä tiedosto sisältää satunnaisesti luotuja merkkijonoja, joissa esiintyy kahdenlaisia merkkijonoja: sellaisia, joissa on kirjaimia ja mahdollisesti numeroita, sekä sellaisia, joissa on kirjaimia, numeroita ja erikoismerkkejä (€,#,{, §, jne). Tehtävänäsi on tehdä ohjelma, joka lukee tiedostosta rivin, testaa onko merkkijono sellainen, joka sisältää vain kirjaimia ja numeroita, ja sen mukaan tulostaa joko "[merkkijono] kelpaa salasanaksi" jos on, tai "[merkkijono] sisältää virheellisiä merkkejä." mikäli siinä on ei-alfanumeerisia merkkejä. Toimiessaan ohjelma tulostaa seuraavaa:

5345m345ö34l kelpaa salasanaksi.
no2no123non4 kelpaa salasanaksi.
noq234n5ioqw#% sisältää virheellisiä merkkejä.
%#""SGMSGSER sisältää virheellisiä merkkejä.
doghdp5234 kelpaa salasanaksi.
sg,dermoepm sisältää virheellisiä merkkejä.
43453-frgsd sisältää virheellisiä merkkejä.
hsth())) sisältää virheellisiä merkkejä.
bmepm35wae kelpaa salasanaksi.
vmopaem2234+0+ sisältää virheellisiä merkkejä.
gsdm12313 kelpaa salasanaksi.

Tehtävässä kannattaa rivit lukea yksi kerrallaan ja testata .isalnum()-merkkijonometodilla. Lisäksi muista poistaa lopussa oleva rivinvaihtomerkki, se ei ole kirjain eikä numero!


Ongelmana on, että kääntäjä tulkitsee nyt kaikki rivit yksittäisiksi merkeiksi eikä sanoiksi.
Olen aloitellut näin:

tiedosto = open("merkkijonoja.txt","r")
rivit = tiedosto.read()
sisältö = rivit[:-1]

tiedosto.close()

for rivi in sisältö:
	testi = rivi.isalnum()
	print(rivi,"kelpaa salasanaksi.")

Auttakaa avutonta :)

TuomasK [02.07.2015 22:00:13]

#

Ei kerrota nyt ihan suoraa vastausta, oppii paremmin ;)

Putkan python-oppaassa kerrotaan tiedostojen käsittelystä

Myöskin pythonin dokumentaatiossa kerrotaan asiasta tässä kohdassa.

Chiman [04.07.2015 13:11:26]

#

Aloittajan koodissa on yksi tai useampi virhe, jotka johtuvat siitä, ettei ohjelman jotkin koodirivit toimi kuten on ajateltu. Aloittelijalle helposti opittavin tapa löytää virheitä on lisätä koodin joukkoon print-käskyjä, joiden avulla muuttujien sisältö saadaan näkyviin. Kun tulostettua sisältöä vertaa omaan käsitykseen siitä mitä niiden pitäisi olla, virhekohta voidaan löytää.

Joskus aito syöte on epäkäytännöllisen pitkä virheiden etsimiseen, joten sen tilalla kannattaa käyttää lyhyempää korviketta. Tässä tapauksessa alkuun pääsee luomalla merkkijonoja_lyhyt.txt-tiedosto, johon voi laittaa esim. rivit

abc
d2e
u+v

ja käyttämällä tätä tiedostoa koodissa. Sen jälkeen lisätään koodiin tulostukset, tässä esimerkkinä vain alku:

tiedosto = open("merkkijonoja_lyhyt.txt","r")
print('tiedosto', tiedosto)
rivit = tiedosto.read()
print('rivit', repr(rivit))
sisältö = rivit[:-1]
print('sisältö', repr(sisältö))

joka suoritettaessa tulostaa:

tiedosto <_io.TextIOWrapper name='merkkijonoja_lyhyt.txt' encoding='UTF-8'>
rivit 'abc\nd2e\nu+v\n'
sisältö 'abc\nd2e\nu+v'

(repr-funktio printin sisällä auttaa näyttämään merkkijonot tiiviisti ja selkeästi)

Eli "rivit" on yksi merkkijono, jonka sisällä \n-merkit ovat rivinvaihtomerkkejä. "sisältö" on muuten sama, mutta viimeinen rivinvaihtomerkki on poistettu. Selvästi tämä ei ollut aloittajan tarkoitus.

Myöhempi for-silmukka on periaatteessa oikea valinta, mutta kun sillä käydään läpi yksittäistä merkkijonoa, se käsittelee sitä merkki kerrallaan. Oikeampi tapa toimia on saada tiedoston sisältö listaksi rivejä, jolloin for-silmukka käsittelee listaa eli tiedoston sisältöä kokonainen rivi kerrallaan. TuomasK vinkkasi oikeaan suuntaan, eli koodin .read()-kohta pitää vaihtaa muuksi.

Kun koodi toimii oikein, poistetaan ylimääräiset print-rivit ja vaihdetaan syötetiedoston nimi oikeaksi.

Grez [04.07.2015 14:12:06]

#

Chiman kirjoitti:

Aloittelijalle helposti opittavin tapa löytää virheitä on lisätä koodin joukkoon print-käskyjä

Tai sitten opetella käyttämään debuggeria niin voi ajaa koodia rivi kerrallaan tarkastellen mitä tapahtuu ja miten muuttujat käyttäytyy.

Toki yhtä kertaa varten voi olla että printien lisääminen on helpompaa, mutta mielestäni debuggeria kannattaisi opetella käyttämään mahdollisimman aikaisessa vaiheessa.

Chiman [04.07.2015 15:03:41]

#

Grez kirjoitti:

Toki yhtä kertaa varten voi olla että printien lisääminen on helpompaa, mutta mielestäni debuggeria kannattaisi opetella käyttämään mahdollisimman aikaisessa vaiheessa.

Kyllä, jatkon kannalta näin. Tässä tapauksessa yksittäisessä foorumiviestissä ei pysty neuvomaan debuggerin käyttöä tuntemattomassa ohjelmointiympäristössä.

Metabolix [04.07.2015 20:07:25]

#

Samasta tehtävästä on keskusteltu ennenkin.

Chiman [05.07.2015 01:09:05]

#

Kun tehtävä on nyt jokseenkin taputeltu, rohkaisen käyttämään jatkossa with-rakennetta tiedosto-operaatioihin. With-lohkon päättyessä tiedosto suljetaan aina, myös mahdollisissa virhetilanteissa.

with open('merkkijonoja.txt', 'r') as tiedosto:
    for rivi in tiedosto:
        # ...

tai

with open('merkkijonoja.txt', 'r') as tiedosto:
    rivit = tiedosto.readlines()
# ...

gronler [16.07.2015 21:01:00]

#

Kiitos vastauksista. Pääsin näillä eteenpäin ja tehtävä tuli tehtyä.


Sivun alkuun

Vastaus

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

Tietoa sivustosta