Ohjelmointi 1/2010, demo 3 vastauksia

1. Tiedon esittäminen tietokoneessa

                   e)      f)                                    g)      h)

a)   11 111
   0101 1111   =  95      95
   0001 1111   =  31      31
 -----------
   0111 1110   = 126     126                                    OK       OK


b) 1 11 111
   0101 1111   =  95      95
   0101 1111   =  95      95
 -----------
   1011 1110   = 190     -66   <=  0100 0001 +1 = 0100 0010    OK        ylivuoto


c)11111 111
   0000 0001   =   1       1
   1111 1111   = 255      -1   <=  0000 0000 +1 = 0000 0001
 -----------
   0000 0000   =   0       0                                   ylivuoto  OK

d)11111 111
   1111 1111   = 255      -1
   1111 1111   = 255      -1
 -----------
   1111 1110   = 254      -2   <= 0000 0001 +1 = 0000 0010     ylivuoto  OK



i)1
   1000 0001   = 129    -127   <= 0111 1110 +1 = 0111 1111
   1111 1110   = 254      -2
 -----------
   0111 1111   = 127     127                                   ylivuoto  ylivuoto

j)
  Tulos on oikein jos
    - positiivisilla luvuilla ei tule ylimääräistä musitinumeroa
    - 2-komplementtiesityksessä vasemman puoleiseen bittiin
      tuleva ja lähtevä muistinumero ovat samoja.
      

2. Muuttujien esittely

1   package demo3;
2   
3   /**
4    * Esitellään muuttujia.
5    * @author vesal
6    * @version 20.9.2008
7    */
8   public class MuuttujatJaTyypit {
9   
10      /**
11       * @param args ei käytössä
12       */
13      public static void main(String[] args) {
14          double tyomatkanPituusPolkupyorallaKm = 9.7; 
15          int  suoritettujenOpintopisteidenMaara = 3; 
16          int  kokoTutkinnonLaajuusOp = 300;
17          double tehtyjaDemoja = 7.5; 
18          char kirjanEnsimmainenKirjain = 'A';
19          double juoksu100mVoittoAika = 9.69;
20  
21          System.out.printf("Työmatka: %3.1f km%n",tyomatkanPituusPolkupyorallaKm);
22          System.out.printf("Opintopisteitä: %d op%n",suoritettujenOpintopisteidenMaara);
23          System.out.printf("Tutkinto: %d op%n",kokoTutkinnonLaajuusOp);
24          System.out.printf("Demoja: %3.1f%n",tehtyjaDemoja);
25          System.out.printf("Kirja alkaa kirjaimella %c%n",kirjanEnsimmainenKirjain);
26          System.out.printf("Usain Bolt: %4.2f s%n",juoksu100mVoittoAika);
27      }
28  
29  }
30  
[JavaDoc-muoto] [Alkuperäinen java]

3. Muuttujien kelpoisuus

int mansikanKiloHinta;            // parempi olisi double
double first,second,final;        // ei ihan kuvaavia, final varattu sana
char omaNimi;                     // nimi ei mahdu char-muuttujaan
double metriMm;                   // voisi olla myös int
double tuntejaVuorokaudessa;      // voisi olla myös int
real nopeus;                      // tyyppiä ei ole (toki voi tehdä, mutta silloin nimi alkaisi isolla
double AuringonEtaisyys;          // nimen olisi hyvä alkaa pienellä
int kuukaudenKeskiLampo:          // tyyppi pitäisi olla double
int kissoja,2_kanaa,kolmeKoiraa;  // 2_kanaa väärin.  Muut voivat olla käyttöyhteydestä riippuen ok.
int i,j,l,I;                      // i ja j kelpaa silmukkaan, l joskus pituutta kuvaamaan, I ei miellellään.

4. Muunnoksia

1   package demo3;
2   /**
3    * Ohjelmalla lasketaan lämpötila ja painomuunnoksia
4    * @author vesal
5    * @version 19.9.2008 
6    *
7    */
8   public class Muunnokset {
9   
10      /**
11       * Muunnetaan Fahrenheit asteet Celsius asteiksi
12       * @param f muunnettava lämpötila Fahrenheit asteina
13       * @return lämpötila Celsius asteina
14       * @example
15       * <pre name="test">
16       *   fahrenheitToCelsius(0)   ~~~ -17.777778;
17       *   fahrenheitToCelsius(32)  ~~~  0;
18       *   fahrenheitToCelsius(100) ~~~  37.777778;
19       *   fahrenheitToCelsius(212) ~~~ 100.0;
20       * </pre>
21       */
22      public static double fahrenheitToCelsius(double f) {
23          return (f - 32.0) * 5.0 / 9.0;
24      }
25  
26      
27      /**
28       * Muunnetaan paunoja (lb) grammoiksi. 
29       * @param painoLb muunnettava paino lb:nä
30       * @return tulos grammoina
31       * @example
32       * <pre name="test">
33       *   paunatGrammoiksi(0) ~~~ 0.0;
34       *   paunatGrammoiksi(1) ~~~ 453.59237;
35       * </pre>
36       */
37      public static double paunatGrammoiksi(double painoLb) {
38          return painoLb*453.59237;
39      }
40  
41      /**
42       * Testataa muunnoksia
43       * @param args ei käytössä
44       */
45      public static void main(String[] args) {
46          double lampotilaF = 13;
47          double lampotilaC;
48          lampotilaC = fahrenheitToCelsius(lampotilaF);
49          System.out.printf("%3.1f F = %3.1f C %n",lampotilaF,lampotilaC);
50          
51          double painoLb = 9.3;
52          double painoG;
53          painoG = paunatGrammoiksi(painoLb);
54          System.out.printf("%5.3f lb = %5.3f g %n",painoLb,painoG);
55          
56      }
57  
58  
59  }
60  
[JavaDoc-muoto] [Alkuperäinen java]

5. Lisää lumiukkoja

1   package demo3;
2   
3   import fi.jyu.mit.graphics.EasyWindow;
4   
5   /**
6    * Piirretäään aliohjelman avulla näytöön 5 lumiukkoa.
7    * @author vesal
8    * @version 19.9.2008
9    */
10  public class Lumiukot3 {
11  
12  
13      /**
14       * Piirtää ikkunaan lumiukon paikkaan (x,y)
15       * @param window ikkuna johon piirretään
16       * @param x lumiukon ison pallon x
17       * @param y lumiukon ison pallon y
18       * @param isonpallonSade alimman pallon säde
19       * @param keskipallonSade mahaa kuvaavan pallon säde
20       * @param paanSade kumipallon pään säde
21       */
22      public static void lumiukko(EasyWindow window, double x, double y, double isonpallonSade,
23              double keskipallonSade, double paanSade) {
24          double keskipallonY    = y-keskipallonSade-isonpallonSade;
25          double paanY           = y-2*keskipallonSade-isonpallonSade-paanSade;
26          window.addCircle(x,y,isonpallonSade);
27          window.addCircle(x,keskipallonY,keskipallonSade);
28          window.addCircle(x,paanY,paanSade);
29      }
30  
31      /**
32       * Piirtää ikkunaan lumiukon paikkaan (x,y)
33       * @param window ikkuna johon piirretään
34       * @param x lumiukon ison pallon x
35       * @param y lumiukon ison pallon y
36       * @param isonpallonSade alimman pallon säde
37       * @param keskipallonSade mahaa kuvaavan pallon säde
38       */
39      public static void lumiukko(EasyWindow window, double x, double y, double isonpallonSade,
40          double keskipallonSade) {
41          lumiukko(window,x,y,isonpallonSade,keskipallonSade,10);
42      }
43  
44      /**
45       * Piirtää ikkunaan lumiukon paikkaan (x,y)
46       * @param window ikkuna johon piirretään
47       * @param x lumiukon ison pallon x
48       * @param y lumiukon ison pallon y
49       * @param isonpallonSade alimman pallon säde
50       */
51      public static void lumiukko(EasyWindow window, double x, double y, double isonpallonSade) {
52          lumiukko(window,x,y,isonpallonSade,15,10);
53      }
54  
55      /**
56       * Piirtää ikkunaan lumiukon paikkaan (x,y) jonka ison pallon säde on 20
57       * @param window ikkuna johon piirretään
58       * @param x lumiukon ison pallon x
59       * @param y lumiukon ison pallon y
60       */
61      public static void lumiukko(EasyWindow window, double x, double y) {
62          lumiukko(window,x,y,20);
63      }
64  
65  
66  
67      /**
68       * Piirretään 5 lumiukkoa
69       * @param args
70       */
71      public static void main(String[] args) {
72          EasyWindow window = new EasyWindow();
73  
74          lumiukko(window,20,100,30);
75          lumiukko(window,30,300,40,20);
76          lumiukko(window,274,190,50,40,30);
77          lumiukko(window,124,150);
78          lumiukko(window,190,130);
79  
80          window.showWindow();
81  
82      }
83  
84  }
85  
[JavaDoc-muoto] [Alkuperäinen java]

6. Lausekkeita

1   package demo3;
2   /**
3    * Lasketaan 
4    * a) vuorokauden sekuntien lukumäärä
5    * b) vuoden tuntien lukumäärä
6    * c) kauanko valolla kuluu aikaa matkaan auringosta maahan
7    * d) valovuosi kilometreinä
8    *  
9    * @author vesal
10   * @version 19.9.2008
11   *
12   */
13  public class Lausekkeet {
14  
15      /** Vuorokauden sekuntien lukumäärä */
16      public static final int SEKUNTEJAVUOROKAUDESSA = 24*60*60;
17  
18      /** Vuoden pituus vuorokausina */
19      public static final double VUODENPITUUSVRK = 365.2425;
20  
21      /** Matka maasta aurinkoon keskimäärin kilometreinä */
22      public static final double MAASTAAURINKOONKM = 149597871;
23  
24      /** Valon nopeus m/s */
25      public static final double VALONNOPEUSMS = 299792458;
26      
27      /**
28       * Lasketaan lausekkeiden arvot
29       * @param args
30       */
31      public static void main(String[] args) {
32          double tuntejaVuodessa = 24 * VUODENPITUUSVRK;
33          double valoMaahanSekuntia = MAASTAAURINKOONKM * 1000 / VALONNOPEUSMS;
34          double valovuosiKm = VALONNOPEUSMS * tuntejaVuodessa * 60 * 60 / 1000;
35          
36          System.out.printf("Vuorokaudessa on %d sekuntia.%n",SEKUNTEJAVUOROKAUDESSA);
37          System.out.printf("Vuodessa on %3.1f tuntia%n",tuntejaVuodessa);
38          System.out.printf("Valolla kestää %4.1f sekuntia auringosta maahan%n",valoMaahanSekuntia);
39          System.out.printf("Valovuosi on %.0f km%n",valovuosiKm);
40  
41      }
42  
43  }
44  
[JavaDoc-muoto] [Alkuperäinen java]

7. Aliohjelmakutsuja

1   package demo3;
2   
3   import fi.jyu.mit.Music.MidiPlayer;
4   
5   /**
6    * Soitetaan Ukko Noa aliohjelmia käyttäen
7    * @author vesal
8    * @version 10.9.2010
9    */
10  public class UkkoNoaTempo {
11  
12      /**
13       * Soitetaan Ukko Noan varsinainen säkeistö
14       * @param mp soitin jolla soitetaan
15       */
16      private static void soitaUkkoNoanSakeisto(MidiPlayer mp) {
17          mp.play("EEEE");
18          mp.play("GF",0.5);
19          mp.play("DDDD");
20          mp.play("FE",0.5);
21      }
22  
23      /**
24       * Soitetaan Ukko Noan kertosäe
25       * @param mp soitin jolla soitetaan
26       */
27      private static void soitaUkkoNoanKertoSae(MidiPlayer mp) {
28          mp.play("CCCEDDDFEEDD");
29          mp.play("C",0.5);
30      }
31  
32      /**
33       * Soittaa Ukko Nooan
34       * @param mp soitin jolla soitetaan
35       */
36      public static void soitaUkkoNoa(MidiPlayer mp) {
37          soitaUkkoNoanKertoSae(mp);
38          soitaUkkoNoanSakeisto(mp);
39          soitaUkkoNoanKertoSae(mp);
40      }
41      
42      
43      /**
44       * @param args ei käytössä
45       */
46      public static void main(String[] args) {
47          MidiPlayer mp = new MidiPlayer();
48          int tempo = 150;
49          mp.setTempo(tempo); soitaUkkoNoa(mp);
50          tempo = (int)(tempo*1.5); 
51          mp.setTempo(tempo); soitaUkkoNoa(mp);    
52          tempo = (int)(tempo*1.5); 
53          mp.setTempo(tempo); soitaUkkoNoa(mp);    
54          
55          // Entä jos olisi aliohjelma jota voisi kutsua: soitaUkkoNoa(mp,tempo); 
56          // ja tempo olisi kutsussa reaaliluku?
57      }
58  
59  
60  }
61  
[JavaDoc-muoto] [Alkuperäinen java]

B1. Merkkijonon metodeja

1   package demo3;
2   
3   import java.util.Scanner;
4   
5   /**
6    * Jono isona ja pienenä
7    * @author vesal
8    * @version 20.9.2008
9    */
10  public class IsoPieni {
11  
12      private static final Scanner lukija = new java.util.Scanner(System.in);
13  
14      
15      /**
16       * Tulostetaan käyttäjä syöttämä jono isona ja pienenä.
17       * @param args ei käytössä.
18       */
19      public static void main(String[] args) {
20          System.out.print("Anna merkkijono >");
21          String jono = lukija.nextLine();
22          
23          System.out.println("Jono isona   : " + jono.toUpperCase());
24          System.out.println("Jono pienenä : " + jono.toLowerCase());
25          
26          int pituus = jono.length();
27          if ( pituus > 3) pituus = 3;
28          System.out.println("Jonon 3. ekaa: " + jono.substring(0,pituus));
29  
30      }
31  
32  }
33  
[JavaDoc-muoto] [Alkuperäinen java]

G1-2. Lumiukot heiluu

1   package demo3;
2   import fi.jyu.mit.graphics.Axis;
3   import fi.jyu.mit.graphics.Circle;
4   import fi.jyu.mit.graphics.DrawableCollection;
5   import fi.jyu.mit.graphics.EasyWindow;
6   import fi.jyu.mit.graphics.MouseFollower;
7   import fi.jyu.mit.graphics.Rotator;
8   
9   /**
10   * Piirretään 3 itsekseen pyörivää lumiukkoa
11   * @author vesal
12   * @version 20.9.2008
13   */
14  public class Lumiukot4 {
15  
16      /**
17       * Piirretään yksi lumiukko, jonka ison pallon
18       * keskipiste on lumiukon keskus.
19       * @author vesal
20       */
21      public static class Lumiukko  extends DrawableCollection {
22          /**
23           * Alustetaan lumiukko paikkaan (x,y)
24           * @param x lumiukon ison pallon x
25           * @param y lumiukon ison pallon y
26           * @param isonpallonSade alimman pallon säde
27           * @param keskipallonSade mahaa kuvaavan pallon säde
28           * @param paanSade kumipallon pään säde
29           */
30          public Lumiukko(double x, double y, double isonpallonSade,
31                  double keskipallonSade, double paanSade) {
32              super();
33              double keskipallonY    = -keskipallonSade-isonpallonSade;
34              double paanY           = -2*keskipallonSade-isonpallonSade-paanSade;
35              move(x,y,0);
36              add(new Circle(0,0,isonpallonSade));
37              add(new Circle(0,keskipallonY,keskipallonSade));
38              add(new Circle(0,paanY,paanSade));
39          }
40          
41          /**
42           * Alustetaan lumiukko paikkaan (x,y)
43           * @param x lumiukon ison pallon x
44           * @param y lumiukon ison pallon y
45           * @param isonpallonSade alimman pallon säde
46           * @param keskipallonSade mahaa kuvaavan pallon säde
47           */
48          public Lumiukko(double x, double y, double isonpallonSade,
49                  double keskipallonSade) {
50              this(x,y,isonpallonSade,keskipallonSade,10);
51          }
52  
53          /**
54           * Alustetaan lumiukko paikkaan (x,y)
55           * @param x lumiukon ison pallon x
56           * @param y lumiukon ison pallon y
57           * @param isonpallonSade alimman pallon säde
58           */
59          public Lumiukko(double x, double y, double isonpallonSade) {
60              this(x,y,isonpallonSade,15,10);
61          }
62  
63          /**
64           * Alustetaan lumiukko paikkaan (x,y)
65           * @param x lumiukon ison pallon x
66           * @param y lumiukon ison pallon y
67           */
68          public Lumiukko(double x, double y) {
69              this(x,y,20,15,10);
70          }
71      }    
72      
73      /**
74       * @param args ei käytössä
75       */
76      public static void main(String[] args) {
77          EasyWindow window = new EasyWindow();
78  
79          Lumiukko ukko1 = new Lumiukko(30,100,30);
80          Lumiukko ukko2 = new Lumiukko(40,300,40,20);
81          Lumiukko ukko3 = new Lumiukko(274,190,50,40,30);
82          
83          window.add(ukko1);
84          window.add(ukko2);
85          window.add(ukko3);
86  
87          new Rotator(ukko1,Axis.Z,3,200);
88          new Rotator(ukko1,Axis.Y,2,200);
89          new Rotator(ukko2,Axis.X,4,200);
90          new Rotator(ukko3,Axis.Z,5,200);
91  
92          new MouseFollower(window.getPanel(),ukko2,0,0,0,true);
93  
94          window.setTitle("Lumiukot heiluu");
95          window.showWindow();
96      }
97  
98  }
99  
[JavaDoc-muoto] [Alkuperäinen java]