Ohjelmoinnin perusteiden 4. harjoitusten mallivastaukset / 19.9.2008 Mikko Apiola.

15. Keskiarvojen laskentaa

import java.util.Scanner;

public class Teht15 
{
	private static Scanner lukija = new Scanner(System.in);
	
	public static void main (String [] args) 
	{		
		System.out.println("Keskiarvojen laskenta.");		
		int lkm = 0;
		do
		{
			System.out.print("Anna lukujen määrä (tai 0, jolloin lopetetaan) :");
			lkm = lukija.nextInt();
			if (lkm > 0)
				laskeSyottoKarvo (lkm);	
		}while (lkm > 0);
	}
	
	public static void laskeSyottoKarvo (int lkm) 
	{
		double summa = 0;
		for (int i=1; i<=lkm; i++) 
		{
			System.out.print("Anna " + i + ". luku: ");
			summa += lukija.nextDouble();	
		}
		System.out.println("Keskiarvo on: "+summa/lkm);
	}
}

16. Potenssien laskentaa

import java.util.Scanner;

public class Teht16 
{
	private static Scanner lukija = new Scanner(System.in);
	
	/* pääohjelma, joka tarjoaa potenssin laskentapalvelun */
	public static void main (String [] args) 
	{		
		System.out.println("Potenssien laskentaa!");
		int kanta = pyydaKokLuku("Anna kanta:");
		int eksponentti = pyydaKokLuku("Anna eksponentti:");
		System.out.println("Vastaus:" + potenssiin(kanta,eksponentti));
	}
	
	/* metodi potenssin laskemiseen */
	public static double potenssiin (double kanta, int eksponentti)
	{
		double tulos = 1.0;
			
		for (int i=0; i < itseisarvo(eksponentti); i++)
			tulos *= kanta;
		
		if (eksponentti < 0)
			tulos = 1/tulos;
		
		return tulos;
	}
	
	/* tässä metodi kokonaisluvun lukemiseen tarkastuksen kera */
	private static int pyydaKokLuku( String teksti ) 
	{	
		while (true) 
		{
			System.out.print(teksti);
			if (lukija.hasNextInt()) 			
				return lukija.nextInt();										
			lukija.nextLine();
		} 
	}	
	
	/* metodi, joka palauttaa luvun itseisarvon */
	private static int itseisarvo (int luku) 
	{
		if (luku < 0)
			luku *= -1;
		return luku;
	}
}

17. Radio

public class Radio 
{
	private boolean paalla;
	private int volume;
	private double kanava;
	
	public Radio()
	{
		this.paalla = true;
		this.volume = 5;
		this.kanava = 2300.0;
	}

	public boolean onkoPaalla() { return this.paalla; }
	public int mikaVolume()     { return this.volume; }
	public double mikaKanava()  { return this.kanava; }

	public void kytkeRadio ( boolean paalla ) { this.paalla = paalla; }
	
	public boolean vaihdaKanava ( double kanava )
	{
		if (kanava < 2300.0 || kanava > 26100.0)
			return false;
			
		this.kanava = kanava;
		return true;
	}
	
	public boolean saadaVolume ( int volume )
	{
		if (volume < 0 || volume > 9)
			return false;
		this.volume = volume;
		return true;
	}
	
	/* pääohjelma radion testausta varten */
	public static void main (String [] args) 
	{		
		Radio r = new Radio();
		
		System.out.println("Päällä:" + r.onkoPaalla());	
		System.out.println("Volume:" + r.mikaVolume());
		System.out.println("Kanava:" + r.mikaKanava());
		
		r.kytkeRadio ( false ); // pois päältä
		
		System.out.println("\nPäällä:" + r.onkoPaalla());	
		System.out.println("Volume:" + r.mikaVolume());
		System.out.println("Kanava:" + r.mikaKanava());
		
		r.kytkeRadio ( true ); // päälle taas
		
		boolean b = r.vaihdaKanava ( 1000 );
		boolean b2= r.saadaVolume ( 100 );
		
		System.out.println("\nb:" + b);	// onnistuiko vaihto?
		System.out.println("b2:" + b2);	 // onnistuiko vaihto?
		System.out.println("Volume:" + r.mikaVolume());
		System.out.println("Kanava:" + r.mikaKanava());
		System.out.println("Päällä:" + r.onkoPaalla());	

		boolean b3 = r.vaihdaKanava ( 24000 );
		boolean b4= r.saadaVolume ( 3 );
		
		System.out.println("\nb:" + b3);	// onnistuiko vaihto?
		System.out.println("b2:" + b4);	    // onnistuiko vaihto?
		System.out.println("Volume:" + r.mikaVolume());
		System.out.println("Kanava:" + r.mikaKanava());
		System.out.println("Päällä:" + r.onkoPaalla());	
		
		r.kytkeRadio ( false ); // lopuksi radio suljetaan	
	}
}

18. Sekuntilaskuri

/* Tässä sekuntilaskuri-ratkaisussa pidetään luokan Sekuntilaskuri sisällä ainoastaan
   kirjaa kokonaissekuntimäärästä. Aksessorit laskevat aina tarpeen mukaan sekuntien kokonaismäärästä
   joko tunnit, minuutit tai sekunnit. 

   24 tuntia  = 24*60*60 = 86400 sekuntia
   1 tunti    = 3600 sekuntia
   1 minuutti = 60 sekuntia
*/

public class Sekuntilaskuri 
{
	private int sekunnit;
	
	public Sekuntilaskuri()  { this.sekunnit = 0;  }

	public void lisaaSekunti() 
	{
		if (this.sekunnit == 86399)
			this.sekunnit = 0;
		else
			this.sekunnit++;
	} 

	public int annaTunnit()    { return (this.sekunnit / 3600); }

	public int annaMinuutit()  { return (this.sekunnit - this.annaTunnit() * 3600) / 60; }
	
	public int annaSekunnit()
	{
		int temp = (this.sekunnit - this.annaTunnit() * 3600);
		return temp - ((temp/60)*60);
	}

	public String toString()  
	{ 
		return this.annaTunnit() + ":" 
		     + this.annaMinuutit() + ":" 
		     + this.annaSekunnit();  
	}

	public static void main (String [] args)  /* testipääohjelma */
	{		
		Sekuntilaskuri s = new Sekuntilaskuri();
		
		for (int i = 0; i <= 24*60*60+500; i++)
		{
			System.out.println(s);
			s.lisaaSekunti();
		}
	}
}

Tässä toinen sekuntilaskuri-ratkaisu.

/*
	Alla toinen sekuntilaskuri-ratkaisu, jossa pidetään luokan sisäisessä toteutuksessa kirjaa
	tunneista, minuuteista ja sekunneista. Sekuntilaskurin ja Sekuntilaskuri2:n toiminta on olion 
	käyttäjän kannalta identtistä.
*/

public class Sekuntilaskuri2
{
    private int tunnit;
    private int minuutit;
    private int sekunnit;

    public Sekuntilaskuri2()  {  this.tunnit = this.minuutit = this.sekunnit = 0;  }

    public void lisaaSekunti() 
	{
        if (this.sekunnit < 59)
            this.sekunnit++;

        else {
            this.sekunnit = 0;
            if (this.minuutit < 59)
                this.minuutit++;
            else {
                this.minuutit = 0;
                if (this.tunnit < 23)
                    this.tunnit++;
                else
                    this.tunnit = 0;
            }
        }
    }

    public int annaTunnit() { return this.tunnit;  }

    public int annaMinuutit() { return this.minuutit;  }

    public int annaSekunnit() { return this.sekunnit;  }

    public String toString()  
    { 
         return this.annaTunnit() + ":" 
             + this.annaMinuutit() + ":" 
             + this.annaSekunnit();  
    }
	
    public static void main (String [] args)  /* testipääohjelma */
    {		
        Sekuntilaskuri2 s = new Sekuntilaskuri2();
		
        for (int i = 0; i <= 24*60*60+500; i++)
        {
            System.out.println(s);
            s.lisaaSekunti();
        }
    }
}

18. MinMax lämpomittari

public class MinMax 
{
	private double minimi;
	private double maksimi;
	private boolean alkutila;
	
	public MinMax() { this.asetaAlkutilaan();  }
	
	public double mikaOnMinimi() { return minimi; }
	
	public double mikaOnMaksimi() { return maksimi; }
	
	public boolean onAlkutilassa() { return alkutila; }
	
	public void asetaAlkutilaan() 
	{ 
		minimi = maksimi = 0;
		alkutila = true; 
	}

	public void kirjaaLampotila(double lampo) 
	{ 
		if (alkutila)
		{
			alkutila=false;
			minimi = maksimi = lampo;
		}
		else
		{
			if (lampo < minimi)
	  			minimi = lampo;
			else if (lampo > maksimi)
				maksimi = lampo;
		}		
	}

	/* pääohjelma */
	public static void main (String [] args) 
	{		
		System.out.println("MinMax lämpötilamittari");

		MinMax mx = new MinMax();
		
		System.out.println("Alkutila:" + mx.onAlkutilassa());
		System.out.println("Minimi:"+ mx.mikaOnMinimi());
		System.out.println("Maksimi:"+ mx.mikaOnMaksimi());
		System.out.println();
		
		mx.kirjaaLampotila(-123.4);
		
		System.out.println("Alkutila:" + mx.onAlkutilassa());
		System.out.println("Minimi:"+ mx.mikaOnMinimi());
		System.out.println("Maksimi:"+ mx.mikaOnMaksimi());
		System.out.println();
		
		mx.kirjaaLampotila(232);
		mx.kirjaaLampotila(234.23);
		mx.kirjaaLampotila(-12.5);
		
		System.out.println("Alkutila:" + mx.onAlkutilassa());
		System.out.println("Minimi:"+ mx.mikaOnMinimi());
		System.out.println("Maksimi:"+ mx.mikaOnMaksimi());
		System.out.println();
		
		mx.asetaAlkutilaan();
		
		System.out.println("Alkutila:" + mx.onAlkutilassa());
		System.out.println("Minimi:"+ mx.mikaOnMinimi());
		System.out.println("Maksimi:"+ mx.mikaOnMaksimi());
		System.out.println();
	}	
}