Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Arvonta ohjelma ongelma

Sivun loppuun

Höpis [12.03.2006 17:19:00]

#

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?

Olga [12.03.2006 17:31:41]

#

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.

Höpis [12.03.2006 17:37:08]

#

Javalla tuo pitäisi tehdä, mutta kun ei onnistu

Olga [12.03.2006 17:56:33]

#

Mikä ei onnistu? Kerro toki mikä kohta tuottaa vaikeuksia. Täältä kyllä löytyy apua ongelmaan.

Höpis [12.03.2006 18:00:07]

#

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...

Mushi [12.03.2006 18:08:31]

#

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...

Höpis [12.03.2006 18:18:40]

#

Lähdenpäs kokeilemaan tuota ohjelman tekoa=)

Onkos teistä joku täällä vielä 21 jälkeen, jotta saisin näyttää teille aikaansaannokseni?

Mushi [12.03.2006 18:20:33]

#

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...

Höpis [12.03.2006 18:21:31]

#

ei mulla ole tuota IRCciä...
Mutta pistän sen tänne niin voitte kattoa sitä sitten=)

Höpis [12.03.2006 22:49:52]

#

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

tsuriga [12.03.2006 23:55:25]

#

-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

Metabolix [13.03.2006 00:00:27]

#

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.

Höpis [13.03.2006 14:21:51]

#

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?

Blaze [13.03.2006 15:39:15]

#

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.

Höpis [13.03.2006 15:46:11]

#

Kiitoksia...täytyypäs tutkia nuita =)

Mushi [13.03.2006 16:18:30]

#

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..


Sivun alkuun

Vastaus

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

Tietoa sivustosta