Up:                                                                  

02312 Indledende programmering,  IMM DTU,  Ver. 2005-09-01

Løsningsforslag til opgaver til 1. semester-uge.

Opgave 1: Installation og anvendelse af JCreator.

 

Find installationsvejledningen til JCreator  Installation og Opstart af Java  på kursets hjemmeside.
 

Når installationen er fuldført indtastes følgende program:

 

public class Test

{

  public static void main (String[] args)

  {

    System.out.println("An Emergency Broadcast");

  }

}

 

Hints: Vælg class name  Test, således at programmet får navnet  Test.java

_ Kompilér og kør programmet.

 Hvis du følger vejledningen, har vi nu et projekt med navnet Opgave1.

 

 

 

Opgave 2: Fejlfinding.

 

Introducer de følgende fejl, en af gangen, til Test programmet. Skriv ned hvilke fejlbeskeder kompileren laver. Ret den foregående fejl, hver gang inden du introducerer en ny fejl. Hvis der ikke kommer nogle fejlbeskeder, skal du forklare hvorfor.

 

1. Lav Test om til test

Følgende fejlmeddelelse fremkommer i build vinduet:

 

d:\JCjava\02312\Opgave1\Test.java:1: class test is public, should be declared in a file named test.java
public class test
       ^
1 error
 

Filnavn og klassenavn skal være ens, disse er også case sensitive.


2. Lav Emergency om til emergency
Da det blot er en tekststreng, skrives nu “emergency” ud

3. Fjern det første citationstegn i tegnstrengen.

Følgende fejlmeddelelse fremkommer i build vinduet:

d:\JCjava\02312\Opgave1\Test.java:5: ')' expected
System.out.println(An Emergency Broadcast");
                      ^
d:\JCjava\02312\Opgave1\Test.java:5: unclosed string literal
System.out.println(An Emergency Broadcast");
                                         ^
d:\JCjava\02312\Opgave1\Test.java:5: ';' expected
System.out.println(An Emergency Broadcast");
                                            ^
d:\JCjava\02312\Opgave1\Test.java:5: cannot resolve symbol
symbol : variable An
location: class Test
System.out.println(An Emergency Broadcast");
                   ^
4 errors
 

1. fejlmeddelelse:

” ’)’ expected” – Første ord kunne være en parameter (variabelnavn), så skulle der være en parentes efter – ikke et nyt “navn”.

 

2. fejlmeddelelse:

Kompileren forventer et lige antal ".

 

3. fejlmeddelelse:

Konsekvens af fejlmeddelelse 2.

 

4. fejlmeddelelse:

Forsøger at fortolke An som et variabelnavn.

 

4. Fjern det sidste citationstegn i tegnstrengen.
 

Følgende fejlmeddelelse fremkommer i build vinduet:

d:\JCjava\02312\Opgave1\Test.java:5: unclosed string literal
System.out.println("An Emergency Broadcast);
                    ^
d:\JCjava\02312\Opgave1\Test.java:5: ')' expected
System.out.println("An Emergency Broadcast);
                                            ^
2 errors
 

1. fejlmeddelelse:

Unclosed string literal”. En mere fornuftig fejlmelding, da dette jo er problemet.

2. fejlmeddelelse:

Konsekvens af fejlmeddelelse 1.

 


5. Lav main om til man
 

Når der tastes F7, kommer der ingen fejlmeddelelser, idet kompileren oversætter et program (metode) som hedder man.

Når der tastes F5, kan programmet ikke starte. Der kommer følgende fejlmeddelelse:

 

Exception in thread "main" java.lang.NoSuchMethodError: main

 

Vi er ikke i stand til kører programmet, idet metoden main altid skal forefindes.

 

6. Lav println om til bogus
 

Følgende fejlmeddelelse fremkommer i build vinduet:

 

d:\JCjava\02312\Opgave1\Test.java:5: cannot resolve symbol
symbol : method bogus (java.lang.String)
location: class java.io.PrintStream
System.out.bogus("An Emergency Broadcast");
          ^
1 error
 

Fornuftige fejlmelding, kender ikke ordet bogus.


7. Lav Broadcast om til Brxoadxcaxst
 

Programmet oversættes og kører uden problemer da dette kun er en ændring af tekst som ikke vedrører java compileren eller ”virtual machine” – men som nok for en bruger ville være meningsforstyrrende – altså nærmest en ”logisk” fejl.

8. Fjern semikolonet fra slutningen af println sætningen
 

Følgende fejlmeddelelse fremkommer i build vinduet:

 

d:\JCjava\02312\Opgave1\Test.java:5: ';' expected
System.out.println("An Emergency Broadcast")
                                            ^
1 error
 

Fornuftig fejlmelding, da dette jo er problemet.
 

9. Fjern den sidste Tuborg-klamme i programmet
 

Følgende fejlmeddelelse fremkommer i build vinduet:

 

d:\JCjava\02312\Opgave1\Test.java:6: '}' expected
   }
    ^
1 error
 

Fornuftig fejlmelding, da dette jo er problemet.

 

 

Opgave 3: Hjemmesiden og skatteprogram

 

(Opret projekt med projektnavn Opgave3 og indsæt fil med navn Skat2)

 

1. Orienter dig på kursets hjemmeside: www.imm.dtu.dk/courses/02312

 

2. Kopier Skat2.java , fra dette dokument

 

public class Skat2

{

  public static void main(String[] args)

 {

    int indkomst = 120000;

    double ambi, pension, bundskat;

 

    ambi = indkomst * 8.0 / 100.0;

    pension = indkomst * 1.0 / 100.0;

 

    System.out.print("Arbejdsmarkedsbidrag: "); System.out.println(ambi);

    System.out.print("Særlig pensionsopsparing: "); System.out.println(pension);

  }

}

 

3. Udvid programmet, så det også beregner bundskatten for år 2000 og udskriver resultatet på skærmen. Indsæt også kommentarer i programmet.

4. Oversæt og kør programmet.

Tip: Bundskatten er 7 % af indkomsten, efter at denne er fratrukket arbejdsmarkedsbidrag (Ambi), særligt pensionsbidrag samt personfradrag.

Ambi 8.0 %, Særlig pension 1.0 %, Bundskat 7.0 %, Personfradrag 33.400 kr.

 

 

 

Løsning:

//Denne klasse udregner nøgletal for skatten år 2000 udfra en given indkomst

//En fremtidig udvidelse vil være at lade indkomsten være en parameter til main

public class Skat2

{

  public static void main(String[] args)

 {

    int indkomst = 120000;              //"hardcoded" af test-grunde

    double ambi, pension, bundskat;     //Alle variable i høj præcision

 

    //Følgende arbejder med faste procentsatser som i næste version

    //bør være konstanter

    ambi = indkomst * 8.0 / 100.0;  

    pension = indkomst * 1.0 / 100.0;

    bundskat = (indkomst-ambi-pension-33400)*7.0/100.0;

 

    //Nu er alle tal klar - udskriv resultaterne

    //Første to linjer laves hver især af to kald

    //mens den tredie udnytter at tal ved addition med strenge

    //konverteres til strenge

    System.out.print("Arbejdsmarkedsbidrag: "); System.out.println(ambi);

    System.out.print("Særlig pensionsopsparing: ");System.out.println(pension);

    System.out.println("Bundskat: " + bundskat);

  }

}

 

Svaret bliver 5306.0


Opgave 3b:


Lav et lille program der udskriver sin(pi/4) og kvadratrod(2)/2
Benyt "Math" klassen som findes i appendix M
Hvad mener du om resultatet?

// Math klassen er en del af "java.lang" pakken,
// som altid automatisk er med
// -den skal derfor ikke "importes"
class MyMath
{
    public static void main(String[] args)
    {
        System.out.println("sin(Pi/4)="+ Math.sin(Math.PI/4));
        System.out.println("Root(2)/2="+ Math.sqrt(2)/2);
    }
}
 

Bemærk at de 2 matematisk identiske størrelser typisk ikke udskriver det samme. (resultalet kan afhænge af oversættersen). Hvad betydning har det hvis vi skal undersøge om 2 'tal' er ens.

 

 

 

Opgave 4:

a

 

Hvilken type (int, float osv.) har følgende værdier?

 

Værdi               Type

58        int

true      boolean

-23       int

"afd "    String

42.0      double

’$’       char

"42.0"    String

"true"    String

’7’       char

 

Bemærk at float konstanter angives som f.eks. : ”1.2345F” – ”default” er double.

Ligeledes er default for heltal ”int” – ikke byte, short eller long.

 

b

 

Hvilken værdi og type har følgende udtryk

 

Udtryk

Udtrykkets værdi 

Udtrykkets type

1.5 * 60.0           

90.0

double

1.5 * 60

90.0

double

24 * 60

1440

int

1.1 + 60 - 1

60.1

double

150.0 / 60

2.5

double

150 / 60

2

int

134.0 % 60

14.0

double (ikke som c++)

134 % 60

14

int

"02199"

"02199"

String

"x er lig med "+ "0"

"x er lig med 0"

String

"x er lig med "+ 0

"x er lig med 0"

String

 

 

c

 

Hvilke af følgende variable navne (identifiers) er lovlige i Java.

 

1Test

Ulovlig – starter med ciffer

Peter_Sørensen

Lovlig

static

Ulovlig – reserveret ord

Test1

Lovlig

peter_static

Lovlig

private

Ulovlig – reserveret ord

Private

Lovlig

_Peter

Lovlig

Peter Soerensen

ULovlig–mellemrum

?Peter

Ulovlig – starter med ’?’

 

d

 

Forklar hvad hver linie i nedenstående program laver. Angiv udskriften fra programmet.

 

public class StringKap2

{

    //Standard main metode

    public static void main (String[] args)   

  {

        //Erklærer String ”test3”

        String test3 ;          

             

        //Tildeler “test3” værdien “HIJ”

        test3 = new String ("HIJ");        

 

        //Erklærer og initialiserer String “test3”

        String test1 = new String ("ABC");  

 

        //Erklærer og initialiserer String “test2”

        String test2 = "DEF";               

 

        //test4 tildeles test1..3 konkateneret

        String test4= test1+test2+test3;    

 

        //Erklæring af int laengde

        int laengde;                        

 

        // laengde tildeles værdi=antal chars i test1                      

        laengde = test1.length();           

 

        //test5, en char, tildeles element indeks 2*

        char test5=test2.charAt(2);       

 

        //test4 laves til små bogstaver 

        test4=test4.toLowerCase();          

 

        //konverterer til strenge og konkatenerer

        System.out.print(test4+test5+laengde); 

    }

}

 *) Bemærk at første element er indeks 0

 

 Output: abcdefhijF3

 

 

e

 

Angiv den rækkefølge som regneoperationerne udføres i.

 

X = a + b + c + d + e;                             //Der adderes fra venstre mod højre

 

X = a + b * c - d / e;                               //Multiplikation og division først

 

X = a / (b + c) - d % e;                           //b+c først, dernæst divisioner, så subtraktion

 

X = a / (b * (c + (d – e)));                      //fra højre mode venstre pga paranteser

 

answer  =  sum / 4 + MAX * lowest;    //division og multiplication først addition

 

 

f

 

Oprydning.

Workspace er \02312\*.* med underkataloger.

Workgroup fil \02312\02312.jcw

Katalogerne Opgave1 og Opgave3 indeholder de 2 projekter.

I hver af disse kataloger findes filer tilhørende de 2 projekter

Hver projektmappe indeholder:

.java                Kildetekst til program.

.class               Oversat program.

osv.

 

Bemærk at det er kataloget \02312\*.* med underkataloger der er workspace

og som skal flyttes til et andet drev for at flytte workspace.