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