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
Når installationen er fuldført indtastes følgende
program:
public class Test
{
public static
{
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.
Opgave 2: Fejlfinding.
Introducer de følgende fejl, en
af gangen, til Test
programmet. Skriv
ned hvilke fejlbeskeder kompileren
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:
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 – så 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.