Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Toisto, kunnes syötetään nolla

Sivun loppuun

kayttaja-12707 [19.02.2014 14:31:34]

#

eli jos joku osaisi vähän neuvoa eli while tehtävä

//kirjoita kaloreita jouleksi ja jouleja kaloreiksi
//muuttava ohjelma siten,että ohjelma mahdollistaa
//useiden joule-/kaloarvojen muuttamisen
//kaloreiksi/jouleksi  ennen kuin se lopettaa
//toimintansa Käyttäjä lopetaa ohjelman
//toiminnan antamalla syöteeeksi nollan,.
package javaharj;

import java.util.Scanner;

public class java17 {
 static Scanner lukija = new Scanner (System.in);

    public static void main(String[] args) {
      double j2k = 0.2390;
        double k2j = 4.184;
        System.out.print("valinta 1 on kalori valinta 2 on joule ");
        int valinta = lukija.nextInt();
        if (valinta == 1) {
            System.out.print("Anna  kalori:");
            double kalori = lukija.nextInt();
            double k2j2 = kalori * k2j;
            System.out.print(kalori + "kaloria on " + k2j2 + "joulea ");
        }

        else if(valinta == 2) {

            System.out.print("Anna  joule:");
            double joule = lukija.nextInt();
            double j3k = joule * j2k;
            System.out.print(joule + "joulea on " + j3k + "kaloria ");}
    }
}

edelisen while tehtävän tein näin

/*Kirjoita ohjelma tarkistaa onko vuosi karkausvuosi,kun ehtona on että
vuosi luvun pitää olla 1800-2015 ohjelma pyytää vuosilukua uudestaaan,
kunnes se annetaan oikein
*/package javaharj;
import java.util.Scanner;

public class java16 {
static Scanner lukija = new Scanner (System.in);
      public static void main(String[] args) {
  System.out.print("Syötä luku 1800-2015 väliltä:");
        int vuosi = lukija.nextInt();

        while(vuosi <1800 ||vuosi>2015){
         System.out.print("Syötä luku on virheelinen Syötä luku 1800-2015 väliltä:");
        vuosi = lukija.nextInt();}
        if((vuosi%4==0 && vuosi%100!=0) || vuosi%400==0)
        System.out.println("on karkausvuosi");
        else
            System.out.println(vuosi+"ei ole karkausvuosi.");
    }
}

Mod. korjasi kooditagit!

jlaire [19.02.2014 15:45:57]

#

Laita toistettavien rivien ympärille silmukka, joka lopetetaan, kun käyttäjä syöttää nollan. Esimerkiksi näin:

while (true) {
    // Lue käyttäjän valinta tässä.

    if (valinta == 0) {
       break;
    }
    else if (valinta == 1) // jne
}

kayttaja-12707 [19.02.2014 18:25:24]

#

vielä on jotain pientä vikaa jos joku tarka silmäinen huomaa olisi hienoa:

package javaharj;

import java.util.Scanner;
import static javaharj.java16.lukija;
public class java18 {
static Scanner lukija = new Scanner (System.in);

    public static void main(String[] args) {
      double j2k = 0.2390;
        double k2j = 4.184;
        while (true) {
        System.out.print("valinta 0 lopetaa valinta 1 on kalori valinta 2 on joule ");
        int valinta = lukija.nextInt();
        if (valinta == 0){
        break:
        }
        else if (valinta == 1) {
            System.out.print("Anna  kalori:");
            double kalori = lukija.nextInt();
            double k2j2 = kalori * k2j;
            System.out.print(kalori + "kaloria on " + k2j2 + "joulea ");
        }

        else if(valinta == 2) {

            System.out.print("Anna  joule:");
            double joule = lukija.nextInt();
            double j3k = joule * j2k;
            System.out.print(joule + "joulea on " + j3k + "kaloria ");}
          valinta = lukija.nextInt();



    }
}

Metabolix [19.02.2014 18:33:17]

#

Luetko ollenkaan niitä kääntäjän virheilmoituksia tms? Etsi vikaa break-sanan läheltä, ja lisäksi laske ohjelmastasi aaltosulut. Jälkimmäisen virheen huomaisit helposti, jos sisentäisit koodin loogisesti: lisää sisennystä aina {-merkin jälkeen ja vähennä }-merkin kohdalla:

plaa {
	plaa {
		plaa
		plöö
	}
	plöö
}

Lisäys: Jos nyt jostain syystä et ole löytänyt virheilmoituksia, etsipä ne. Komentorivillä kääntäjä antaa virheet näin selvästi:

java17.java:15: error: ';' expected
        break:
             ^
java17.java:34: error: reached end of file while parsing
}
 ^

kayttaja-12707 [19.02.2014 18:45:19]

#

Mikä break kohdassa on väärin ohjelma toimii kuitenkin?

//kirjoita kaloreita jouleksi ja jouleja kaloreiksi
//muuttava ohjelma siten,että ohjelma mahdollistaa
//useiden joule-/kaloarvojen muuttamisen
//kaloreiksi/jouleksi  ennen kuin se lopettaa
//toimintansa Käyttäjä lopetaa ohjelman
//toiminnan antamalla syöteeeksi nollan,.
package javaharj;

import java.util.Scanner;

public class java17 {
 static Scanner lukija = new Scanner (System.in);

    public static void main(String[] args) {
      double j2k = 0.2390;
        double k2j = 4.184;
        while (true)   {
        System.out.print("valinta 0 lopetaa valinta 1 on kalori valinta 2 on joule ");
        int valinta = lukija.nextInt();
        if (valinta == 0){
        break:
        }



        if (valinta == 1) {
            System.out.print("Anna  kalori:");
            double kalori = lukija.nextInt();
            double k2j2 = kalori * k2j;
            System.out.print(kalori + "kaloria on " + k2j2 + "joulea ");
        }

        else if(valinta == 2) {

            System.out.print("Anna  joule:");
            double joule = lukija.nextInt();
            double j3k = joule * j2k;
            System.out.print(joule + "joulea on " + j3k + "kaloria ");}
    }
}
}

Shamppa [19.02.2014 20:55:35]

#

Jos et nyt Metabolixin vihjeiden jälkeen vielä sitä huomannnut, niin

break:

tulisi olla

break;

kayttaja-12707 [20.02.2014 10:27:16]

#

miten tämä pitäisi tehdä?
muuta edellistä tehtää sitten , että ohjelma
antaa virheilmoituksen jos syötetty joule/kalomäärä
on negatiivinen ja pyytää siinä tapauksessa arvoa uudestaa
pitäisikö sinne tehdä toinen while lause?
vai voiko tällaista edes tehdä?

package javaharj;

import java.util.Scanner;

public class java19 {
 static Scanner lukija = new Scanner (System.in);

    public static void main(String[] args) {
      double j2k = 0.2390;
        double k2j = 4.184;
        while (true)   {
        System.out.print("valinta 0 lopetaa valinta 1 on kalori valinta 2 on joule ");
        int valinta = lukija.nextInt();
        if (valinta == 0){
        break;
        }



        if (valinta == 1) {
            System.out.print("Anna  kalori:");
            double kalori = lukija.nextInt();
            double k2j2 = kalori * k2j;
            System.out.print(kalori + "kaloria on " + k2j2 + "joulea ");
        }

        else if(valinta == 2) {

            System.out.print("Anna  joule:");
            double joule = lukija.nextInt();
            double j3k = joule * j2k;
            System.out.print(joule + "joulea on " + j3k + "kaloria ");}

    }
}
}

jalski [20.02.2014 10:44:01]

#

kayttaja-12707 kirjoitti:

vai voiko tällaista edes tehdä?

Tarkasta if-lauseessa, jos pienempi kuin nolla niin tulosta virheilmoitus ja continue.

jlaire [20.02.2014 13:36:42]

#

kayttaja-12707 kirjoitti:

pitäisikö sinne tehdä toinen while lause?
vai voiko tällaista edes tehdä?

Voi tehdä. Se on hyvä ratkaisu.

double j2k = 0.2390;
double k2j = 4.184;

...

double k2j2 = kalori * k2j;
double j3k = joule * j2k;

Nimi "j2k" on muuten lyhennys sanoista "joule to kalori". Nimet "k2j2" ja "j3k" toisaalta eivät ole mitenkään loogisia, yksinkertaiset "joule" ja "kalori" olisivat parempia.

(Muoks: Luin tehtävän ensin väärin.)

kayttaja-12707 [20.02.2014 18:59:52]

#

jalski kirjoitti:

kayttaja-12707 kirjoitti:

vai voiko tällaista edes tehdä?

Tarkasta if-lauseessa, jos pienempi kuin nolla niin tulosta virheilmoitus ja continue.

tätäkö tarkoitit?
joo tiedän olen ihan pihalla tämän kanssa
vielä on jotain vikaa

package javaharj;

import java.util.Scanner;
import static javaharj.java18.lukija;

public class java19 {
 static Scanner lukija = new Scanner (System.in);

    public static void main(String[] args) {
      double j2k = 0.2390;
        double k2j = 4.184;
        while (true)   {
        System.out.print("valinta 0 lopetaa valinta 1 on kalori valinta 2 on joule ");
        int valinta = lukija.nextInt();
        if (valinta == 0){
        break;
        }



        if (valinta == 1) {
            System.out.print("Anna  kalori:");
            double kalori = lukija.nextInt();
            double k2j2 = kalori * k2j;
            System.out.print(kalori + "kaloria on " + k2j2 + "joulea ");
        }

        else if(valinta == 2) {

            System.out.print("Anna  joule:");
            double joule = lukija.nextInt();
            double j3k = joule * j2k;
            System.out.print(joule + "joulea on " + j3k + "kaloria ");}

        else if (k2j2< 0) {
        System.out.println("virheilmoitus ");
        continue; }

        else if (j3k<0){
        System.out.println("virheilmoitus ");
        continue; }
        }
    }

jalski [20.02.2014 19:49:18]

#

kayttaja-12707 kirjoitti:

tätäkö tarkoitit?
vielä on jotain vikaa

Ajattele loogisesti... Tuo tarkistus, että onko syötetty luku pienempi kuin nolla tehdään siis tietenkin heti, kun numeerinen syöte on luettu ja muunnettu luvuksi. Missään nimessä tuota ei erilliseen else if - lohkoon kannata yrittää tunkea.

kayttaja-12707 [20.02.2014 21:10:04]

#

jalski kirjoitti:

kayttaja-12707 kirjoitti:

tätäkö tarkoitit?
vielä on jotain vikaa

Ajattele loogisesti... Tuo tarkistus, että onko syötetty luku pienempi kuin nolla tehdään siis tietenkin heti, kun numeerinen syöte on luettu ja muunnettu luvuksi. Missään nimessä tuota ei erilliseen else if - lohkoon kannata yrittää tunkea.

joo kiitos sulle paljon nyt tajusin

package javaharj;

import java.util.Scanner;
import static javaharj.java18.lukija;

public class java19 {
 static Scanner lukija = new Scanner (System.in);

    public static void main(String[] args) {
      double j2k = 0.2390;
        double k2j = 4.184;
        while (true)   {
        System.out.print("valinta 0 lopetaa valinta 1 on kalori valinta 2 on joule ");
        int valinta = lukija.nextInt();
        if (valinta == 0){
        break;
        }




        else if (valinta == 1) {
            System.out.print("Anna  kalori:");
            double kalori = lukija.nextInt();
              if (kalori <0) {
        System.out.println("virheilmoitus ");
        continue; }
            double k2j2 = kalori * k2j;
            System.out.print(kalori + "kaloria on " + k2j2 + "joulea ");
        }

        else if(valinta == 2) {

            System.out.print("Anna  joule:");
            double joule = lukija.nextInt();
             if (joule <0) {
        System.out.println("virheilmoitus ");
        continue; }
            double j3k = joule * j2k;
            System.out.print(joule + "joulea on " + j3k + "kaloria ");}



        }
    }
}

AkeMake [21.02.2014 21:47:45]

#

Eikö teillä opeteta kurssilla koodin oikeaoppista sisennystä, kommentointia ja debuggausta? Itsekin käyn tällä hetkellä Java-kurssia ja meillä kyllä korostettiin alusta asti kuinka tärkeää on kommentoida tekemäänsä koodia, sisentää se oikeaoppisesti ja debugata, jotta virheet saa paikallistettua. Lisäksi testien kirjoittaminen on meillä ollut todella merkittävässä roolissa alusta asti.

Millä ohjelmalla kirjoitatte koodinne? Meillä käytetään eclipseä, jolloin nämä kaikki on melko simppeli toteuttaa. Toki jos kirjoitatte Javaa käsin tekstitiedostoon, ovat nämä jo hiukan työläämpiä. Kyllä silti tällöinkin kannattaa lukemisen helpottamiseksi sisentää koodi loogisesti.

Javassa muuten on tapana kirjoittaa kaikki luokat isolla alkukirjaimella.
Nähdäkseni et käytä tuota javaharj.java18.lukija luokkaa missään, joten se on ylimääräinen turhake.

Laitan alle tuon koodisi sisennettynä ja kommentoituna. Voit siitä huomata, kuinka paljon parempi koodia on lukea ja ymmärtää, kun sisennykset ovat niin kuin pitääkin. Lisäksi koodin kommentointi on hyvä tapa, jolloin vielä myöhemminkin tietää mitä siinä tehdään. Lisäksi oikeaoppinen kommentointi mahdollistaa sen, että tiedostosta voidaan luoda automaattinen dokumentaatio.

package javaharj;

import java.util.Scanner;
// import static javaharj.java18.lukija;

/**
 * Ohjelma, joka muuttaa kalorit jouleiksi ja joulet kaloreiksi.
 * @author kayttaja-12707
 * @version 21.2.2014
 */
public class Java19 {
    static Scanner lukija = new Scanner(System.in);

    /**
     * Tulostaa näytölle paljonko käyttäjän antamat
     * kalorit ovat jouleissa ja joulet kaloreissa.
     * @param args ei käytetä
     */
    public static void main(String[] args) {
        double j2k = 0.2390;
        double k2j = 4.184;
        while (true) {
            System.out.print("valinta 0 lopetaa valinta 1 on kalori valinta 2 on joule ");
            int valinta = lukija.nextInt();
            if (valinta == 0) {
                break;
            } else if (valinta == 1) {
                System.out.print("Anna kalori:");
                double kalori = lukija.nextInt();
                if (kalori < 0) {
                    System.out.println("virheilmoitus ");
                    continue;
                }
                double k2j2 = kalori * k2j;
                System.out.print(kalori + " kaloria on " + k2j2 + "joulea ");
            } else if (valinta == 2) {

                System.out.print("Anna  joule:");
                double joule = lukija.nextInt();
                if (joule < 0) {
                    System.out.println("virheilmoitus ");
                    continue;
                }
                double j3k = joule * j2k;
                System.out.print(joule + " joulea on " + j3k + "kaloria ");
            }

        }
    }
}

kayttaja-12707 [23.02.2014 14:08:10]

#

miten nämä kohdat pitäisi tehdä ottaa
vastaan syötettyjä pistemääriä, kunnes lopuksi syötetään
nolla? Ohjelma tulostaa pisteiden keskiarvon miten tämä kohta kohta pitäisi tehdä?

//kirjoita ohjelma, joka ottaa
//vastaan syötettyjä pistemääriä, kunnes lopuksi syötetään
//nolla. Ohjelma tulostaa pisteiden
//keskiarvon ja pienimmän syötetyn pistemäärän.

package javaharj;
import java.util.Scanner;

public class java21 {

 static Scanner lukija = new Scanner (System.in);
      public static void main(String[] args) {
 int pisteet =0,lisäys,summa;
 double keskiarvo;
 while  (true ){
     System.out.print(" lisätään piste ");
     lisäys = lukija.nextInt();
     while (lisäys < 0 ){
     System.out.print("Lisäys ei voi olla negatiivinen ");
     System.out.print("Anna lisättävä piste uudelleen  ");
     lisäys=lukija.nextInt ();
     }
      summa = pisteet +=lisäys;
     keskiarvo = (double) pisteet / lisäys;

 System.out.println("summa:" + summa + "\n Keskiarvo: " + keskiarvo);
 }

    }

}

Lisäys:

netbeansiä käytetään mutta ei siellä tunnilla paljon mitään opeteta
kyllä tämä menee aika paljon itse opiskeluksi

Teuro [23.02.2014 14:30:38]

#

Meniskö ihan näin

//kirjoita ohjelma, joka ottaa
//vastaan syötettyjä pistemääriä, kunnes lopuksi syötetään
//nolla. Ohjelma tulostaa pisteiden
//keskiarvon ja pienimmän syötetyn pistemäärän.

package javaharj;
import java.util.Scanner;

public class java21 {
	static Scanner lukija = new Scanner (System.in);
	public static void main(String[] args) {
		int pisteet = 0;
		double summa;
		double keskiarvo;
		double maara = 0;
		double pienin = 1000;

		while (true){
			System.out.println("lisätään piste ");
			pisteet = lukija.nextDouble();

			if (pisteet < 0) {
				System.out.println("Lisäys ei voi olla negatiivinen ");
				System.out.println("Anna lisättävä piste uudelleen  ");
			    continue;
		    } else if(pisteet == 0) {
				break;
			}

			if (pisteet < pienin) {
				pienin = pisteet;
			}

			summa += pisteet;
			++maara;
		}

		keskiarvo = summa / maara;
		System.out.println("summa: " + summa + "\r\n Keskiarvo " + keskiarvo + "\r\n" + "pienin oli: " + pienin);
	}
}

Syötteenluku lisätty

Grez [23.02.2014 14:54:19]

#

Teuro kirjoitti:

Meniskö ihan näin

En usko. Tuo:
- ei lue mitään syötettä käyttäjältä
- ei osaa antaa virheilmoitusta jos syötetty arvo olisi negatiivinen (viitaten alla olevaan)

kayttaja-12707 kirjoitti:

muuta edellistä tehtävää sitten, että ohjelma
antaa virheilmoituksen jos syötetty joule/kalomäärä
on negatiivinen

Metabolix [23.02.2014 16:15:39]

#

kayttaja-12707 kirjoitti:

miten nämä kohdat pitäisi tehdä

Tällä hetkellä tärkeämpi kysymys on, kenen ne pitäisi tehdä. Opitko oikeasti ohjelmointia sillä, että teet yhden rikkinäisen yrityksen ja tulet sitten tänne pyytämään siihen korjauksia? Oletko analysoinut saamiasi ratkaisuja niin, että ymmärtäisit, miksi ne toimivat ja miksi oma koodisi ei toiminut?

Sinun pitää alkaa itse ratkaista noita ongelmiasi, jos haluat oppia. Ohjelmointi ei ole mikään salatiede, jossa pitää osata ulkoa oikea koodi, vaan ohjelmointi on logiikkaa. Valmiin ratkaisun pyytäminen on harvoin oikea tapa ”opiskella” perusasioita. Älä siis laita tänne tehtävänantoa ja koko rikkinäistä koodia vaan ota itse selvää, mitä koodisi tekee ja miksi se tekee niin, ja mieti itse loogisesti, minkälainen muutos tarvitaan, jotta se tekisi eri tavalla. Ota kynä ja paperia ja mieti rivi kerrallaan, miten koodisi etenee ja mitä eri muuttujissa on.

Nytkin jos viitsisit miettiä edes pari sekuntia eri muuttujien sisältöä, varmaan tietäisit, miksi ”pisteet / lisäys” ei voi olla oikea laskulauseke keskiarvon laskemiseen.

Oikea lähestymistapa tehtävään olisi alunperinkin tällainen: Mitä tarvitaan keskiarvon laskemiseen? Lukujen määrä ja summa. Mitä määrä ja summa ovat koodin alussa? 0 ja 0. Miten määrä ja summa muuttuvat, kun luetaan uusi luku? Summa kasvaa luvun verran ja määrä kasvaa yhdellä. Miten määrästä ja summasta saa keskiarvon? Jakolaskulla. Jos et osaa ratkaista jotain ongelmaa kokonaisena, kirjoita se ensin suomeksi ja jaa se pienempiin osiin, kunnes osaat ratkaista osat. Esimerkiksi tämän keskiarvotehtävän koodia voisi kehitellä näin:

Vaihe 1: Mikä on tehtävä?

// TODO: Pyydä lukuja ja laske niiden keskiarvo.

Vaihe 2: Ratkaisuun vaaditaan lukujen määrä ja summa, ja keskiarvon laskeminen on varmaan tuttu juttu. Toteutetaan ne osat mutta jätetään lukujen pyytäminen myöhemmäksi.

int määrä = 0, summa = 0;
// TODO: Pyydä lukuja ja laske niiden määrä ja summa.
System.out.println("Keskiarvo: " + ((double)summa / (double)määrä));

Vaihe 3: Lukujen pyytämiseen tarvitaan selvästi silmukka ja nextInt, ja lisäksi pitää tarkistaa negatiiviset luvut ja nolla ja muuttaa summaa ja määrää oikein.

int määrä = 0, summa = 0;
while (true) {
	System.out.print("Anna luku: ");
	int luku = lukija.nextInt();
	// TODO: Jos luku on negatiivinen, pyydä uusi.
	// TODO: Jos luku on nolla, lopeta silmukka.
	// TODO: Muuta summaa ja määrää.
}
System.out.println("Keskiarvo: " + ((double)summa / (double)määrä));

Vaihe 4: Loput palat ovat tarpeeksi helppoja, joten tehdään ohjelma valmiiksi.

int määrä = 0, summa = 0;
while (true) {
	System.out.print("Anna luku: ");
	int luku = lukija.nextInt();
	while (luku < 0) {
		System.out.println("Negatiivinen luku ei kelpaa!");
		System.out.print("Anna luku: ");
		luku = lukija.nextInt();
	}
	if (luku == 0) {
		break;
	}
	määrä += 1;
	summa += luku;
}
System.out.println("Keskiarvo: " + ((double)summa / (double)määrä));

kayttaja-12707 kirjoitti:

kyllä tämä menee aika paljon itse opiskeluksi

Opiskele sitten äläkä vain kysele. Jos oman kurssisi materiaalit eivät auta opiskelussa, tee vaikka MOOC.

kayttaja-12707 [23.02.2014 19:52:19]

#

Oletko nyt täysin hakoteillä?

//Kirjoita ohjelma,
//joka pyytää käyttäjältä 15 positiivista kokonaislukua ja tulostaa
//niiden summan. Ohjelma kelpuuttaa syötteiksi vain positiiviset luvut.
//Virheellisestä
//syötteestä tulostetaan ilmoitus ja lukua pyydetään uudelleen
//(tarvittaessa toistuvasti). Toteuta ohjelmasi kahdella eri tavalla:
//a)while-silmukalla, b)for-silmukalla

package javaharj;

import java.util.Scanner;

public class java20 {
    static Scanner lukija = new Scanner(System.in);

    public static void main(String[] args) {
        int summa, syötetytLuvut = 1, lisäys;
        while(syötetytLuvut < 15) {

            System.out.print(" lisätään luku ");
            lisäys = lukija.nextInt();
            while(lisäys < 0) {
                System.out.print("Lisäys ei voi olla negatiivinen ");
                System.out.print("Anna lisättävä luku uudelleen  ");
                lisäys = lukija.nextInt();
            }
           syötetytLuvut += 1;
            summa += lisäys;
            System.out.println("kokanaislukujen summa on   "+summa +"");
        }
    }
}

Metabolix [23.02.2014 20:03:46]

#

Luepa edellinen viestini uudestaan ja mieti itse (sekä sitä viestiä että koodiasi). Sinun pitäisi aika helposti kokeilemalla itsekin tietää, oletko hakoteillä. Pystytkö ajamaan tuon koodin? Jos et pysty, millainen virheilmoitus tulee ja osaatko korjata sen? Jos taas pystyt, mitä tapahtuu ja miten tulos eroaa toivotusta?

Jos et nyt todellakaan halua opetella ohjelmoimaan itse, voit googlata tehtäviin valmiita ratkaisuja.

Lisäys: Näköjään kyselet muuallakin. Pahasti näyttää, että ei taida olla tavoitteena oppiminen vaan ratkaisujen pummaus. Nyt loppuu tuollainen!


Sivun alkuun

Vastaus

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

Tietoa sivustosta