Inl¨ amningsuppgift 1
Programmeringsteknik MN1 vt02
Denna uppgift skall l¨osas individuellt och redovisas muntligt vid dator f¨or l¨araren senast 2002-02-10.
1 Introduktionslaboration
Uppgiftens syfte ¨ar att bekanta sig med systemet och att kunna skapa, kom- pilera och k¨ora n˚agra enkla Java-program. Det ¨ar inte avsikten att du ska f¨orst˚a alla detaljer i de program som du skapar nedan, det ¨ar en expose av olika m¨ojligheter som vi ska diskutera mera under kursens g˚ang.
B¨orja med att logga in p˚a ditt datorkonto. Se till att du befinner dig i din huvudkatalog. Det g¨or du automatiskt om du inte g¨or n˚agot s¨arskilt.
B¨orja med att starta programmet netscape. Det g¨or du med kommandot netscape &
Sudda bort det som st˚ar i netscapes adressf¨alt (location) och skriv dit adres- sen f¨or kursens hemsida:
http://www.tdb.uu.se/edu/course/homepage/progMN1/
Titta p˚a sidan och se vad som finns d¨ar och l¨ar dig hitta d¨ar. Du kommer antagligen att anv¨anda den en hel del under kursen. En del saker ¨ar ganska tomma i b¨orjan och kommer att fyllas p˚a under kursen. N¨ar du tittat klart kan du avsluta netscape.
Skapa nu en arbetskatalog f¨or Java, den kan t. ex. heta java. Skapa den med kommandot
mkdir java
Se sedan till att arbetskatalogen blir din aktuella katalog.
cd java
Alla Javaprogram du skriver under kursen l¨agger du f¨or enkelhets skull i denna katalog.
Kursboken anv¨ander en del hj¨alpprogram som vi kommer att beh¨ova under kursen, till exempel funktioner f¨or att l¨asa och skriva flyttal. F¨orst av allt ska du kopiera dessa hj¨alpprogram till din arbetskatalog. Det g¨or du med kom- mandot (se till att du skriver exakt som det st˚ar med alla tecken, inklusive mellanrum och den avslutande punkten)
cp -r /it/kurs/progMN1/java/extra .
Om du nu beg¨ar en lista av filer (ls kommandot) i din katalog ska du se en ny katalog med namnet extra. Du kan ocks˚a titta i denna katalog (utan att byta aktuell katalog). Som du ser finns d¨ar ett antal filer. Du beh¨over ha dessa filer f¨or att kunna anv¨anda bokens exempel men du beh¨over inte r¨ora filerna p˚a n˚at s¨att.
Vi ska nu skriva in ett antal enkla Javaprogram och testk¨ora dem. F¨or att kunna g¨ora detta m˚aste du kunna anv¨anda en texteditor f¨or att skriva in programmet. Under introduktionskursen har du anv¨ant programmet emacs.
Du ska nu skriva ett Javaprogram med namnet Example1.java. Starta emacs p˚a f¨oljande s¨att:
emacs Example1.java &
Du f˚ar nu ett tomt f¨onster d¨ar du kan skriva in text. Se till att detta ¨ar ditt aktiva f¨onster. Skriv in f¨oljande lilla program, exakt som det st˚ar:
public class Example1 {
public static void main(String[] arg) {
System.out.println("V¨alkommen till Java");
} }
F¨or att indentera (formatera) k¨allkoden kan man trycka ’tab’. Emacs kommer d˚a att automatiskt att g¨ora detta p˚a den rad mark¨oren st˚ar.
Man kan ¨aven f˚a emacs att f¨args¨atta k¨allkoden, detta g¨or ingenting f¨or pro-
grammets funktion, men m˚anga upplever k¨allkoden som l¨attare att l¨asa d˚a.
Om du vill prova detta, g˚a in i menyn Help och sedan undermenyn Options, v¨alj d¨ar slutligen Global Font Lock.
N¨ar du skrivit in programmet, se till att du sparar det i emacs, men av- sluta inte emacs. F¨or att kunna k¨ora programmet m˚aste du nu kompilera programmet, dvs ¨overs¨atta det till n˚agot som maskinen f¨orst˚ar. Det g¨or du med kommandot ( i kommandof¨onstret, inte i emacsf¨onstret):
javac Example1.java
Om allting ¨ar bra nu s˚a ska du efter en stund f˚a tillbaka kommandopromp- tern i datorns f¨onster, om du skrev fel s˚a har du antagligen f˚att ett antal felmeddelanden p˚a sk¨armen. Om du f˚att n˚agra fel m˚aste du r¨atta till dessa i emacs, spara och kompilera igen tills det blir r¨att.
I din javakatalog s˚a ska nu finnas tre filer, Example1.java, Example1.class samt katalogen extra. Kolla detta med ls!
F¨or att f˚a programmet utf¨ort m˚aste du starta en JVM (Java Virtual Machi- ne). Det g¨or du s˚a h¨ar:
java Example1 Vad h¨ande?
Andra nu lite grand i filen Example1.java (med hj¨¨ alp av emacs), ¨andra lite p˚a stavning eller l¨agg in n˚agra konstiga tecken. G¨or om kompileringen ovan och se vad som h¨ander. F¨orst˚ar du de utskrifter som du fick?
Som standard p˚a v˚art system k¨ors Java version 1.3. Du kan kolla om vilken version av Java du anv¨ander genom att skriva
java -version
F¨orhoppningsvis kommer du att f˚a en utskrift som ser ut som java version "1.3.1 02"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1 02-b02) Java HotSpot(TM) Client VM (build 1.3.1 02-b02, mixed mode)
Ta kontakt med l¨araren om du f˚ar n˚agot annat, eftersom delar av materialet i kursen bygger p˚a att Java-version 1.3 anv¨ands.
Skapa nu en ny fil Example2.java i emacs. Det kan du antingen g¨ora genom att trycka CTRL-X CTRL-F eller genom att v¨alja Open File i Files-menyn.
I b˚ada fallen f˚ar du sedan skriva filens namn (Example2.java) l¨angst ned i emacsf¨onstret. N¨ar du gjort detta ska du ha ett tomt emacsf¨onster framme.
Skriv nu in f¨oljande Javaprogram, precis som f¨orut m˚aste du skriva exakt r¨att.
import javax.swing.*;
public class Example2{
private String utdata;
public Example2(){
utdata = "V¨alkommen till Java";
JOptionPane.showMessageDialog(null,utdata);
System.exit(0);
}
public static void main(String[] arg){
Example2 e = new Example2();
} }
Spara, kompilera och k¨or detta program precis som du gjorde f¨orut. Vad h¨ander? F¨orhoppningsvis fick du en dialogruta med texten V¨alkommen till Java och en OK-knapp. St¨ang rutan genom att klicka p˚a OK eller genom peka p˚a den ¨ovre ramen och tryck ned h¨oger musknapp. Du f˚ar d˚a fram en meny, v¨alj Close i denna meny f¨or att avsluta programmet.
Vi ska nu forts¨atta med ytterligare ett exempel. Skapa filen Example3.java i emacs p˚a samma s¨att som tidigare. Skriv in f¨oljande program.
import java.awt.*;
import javax.swing.*;
class Example3 extends JFrame{
public Example3(){
JLabel l = new JLabel(’’Welcome to Java’’, JLabel.CENTER);
getContentPane().add(l);
l.setOpaque(true);
l.setBackground(Color.yellow);
l.setForeground(Color.blue);
l.setFont(new Font(’’SansSerif’’,Font.BOLD,24));
setSize(400,150);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] arg){
Example3 d2 = new Example3();
} }
Spara, kompilera och k¨or precis som tidigare. Denna g˚ang f˚ar du ett f¨onster med en text i och inget mer. I det f¨orra exemplet d¨ok det ocks˚a upp en OK-knapp i f¨onstret tillsammans med texten som du lade in.
Som du s˚ag i det f¨orsta lilla programmet kan vi skriva ut saker i komman- dof¨onstret genom att anv¨anda System.out. Det finns ocks˚a en System.in f¨or att datorn ska kunna fr˚aga efter olika saker som du tillhandah˚aller. System.in
¨ar dock ganska korkad eftersom den bara kan ta emot text, inte tal (numeriska v¨arden).
F¨or att m¨ojligg¨ora detta m˚aste man skapa lite egna utbyggnader av Java.
Skansholm har i sitt extra-paket skapat tv˚a verktyg, Std.out och Std.in som ers¨atter System.out och System.in. Det ¨ar viktigt att komma ih˚ag att dessa inte ing˚ar i Javaspr˚aket, de ¨ar ett eget till¨agg. Dock kan man anv¨anda ex- trapaketet p˚a alla datorer, det ¨ar bara att sj¨alv l¨agga in det, s˚a det ¨ar inte ett s˚a stort problem. S˚a l¨ange man k¨anner till och dokumenterar att man anv¨ander paketet extra s˚a ¨ar detta inget stort problem.
Skriv in f¨oljande program, om du tycker det ¨ar f¨or mycket att skriva kan du kopiera det fr˚an /it/kurs/progMN1/java/AddSub.java.
import extra.*;
public class AddSub {
public static void main(String [] args) { double a,b;
// fr˚aga efter ett v¨arde p˚a a Std.out.print(’’Ge a’s v¨arde ’’);
a = Std.in.readDouble();
// fr˚aga efter ett v¨arde p˚a b Std.out.print(’’Ge b’s v¨arde ’’);
b = Std.in.readDouble();
// r¨akna ut summa och skillnad double sum,diff;
sum = a + b;
diff = a - b;
// skriv ut
Std.out.println(’’Summan blev ’’ + sum + ’’ skillnanden blev ’’ + diff);
// formatera
Std.out.println(’’Summan blev ’’ + ExtendedWriter.formatNum(sum,6,2) +
’’ skillnanden blev ’’ +
ExtendedWriter.formatNum(diff,6,2));
} }
Kompilera detta och k¨or det. Ge a v¨ardet 4.5 och b v¨ardet 3.47. Notera att du skriver decimalpunkt och inte decimalkomma. Du kan dock st¨alla in Java f¨or svensk standard om du vill, se kapitel 5 i kursboken f¨or detaljer.
Som du ser s˚a skriver programmet f¨orst ut summan och skillnaden med v¨aldigt m˚anga decimaler. Du ser ocks˚a att de sista decimalerna ¨ar fel. Det
ser ut som om datorn r¨aknar fel, kan den det? Ja alla r¨akningar med deci- maler ¨ar alltid lite (oftast f¨orsumbart) inexakt. D¨arefter skrivs samma sak ut med f¨arre decimaler, d˚a ser man inte att v¨ardena ¨ar lite felaktiga (fast det ¨ar de ju fortfarande, datorn har alla decimaler internt). Uttrycket Ex- tendedWriter.formatNum(sum,6,2) inneb¨ar att vi anv¨ander en formatterare fr˚an paketet extra (se kap 5 i boken) f¨or att formattera svaret p˚a ett annat s¨att ¨an standard. Vi vill ha 6 positioner, 2 decimaler.
JAVA ¨ar ett spr˚ak med ett litet antal spr˚akelement. Dessutom finns ett stort bibliotek med olika hj¨alpprogram. Eftersom dessa ¨ar mycket omfattande finns inte allting dokumenterat i kursboken eller i andra b¨ocker. F¨or att avhj¨alpa detta finns omfattande online-hj¨alp tillg¨anglig. Den generella javasiten ¨ar http://www.javasoft.com.
Starta netscape och surfa till ovanst˚aende adress och se vad som finns d¨ar.
Du kan hitta olika saker, t. ex. gratis kompilator och JVM f¨or Windows.
L¨ankar till detta finns ocks˚a p˚a kursens hemsida.
Dokumentationen f¨or Java 1.1 finns p˚a:
http://java.sun.com/products/jdk/1.1/docs/api/packages.html och f¨or Java2 (version 1.3) finns p˚a:
http://java.sun.com/products/jdk/1.3/docs/api/index.html
Starta netscape och surfa till dokumentationen f¨or java2 (det ¨ar den versionen vi anv¨ander). Leta upp dokumentation f¨or metoderna drawOval och drawArc i klassen Graphics. Detta hittar du i paketet java.awt, klassen Graphics. Utf¨or detta och l¨as hur man anv¨ander ovanst˚aende tv˚a metoder.
Java bygger p˚a sina bibliotek och det finns inga b¨ocker som dokumenterar allt detta. D¨arf¨or m˚aste man ofta sl˚a upp saker via internet p˚a detta s¨att.
Nu ska vi skapa ett sista exempel. Skapa en fil KattRitare.java. Den ska se ut som nedst˚aende. Om du tycker det verkar vara jobbigt att skriva s˚a mycket text kan du kopiera den fr˚an /it/kurs/progMN1/java/KattRitare.java, du beh¨over dessutom skapa och kopiera filen /it/kurs/progMN1/java/Katt.java.
import java.awt.*;
import javax.swing.*;
public class KattRitare extends JPanel {
Font f = new Font(Serif", Font.ITALIC, 18);
public KattRitare() {
setBackground(Color.white);
setPreferredSize(new Dimension(300,300) );
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.black);
g.drawRect(50, 50, 60, 60); // huvud g.drawRect(80, 225, 140, 5); // svans g.setColor(Color.white);
g.fillOval(20, 110, 120, 120); // vitt inne i kroppen g.setColor(Color.black);
g.fillOval(75, 75, 10, 10); // nos
g.drawOval(20, 110, 120, 120); // rita kropp, kontur g.fillOval(60, 60, 10, 10); // ¨ogon
g.fillOval(90, 60, 10, 10);
g.setColor(Color.black);
g.drawLine(50, 50, 60, 30); // ¨oron g.drawLine(60, 30, 70, 50);
g.drawLine(110, 50, 100, 30);
g.drawLine(100, 30, 90, 50);
g.setColor(Color.red);
g.drawArc(60, 80, 40, 20, 180, 180); // mun g.setColor(Color.black);
g.setFont(f);
g.drawString(Mjava", 200, 50);
} }
Du m˚aste ocks˚a skapa filen Katt.java som ser ut som
import java.awt.*;
import javax.swing.*;
public class Katt extends JFrame {
private KattRitare l;
public Katt(){
Container c = getContentPane();
l = new KattRitare();
c.setBackground(Color.white);
c.setLayout(new FlowLayout() );
setSize(300,300);
c.add(l);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] arg){
Katt k1 = new Katt();
} }
Kompilera b˚ada filerna och k¨or detta Katt.
Efter att du f˚att den att fungera ska du modifera kattens utseende en smula.
I programmet ovan finns ett avsnitt (en metod) som heter paintComponent.
Den g¨or sj¨alva ritandet av katten. Katten ritas i en ruta som ¨ar 300 punkter bred och 300 punkter h¨og. Punkten i ¨ovre v¨anstra h¨ornet heter (1,1) och punkterna r¨aknas sedan upp ˚at h¨oger och ned˚at vilket betyder att det nedre h¨ogra h¨ornet heter (300,300). Med hj¨alp av denna information kan man lis- ta ut hur ritandet fungerar ovan. Din uppgift ¨ar nu att ¨andra ovanst˚aende program s˚a att
• Munnen blir gul
• ¨Ogonen blir gr¨ona
• ¨Oronen blir dubbelt s˚a l˚anga
• Svansen blir h¨alften s˚a l˚ang.
Kom ih˚ag att varje g˚ang du ¨andrat n˚agot i programmet m˚aste du spara det i emacs och kompilera det med javac innan du ser n˚agon skillnad vid testk¨orning.