Hei!
Mulla ois hivenen kinkkinen tehtävä, joka ei oikein aukea mulle...
Ohjelma arpoo satunnaisluvun väliltä 1 –100. Käyttäjä arvaa koneen arpomaa lukua max viisi kertaa. Jos arvaus on liian suuri, tulostetaan sana High. Jos se on liian pieni, tulostetaan Low. Arvaamista jatketaan kunnes käyttäjä arvaa oikean luvun tai arvauskerrat tulee täyteen. Ohjelma tulostaa lopuksi arvauskertojen määrän.
Jotain olen saanut tuohon väsättyä eli itse arvonnan, mutta siihen se jäikin...oisko jollain viisautta tohon?
Eipä se enää muuta sitten vaadikaan kuin simppelin silmukan, jossa arvausta kysytään ja sitä kommentoidaan arvauksesta riippuen. Silmukasta poistutaan tietyin ehdoin, eli mikäli arvauskerrat ovat tulleet täyteen tai käyttäjän arvaama luku täsmää arvotun luvun kanssa. Ja jokaisen arvauksen yhteydessä kasvatat alussa nollaksi alustettua muuttujaa yhdellä, jolloin lopuksi voit tulostaa nuo arvauskerrat.
Et kieltä maininnut viestissäsi, mutta tässä tilanteessa se onkin epäolennaista sillä tuolla periaatteella sen voit tehdä, oli käytetty ohjelmointikieli sitten mikä tahansa.
Javalla tuo pitäisi tehdä, mutta kun ei onnistu
Mikä ei onnistu? Kerro toki mikä kohta tuottaa vaikeuksia. Täältä kyllä löytyy apua ongelmaan.
Tuo koko homma on mulle hepreaa tuosta arvonnan jälkeen...Mie en oikeasti tajua tuota!
Mie en oikein tiedä, että mistä alkaisin purkaan tuota vyyhtiä...mulla tosin ois yks lotto arvonta ja mietin oisko siitä apua...
Mä olen tehnyt vastaavan ohjelman Do-While silmukan avulla.
Ensin arvotaan luku ja siten aloitetaan Do-silmukka jossa otetaan vastaan arvaus, verrataan arvausta arvottuun lukuun ja lisätään kertoja++.
Tämä ohjelma tosin ottaa arvauksia niin kauan vastaan, että arvaus menee oikein.
Voit omaan ohjelmaasi lisätä "jatketaanko"-muuttujan joka voi olla boolean tyyppinen ja on oletusarvoisesti true, mutta muuttuu falseksi jos arvataan oikein tai 5 kertaa tulee täyteen.
Ohjelman pseudokoodi voisi olla tälläinen:
-Arvotaan luku
-Aloitetaan do silmukka
-Arvauskerrat++
-Otetaan vastaan arvaus
-Jos arvaus == luku, jatketaanko = false
-Muuten jos arvaus < luku, "Low", tai arvaus > luku, "High"
-Jos arvauskerrat == 5, jatketaanko = false
-Lopetetaan do-silmukka: while(jatketaanko)
Ongelmaksi jää enään se, arvattiinko oikein vai loppuiko arvauskerrat, mutta myös sen pystyy kiertämään taas uudella boolean muuttujalla ja tarkistamalla sen totuusarvon silmukan suorittamisen jälkeen...
Toivottavasti ymmärsit edes vähän mitä yritin tässä neuvoa.. :)
Se piti vielä sanoa, että kun ilmeisesti olet uusi koodauksen maailmassa, niin erittäin usein ongelman ratkaisut hahmottuvat itselleen vasta kun jotain tuhertaa paperille. Suosittelen opettelemaan tekemään yllä olevan esimerkin mukaisia pseudokoodeja joko noin tekstiä kirjoittamalla, tai sitten merkkejä piirtämällä..
Ainakin useimman kinkkisimmäntuntuisista herjoitustehtävistä mitä oppikirjoissa esitellään ovat loppujen lopuksi äärimmäisen helppoja koodata, kun ratkaiseen tehtävän eka paperille ja sitten sen avulla "kopioi" ratkaisun koneelle...
Lähdenpäs kokeilemaan tuota ohjelman tekoa=)
Onkos teistä joku täällä vielä 21 jälkeen, jotta saisin näyttää teille aikaansaannokseni?
IRCnetin kanavalla #ohjelmointiputka todennäköisesti ainakin on porukkaa paikalla, jos täältä ei ketään löydy.. Kannattaa käydä sielä esittelemässä tuotoksiaan...
ei mulla ole tuota IRCciä...
Mutta pistän sen tänne niin voitte kattoa sitä sitten=)
Ok..Meni hieman myöhään tän tehtävän tekeminen!
Mulla olis nyt tässä kaksi erilaista versioita, jotka ei toimi mitenkään päin!
Toivottavasti saan teiltä "korjaus" avun tähän tehtävään...
ELI
A TEHTÄVÄ:
Public Class A { Public static void main (String [] args) { int lukujenLkm = 1; int arvottuluku = 1; int kierroslaskuri = 1; boolean oikein=false; lukujenLkm = Lue.koko("Arvaa Luku"); While(kierroslaskuri<lukujenLkm) { arvottuluku=arvonta(); voitto=5; System.out.println("Uusi arvaus); do { int arvaus=Lue.koko("Arvaa Luku); if(arvottuluku==arvaus){ oikein=true; System.out.println("Oikein"); if (luku <= arvaus) System.out.println("Low") if (luku >= arvaus) System.out.println("High") } else if(arvottuluku==arvaus){ väärin=false; System.out.println("Väärin"); } } } System.out.println("Arvottiin" + lukujenLkm + "lukua" + (double)lukujenLkm); Public static int arvonta() { int luku = (int) ( 101*Math.random()); return luku; } }
JA SITTEN B TEHTÄVÄ:
Public Class b { Public static void main (String [] args) { System.out.println("Arvaa Luku"); Random rand = new Random(); int arvottuLuku = rand.nextInt(101); int arvottujenLkm = 1; while (arvottuLuku != && arvottujenLkm < 5) { arvottuLuku = rand.nextInt(101); arvottujenLkm++; } do { int arvaus=Lue.koko("Arvaa Luku); if(arvottuluku==arvaus){ oikein=true; System.out.println("Oikein"); if (luku <= arvaus) System.out.println("Low") if (luku >= arvaus) System.out.println("High") } else if(arvottuluku==arvaus){ väärin=false; System.out.println("Väärin"); } } } System.out.println("Arvottiin" + arvottujenLkm + "lukua" + (double)arvottujenLkm); } } Public static int arvonta() { int luku = (int) ( 101*Math.random()); return luku; } }
KUTEN HUOMAATTE OLEN TOIVOTON =(
Mod. edit: autetaan auttaja alkuun, ts. kooditagit
-public kirjoitetaan pienellä
-komentorakenteet, kuten while, kirjoitetaan pienellä
-sisennykset ovat hirviät
-tuossa on lähinnä loogisia, ei niinkään ohjelmallisia virheitä
Ensinnäkin asennat jonkun editorin, joka tukee koodivärjäystä. Javasta kun on kyse niin vaikka JCreatorin. Minkä vain, millä näkee väreissä heti, jos koodissa on syntaksivirheitä lainausmerkeissä tai puutteita lohkomerkinnöissä ({}-merkit).
Suosittelen lukemaan joko Arto Wiklan Java-oppaan tai tutustumaan Javalaan.
Tämä minun kommentoima koodini tuskin kääntyy sellaisenaan (olisi varmaan ensimmäinen kerta :]), ja sieltä on voinut jäädä jotain vielä huomaamati.
// Muokkasin siis luokkaa, joka alkuperäiseltä nimeltään oli A. public class Arvaus { public static void main(String [] args) { int arvottuluku = 1; // satunnaisluku, jota käyttäjä yrittää arvata int kierroslaskuri = 1; // tällä pidetään kirjaa kuluneista kierroksista int arvaus = 1; // käyttäjän arvaus // boolean oikein=false; tämän voit korvata break-rakenteella // arvotaan luku, jota käyttäjä lähtee arvailemaan arvottuluku=arvonta(); // arvo // kehotetaan käyttäjää syöttämään jokin luku ja luetaan se System.out.print("Arvaa luku: "); arvaus = Lue.kluku(); // halutaan toistaa enintään 5 kertaa (katso oppaista muuttuja++:n merkitys) while(kierroslaskuri++ < 5) { // arvottuluku=arvonta(); <-- tämän pitää olla toistorakenteen ulkopuolella, muuten luku arvotaan aina uusiksi // voitto=5; // tämä on turha, eikä läpäisekään kääntäjää, koska sille ei ole määritelty tyyppiä System.out.print("Uusi arvaus: "); // tästä puuttui lainausmerkki, kannattaa käyttää koodin värjäävää editoria // do(-while?)-rakenne on tässä turha (ja puutteellinen), kannattaa lukea oppaista rakenteen oikeanlainen käyttö // do { // Lue-luokassa metodin nimi on "kluku", ei "koko" // eikä sille anneta parametreja int arvaus=Lue.kluku(); // jos arvataan oikein, lopetetaan toisto break-rakenteella if(arvaus == arvottuluku) { System.out.println("Oikein!"); break; } // tässä ei tarvitse tarkastella, onko arvaus yhtä suuri kuin arvottu luku if (arvaus < arvottuluku) System.out.println("Low") // tässäkään ei tarvitse tarkastella, onko arvaus yhtä suuri kuin arvottu luku // itse asiassa, tässä ei tarvitse tarkastella mitään, sillä kaikki muut mahdolliset // tilanteet on jo käyty läpi (tilanne 1: arvaus = arvottu, tilanne 2: arvaus < arvottu) else System.out.println("High") /* Tässä on yksi ajatusvirheistä. Ensinnäkään totuusarvomuuttujaa väärin ei ole määritelty, ja * jos se asetetaan epätodeksi, niin miksi silti tulostetaan, että käyttäjä olisi arvannut väärin? else if(arvottuluku==arvaus){ väärin=false; System.out.println("Väärin"); } */ } // while loppuu // doubleksi muuttaminen lienee tässä turha? // veikkasin, että tässä oli tarkoitus tulostaa arvausten lukumäärä System.out.println("Arvauksia kertyi " + kierroslaskuri + "kappaletta"); } // main-metodi loppuu public static int arvonta() { int luku = (int) ( 101*Math.random()); return luku; } // metodi arvonta loppuu } // luokka Arvaus loppuu
Tekisit viisaasti, kun tekisit kuten tsuriga sanoi ja hankkisit kunnon editorin. Lisäksi suosittelen java-kääntäjää, jonka virheilmoituksista näkee usein suoraan, mikä on vialla.
Kiitän teitä ja kumarran avustanne!!!!Olette kyllä ihania, kun autoitte=)
Minulla on yksi kääntäjä koneella, mutta se ei oikein toimi enkä tiedä mikä siinä mättää.
Voisitteko suositella minulle jotakin kunnon editoria?
Javalle löytyy ihan ilmaiseksikin useampiakin raskaansarjan IDEjä, mm. Eclipse ja NetBeans, itse olen käyttänyt ihan laadukasta tekstieditoria (Vim).
Lisäksi haluan erikoismainita erityisesti opetuskäyttöön suunnitellun BlueJ:n, jolla voi kätevästi ja havainnollisesti kokeilla koodia.
Kiitoksia...täytyypäs tutkia nuita =)
Kun luin nuo sinun kirjoittamat koodipätkät, niin väkisinkin muistui mieleen vielä yksi kikka, kuinka ehkäistä virheitä koodissa. Eli jos tai KUN sinulle on epäselvää kuinka jokin metodi toimii, tai mikä ikinä liekään, niin kannattaa kaivaa esiin kyseisestä asiasta kirjoitettu dokumentaatio ja tarkistaa miten se nyt menikään..
Tässä tapauksessa erityisesti viittaan tuohon Do-While komentoon, mutta se kannattaa kyllä yleistää lähes kaikkeen..
Se ei ole mitenkään häpeä tarkistaa ihan perus juttujen toimintaa (esim itse juuri eilen jouduin katselemaan esimerkkiä oppikirjasta kuinka Switch-komentoja koodattiinkaan), se tarkistaminen vain yleensä säästää mielettömästi aikaa..
Aihe on jo aika vanha, joten et voi enää vastata siihen.