Vinnaren i pepparkakshustävlingen!
2021-12-12, 01:14
  #1
Medlem
Har verkligen kört fast på en skoluppgift som går ut på att skapa en fiktiv bank, en klassiker.
Det jag behöver hjälp med är att initiera räntor på samtliga skapade konton. konton sparas i en linkedList, spännande bara det.

MAIN
Kod:
import radorienteradTerminal.*;

public class MikroBanken
{

    public static void main(String[] args)
    {
        new Terminal();
    }
}


KONTO
Kod:
package bankVerksamhet;

class Konto
{
    private static int nyttNr = 1000;
    private int kontoNr;
    int saldo;
    int summaRänta;

    Konto()
    {
        nyttNr++;
        kontoNr = nyttNr;
    }

    int getKontoNr()
    {
        return kontoNr;
    }
    
    int beräknaRänta() {
        	if(KontoFabrik.getKontotyp() == 1) {
        		summaRänta= (int)Math.round(saldo * KontoFabrik.getRänta());
        			saldo+=summaRänta; 
        		return summaRänta;
        	} if(KontoFabrik.getKontotyp()==2) {
        		if(saldo < 80000) {
        			summaRänta= (int)Math.round(saldo * KontoFabrik.getRänta());
            			saldo+=summaRänta;
            			return summaRänta;
        		} else if (80000 < saldo) {
        			summaRänta= (int)Math.round(saldo * (KontoFabrik.getRänta() + 0.025));
            			saldo+=summaRänta;
            			return summaRänta;
        		}
        	} if(KontoFabrik.getKontotyp()==3) {
        		if(0 < saldo) {
        			summaRänta= (int)Math.round(saldo * KontoFabrik.getRänta());
            			saldo+=summaRänta;
            			return summaRänta;
        		} else if(saldo < 0) {
        			//Straffränta på 17.9%
        			summaRänta = (int)Math.round(saldo * 0.821);
            			saldo-=summaRänta;
            			return summaRänta;
        		} 
        	}  
    			return (int)summaRänta;
        }
        public int getRänta() {
        	return summaRänta;
        }
    public String toString()
    {
        return "Kontonr: " + kontoNr + ", saldo: " + saldo + "kr";
    }
}

KONTOFABRIK
Kod:
package bankVerksamhet;

class KontoFabrik
{
	static int kontotyp;
	static double ränta;
    
    static Konto skapaKonto(int typ)
    {
    	kontotyp = typ;
    	if(typ == 1) {
    		return new Lonekonto();
    	}
    	if(typ == 2) {
    		return new Maxikonto();
    	}
    	if(typ == 3) {
    		return new Sparkonto();
    	} else
    		return null;
    } 
    
    public static int getKontotyp() {
    	return kontotyp;
    }
    
    public static double getRänta() {
    	return ränta;
    }
}

KONTOREGISTER
Kod:
package bankVerksamhet;
import java.util.*;

class KontoRegister
{
    private List<Konto> listan = new LinkedList<Konto>();
    private Iterator<Konto> iteratorn = listan.iterator();

    KontoRegister()
    {
    }

    void add(Konto nyttKonto)
    {
        listan.add(nyttKonto);
    }

    boolean remove(Konto kontot)
    {
        return listan.remove(kontot);
    }
    
    boolean isEmpty()
    {
        return listan.size() == 0;
    }    
    
    Konto first()
    {   
        iteratorn = listan.iterator();
        
        if (iteratorn.hasNext())
            return (Konto)iteratorn.next();        
            
        return null;
    }

    Konto next()
    {
        if (iteratorn.hasNext())
            return (Konto)iteratorn.next();        
        
        return null;
    }    

    Konto search(int kontoNr)
    {
        Konto ettKonto = first();
        
        while (ettKonto != null && ettKonto.getKontoNr() != kontoNr)
            ettKonto = next();
        
        return ettKonto;
    }    
}
TRANSAKTION
Kod:
package bankVerksamhet;
import javax.swing.JOptionPane;

import radorienteradTerminal.*;

public class Transaktion
{
    private Terminal terminal;
    private Konto aktivtKonto;
    private KontoRegister registret = new KontoRegister();

    public Transaktion(Terminal terminalen)
    {
        terminal = terminalen;
    }

    public void skapaKonto(int kontotyp)
    {        
        aktivtKonto = KontoFabrik.skapaKonto(kontotyp);
        registret.add(aktivtKonto);
        terminal.uppdatera();
    }

    public void beräknaRänta() {
    	while(registret.next() != null) {
    		aktivtKonto = registret.next();
    		int ränta = aktivtKonto.getRänta();
    		System.out.println(ränta);
    }
}
    
}
__________________
Senast redigerad av bosscs2 2021-12-12 kl. 01:24.
Citera
2021-12-12, 01:15
  #2
Medlem
TERMINAL
Kod:
package radorienteradTerminal;


public class Terminal
{
    private bankVerksamhet.Transaktion banken = new bankVerksamhet.Transaktion(this);

    public Terminal()
    {
        kommandoVal();
    }

    private void kommandoVal()
    {
        String meddelande = "Välkommen till MikroBanken!";
        int val = 0;
        
        do
        {
            meny();
            
            try
            {
                val = Dialog.heltalsFråga("=>: ");
            
                switch (val)
                {            
                    case 0:     //AVSLUTA
                    break;
                
                    case 1:     //SKAPA
                        int kontotyp = Dialog.heltalsFråga("Välj typ av konto, (1 <-Sparkonto, 2 <-Maxikonto, 3 <-Lönekonto)=>: ");
                        banken.skapaKonto(kontotyp);
                        break;               

                    case 7:    //BERÄKNA RÄNTA
                    	if(banken.harAktivtKonto()) {
                    		banken.beräknaRänta();
                    		meddelande("Samtliga räntor är tillagda.");
                    	}
                        	meddelande("Här saknas kod!");
                        break;      
                 }    
             }
             catch (CommunicationException fel)
             {
                 System.out.println(fel);
             }
             
        }while (val != 0);
        
        System.out.println("Programmet är avslutat.");
    }   
     
    private void meny()
    {
        int i;
        
        System.out.println("\n\nMIKROBANKEN");
        ritaLinje('_', 50);
        
        System.out.println("0 <- Avsluta programmet");
        System.out.println("1 <- Skapa ett nytt konto");
        System.out.println("2 <- Aktivera ett konto");

        if (banken.harAktivtKonto())
        {
            System.out.println("3 <- Sätt in pengar på det aktiva kontot");
            System.out.println("4 <- Ta ut pengar från det aktiva kontot");
            System.out.println("5 <- Radera det aktiva kontot");
            System.out.println("6 <- Inaktivera det aktiva kontot");            
        }
        
        System.out.println("7 <- Räkna ränta på samtliga konton");
        
        System.out.flush();
    }  
    
    public void uppdatera()
    {
        String info = banken.kontoInfo();
        ritaLinje('-', 50);
        System.out.println(info);
        ritaLinje('-', 50);                
    }

    public void meddelande(String text)
    {
        ritaLinje('-', 50);
        System.out.println(text);
        ritaLinje('-', 50);
    }
    
     private void ritaLinje(char symbol, int antal)
     {
        for (int i=0; i<antal; i++)
            System.out.print(symbol);
        System.out.println();
     }
}

Det blir fel när jag ska beräkna räntan på samtliga konton som sparas i linkedList.

FELMEDDELANDE:
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.LinkedList$ListItr.checkForComodificatio n(LinkedList.java:970)
at java.base/java.util.LinkedList$ListItr.next(LinkedList.java: 892)
at bankVerksamhet.KontoRegister.next(KontoRegister.ja va:81)
at bankVerksamhet.Transaktion.beräknaRänta(Transaktio n.java:127)
at radorienteradTerminal.Terminal.kommandoVal(Termina l.java:83)
at radorienteradTerminal.Terminal.<init>(Terminal.jav a:20)
at MikroBanken.main(MikroBanken.java:18)
__________________
Senast redigerad av bosscs2 2021-12-12 kl. 01:25.
Citera
2021-12-15, 07:29
  #3
Medlem
a-mortals avatar
Citat:
Ursprungligen postat av bosscs2
Har verkligen kört fast på en skoluppgift som går ut på att skapa en fiktiv bank, en klassiker.
Det jag behöver hjälp med är att initiera räntor på samtliga skapade konton. konton sparas i en linkedList, spännande bara det.

MAIN
Kod:
import radorienteradTerminal.*;

public class MikroBanken
{

    public static void main(String[] args)
    {
        new Terminal();
    }
}


KONTO
Kod:
package bankVerksamhet;

class Konto
{
    private static int nyttNr = 1000;
    private int kontoNr;
    int saldo;
    int summaRänta;

    Konto()
    {
        nyttNr++;
        kontoNr = nyttNr;
    }

    int getKontoNr()
    {
        return kontoNr;
    }
    
    int beräknaRänta() {
        	if(KontoFabrik.getKontotyp() == 1) {
        		summaRänta= (int)Math.round(saldo * KontoFabrik.getRänta());
        			saldo+=summaRänta; 
        		return summaRänta;
        	} if(KontoFabrik.getKontotyp()==2) {
        		if(saldo < 80000) {
        			summaRänta= (int)Math.round(saldo * KontoFabrik.getRänta());
            			saldo+=summaRänta;
            			return summaRänta;
        		} else if (80000 < saldo) {
        			summaRänta= (int)Math.round(saldo * (KontoFabrik.getRänta() + 0.025));
            			saldo+=summaRänta;
            			return summaRänta;
        		}
        	} if(KontoFabrik.getKontotyp()==3) {
        		if(0 < saldo) {
        			summaRänta= (int)Math.round(saldo * KontoFabrik.getRänta());
            			saldo+=summaRänta;
            			return summaRänta;
        		} else if(saldo < 0) {
        			//Straffränta på 17.9%
        			summaRänta = (int)Math.round(saldo * 0.821);
            			saldo-=summaRänta;
            			return summaRänta;
        		} 
        	}  
    			return (int)summaRänta;
        }
        public int getRänta() {
        	return summaRänta;
        }
    public String toString()
    {
        return "Kontonr: " + kontoNr + ", saldo: " + saldo + "kr";
    }
}

KONTOFABRIK
Kod:
package bankVerksamhet;

class KontoFabrik
{
	static int kontotyp;
	static double ränta;
    
    static Konto skapaKonto(int typ)
    {
    	kontotyp = typ;
    	if(typ == 1) {
    		return new Lonekonto();
    	}
    	if(typ == 2) {
    		return new Maxikonto();
    	}
    	if(typ == 3) {
    		return new Sparkonto();
    	} else
    		return null;
    } 
    
    public static int getKontotyp() {
    	return kontotyp;
    }
    
    public static double getRänta() {
    	return ränta;
    }
}

KONTOREGISTER
Kod:
package bankVerksamhet;
import java.util.*;

class KontoRegister
{
    private List<Konto> listan = new LinkedList<Konto>();
    private Iterator<Konto> iteratorn = listan.iterator();

    KontoRegister()
    {
    }

    void add(Konto nyttKonto)
    {
        listan.add(nyttKonto);
    }

    boolean remove(Konto kontot)
    {
        return listan.remove(kontot);
    }
    
    boolean isEmpty()
    {
        return listan.size() == 0;
    }    
    
    Konto first()
    {   
        iteratorn = listan.iterator();
        
        if (iteratorn.hasNext())
            return (Konto)iteratorn.next();        
            
        return null;
    }

    Konto next()
    {
        if (iteratorn.hasNext())
            return (Konto)iteratorn.next();        
        
        return null;
    }    

    Konto search(int kontoNr)
    {
        Konto ettKonto = first();
        
        while (ettKonto != null && ettKonto.getKontoNr() != kontoNr)
            ettKonto = next();
        
        return ettKonto;
    }    
}
TRANSAKTION
Kod:
package bankVerksamhet;
import javax.swing.JOptionPane;

import radorienteradTerminal.*;

public class Transaktion
{
    private Terminal terminal;
    private Konto aktivtKonto;
    private KontoRegister registret = new KontoRegister();

    public Transaktion(Terminal terminalen)
    {
        terminal = terminalen;
    }

    public void skapaKonto(int kontotyp)
    {        
        aktivtKonto = KontoFabrik.skapaKonto(kontotyp);
        registret.add(aktivtKonto);
        terminal.uppdatera();
    }

    public void beräknaRänta() {
    	while(registret.next() != null) {
    		aktivtKonto = registret.next();
    		int ränta = aktivtKonto.getRänta();
    		System.out.println(ränta);
    }
}
    
}

Citat:
Ursprungligen postat av bosscs2
TERMINAL
Kod:
package radorienteradTerminal;


public class Terminal
{
    private bankVerksamhet.Transaktion banken = new bankVerksamhet.Transaktion(this);

    public Terminal()
    {
        kommandoVal();
    }

    private void kommandoVal()
    {
        String meddelande = "Välkommen till MikroBanken!";
        int val = 0;
        
        do
        {
            meny();
            
            try
            {
                val = Dialog.heltalsFråga("=>: ");
            
                switch (val)
                {            
                    case 0:     //AVSLUTA
                    break;
                
                    case 1:     //SKAPA
                        int kontotyp = Dialog.heltalsFråga("Välj typ av konto, (1 <-Sparkonto, 2 <-Maxikonto, 3 <-Lönekonto)=>: ");
                        banken.skapaKonto(kontotyp);
                        break;               

                    case 7:    //BERÄKNA RÄNTA
                    	if(banken.harAktivtKonto()) {
                    		banken.beräknaRänta();
                    		meddelande("Samtliga räntor är tillagda.");
                    	}
                        	meddelande("Här saknas kod!");
                        break;      
                 }    
             }
             catch (CommunicationException fel)
             {
                 System.out.println(fel);
             }
             
        }while (val != 0);
        
        System.out.println("Programmet är avslutat.");
    }   
     
    private void meny()
    {
        int i;
        
        System.out.println("\n\nMIKROBANKEN");
        ritaLinje('_', 50);
        
        System.out.println("0 <- Avsluta programmet");
        System.out.println("1 <- Skapa ett nytt konto");
        System.out.println("2 <- Aktivera ett konto");

        if (banken.harAktivtKonto())
        {
            System.out.println("3 <- Sätt in pengar på det aktiva kontot");
            System.out.println("4 <- Ta ut pengar från det aktiva kontot");
            System.out.println("5 <- Radera det aktiva kontot");
            System.out.println("6 <- Inaktivera det aktiva kontot");            
        }
        
        System.out.println("7 <- Räkna ränta på samtliga konton");
        
        System.out.flush();
    }  
    
    public void uppdatera()
    {
        String info = banken.kontoInfo();
        ritaLinje('-', 50);
        System.out.println(info);
        ritaLinje('-', 50);                
    }

    public void meddelande(String text)
    {
        ritaLinje('-', 50);
        System.out.println(text);
        ritaLinje('-', 50);
    }
    
     private void ritaLinje(char symbol, int antal)
     {
        for (int i=0; i<antal; i++)
            System.out.print(symbol);
        System.out.println();
     }
}

Det blir fel när jag ska beräkna räntan på samtliga konton som sparas i linkedList.

FELMEDDELANDE:
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.LinkedList$ListItr.checkForComodificatio n(LinkedList.java:970)
at java.base/java.util.LinkedList$ListItr.next(LinkedList.java: 892)
at bankVerksamhet.KontoRegister.next(KontoRegister.ja va:81)
at bankVerksamhet.Transaktion.beräknaRänta(Transaktio n.java:127)
at radorienteradTerminal.Terminal.kommandoVal(Termina l.java:83)
at radorienteradTerminal.Terminal.<init>(Terminal.jav a:20)
at MikroBanken.main(MikroBanken.java:18)

Felmeddelandet säger att du ändrar listan innan iteratorn gått klart.
Jag föreslår följande ändringar:
Kod:
public class Transaktion
{
    private Terminal terminal;
    private Konto aktivtKonto;
    private List<Konto> registret = new LinkedList<Konto>(); // fix
Kod:
    public void beräknaRänta() {
        Iterator<Konto> itr = registret.iterator();
    	for (Konto k = itr.next(); k != null; k = itr.next()) {
    		int ränta = k.getRänta();
    		System.out.println(ränta);
        }
    }
Citera
2021-12-22, 18:13
  #4
Medlem
kjellbrels avatar
Jag har inte läst din kod i detalj men här är ett försök att ge några blandade tips på vägen:
1. Tänk på iteratorer som förbrukningsmateral, dvs de skapas och används för att stega igenom en samling endast en gång och sen slänger man dem. Vill man stega igenom igen, så skapar eller efterfrågar man en ny iterator.
2. Din kontofabrik har 2 klassvariabler (det finns alltså endast en förekomst av dessa 2 i hela programmet) som du kanske inte har så stor nytta av? Kontotypen kommer enbart komma ihåg senast skapade typ och ränta är väl något som tillhör konto på något lämpligt sätt, beroende på om du menar räntesats eller räntebelopp här.
3. Fabriken skapar konton av olika typ (Lonekonto, Maxikonto etc). Har du skapat dessa klasser? Uppgiften går säkerligen ut på att du skall träna på arvsmeknismer här och låta respektive typ implementera ränteberäkning på sitt sätt, istället för att du (som du gör nu) beräknar i konto (den generella typen) och blir tvungen att försöka avgöra själv vilken typ det är och efter det välja beräkningssätt.
4. Bra namnval är viktigt för att förstå och även vid frågeställningar till andra. Det blir rörigt när man tittar i din kod och ser variabeln "banken" och konstaterar att den är av typen Transaktion. Det känns ju lite konstigt, eller hur?

Lite allmänt:
- Ta dig tiden att läsa in dig på och förstå skillnaden ordentligt mellan klass- och instansmedlemmar (variabler och metoder). Det kommer hjälpa dig rejält framöver. Exempelvis kommer det bli uppenbart för dig varför dina villkor med kontotypskontroller (t ex "if(KontoFabrik.getKontotyp() == 1)") från enskilda instanser av konton kommer fungera dåligt.
- Försök testa dig framåt i små steg. Skapa inte hela applikationen på en gång för att sen försöka testköra helheten och förstå vad som går fel och vad som fattas. Det är enklare att bygga upp det i småbitar och skriva testprogram som bara skapar upp och testkör smådelar först. Sen bygger man på uppåt.
- Är du van vid att använda en debugger i någon IDE? Om inte så är det en bra investering också. Det kommer att ge dig mycket när du stegar dig igenom kod du skrivit.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in