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 :)
Ei kerrota nyt ihan suoraa vastausta, oppii paremmin ;)
Putkan python-oppaassa kerrotaan tiedostojen käsittelystä
Myöskin pythonin dokumentaatiossa kerrotaan asiasta tässä kohdassa.
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.
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.
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ä.
Samasta tehtävästä on keskusteltu ennenkin.
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() # ...
Kiitos vastauksista. Pääsin näillä eteenpäin ja tehtävä tuli tehtyä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.