2021-12-12, 01:14
  #1
Medlem
Har verkligen krt fast p en skoluppgift som gr ut p att skapa en fiktiv bank, en klassiker.
Det jag behver hjlp med r att initiera rntor p samtliga skapade konton. konton sparas i en linkedList, spnnande 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 summaRnta;

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

    int getKontoNr()
    {
        return kontoNr;
    }
    
    int berknaRnta() {
        	if(KontoFabrik.getKontotyp() == 1) {
        		summaRnta= (int)Math.round(saldo * KontoFabrik.getRnta());
        			saldo+=summaRnta; 
        		return summaRnta;
        	} if(KontoFabrik.getKontotyp()==2) {
        		if(saldo < 80000) {
        			summaRnta= (int)Math.round(saldo * KontoFabrik.getRnta());
            			saldo+=summaRnta;
            			return summaRnta;
        		} else if (80000 < saldo) {
        			summaRnta= (int)Math.round(saldo * (KontoFabrik.getRnta() + 0.025));
            			saldo+=summaRnta;
            			return summaRnta;
        		}
        	} if(KontoFabrik.getKontotyp()==3) {
        		if(0 < saldo) {
        			summaRnta= (int)Math.round(saldo * KontoFabrik.getRnta());
            			saldo+=summaRnta;
            			return summaRnta;
        		} else if(saldo < 0) {
        			//Straffrnta p 17.9%
        			summaRnta = (int)Math.round(saldo * 0.821);
            			saldo-=summaRnta;
            			return summaRnta;
        		} 
        	}  
    			return (int)summaRnta;
        }
        public int getRnta() {
        	return summaRnta;
        }
    public String toString()
    {
        return "Kontonr: " + kontoNr + ", saldo: " + saldo + "kr";
    }
}

KONTOFABRIK
Kod:
package bankVerksamhet;

class KontoFabrik
{
	static int kontotyp;
	static double rnta;
    
    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 getRnta() {
    	return rnta;
    }
}

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 berknaRnta() {
    	while(registret.next() != null) {
    		aktivtKonto = registret.next();
    		int rnta = aktivtKonto.getRnta();
    		System.out.println(rnta);
    }
}
    
}
__________________
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 = "Vlkommen till MikroBanken!";
        int val = 0;
        
        do
        {
            meny();
            
            try
            {
                val = Dialog.heltalsFrga("=>: ");
            
                switch (val)
                {            
                    case 0:     //AVSLUTA
                    break;
                
                    case 1:     //SKAPA
                        int kontotyp = Dialog.heltalsFrga("Vlj typ av konto, (1 <-Sparkonto, 2 <-Maxikonto, 3 <-Lnekonto)=>: ");
                        banken.skapaKonto(kontotyp);
                        break;               

                    case 7:    //BERKNA RNTA
                    	if(banken.harAktivtKonto()) {
                    		banken.berknaRnta();
                    		meddelande("Samtliga rntor r tillagda.");
                    	}
                        	meddelande("Hr 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 <- Stt in pengar p det aktiva kontot");
            System.out.println("4 <- Ta ut pengar frn det aktiva kontot");
            System.out.println("5 <- Radera det aktiva kontot");
            System.out.println("6 <- Inaktivera det aktiva kontot");            
        }
        
        System.out.println("7 <- Rkna rnta 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 nr jag ska berkna rntan 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.berknaRnta(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 krt fast p en skoluppgift som gr ut p att skapa en fiktiv bank, en klassiker.
Det jag behver hjlp med r att initiera rntor p samtliga skapade konton. konton sparas i en linkedList, spnnande 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 summaRnta;

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

    int getKontoNr()
    {
        return kontoNr;
    }
    
    int berknaRnta() {
        	if(KontoFabrik.getKontotyp() == 1) {
        		summaRnta= (int)Math.round(saldo * KontoFabrik.getRnta());
        			saldo+=summaRnta; 
        		return summaRnta;
        	} if(KontoFabrik.getKontotyp()==2) {
        		if(saldo < 80000) {
        			summaRnta= (int)Math.round(saldo * KontoFabrik.getRnta());
            			saldo+=summaRnta;
            			return summaRnta;
        		} else if (80000 < saldo) {
        			summaRnta= (int)Math.round(saldo * (KontoFabrik.getRnta() + 0.025));
            			saldo+=summaRnta;
            			return summaRnta;
        		}
        	} if(KontoFabrik.getKontotyp()==3) {
        		if(0 < saldo) {
        			summaRnta= (int)Math.round(saldo * KontoFabrik.getRnta());
            			saldo+=summaRnta;
            			return summaRnta;
        		} else if(saldo < 0) {
        			//Straffrnta p 17.9%
        			summaRnta = (int)Math.round(saldo * 0.821);
            			saldo-=summaRnta;
            			return summaRnta;
        		} 
        	}  
    			return (int)summaRnta;
        }
        public int getRnta() {
        	return summaRnta;
        }
    public String toString()
    {
        return "Kontonr: " + kontoNr + ", saldo: " + saldo + "kr";
    }
}

KONTOFABRIK
Kod:
package bankVerksamhet;

class KontoFabrik
{
	static int kontotyp;
	static double rnta;
    
    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 getRnta() {
    	return rnta;
    }
}

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 berknaRnta() {
    	while(registret.next() != null) {
    		aktivtKonto = registret.next();
    		int rnta = aktivtKonto.getRnta();
    		System.out.println(rnta);
    }
}
    
}

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 = "Vlkommen till MikroBanken!";
        int val = 0;
        
        do
        {
            meny();
            
            try
            {
                val = Dialog.heltalsFrga("=>: ");
            
                switch (val)
                {            
                    case 0:     //AVSLUTA
                    break;
                
                    case 1:     //SKAPA
                        int kontotyp = Dialog.heltalsFrga("Vlj typ av konto, (1 <-Sparkonto, 2 <-Maxikonto, 3 <-Lnekonto)=>: ");
                        banken.skapaKonto(kontotyp);
                        break;               

                    case 7:    //BERKNA RNTA
                    	if(banken.harAktivtKonto()) {
                    		banken.berknaRnta();
                    		meddelande("Samtliga rntor r tillagda.");
                    	}
                        	meddelande("Hr 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 <- Stt in pengar p det aktiva kontot");
            System.out.println("4 <- Ta ut pengar frn det aktiva kontot");
            System.out.println("5 <- Radera det aktiva kontot");
            System.out.println("6 <- Inaktivera det aktiva kontot");            
        }
        
        System.out.println("7 <- Rkna rnta 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 nr jag ska berkna rntan 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.berknaRnta(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 sger att du ndrar listan innan iteratorn gtt klart.
Jag freslr fljande ndringar:
Kod:
public class Transaktion
{
    private Terminal terminal;
    private Konto aktivtKonto;
    private List<Konto> registret = new LinkedList<Konto>(); // fix
Kod:
    public void berknaRnta() {
        Iterator<Konto> itr = registret.iterator();
    	for (Konto k = itr.next(); k != null; k = itr.next()) {
    		int rnta = k.getRnta();
    		System.out.println(rnta);
        }
    }
Citera
2021-12-22, 18:13
  #4
Medlem
kjellbrels avatar
Jag har inte lst din kod i detalj men hr r ett frsk att ge ngra blandade tips p vgen:
1. Tnk p iteratorer som frbrukningsmateral, dvs de skapas och anvnds fr att stega igenom en samling endast en gng och sen slnger man dem. Vill man stega igenom igen, s skapar eller efterfrgar man en ny iterator.
2. Din kontofabrik har 2 klassvariabler (det finns allts endast en frekomst av dessa 2 i hela programmet) som du kanske inte har s stor nytta av? Kontotypen kommer enbart komma ihg senast skapade typ och rnta r vl ngot som tillhr konto p ngot lmpligt stt, beroende p om du menar rntesats eller rntebelopp hr.
3. Fabriken skapar konton av olika typ (Lonekonto, Maxikonto etc). Har du skapat dessa klasser? Uppgiften gr skerligen ut p att du skall trna p arvsmeknismer hr och lta respektive typ implementera rnteberkning p sitt stt, istllet fr att du (som du gr nu) berknar i konto (den generella typen) och blir tvungen att frska avgra sjlv vilken typ det r och efter det vlja berkningsstt.
4. Bra namnval r viktigt fr att frst och ven vid frgestllningar till andra. Det blir rrigt nr man tittar i din kod och ser variabeln "banken" och konstaterar att den r av typen Transaktion. Det knns ju lite konstigt, eller hur?

Lite allmnt:
- Ta dig tiden att lsa in dig p och frst skillnaden ordentligt mellan klass- och instansmedlemmar (variabler och metoder). Det kommer hjlpa dig rejlt framver. Exempelvis kommer det bli uppenbart fr dig varfr dina villkor med kontotypskontroller (t ex "if(KontoFabrik.getKontotyp() == 1)") frn enskilda instanser av konton kommer fungera dligt.
- Frsk testa dig framt i sm steg. Skapa inte hela applikationen p en gng fr att sen frska testkra helheten och frst vad som gr fel och vad som fattas. Det r enklare att bygga upp det i smbitar och skriva testprogram som bara skapar upp och testkr smdelar frst. Sen bygger man p uppt.
- r du van vid att anvnda en debugger i ngon IDE? Om inte s r det en bra investering ocks. Det kommer att ge dig mycket nr 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