L?sningsforslag ukeoppg. 1:  24. ? 30. aug (INF1000 - H?st 2011)

Et f?rste m?te med Java (kapittel 1 i l?reboka, "Rett p? Java" 3. utg.)

M?l
I f?rste datarom-time skal du greie ? skrive dine f?rste Java-programer og f? de til ? fungere. P? timene med tavleundervisning (seminartimene) f?r du mer informasjon om Java-programmering og kurset generelt, og gjennomgang av noen av oppgavene.

[N?kkeloppg.]: Oppgave merket med n?kkelsymbol er plukket ut som spesielt representativ for de viktigste temaene fra ukens forelesning, og alle b?r ha som minimumsm?l ? l?se denne selvstendig.

Oppgaver

  1. Det f?rste programet:  kap. 1, oppg. 1 (side 25 i l?reboken)
    Lag et program som skriver f?lgende tekst p? skjermen:
    Rachmaninovs 3. klaverkonsert har et vakkert ?pningstema
    
    Velg selv hvilket navn du vil gi klassen.

    Tips: Les f?lgende veiledning:
    L?sningsforslag:
    Lagre f?lgende programkode i en fil kalt "Rach3.java":
    class Rach3 {
        public static void main(String[] args) {
            System.out.println("Rachmaninovs 3. klaverkonsert har et vakkert ?pningstema");
        }
    }
    Kj?reeksempel:
    > javac Rach3.java
    > java Rach3
    Rachmaninovs 3. klaverkonsert har et vakkert ?pningstema
    


  2. Kompilerings- vs. kj?refeil:  kap. 1, oppg. 2 (side 25)
    Med utgangspunkt i programmet nedenfor skal du utf?re de angitte endringene en for en. Pr?v f?rst ? kompilere programmet og studér eventuelle feilmeldinger. Dersom programmet lar seg kompilere, s? fors?k ? kj?re det. For hvert fors?k skal du rette programmet tilbake til utgangspunktet og kontrollere at det virker. Her er programmet (som skrives inn i en fil med navnet Studie.java):
    class Studie {
        public static void main(String[] args) {
            System.out.println("Rett p? Java");
        }
    }
    
    1. Fjern ordet static.
    2. Fjern ordet void.
    3. Skriv studie i stedet for Studie.
    4. Skriv Skr?tt i stedet for Rett.
    5. Fjern den siste kr?llparentesen.
     a. Uten n?kkelordet 'static' f?r vi denne feilmeldingen ved kj?ring:
    
        > javac Studie.java
        > java Studie.java
        Exception in thread "main" java.lang.NoSuchMethodError: main
    
        Programmet lar seg kompilere (med kommandoen javac), men alts? ikke
        kj?re (med java) fordi det mangler en main-metode av riktig type.
    
     b. N?r vi fjerner n?kkelordet 'void' gir javac feilmeldingen:
    
        > javac Studie.java
        Studie.java:2: invalid method declaration; return type required
            public static main(String[] args) {
                          ^
        Programmet lar seg ikke kompilere fordi Java krever at alle
        metodene i et program (main er en s?kalt "metode", som vi skal
        se i kapittel 7) deklareres med en returtype.  Returtypen "void"
        angir at main-metoden ikke skal "returnere" noen verdi, og m?
        angis som returtypen til main.  Mer om dette i avsnitt 7.5
        i l?reboka.
    
     c. Programmet lar seg kompilere, men ikke kj?re fordi klassen har
        feil navn.  Ved kj?ring f?r vi en veldig kryptisk feilmelding,
        som alts? betyr at filnavn ikke stemmer med klassenavn:
    
        java.lang.NoClassDefFoundError: Studie (wrong name: studie)
           at java.lang.ClassLoader.defineClass1(Native Method)
           at java.lang.ClassLoader.defineClass(Unknown Source)
           ...
        Exception in thread "main"
    
     d. Programmet lar seg b?de kompilere og kj?re.  Resultatet er bare
        en litt annen utskrift enn f?r.
    
     e. Ved kompilering f?r vi f?lgende feilmelding:
    
        Studie.java:4: reached end of file while parsing
            }
             ^
        Denne feilmeldingen betyr alts? at vi har glemt ? avslutte en
        kr?llparentes i programmet.
    


  3. Finn fem syntaksfeil:  kap. 1, oppg. 3 (side 26)
    Finn feilene i dette programmet:
    class Utskrift {
        public stitac void main(String args) (
            System.out.println("Beethoven skrev Skjebnesymfonien")
            System.out.println("og ?tte andre symfonier.);
        }
    }
    
    Det er fem syntaksfeil i programmet:
       1. N?kkelordet "static" er stavet feil.
    
       2. Det mangler hakeparenteser ("[]") etter "String" p? linje 2.
          Denne feilen oppdages ikke av kompilatoren, men av kj?resystemet
          fordi det er lov ? lage metoder uten "[]" der, bare ikke lov
          ? bruke de som hoved-main-metoden n?r man kj?rer et program.
          Kj?resystemet gir ofte litt mer uventede feilmeldinger enn
          kompilatoren, men disse vil du ogs? etter hvert l?re deg ? kjenne
          igjen.  I dette tilfellet f?r vi f?lgende feilmelding n?r vi
          pr?ver ? kj?re programmet:
    
            java.lang.NoSuchMethodError: main
            Exception in thread "main"
    
          Som vi ser s? betyr feilmeldingen at kj?resystemmet ikke fant
          noen (riktig skrevet) main-metode.
    
       3. Det st?r vanlig parentes i stedet for kr?llparentes p? slutten
          av linje 2.
    
       4. Det mangler semikolon p? slutten av linje 3.
    
       5. Avsluttende anf?rselstegn mangler p? linje 4.
    


  4. [N?kkeloppg.]Bokstavpyramide:  kap. 1, oppg. 5 (side 26)
    Vi ?nsker ? skrive ut f?lgende tekst p? skjermen (med samme pyramideformatering):
        a
       a a
      a b a
     a c c a
    a d f d a
    
    Lag et Java-program som gj?r dette, ved ? bruke flere utskriftssetninger.

    Tips:
    Idéen her er ? finne hvor og hvordan man kan legge inn mellomroms-tegn i programmet for ? f? til pyramideformateringen. Senere i kurset, i kapittel 3 (side 54) vil du l?re en annen m?te ? l?se denne oppgaven p? hvor Java tar seg av pyramideformateringen.
    class Pyramide {
        public static void main(String[] args) {
            System.out.println("    a"); // 4 mellomrom f?r ?a?
            System.out.println("   a a"); // 3 mellomrom f?r ?a a?
            System.out.println("  a b a");
            System.out.println(" a c c a");
            System.out.println("a d f d a");
        }
    }

    Her er en annen m?te ? programmere dette p?, som gir samme resultat.
    "\n" (bakover-skr?strek etterfulgt av n) er koden for linjeskift i Java.

    class Pyramide {
        public static void main(String[] args) {
            System.out.println("    a\n"
                               + "   a a\n"
                               + "  a b a\n"
                               + " a c c a\n"
                               + "a d f d a");
        }
    }

    Kj?reeksempel: (Begge programmene ovenfor gir samme resultat)
    > javac Pyramide.java
    > java Pyramide
        a
       a a
      a b a
     a c c a
    a d f d a
    


  5. Hvis du har mer tid f?rste uken kan du begynne ? unders?ke kildene med nyttig informasjon som vi har samlet under: Det er bare de to f?rste som er viktigst (kurshjemmesiden og Webmail), men interesserte kan fortsette nedover i lista og finne mye annen nyttig informasjon relevant for kurset.



Tibakemelding om dette oppgavesettet kan du skrive i bloggen eller sende p? mail til josek [a] ifi.uio.no