Python-taitajat, tarviin pikaista helppiä!!!

Liittynyt
18.05.2020
Viestejä
14
Heipparallaa! Tälläinen harjoitus pitäisi tehdä enkä ollenkaan pääse alkuun mistään suunnasta (vain vähän kokemusta Pythonista). :D Osaisiko joku auttaa alkuun tai mielellään enemmämkin:D?


Harjoitus 11.10
Kirjoita ohjelma, joka ylläpitää yksinkertaista tehtävälistaa. Itse tehtävälista on tallennettuna teksitiedostoon todo.txt, jonka jokainen rivi on oma tehtävänsä. Tiedosto on rakenteeltaan seuraavanlainen

Osta maitoa, 3.9.2017
Koodaa harjoitus 3, 1.9.2017
Mene ajoissa nukkumaan, 12.8.2017
Jokaisesta tehtävästä tallennetaan tehtävän kuvaus ja luontipäivämäärä. Tiedostossa tiedot on erotettu toisistaan pilkulla.

Sisäisesti ohjelma tallentaa tehtävät sanakirjaan, joka on muotoa

{'numero':1,'tehtava':'Tehtävän kuvaus', 'pvm':'pp.kk.vvvv'}
Numero on tehtavaa vastaava rivinumero todo.txt tiedostosta. Tehtävän numeroa ei siis talleteta tiedostoon, vaan se luodaan kun tehtävät luetaan tiedostosta. Kun listaan lisätään uusi tehtävä, ohjelma luo automaattisesti päiväyksen tietokoneen kalenterista ja antaa tehtävälle numeroksi seuraavan vapaan luvun, joka on olemassa olevien tehtävien lukumäärä lisättynä yhdellä. Kun ohjelma lopetetaan, se huolehtii automaattisesti tehtävien tallentamisesta. Kun ohjelma käynnistetään se lukee tehtävät tiedostosta, jos tiedosto on olemassa.

Toteuta ohjelmaan seuraavat aliohjelmat:

avaa_tiedosto(): Avaa todo.txt tiedoston ja lukee tiedoston sisältämät tehtävät sanakirjaan.
tallenna_tiedosto(): Tallentaa sanakirjassa olevat tehtävät todo.txt tiedostoon. Vanha tiedosto korvataan uudella.
lisaa_tehtava(tehtavakuvaus): Luo uuden tehtävän, joka lisätään sanakirjaan.
etsi_tehtavat(paivays): Etsii sanakirjasta kaikki ne tehtävät, jotka on luotu tiettynä päivänä.
poista_tehtava(numero): Poistaa sanakirjasta tehtävän sen numeron perusteella.
listaa_tehtavat(): Tulostaa näytölle kaikki sanakirjan tiedot.
Toteuta ohjelmaan pääohjelma main, jossa on valikkojärjestelmä ohjelman käyttämiseksi:

Tehtävien hallinta
1. Tulosta tehtävät
2. Luo uusi tehtävä
3. Etsi tehtävät
4. Poista tehtävä
5. Lopeta ohjelma.
Anna valintasi: _
 
Kannattaa pilkkoa tehtävää osiin ja tuossa on pyydettykin tehdä aliohjelmina toimintoja. Ekaksi lähtisin kirjoittamaan pseudokoodina ohjelman runkoa, eli vaikka suomeksi suunnitellen, mitä tulisi minnekin.

En väitä itseänikään mestariksi, mutta näyttää siltä, että tämä luonnistuisi itseltäni. Joten ehkä voin auttaa jos ei kiire jo ajanut historiaan tätä aihetta!

Ja koska on kyse harjoitustehtävästä, niin en lähtisi tarjoamaan valmista. Vinkkejä ja suuntaa kylläkin.

Olennaisia kysymyksiä alkuun, onko aliohjelman toteutus tuttua pythonissa? Tähänkin voin opastaa tarvittaessa.
Tästä esim. pikainen vinkki miten pääohjelma main lähtisi toteutumaan:

 
Uusi tunnus ja ensimmäinen postaus. Hmmm, haiskahtaa siltä, että haetaan valmista vastausta koulutehtävään, mutta se ei kyllä onnistu täällä, eikä todennäköisesti muuallakaan. Toisaalta olihan siinä sentään suoraan mainittu, että kyse on harjoitustehtävästä, joten siinä mielessä voi olla ihan vilpitöntäkin avunpyyntöä.

Jonkinlaisen Todo-sovelluksen tekeminen on varmaan jokaisen korkeakoulun Javascript/Python-kurssien tehtävänä, mutta toisaalta minkä koulun ja missä kurssilla on tällainen harjoitustehtävä, jossa ei tarjota tehtävän tekemiseksi riittäviä taustatietoja, ohjeistusta ja tukea? Voisin melkeinpä väittää, että saman kurssin aiemmista tehtävistä, materiaaleista kasaa pienen Googletuksen avulla tuollaisen sovelluksen kohtuullisella työmäärällä. Tai sitten kyse on jostakin jatkokurssista, johon pohjatietovaatimuksena oli perusteet, jotka aloittaja on skipannut?

Vähän vaikea sanoa muutenkaan mitään, kun ei tiedä minkä verran perusteita on hallussa. Kuten edellinen kirjoittaja, en ole minäkään mikään Python-mestari, mutta eiköhän tuollainen sovellus synny joka tapauksessa.
 
Tuossa Kautiumin viestissä olikin omaa ilmaisuani paremmin ajatukseni. Mietteissäni oli kuitenkin myös, että jos on aikaa ja halua oppia _tekemällä_ niin jonkin verran itseltäni löytyisi myös aikaa auttaa, mutta valmista en ole tarjoamassa!

Pikainen googletus vähän aiemmin ei tuottanut suoraan tulosta tästä tehtävästä. Vaikka hieman ehkä työläs, niin ei mahdottoman vaikea harjoitustehtävä. Riippuu paljon yllä mainitusta tehtävän taustasta.

Myöskin huomattavaa apua olisi tietää mitkä osiot ovat vieraita, ja mitä on edes jossain määrin hallussa. Kuten vaikkapa tiedostojen käsittely, esim. avaus, sulku, kirjoitus pythonilla - hallussa vaiko ei?
 
Oikeastaan ehkä hankalin asia tässä onkin se tiedostojen käsittely, että en oikein tiedä missä muodossa koodi pitäisi kirjottaa, että asia tallentuu tekstitiedostolle, tarvitaanko esim. hakasulkeet kun syöttää tiedostoon jotain ja en myöskään osaa avata tiedostoa pythonin avulla. Ali- ja pääohjelmia olen jonkun verran pyöritellyt. Kyseessä on siis tosiaan koulun harjoitustehtävä, loppupään tehtävä. Alkupään asiat eli perus koodin kirjoittaminen, matemaattiset funktiot yms, sovellukset tyyliin "Kirjoita ohjelma, joka tulostaa nimesi 100 kertaa" niin ovat olleet kyllä helppoja, mutta tässä loppupäässä on tullut hieman ongelmia.
Suoraa vastausta en vaadi, mutta meilläkin nyt etäopiskelussa asioita käytiin suhteellisen vähän läpi täältä loppupäästä. Kurssi oikeastaan on jo loppunut, joten sinänsä on kiire ja sinänsä ei, kunhan kurssi valmistuu ennen kuin itse haluaa valmistua koulusta. Olisi siis kiva saada vain vinkkejä, joiden avulla pääsisi alkuun, mistä kannattaisi aloittaa? Varmaan ehkä siitä, että saa kirjoitettua sellaisen koodinpätkän, että voisi syöttää tekstitiedostoon tavaraa, yritin sitäkin mutta joku virheilmoitus tuli. Suoranaisesti nyt en muista mikä se oli kun heitin koko tehtävän jo roskakoriin ku meni hermot :D
 
Tiedostojen avaamiseen ja tallentamiseen kohtuullisen selkeitä ohjeita löytyy mm. w3schoolsin sivuilta, jossa on muutenkin todella paljon hyvää perusmateriaalia -->


Yksi esimerkkikoodi tiedostojen avaamisesta ja tallentamisesta täällä:

 
Tiedostojen avaamiseen ja tallentamiseen kohtuullisen selkeitä ohjeita löytyy mm. w3schoolsin sivuilta, jossa on muutenkin todella paljon hyvää perusmateriaalia -->


Yksi esimerkkikoodi tiedostojen avaamisesta ja tallentamisesta täällä:

Kiitos! En olekaan tuohon sivustoon edes törmännyt, vaikka kuinka paljon onkin tullut surffailtua eri sivustoilla.
 
Jonkun oppilaitoksen julkaisemassa python-oppaassa taitaa olla melkeinpä vastaava ohjelmanpätkä esimerkkiohjelmana jos en ihan väärin muista. Kuitenkin moinen PDF on varsin selkeä opas aloittelijalle kun on vieläpä suomeksi.
 
Jonkun oppilaitoksen julkaisemassa python-oppaassa taitaa olla melkeinpä vastaava ohjelmanpätkä esimerkkiohjelmana jos en ihan väärin muista. Kuitenkin moinen PDF on varsin selkeä opas aloittelijalle kun on vieläpä suomeksi.
Jeps, pitääpä vielä lisää etsiä tietoa. Itse tehtävän tekemiseen palaan vasta huomenna, enää ei aivotoimintaan kyllä kykene tänä iltana :D
 
Täytyisikö tässä tehtävässä siis aluksi tulla käyttäjälle näkyviin tuo valikkojärjestelmä, jossa voi valita, miten haluaa tiedostoa käsitellä (main) ja sen jälkeen aliohjelmat? Eli täytyykö se kirjoittaa ensin, sen jälkeen se osa, miten tiedostolle saa tallennettua jotain. Vai täytyykö koodi aloittaa sillä? Siinä olen vähän hukassa.
 
Täytyisikö tässä tehtävässä siis aluksi tulla käyttäjälle näkyviin tuo valikkojärjestelmä, jossa voi valita, miten haluaa tiedostoa käsitellä (main) ja sen jälkeen aliohjelmat? Eli täytyykö se kirjoittaa ensin, sen jälkeen se osa, miten tiedostolle saa tallennettua jotain. Vai täytyykö koodi aloittaa sillä? Siinä olen vähän hukassa.
Saat itse valita logiikan missä vaiheessa tapahtuu mitäkin. Olennaista on, että käyttäjälle näytetään tuo valikko ja sen perusteella sitten tapahtuu funktioita/aliohjelmia kutsumalla niitä haluttuja asioita. Käyttäjä ei siis tietenkään näe koskaan mitään muuta kuin sen valikon ja tarvittavissa tilanteissa tietenkin myös todo-listauksen sisällön näytöllä.

Ohjelma on mahdollista toteuttaa monella tavalla. Voit siis lukea tiedoston sisällön jo ohjelman käynnistyksen yhteydessä ja sitten käsitellä sitä halutulla tavalla, tai sitten luet sen vasta kun käyttäjä tekee "tulosta tehtävät" -valinnan. Tuossa jälkimmäisessä on vaan sellainen ongelma, että jos käyttäjä valitseekin ensimmäisenä jonkin muun valinnan, niin siitä pitää tulostaa virheilmoitus, tai muistaa muuten käsitellä tilanne. Itse lukisin tiedoston samalla kun ohjelma avataan.

Edit.
Tarkemmin katsottuna ohjeessahan on sanottu että "Kun ohjelma käynnistetään se lukee tehtävät tiedostosta, jos tiedosto on olemassa. "
 
Viimeksi muokattu:
Saat itse valita logiikan missä vaiheessa tapahtuu mitäkin. Olennaista on, että käyttäjälle näytetään tuo valikko ja sen perusteella sitten tapahtuu funktioita/aliohjelmia kutsumalla niitä haluttuja asioita. Käyttäjä ei siis tietenkään näe koskaan mitään muuta kuin sen valikon ja tarvittavissa tilanteissa tietenkin myös todo-listauksen sisällön näytöllä.
Jeps kiitos!
 
Ja siis tosiaan sen verran vielä selvennän, että sen vuoksi eilen luotu käyttäjä vasta, koska en ole koskaan oikein perehtynyt näihin foorumeihin, ei ole tullut aikaisemmin tarvetta ehkä pyytää elektroniikan/tietotekniikan asioihin suoraan tällaisista apua. :D Toivottavasti sulaudun vielä joukkoon ja opin käyttämään tätäkin sivua paremmin.
 
Ja siis tosiaan sen verran vielä selvennän, että sen vuoksi eilen luotu käyttäjä vasta, koska en ole koskaan oikein perehtynyt näihin foorumeihin, ei ole tullut aikaisemmin tarvetta ehkä pyytää elektroniikan/tietotekniikan asioihin suoraan tällaisista apua. :D Toivottavasti sulaudun vielä joukkoon ja opin käyttämään tätäkin sivua paremmin.
Jep, ei siinä mitään, tervetuloa vaan. Joskus vaan näkee kuinka joku opiskelija kuvittelee saavansa valmiin vastauksen harjoitustehtäväänsä ihan vaan postaamalla tehtävän jonnekin foorumille, niin siksi näihin suhtaudutaan hieman varauksella.

Techbbs on muuten paljon muutakun kuin pelkästään IT-foorumi, vaikka käyttäjien edustus vahvasti tekniikkapainotteista onkin.
 
Jep, ei siinä mitään, tervetuloa vaan. Joskus vaan näkee kuinka joku opiskelija kuvittelee saavansa valmiin vastauksen harjoitustehtäväänsä ihan vaan postaamalla tehtävän jonnekin foorumille, niin siksi näihin suhtaudutaan hieman varauksella.

Techbbs on muuten paljon muutakun kuin pelkästään IT-foorumi, vaikka käyttäjien edustus vahvasti tekniikkapainotteista onkin.
Ymmärrän. Ehkä olisi pitänyt itsekin muotoilla aloitusviestini paremmin, jotta asia olisi tullut selkeästi esille eikä ehkä tulisi niin herkästi väärinkäsitystä. Ja joo, itseasiassa kuulin tästä foorumistakin ekaa kertaa vasta eilen kun tänne löysin.
 
Koodi:
tiedosto = open("todo.txt", "a", encoding='utf-8')
tiedosto.write(input("Syötä uusi tehtävä: "))
tiedosto.close()

Tällä sain ainakin tehtävän tallentumaan tekstitiedostoon, mutta mihin kohti tuohon isketään tuo muotoilu, jotta jokainen tehtävä menisi omalle rivilleen? ja en löytänyt ainakaan materiaaleistani suoraan apua siihenkään, miten saa automaattisesti lisättyä päivämäärän ja niin että se olisi erotettu pilkulla itse tehtävästä.
 
Varmaankin tuo uusi tehtävä kannattaisi lukea muuttujaan ja sitten vaikka muodostaa rivi jossa on tuo järjestysnumero, tehtävä ja päivämäärä ja kirjoittaa se valmisteltu rivi tiedostoon. Eli jotenkin vähän tähän tyyliin:
rivi = str(rivinro) + ',' + tehtävä + ',' + paivamaara + '\n'
Muitakin (ehkä parempiakin) tapoja on mutta tuossa nyt yksi tapa. Sitten kirjoittaa tuon rivi -muuttujan tiedostoon. Tuo \n on siis rivinvaihtomerkki.

Ja tietty tuota päivämäärähommaa pitää vähän pohjustaa ennenkuin sen saa tuohon liitettyä eli varmaankin "import date", "import datetime" tms jolla otetaan päivämääräfunktiot käyttöön, en nyt ulkoa muista. Googlella kuitenkin löytyy varsin hyvin dokumentaatiota tuostakin vaikkapa hakusanoilla "python date".
 
En nyt ole Pythonin kanssa ollut 10v tekemisissä, mutta ehkä tässä jotain tipsei.

En tiedä saako tuohon inputtiin kätevästi liitettyä päivämääriä yms. Eli pitäisikö olla joku merkkijono muuttuja mihin tallentaa sen lopullisen rivin joka sitten kirjoitetaan tiedostoon:

tiedosto.write(merkkijono)

Tartteekohan jonkun toisen muuttujan ensin input tekstille:
input = input("syötä uusi tehtävä: ")

Sitten + merkeillä voit yhdistellä eri tietoja stringiin
input + ", " <- lisäisi input muuttujan ja ,

päivämäärä varmaan datetime kirjastosta ( vaatii: import datetime)

\n = end line, jolloin seuraava syöte tulee varmaan uudelle riville. (en kokeillut, mutta google kertoi)

merkkijono varmaan muodostuu jotenkin:

newTodo = input + ", " + datetime.datetime.now().strftime("%x") + "\n"
// strftime() muuntaa ajan merkkijonomuotoon ja muotoilee sen halutusti
tiedosto.write(newTodo)

Tuon päivämäärän formaatin saa vaihdettua vaihtamalla tuon %x .. tuo ei taida olla ihan oikea formaatti kun on erottelu /-viivoilla. Voit varmaan selvitellä itse miten saat oikean, en nopeesti löytäny..

Toivottavasti jotain apua...
 
Kiitos molemmille, lähden kokeilemaan antamianne vinkkejä. Ehkä tää tehtävä joskus tulee valmiiksi. :D
Koitettu on tässä tunnin ajan vaikka mitä ja ainut mitä saan nii kokoajan vaan erilaisia virheilmoituksia :D En ymmärrä yhtään miten saan tehtyä sellaisen koodin että voi itse syöttää tehtävän, en jotenkin saa input-komentoa toimimaan. :/
 
Koitettu on tässä tunnin ajan vaikka mitä ja ainut mitä saan nii kokoajan vaan erilaisia virheilmoituksia :D En ymmärrä yhtään miten saan tehtyä sellaisen koodin että voi itse syöttää tehtävän, en jotenkin saa input-komentoa toimimaan. :/
Koodi:
from datetime import datetime
n = datetime.now()

tiedosto = input("Syötä uusi tehtävä: ")

with open("todo.txt", "w") as f:
    f.write(tiedosto)

Jotain tähän suuntaan lähdin koittamaan ja teksti tallentuu, mutta miten saisin sen päivämäärän vielä lisättyä kun ei toimi jos kirjoitan esim "f.write(tiedosto) +n"?
 
Sanakirjan lukeminen ja kirjoitus txt tiedostoon menee jotenkin:
Koodi:
for rivi < sanakirja lenght
    write (sanakirja[rivi]['tehtava'] +", "+sanakirja[rivi]['pvm'])

print(sanakirja[1]['tehtava']) // tulostaa sanakirjan tehtavan rivi nro 1
päivämäärän saa:
Koodi:
from datetime import date
today = date.today().strftime("%d.%m.%Y")
txt tiedoston lukemiseen ja sanakirjan luomiseen:
 
Viimeksi muokattu:
Sanakirjan lukeminen ja kirjoitus txt tiedostoon menee jotenkin:
for rivi < sanakirja lenght
write (sanakirja[rivi]['tehtava'] +", "+sanakirja[rivi]['pvm'])

print(sanakirja[1]['tehtava']) // tulostaa sanakirjan tehtavan rivi nro 1

päivämäärän saa:
from datetime import date
today = date.today().strftime("%d.%m.%Y")

Sanakirjan lukemiseen ja luomiseen:
Kiitos!
 
Hauska tuo tehtävänanto.. sanakirja.. ja tietorakenteetkin semisti järjettömiä tehtävään, mutta ehkä se ei ole pointti..
Itseasiassa kun mainitsit niin lukaisin tuon tehtävänannon uusiksi ja tosiaan eihän tuo ihan fiksuin tehtävänanto ole. Tosiaan, itsekin säilöisin dataa vähän toisin ja määrittäisin nuo aliohjelmat/funktiot eri tavalla. Lisäksi tuo tehtävänanto on ainakin mun mielestä osittain vähän tulkinnanvarainen. Mutta kyllä tuo harjoitustehtävänä menee...
 
Eikös tuossa tehtävänannossa ole ristiriita?

Kun listaan lisätään uusi tehtävä, ohjelma luo automaattisesti päiväyksen tietokoneen kalenterista ja antaa tehtävälle numeroksi seuraavan vapaan luvun, joka on olemassa olevien tehtävien lukumäärä lisättynä yhdellä.

Jos saa kuitenkin poistaa välistä tehtäviä lennossa, niin seuraava vapaa luku on eri asia, kuin olemassa olevien tehtävien lukumäärä + 1 :kahvi: Tosin näinhän se töissäkin aina menee ja huonot tehtävänannot opettaa hyvin jos niistä selviää

Nyt kun laseja on taas työnnetty kireemmin otsaa kohti, kaksi avaintekijää helpottaa tuota tehtävää valtavasti:

csv — CSV File Reading and Writing — Python 3.8.5 documentation <- helppoa csv-kirjoittelua, separaattorin voi määrittää itse, esim. pilkku + space
13. Enumerate — Python Tips 0.1 documentation <- helpottaa varmasti rivejä iteroidessa noiden tehtävänumeroiden luonnissa
 
Eikös tuossa tehtävänannossa ole ristiriita?

Kun listaan lisätään uusi tehtävä, ohjelma luo automaattisesti päiväyksen tietokoneen kalenterista ja antaa tehtävälle numeroksi seuraavan vapaan luvun, joka on olemassa olevien tehtävien lukumäärä lisättynä yhdellä.

Jos saa kuitenkin poistaa välistä tehtäviä lennossa, niin seuraava vapaa luku on eri asia, kuin olemassa olevien tehtävien lukumäärä + 1 :kahvi: Tosin näinhän se töissäkin aina menee ja huonot tehtävänannot opettaa hyvin jos niistä selviää

Nyt kun laseja on taas työnnetty kireemmin otsaa kohti, kaksi avaintekijää helpottaa tuota tehtävää valtavasti:

csv — CSV File Reading and Writing — Python 3.8.5 documentation <- helppoa csv-kirjoittelua, separaattorin voi määrittää itse, esim. pilkku + space
13. Enumerate — Python Tips 0.1 documentation <- helpottaa varmasti rivejä iteroidessa noiden tehtävänumeroiden luonnissa
Seuraava vapaa luku on aina tehtävien lukumäärä + 1. Jos välistä poistetaan yksi rivi, niin myös tehtävien kokonaislukumäärästä vähennetään 1 ja niin edelleen.
 
Heipparallaa! vaan pauliinaw
Onkohan tämä "Tehtävä lista" asia jo loppuun käsitelty ja mikäli ei, tuleeko tämä python koodi suoritettavaksi Windows vai Linux ympäristössä.
 

Uusimmat viestit

Statistiikka

Viestiketjuista
258 146
Viestejä
4 487 996
Jäsenet
74 159
Uusin jäsen
kahvirommi

Hinta.fi

Back
Ylös Bottom