L?sningsforslag ukeoppg. 4: 14. - 20. sep (INF1000 - H?st 2013)

_亚博娱乐官网_亚博pt手机客户端登录

Oppgavesett: ukeoppgaver 4.

  1. Utskrift og sum av oddetalls-array: kap. 5, oppg. 1-2 (side 99)
    a) Skriv et program som inneholder en heltalls-array med f?lgende elementer: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19.  Programmet skal inneholde en l?kke som skriver ut indeksen og verdien for alle elementene i arrayen.
    class Oddetall {
      public static void main(String[] args) {
        int[] oddetall = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
    
        for (int i = 0; i < oddetall.length; i++) {
          System.out.println("oddetall[" + i + "] = " + oddetall[i]);
        }
      }
    }
    

    b) Sum av elementene i en array: Vi bruker her samme array som i forrige oppgave: Beregn summen av elementene og skriv ut resultatet.

    int sum = 0; 
    for (int i = 0; i < oddetall.length; i++) { 
      sum = sum + oddetall[i];
    } 
    System.out.println("sum = " + sum);
    
  2. S?ke etter tall i array:
    a) Utvid programmet fra forrige oppgave slik at det ber bruker taste inn et tall, og deretter skriver ut en beskjed om det inntastede tallet finnes eller ikke finnes i arrayen.
    b) Legg ogs? til en l?kke som skriver ut alle verdiene i arrayen som er mindre enn det inntastede tallet.

    import easyIO.*; 
    class Uke3_Terminaloppg3 { 
      public static void main(String[] args) { 
        In tast = new In(); 
        int[] oddetall = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 }; 
    
        // (a) Finnes tallet? 
        System.out.print("Tast inn et tall: "); 
        int tall = tast.inInt(); 
        boolean funnet = false; 
        for (int i = 0; i < oddetall.length; i++) { 
          if (oddetall[i] == tall) { 
            funnet = true; 
          } 
         } 
    
        System.out.print("Tallet " + tall); 
        if (funnet) { 
          System.out.println(" finnes i arrayen"); 
        } else { 
          System.out.println(" finnes ikke i arrayen"); 
        } 
    
        // (b) Skriv ut verdiene < tall: 
        System.out.print("Verdier i arrayen som er < " + tall + ": "); 
        for (int i = 0; i < oddetall.length; i++) { 
          if (oddetall[i] < tall) { 
            System.out.print(oddetall[i] + " "); 
          } 
        } 
        System.out.println(); 
      } 
    }
    
    KJ?REEKSEMPEL: 
    > java Uke3_Terminaloppg3
    Tast inn et tall: 5 
    Tallet 5 finnes i arrayen 
    Verdier i arrayen som er < 5: 1 3 

     

  3. Flerdimensjonal array:

    To-dimensjonale arrayer brukes p? samme m?te som en-dimensjonale, men har to sett med klammer, og gjennomg?s best ved hjelp av to nestede for-l?kker, som vist i f?lgende program:
    import easyIO.*;
    class Array2D {
      public static void main(String[] args) {
    
        int[][] b = new int[3][4];
    
        for (int i = 0; i < 3; i++) {
          for (int j = 0; j < 4; j++) {
    
            b[i][j] = i * j;
    
    	System.out.println(<Hva mangler her?>);
           }
        }
      }
    }
    
    KJ?REEKSEMPEL: 
    > java Array2D
      b[0][0] = 0
      b[0][1] = 0
      b[0][2] = 0
      b[0][3] = 0
      b[1][0] = 0
      b[1][1] = 1
      b[1][2] = 2
      b[1][3] = 3
      b[2][0] = 0
      b[2][1] = 2
      b[2][2] = 4
      b[2][3] = 6
    

    a) Hvor mange elementer er det plass til i arrayen b vist over?

    12 elementer (dvs. 3 x 4)

    b) Hva er array-indeksene til array-elementene i tredje kolonne, og hvilke verdier f?r disse elementene i programmet over?

    Tredje kolonne best?r av array-plassene b[0][2], b[1][2], 
    og b[2][2], og verdiene i disse plassene er henholdsvis: 
    0, 2, og 4.

    c) Fullf?r println-setningen i programmet ovenfor slik at det gir utskriften vist under "Kj?reeksempel".

       System.out.println("b[" + i + "][" + j + "] = "  + b[i][j]);

     

  4. inLine(), inChar(), og ordrel?kke:
    Lag et program som sp?r bruker etter et navn.  Programmet leser navnet inn ved hjelp av inLine() (hvis du bruker EasyIO) eller med nextLine (hvis du bruker Scanner); og "fyller" s? skjermen med navnet ved ? skrive det ut 100 ganger.  Videre skal programmet sp?rre bruker om hun vil gi et nytt navn (j/n).  Svaret leses n? med .inChar("\n\r") hvis du bruker EasyIO (for tips uten EasyIO se "Hint" nedenfor), og hvis det er 'j' gjentas hele prosessen; hvis svaret ikke er 'j' avsluttes programmet. 

    Kj?reeksempel:
    Skriv et navn: Ola Nordmann
    Ola Nordmann Ola Nordmann Ola Nordmann Ola Nordmann Ola Nordmann O
    la Nordmann Ola Nordmann Ola Nordmann Ola Nordmann Ola Nordmann Ol
    a Nordmann Ola Nordmann Ola Nordmann Ola Nordmann Ola  ...osv...
    Gi nytt navn? (j/n): j
    Skriv et navn:
    
    // L?sning med EasyIO:
    import easyIO.*;
    class Navn100 {
      public static void main(String[] args) {
        In tast = new In();
        Out skjerm = new Out();
    
        char svar = 'j'; // Startverdi
        while (svar != 'n') {
    
          skjerm.out("Skriv et navn: ");
          String navn = tast.inLine();
    
          for (int i = 0; i < 100; i++) {
            skjerm.out(navn + " ");
          }
          skjerm.outln();
    
          skjerm.out("Gi nytt navn? (j/n): ");
          svar = tast.inChar("\n\r");
          }
        }
     }
    
    // L?sning uten EasyIO:
    import java.util.*;
    class Navn100 {
      public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
    
          char svar = 'j'; // Startverdi
          while (svar != 'n') {
    
            System.out.print("Skriv et navn: ");
    	String navn = scan.nextLine();
    
    	for (int i = 0; i < 100; i++) {
    	  System.out.print(navn + " ");
    	}
    	System.out.println();
    
    	System.out.print("Gi nytt navn? (j/n): ");
    	svar = scan.nextLine().charAt(0);
          }
        }
     }
  5. Metoder:
    a) Endre strukturen til programmet ditt fra oppgave nr. 4 over slik at det f?lger den typen programstruktur som vi skal bruke i Oblig 2 (vist i skissen nedenfor), dvs. med en liten kontrollklasse ?verst, etterfulgt av en egen klasse for metodene.  Hele programmet med begge klassene lagres i én fil, kalt Navn100.java (dvs. navnet til klassen med metoden main()).  Lag bare én metode i hjelpeklassen, kalt ordrel?kke(), som gj?r alt som st?r i nr. 7 ovenfor.
    import easyIO.*;
    class Navn100 {
      public static void main(String[] args) {
        Hjelpeklasse hj = new Hjelpeklasse();
        hj.ordrelokke();
      }
    }
    
    class Hjelpeklasse {
      In tast = new In();
      Out skjerm = new Out();
    
      String navn;
    
      void ordrelokke() {
        char svar = 'j';
        while (svar != 'n') {
          // Be bruker taste et navn og les det inn med .inLine():
          skjerm.out("Skriv et navn: ");
          navn = tast.inLine();
    
          for (int i = 0; i < antall; i++) {
            skjerm.out(navn + " ");
          }
          skjerm.outln();
    
          // - Sp?r om bruker vil "Gi nytt navn? (j/n):"
          skjerm.out("Gi nytt navn? (j/n): ");
          svar = tast.inChar("\n\r");
        }
      }
    
    }
  6. Mer info: Grunnen til at vi skriver programmet p? denne m?ten med to klasser vil bli klarere n?r vi kommer til kapittel 8, men har sammenheng med at vi ?nsker ? lage gode "objektorienterte" program der vi jobber med "objekter".  I denne skissen er det fem pekere til objekter: args[], hj, tast, skjerm, og navn.

    b) Flere metoder: Endre programmet slik at koden som skriver ut navnet 100 ganger flyttes til en egen metode kalt utskrift().  Husk ? legge inn et kall p? metoden p? det stedet i programmet du flyttet koden fra.
    import easyIO.*;
    class Navn100 {
      public static void main(String[] args) {
        Hjelpeklasse hj = new Hjelpeklasse();
        hj.ordrelokke();
      }
    }
    
    class Hjelpeklasse {
      In tast = new In();
      Out skjerm = new Out();
    
      String navn;
    
      void ordrelokke() {
        char svar = 'j';
        while (svar != 'n') {
          // Be bruker taste et navn og les det inn med .inLine():
          skjerm.out("Skriv et navn: ");
          navn = tast.inLine();
    
          // Kaller metoden utskrift():
          utskrift();
    
          // - Sp?r om bruker vil "Gi nytt navn? (j/n):"
          skjerm.out("Gi nytt navn? (j/n): ");
          svar = tast.inChar("\n\r");
          tast.inLine();  // Se kommentaren litt lenger ned for hvorfor vi trenger denne
          }
        }
      }
      
      void utskrift() {
        for (int i = 0; i < 100; i++) {
          skjerm.out(navn + " ");
        }
        skjerm.outln();
      }
    } 

    c) Inn-parameter: Endre programmet slik at det ogs? sp?r bruker hvor mange ganger navnet skal skrives ut.  Verdien som bruker taster skal overf?res som parameter til metoden utskrift() som du lagde i del (b).  Endre ogs? metoden utskrift(..) slik at den tar imot argumentet ved hjelp av parameteren int antall, slik:  void utskrift(int antall) {
    import easyIO.*;
    class Navn100 {
      public static void main(String[] args) {
        Hjelpeklasse hj = new Hjelpeklasse();
        hj.ordrel?kke();
      }
    }
    
    class Hjelpeklasse {
      In tast = new In();
      Out skjerm = new Out();
    
      void ordrel?kke() {
        char svar = 'j';
        while (svar != 'n') {
          // Be bruker taste et navn og les det inn med .inLine():
          skjerm.out("Skriv et navn: ");
          String navn = tast.inLine();
    
          // Kaller metoden utskrift():
          utskrift(navn);
    
          // - Sp?r om bruker vil "Gi nytt navn? (j/n):"
          skjerm.out("Gi nytt navn? (j/n): ");
          svar = tast.inChar("\n\r");
          tast.inLine();
        }
      }
    
      void utskrift(String navn) {
        for (int i = 0; i < 100; i++) {
          skjerm.out(navn + " ");
        }
        skjerm.outln();
      }
    }
    

    NB! En viktig ting er at easyIO sin inChar() ikke leser linjeskiftet. S? n?r du skriver "j\n" (alts? j og deretter enter) vil den bare lese j, og linjeskiftet blir liggende i minnet. Derfor vil du allerede ha tastet inn informasjon til inLine() n?r du kommer p? toppen av while-l?kken igjen. Det finnes flere m?ter ? fikse dette p?. En av dem er ? skrive en inLine() etter en inChar(), en annen m?te er ? bruke easyIO sin setDelimeter(). Se easyIO sin dokumentasjon for klassen In for ? finne ut mer om dette: http://folk.uio.no/inf1000/easyIO/In.html

  7. Robot: Klasse med metode med en parameter

    Her skal du benytte samme programstruktur som beskrevet i forrige oppgave, med en klasse som inneholder deklarasjon av metoden main, og en som inneholder deklarasjonen av ?vrige metoder.

    a) Skriv en klasse SiHei som inneholder en main-metode. Lag en ny klasse Robot og deklarer en metode i denne som heter hilsen, og som skriver en tekst ut p? skjermen. Metoden skal ha en String-parameter som angir hvilken tekst som skal skrives ut. Metoden skal ikke returnere noe.

    b) Legg et kall p? metoden hilsen fra main-metoden i SiHei, med teksten "Hallo, jeg er roboten Tux" som aktuell parameter. Test at programmet ditt skriver ut teksten "Hallo, jeg er roboten Tux" p? skjermen.

    class SiHei {
      public static void main(String[] args) {
        Robot tux = new Robot();
        // her kaller vi metoden
        tux.hilsen("Hallo, jeg er roboten Tux.");
      }
    }
    
    class Robot {
      // Her er metoden
      void hilsen(String tekst) {
        System.out.println(tekst);
      }
    }
    
Publisert 5. sep. 2013 16:29 - Sist endret 20. sep. 2013 16:23