Uppsala universitet, inst f Informationsteknologi, avd f teknisk databehandling
Programmeringsteknik MN1, ht06.
Obligatorisk uppgift 6, klassen Bank
| Syfte:
| Mer övning på sammansatta klasser, referenser och arrayer av objekt
samt enkel in- och utmatning mot filer.
|
| Att göra före uppgiften:
| Uppgift 5. .
|
| Redovisning:
| Skriftlig redovisning av alla klasserna Bank med
kommenterad kod, programkörningar samt svar på frågorna senast
den 24 november 2006
|
Uppgiften går ut på att skriva en klass Bank som håller
reda på ett antal bankkunder (objekt av typen Bankkund).
I den föregående uppgiften kunde man via en meny hantera
EN kund dvs skapa konton, sätta in och ta ut pengar etc.
I klassen Bank skall det via en meny gå att skapa och ta
bort kunder och, genom anrop av menyn i Bankkund,
hantera enskilda kunder.
Data (kunder, konton mm) skall sparas på en fil mellan körningarna
av ett program. Programmet skall alltså börja med att läsa in
uppgifterna från en fil och avslutas med att skriva ut uppgifterna
på samma fil.
Här följer ett exempel på programkörningar. Observera
att programmet körs tre gånger (från ett terminalfönster) och
hur informationen finns kvar från föregående körning.
vega $ java Bank
Välkommen till Ebberöds bank!
Datafil (eller CR om ingen fil):
Huvudmeny:
1. Skapa ny kund
2. Hantera kund
3. Ta bort kund.
4. Lista alla kunder
5. Avsluta.
Ditt val: 1
Namn: kalle
Adress: Uppsala
Telefon: 123456
Huvudmeny:
1. Skapa ny kund
2. Hantera kund
3. Ta bort kund.
4. Lista alla kunder
5. Avsluta.
Ditt val: 2
Namn: kalle
Meny för kundhantering:
1. Skapa nytt konto.
2. Sätta in pengar.
3. Ta ut pengar.
4. Byta adress på kunden.
5. Ta bort konto.
6. Saldobesked
7. Skriv ut info om kunden.
8. Åter till huvudmenyn.
Ditt val: 1
Vilken summa skall sättas in?
1000
Meny för kundhantering:
1. Skapa nytt konto.
2. Sätta in pengar.
3. Ta ut pengar.
4. Byta adress på kunden.
5. Ta bort konto.
6. Saldobesked
7. Skriv ut info om kunden.
8. Åter till huvudmenyn.
Ditt val: 1
Vilken summa skall sättas in?
2000
Meny för kundhantering:
1. Skapa nytt konto.
2. Sätta in pengar.
3. Ta ut pengar.
4. Byta adress på kunden.
5. Ta bort konto.
6. Saldobesked
7. Skriv ut info om kunden.
8. Åter till huvudmenyn.
Ditt val: 8
Huvudmeny:
1. Skapa ny kund
2. Hantera kund
3. Ta bort kund.
4. Lista alla kunder
5. Avsluta.
Ditt val: 5
Filnamn för att spara på: bank.txt
Ajöss (och tack för fisken)
vega$ java Bank
Välkommen till Ebberöds bank!
Datafil (eller CR om ingen fil): bank.txt
Huvudmeny:
1. Skapa ny kund
2. Hantera kund
3. Ta bort kund.
4. Lista alla kunder
5. Avsluta.
Ditt val: 4
Kundlista:
kalle
Huvudmeny:
1. Skapa ny kund
2. Hantera kund
3. Ta bort kund.
4. Lista alla kunder
5. Avsluta.
Ditt val: 1
Namn: Lisa
Adress: Stockholm
Telefon: 2345667
Huvudmeny:
1. Skapa ny kund
2. Hantera kund
3. Ta bort kund.
4. Lista alla kunder
5. Avsluta.
Ditt val: 2
Namn: Urban
Finns ej
Namn: Lisa
Meny för kundhantering:
1. Skapa nytt konto.
2. Sätta in pengar.
3. Ta ut pengar.
4. Byta adress på kunden.
5. Ta bort konto.
6. Saldobesked
7. Skriv ut info om kunden.
8. Åter till huvudmenyn.
Ditt val: 1
Vilken summa skall sättas in?
10000
Meny för kundhantering:
1. Skapa nytt konto.
2. Sätta in pengar.
3. Ta ut pengar.
4. Byta adress på kunden.
5. Ta bort konto.
6. Saldobesked
7. Skriv ut info om kunden.
8. Åter till huvudmenyn.
Ditt val: 8
Huvudmeny:
1. Skapa ny kund
2. Hantera kund
3. Ta bort kund.
4. Lista alla kunder
5. Avsluta.
Ditt val: 5
Ajöss (och tack för fisken)
vega$ java Bank
Välkommen till Ebberöds bank!
Datafil (eller CR om ingen fil): bank.txt
Huvudmeny:
1. Skapa ny kund
2. Hantera kund
3. Ta bort kund.
4. Lista alla kunder
5. Avsluta.
Ditt val: 4
Kundlista:
kalle
Lisa
Huvudmeny:
1. Skapa ny kund
2. Hantera kund
3. Ta bort kund.
4. Lista alla kunder
5. Avsluta.
Ditt val: 5
Ajöss (och tack för fisken)
Filhanteringen
Programmet börjar alltså med att fråga om ett filnamn. Om man ger ett
så skall programmet läsa in data från filen. När man lämnar
programmet så skall programmet skriva filen på nytt så att nästa
körning kan fortsätta med aktuella data. (Om inget filnamn gavs vid
start så skall programmet fråga efter filnamn vid avslut, annars
skall samma fil användas som gavs i början)
Java har många möjligheter att skriva och läsa filer. I denna uppgift
skall vi göra det så enkelt som möjligt. För att läsa filen
så skall ni använda ett Scanner-objekt som nu skall
kopplas till en fil och inte System.in.
Detta kan göras med satsen
Scanner fsc = new Scanner(new File(filnamn));
där 'filnamn' är ett String-objekt med namnet på filen.
För att skriva filen så kan man använda klassen PrintWriter
som samma metoder som ni har använt i System.out
dvs bl.a. print och println.
För att koppla ett PrintWriter-objekt till en fil kan man
direkt göra
PrintWriter pw = new PrintWriter(filnamn);
Om filen redan existerar så kommer den att skrivas över.
Observera att man måste stänga filen när man skrivit klart genom ett anrop
till close:
pw.close();
Filstruktur
När programmet avslutas skall all information som behövs för att
det skall gå att återstarta programmet med samma kund- och kontouppsättning
skrivas på filen. Använd följande struktur på filen
- Först ett heltal som anger hur många kunder det finns,
- därefter kund för kund.
- För varje kund
- tre rader med namn, adress respektive telefon
- en rad med ett heltal som anger hur många konton kunden har
- en rad för varje konto med nummer och saldo.
Efter körning med exemplet ovan så har filen bank.txt följande
innehåll:
2
kalle
Uppsala
123456
2
9983 1000.0
25662 2000.0
Lisa
Stockholm
2345667
1
37260 10000.0
Tips
- Läs om klasserna
PrintWriter, Scanner
och File i
Javadokumentationen. Läs gärna också Skansholm kap 5.5 (vi
tillhandahåller kopior av dessa sidor till dem som vill.
-
- Förse klasserna
Person, Bankkund och
Bankkonto med metoder för att skriva ut respektive
objekt på en fil. Låt metoden ha en PrintWriter som
parameter. Låt en metod i klassen Bank sköta kopplingen
till fil. Gör på liknande sätt metoder för inläsning från fil.
- Du kan behöva tala om för
Scanner-objektet att
den skall använda amerikanska konventioner (dvs decimalpunkt
i stället för decimalkomma) genom anropet
scf.useLocale(Locale.US)
- Ni kan använda följande
main-metod i klassen
Bank:
public static void main(String[] args)
throws IOException{
Bank b= new Bank();
Scanner sc = new Scanner(System.in);
String filnamn;
System.out.println("Välkommen till Ebberöds bank!");
System.out.print("Datafil (eller CR om ingen fil): ");
filnamn = sc.nextLine();
if (!filnamn.equals(""))
b.lasFranFil(filnamn);
boolean sluta = false;
while(!sluta) {
int val = b.meny();
sluta = b.switcha(val);
}
if (filnamn.equals("")) {
System.out.print("Filnamn för att spara på: ");
filnamn = sc.nextLine();
}
if (!filnamn.equals(""))
b.sparaPaFil(filnamn);
System.out.println("Ajöss (och tack för fisken)");
}
- En metod för att spara på fil kan ha detta utseende:
public void sparaPaFil(String filnamn) throws IOException{
PrintWriter pw = new PrintWriter(filnamn);
pw.println(antal);
for (int i=0; i
Frågor:
- Har du behövt ändra någon metod i de tidigare utvecklade
klasserna (
Person,
Bankkonto och Bankkund)? I så fall vilka
och varför?
- Vilka metoder har du behövt lägga till i de tidigare utvecklade
klasserna?
- Kan ditt program hantera hur många kunder som helst? Om ej, hur
skulle man kunna göra för att uppnå det?
- Om programmet avbryts på något annat sätt än det normala så kommer
informationen som lagts in under denna körning gå förlorad.
Föreslå något sätt att minimera förlusterna av data!
Last modified: Fri Oct 27 12:38:29 MEST 2006