12 svar
150 visningar
Schwartz 42
Postad: 16 jul 18:45

Bankapplikation i Windows Form

Hej! Läser kursen programmering 2 i c#, läst programmering 1 i c++ så känner mig rätt lost. Men försöker iaf, o har fastnat på en uppgift som går ut på att göra en applikation i Windows Form, det ska vara en banksimulator där man kan sätta in och ta ut pengar, starta ett sparkonto eller ett kreditkonto och sedan se alla skapade konton i en lista. Har försökt få till det med hjälp av bokens facit, men likt förbannat funkar det inte. Publicerar koden så kanske nån av er kan hjälpa mig. Fattar ju ingenting eftersom jag inte läst de riktiga grunderna i c# :( Så trött på skolan som byter språk mellan kurserna. 

Här kommer koden jag har i form1.cs

using static WinFormsApp3.Program;
using WinFormsApp3;
namespace WinFormsApp3
{
    
    
        public partial class Form1 : Form
        {
            private Bank bank = new Bank();
        public void Övning_Banken()
        {
            InitializeComponent();
        }
            private void UppdateraKontoLista()
            {
                lbxKonton.Items.Clear();
                foreach (BankKonto konto in bank.Konton) lbxKonton.Items.Add(konto);
            }

            private void Insättning_Click(object sender, EventArgs e)
            {
                if (lbxKonton.SelectedItem != null)
                {
                    double belopp;
                    if (!double.TryParse(tbxBelopp.Text, out belopp))
                    { MessageBox.Show("Felaktigt belopp", Text); return; }
                    (lbxKonton.SelectedItem as BankKonto).Insättning(belopp);
                    UppdateraKontoLista();
                }
            }

            private void btnUttag_Click(object sender, EventArgs e)
            {
                if (lbxKonton.SelectedItem != null)
                {
                    double belopp;
                    if (!double.TryParse(tbxBelopp.Text, out belopp))
                    {
                        MessageBox.Show("Felaktigt belopp", Text); return;
                    }
                    if ((lbxKonton.SelectedItem as BankKonto).Uttag(belopp) == false)
                        MessageBox.Show("Medges ej", Text);
                    else UppdateraKontoLista();
                }
            }

            private void btnRegistrera_Click(object sender, EventArgs e)
            {
                double ränteSats;
                if (!double.TryParse(tbxRänta.Text, out ränteSats))
                { MessageBox.Show("Felaktig räntesats", Text); return; }

                double kredit;
                if (!double.TryParse(tbxKredit.Text, out kredit))
                { MessageBox.Show("Felaktig Kredit", Text); return; }

                BankKonto nyttKonto;
                if (kredit == 0) nyttKonto = new SparKonto(tbxPersonNr.Text, ränteSats);
                else nyttKonto = new LåneKonto(tbxPersonNr.Text, ränteSats, kredit);

                bank.Konton.Add(nyttKonto);
                lbxKonton.Items.Add(nyttKonto);

                foreach (Control kontroll in gbxÖppnaKonto.Controls)
                    if (kontroll is TextBox) (kontroll as TextBox).Clear();
            }

            private void btnUppdateraÅrsRänta_Click(object sender, EventArgs e)
            {
                foreach (BankKonto konto in bank.konton)
                {
                    konto.BeräknaRänta();
                }
                UppdateraKontoLista();
            }
        }
    
}

Felmeddelandena jag har på denna kod är dessa:

CS1061 'Program.Bank' does not contain a definition for 'Konton' and no accessible extension method 'Konton' accepting a first argument of type 'Program.Bank' could be found (are you missing a using directive or an assembly reference?) rad 17 och 61

CS7036 There is no argument given that corresponds to the required parameter 'r' of 'Program.SparKonto.SparKonto(string, double, double)' rad 58 och 59

CS0103 The name 'gbxÖppnaKonto' does not exist in the current context rad 64

CS0122 'Program.Bank.konton' is inaccessible due to its protection level rad 70

Här kommer koden jag har i program.cs

 

using static WinFormsApp3.Program;

namespace WinFormsApp3
{
    class Program
    {
        public class Övning_Banken : Form
        {
            private Bank bank = new Bank();
        }
        public abstract class BankKonto
        {
            protected string personNr;
            protected double behållning;
            protected double ränteSats;
            public BankKonto(string p, double b, double r)
            {
                personNr = p;
                behållning = b;
                ränteSats = r;
            }

            public double Behållning
            {
                get { return behållning; }
                set { behållning = value; }
            }

            public void Insättning(double belopp)
            {
                behållning += belopp;
            }

            public abstract bool Uttag(double belopp);
            public abstract double BeräknaRänta();

        }

        public class SparKonto : BankKonto
        {
            public SparKonto(string p, double b, double r) : base(p, b, r)
            {

            }

            public override bool Uttag(double belopp)
            {
                if (belopp < behållning)
                {
                    behållning -= belopp;
                    return true;
                }
                else return false;
            }

            public override double BeräknaRänta()
            {
                double ränta = behållning * ränteSats / 100;
                behållning += ränta;
                return ränta;
            }

            public override string ToString()
            {
                return "Sparkonto " + personNr + ": " + behållning;
            }
        }

        public class LåneKonto : BankKonto
        {
            protected double kredit = 0;
            public LåneKonto(string p, double b, double r, double k) : base(p, b, r)
            {
                kredit = k;
            }

            public override bool Uttag(double belopp)
            {
                if (belopp <= behållning + kredit)
                {
                    behållning -= belopp;
                    return true;
                }
                else return false;
            }
            public override double BeräknaRänta()
            {
                double ränta = 0;
                if (behållning < 0)
                {
                    ränta = behållning * ränteSats / 100;
                    behållning += ränta;
                }
                return ränta;
            }

            public override string ToString()
            {
                return "Lånekonto " + personNr + ": " + behållning;
            }
        }



        public class Bank
        {
            List<BankKonto> konton = new List<BankKonto>();
            public double Behållning
            {
                get
                {
                    double behållning = 0;
                    foreach (BankKonto konto in konton)
                        behållning += konto.Behållning;
                    return behållning;
                }
            }
        }

        [STAThread]
        static void Main()
        {
            
            ApplicationConfiguration.Initialize();
            Application.Run(new Form1());
        }
    }
}

Inga felmeddelanden här. 

 

Här är koden i Form1.Designer.cs

 

namespace WinFormsApp3
{
    partial class Form1
    {
        /// <summary>
        ///  Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        ///  Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        ///  Required method for Designer support - do not modify
        ///  the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            label1 = new Label();
            label2 = new Label();
            tbxBelopp = new TextBox();
            Insättning = new Button();
            btnUttag = new Button();
            label3 = new Label();
            label4 = new Label();
            label5 = new Label();
            tbxPersonNr = new TextBox();
            label6 = new Label();
            tbxRänta = new TextBox();
            label7 = new Label();
            tbxKredit = new TextBox();
            btnRegistrera = new Button();
            lbxKonton = new ListBox();
            btnUppdateraÅrsRänta = new Button();
            SuspendLayout();
            // 
            // label1
            // 
            label1.AutoSize = true;
            label1.Location = new Point(12, 66);
            label1.Name = "label1";
            label1.Size = new Size(165, 30);
            label1.TabIndex = 0;
            label1.Text = "Insättning/Uttag";
            // 
            // label2
            // 
            label2.AutoSize = true;
            label2.Location = new Point(12, 114);
            label2.Name = "label2";
            label2.Size = new Size(82, 30);
            label2.TabIndex = 1;
            label2.Text = "Belopp:";
            // 
            // tbxBelopp
            // 
            tbxBelopp.Location = new Point(96, 117);
            tbxBelopp.Name = "tbxBelopp";
            tbxBelopp.Size = new Size(175, 35);
            tbxBelopp.TabIndex = 2;
            // 
            // Insättning
            // 
            Insättning.Location = new Point(156, 218);
            Insättning.Name = "Insättning";
            Insättning.Size = new Size(131, 40);
            Insättning.TabIndex = 3;
            Insättning.Text = "Insättning";
            Insättning.UseVisualStyleBackColor = true;
            Insättning.Click += Insättning_Click;
            // 
            // btnUttag
            // 
            btnUttag.Location = new Point(161, 270);
            btnUttag.Name = "btnUttag";
            btnUttag.Size = new Size(131, 40);
            btnUttag.TabIndex = 4;
            btnUttag.Text = "Uttag";
            btnUttag.UseVisualStyleBackColor = true;
            btnUttag.Click += btnUttag_Click;
            // 
            // label3
            // 
            label3.AutoSize = true;
            label3.Location = new Point(378, 66);
            label3.Name = "label3";
            label3.Size = new Size(136, 30);
            label3.TabIndex = 5;
            label3.Text = "Öppna Konto";
            // 
            // label4
            // 
            label4.AutoSize = true;
            label4.Location = new Point(381, 114);
            label4.Name = "label4";
            label4.Size = new Size(103, 30);
            label4.TabIndex = 6;
            label4.Text = "PersonNr:";
            // 
            // label5
            // 
            label5.Location = new Point(0, 0);
            label5.Name = "label5";
            label5.Size = new Size(100, 23);
            label5.TabIndex = 0;
            // 
            // tbxPersonNr
            // 
            tbxPersonNr.Location = new Point(490, 111);
            tbxPersonNr.Name = "tbxPersonNr";
            tbxPersonNr.Size = new Size(183, 35);
            tbxPersonNr.TabIndex = 7;
            // 
            // label6
            // 
            label6.AutoSize = true;
            label6.Location = new Point(378, 166);
            label6.Name = "label6";
            label6.Size = new Size(105, 30);
            label6.TabIndex = 8;
            label6.Text = "RänteSats";
            // 
            // tbxRänta
            // 
            tbxRänta.Location = new Point(491, 165);
            tbxRänta.Name = "tbxRänta";
            tbxRänta.Size = new Size(175, 35);
            tbxRänta.TabIndex = 9;
            // 
            // label7
            // 
            label7.AutoSize = true;
            label7.Location = new Point(385, 213);
            label7.Name = "label7";
            label7.Size = new Size(67, 30);
            label7.TabIndex = 10;
            label7.Text = "Kredit";
            // 
            // tbxKredit
            // 
            tbxKredit.Location = new Point(490, 217);
            tbxKredit.Name = "tbxKredit";
            tbxKredit.Size = new Size(175, 35);
            tbxKredit.TabIndex = 11;
            // 
            // btnRegistrera
            // 
            btnRegistrera.Location = new Point(502, 285);
            btnRegistrera.Name = "btnRegistrera";
            btnRegistrera.Size = new Size(131, 40);
            btnRegistrera.TabIndex = 12;
            btnRegistrera.Text = "Registrera";
            btnRegistrera.UseVisualStyleBackColor = true;
            btnRegistrera.Click += btnRegistrera_Click;
            // 
            // lbxKonton
            // 
            lbxKonton.FormattingEnabled = true;
            lbxKonton.ItemHeight = 30;
            lbxKonton.Location = new Point(837, 81);
            lbxKonton.Name = "lbxKonton";
            lbxKonton.Size = new Size(264, 214);
            lbxKonton.TabIndex = 13;
            // 
            // btnUppdateraÅrsRänta
            // 
            btnUppdateraÅrsRänta.Location = new Point(843, 324);
            btnUppdateraÅrsRänta.Name = "btnUppdateraÅrsRänta";
            btnUppdateraÅrsRänta.Size = new Size(258, 40);
            btnUppdateraÅrsRänta.TabIndex = 14;
            btnUppdateraÅrsRänta.Text = "Uppdatera med Årsränta";
            btnUppdateraÅrsRänta.UseVisualStyleBackColor = true;
            btnUppdateraÅrsRänta.Click += btnUppdateraÅrsRänta_Click;
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(12F, 30F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(1148, 450);
            Controls.Add(btnUppdateraÅrsRänta);
            Controls.Add(lbxKonton);
            Controls.Add(btnRegistrera);
            Controls.Add(tbxKredit);
            Controls.Add(label7);
            Controls.Add(tbxRänta);
            Controls.Add(label6);
            Controls.Add(tbxPersonNr);
            Controls.Add(label5);
            Controls.Add(label4);
            Controls.Add(label3);
            Controls.Add(btnUttag);
            Controls.Add(Insättning);
            Controls.Add(tbxBelopp);
            Controls.Add(label2);
            Controls.Add(label1);
            Name = "Form1";
            Text = "Banken";
            ResumeLayout(false);
            PerformLayout();
        }

        #endregion

        private Label label1;
        private Label label2;
        private TextBox tbxBelopp;
        private Button Insättning;
        private Button btnUttag;
        private Label label3;
        private Label label4;
        private Label label5;
        private TextBox tbxPersonNr;
        private Label label6;
        private TextBox tbxRänta;
        private Label label7;
        private TextBox tbxKredit;
        private Button btnRegistrera;
        private ListBox lbxKonton;
        private Button btnUppdateraÅrsRänta;
    }
}

Inga felmeddelanden här heller. 

Vore så tacksam för lite hjälp! 

thedifference 386
Postad: 16 jul 21:12 Redigerad: 16 jul 21:21

För det första, tack för formatterad kod =) längesen jag skrev C# men dina problem verkar ganska språkagnostiska.

Problem med rad 17 och 61: Listan i din Bank-klass heter konton, med litet k, men du försöker använda stort (läs hela inlägget, för det kommer nog ett nytt problem efter det, som tas upp längre ner).

List<BankKonto> konton = new List<BankKonto>();

Problem med rad 58: Constructorn för SparKonto förväntar sig tre argument, men du skickar två.

public SparKonto(string p, double b, double r)

Problem med rad 59: Constructorn för LåneKonto förväntar sig fyra argument, men du skickar tre.

public LåneKonto(string p, double b, double r, double k)

Problem med rad 64: btnRegistrera_Click() har ingen aning om vad du menar med gbxÖppnaKonto. Det är det enda stället i hela första kodraddan där det nämns.

Problem med rad 70: Här har du stavat rätt till konton, men du kommer inte åt variabeln utifrån. Förmodligen löser det sig med att göra den till public:

public List<BankKonto> konton = new List<BankKonto>();

Eller kan du brottas lite med setters och getters om du vill träna encapsulation.

Schwartz 42
Postad: 16 jul 21:35 Redigerad: 16 jul 21:39

Tack för svar! När jag ändrade List till public löste sig problemet att klassen var för skyddad, och när jag la till en groupbox med namnet gbxÖppnaKonto och la till det som ska vara där löste sig det, men de två där jag angett en parameter för lite får jag inte ordning på, för tar jag bort parameter b så får jag istället detta felmeddelande: 

CS7036 There is no argument given that corresponds to the required parameter 'r' of 'Program.BankKonto.BankKonto(string, double, double)' på rad 41 och 72 i program.cs filen. Vad gör jag för fel?  :)

 

thedifference 386
Postad: 16 jul 21:53

Kan inte riktigt tyda vad du gjort, men det verkar som om du skippade att skicka ett argument till SparKonto eller LåneKonto för att du inte kunde få tag på det. Dock behöver BankKonto (som är deras superclass) detta argument ändå.

Eftersom du har

public class SparKonto : BankKonto

så måste SparKontos constructor få alla argument som behövs för BankKonto, plus eventuella extra argument som SparKonto självt behöver. Likadant med LöneKonto.

Visa dina ändringar, och gärna vad uppgiften är. Har du fått ett skelett att bygga kött på eller helt fria händer?

(Hinner nog inte svara mer ikväll)

thedifference 386
Postad: 16 jul 22:00

Om du vill se din app köra kan du ju hitta på ett argument. Bara skicka noll om det är en siffra som behövs. Du kommer behöva lösa problemet, men kanske du finner lite motivation i att den startar och halvt fungerar.

Schwartz 42
Postad: 16 jul 22:03

Tack för all hjälp, tror jag fått ordning på koden, för nu är alla felmeddelanden borta, nu nästa fråga då, hur får jag programmet att köras så jag kan testa om det fungerar? Vad ska stå i Main? Har som sagt inte hållt på med c# förut, utan jag läste programmering 1 i c++ och jag tycker nog att det skiljer sig jäkligt mycket :)

Schwartz 42
Postad: 16 jul 22:05

Koden ser nu ut såhär i Program.cs:

 

using static WinFormsApp3.Program;

namespace WinFormsApp3
{
    class Program
    {
        
    
    
        public class Övning_Banken : Form
        {
            private Bank bank = new Bank();
        }
        public abstract class BankKonto
        {
            protected string personNr = " ";
            protected double behållning = 0;
            protected double ränteSats = 0;
            public BankKonto(string personNr, double ränteSats)
            {
                this.personNr = personNr;
                this.ränteSats = ränteSats;
            }

            public double Behållning
            {
                get { return behållning; }
                set { behållning = value; }
            }

            public void Insättning(double belopp)
            {
                behållning += belopp;
            }

            public abstract bool Uttag(double belopp);
            public abstract double BeräknaRänta();

        }

        public class SparKonto : BankKonto
        {
            public SparKonto(string personNr, double ränteSats) : base(personNr, ränteSats)
            {

            }

            public override bool Uttag(double belopp)
            {
                if (belopp < behållning)
                {
                    behållning -= belopp;
                    return true;
                }
                else return false;
            }

            public override double BeräknaRänta()
            {
                double ränta = behållning * ränteSats / 100;
                behållning += ränta;
                return ränta;
            }

            public override string ToString()
            {
                return "Sparkonto " + personNr + ": " + behållning;
            }
        }

        public class LåneKonto : BankKonto
        {
            protected double kredit = 0;
            public LåneKonto(string personNr, double ränteSats, double k) : base(personNr, ränteSats)
            {

                kredit = k;
            }

            public override bool Uttag(double belopp)
            {
                if (belopp <= behållning + kredit)
                {
                    behållning -= belopp;
                    return true;
                }
                else return false;
            }
            public override double BeräknaRänta()
            {
                double ränta = 0;
                if (behållning < 0)
                {
                    ränta = behållning * ränteSats / 100;
                    behållning += ränta;
                }
                return ränta;
            }

            public override string ToString()
            {
                return "Lånekonto " + personNr + ": " + behållning;
            }
        }



        public class Bank
        {
            public List<BankKonto> konton = new List<BankKonto>();
            public double Behållning
            {
                get
                {
                    double behållning = 0;
                    foreach (BankKonto konto in konton)
                        behållning += konto.Behållning;
                    return behållning;
                }
            }
        }
        static void Main()
        {
            
        }
    }

Och i Form1.cs såhär:

using static WinFormsApp3.Program;
using WinFormsApp3;
namespace WinFormsApp3
{


    public partial class Form1 : Form
    {
        private Bank bank = new Bank();
        public void Övning_Banken()
        {
            InitializeComponent();
        }
        private void UppdateraKontoLista()
        {
            lbxKonton.Items.Clear();
            foreach (BankKonto konto in bank.konton) lbxKonton.Items.Add(konto);
        }

        private void Insättning_Click(object sender, EventArgs e)
        {
            if (lbxKonton.SelectedItem != null)
            {
                double belopp;
                if (!double.TryParse(tbxBelopp.Text, out belopp))
                { MessageBox.Show("Felaktigt belopp", Text); return; }
                (lbxKonton.SelectedItem as BankKonto).Insättning(belopp);
                UppdateraKontoLista();
            }
        }

        private void btnUttag_Click(object sender, EventArgs e)
        {
            if (lbxKonton.SelectedItem != null)
            {
                double belopp;
                if (!double.TryParse(tbxBelopp.Text, out belopp))
                {
                    MessageBox.Show("Felaktigt belopp", Text); return;
                }
                if ((lbxKonton.SelectedItem as BankKonto).Uttag(belopp) == false)
                    MessageBox.Show("Medges ej", Text);
                else UppdateraKontoLista();
            }
        }

        private void btnRegistrera_Click(object sender, EventArgs e)
        {
            double ränteSats;
            if (!double.TryParse(tbxRänta.Text, out ränteSats))
            { MessageBox.Show("Felaktig räntesats", Text); return; }

            double kredit;
            if (!double.TryParse(tbxKredit.Text, out kredit))
            { MessageBox.Show("Felaktig Kredit", Text); return; }

            BankKonto nyttKonto;
            if (kredit == 0) nyttKonto = new SparKonto(tbxPersonNr.Text, ränteSats);
            else nyttKonto = new LåneKonto(tbxPersonNr.Text, ränteSats, kredit);

            bank.konton.Add(nyttKonto);
            lbxKonton.Items.Add(nyttKonto);

            foreach (Control kontroll in gbxÖppnaKonto.Controls)
                if (kontroll is TextBox) (kontroll as TextBox).Clear();
        }

        private void btnUppdateraÅrsRänta_Click(object sender, EventArgs e)
        {
            foreach (BankKonto konto in bank.konton)
            {
                konto.BeräknaRänta();
            }
            UppdateraKontoLista();
        }

     
    }

}

Kan fota av uppgiften imorgon, jag har grundstenar jag ska använda till min hjälp. :) Återigen, tack för all hjälp!

thedifference 386
Postad: 17 jul 07:06 Redigerad: 17 jul 07:09
Schwartz skrev:

Tack för all hjälp, tror jag fått ordning på koden, för nu är alla felmeddelanden borta, nu nästa fråga då, hur får jag programmet att köras så jag kan testa om det fungerar? Vad ska stå i Main?

En Main från en gammal uppgift jag gjort. Jag tror inte jag skrev en enda rad av detta utan det autoskapades när jag valde att använda Windows Forms i början.

Själva filen heter dock Program.cs.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Assignment_3
{
    static class Program
    {
        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
}
Schwartz 42
Postad: 17 jul 13:47

Tror jag fått ordning på det, fick iaf fram ett program som gick o göra olika val i. Men, bifogar uppgiften, så får vi se om ni har några tankar. :) 

Här kommer uppgiften jag har fått av läraren, och powerpointen jag ska ha till hjälp. 

Men bara det här går ju inte köra, så jag antar att jag ska använda diagrammet för att fylla i resten av koden som måste saknas. Det finns en liknande uppgift i boken som jag använt som hjälp, bifogar den också. 

 

 

Bifogar också koden som jag skrivit till lärarens uppgift nedan:

namespace WinFormsApp8
{
    internal static class Program
    {
        public abstract class BankKonto
        {
            protected string personNr;
            protected double behållning;
            protected double ränteSats;

            public BankKonto(string p, double r)
            {
                personNr = p;
                ränteSats = r;
            }

            public double Behållning
            {
                get { return this.behållning; }
                set { this.behållning = value; }
            }

            public void Insättning(double belopp)
            {
                this.behållning += belopp;
            }

            public abstract bool Uttag(double belopp);
            public abstract double BeräknaRänta();

           
        }

        public class SparKonto : BankKonto
        {
            public SparKonto(string personNr, double ränteSats) : base(personNr, ränteSats)
            {

            }
            public override bool Uttag(double belopp)
            {
                if (belopp <= behållning)
                {
                    behållning -= belopp;
                    return true;
                }
                else return false;
            }
            public override double BeräknaRänta()
            {
                double ränta = behållning * ränteSats / 100;
                behållning += ränta;
                return ränta;
            }

            public override string ToString()
            {
                return "Sparkonto " + personNr + ": " + behållning;
            }
        }

        public class LåneKonto : BankKonto
        {
            private double kredit;
            public LåneKonto(string personNr, double ränteSats, double Kredit) : base(personNr, ränteSats)
            {
                this.kredit = kredit;
            }

            public override bool Uttag(double belopp)
            {
                if (belopp <= behållning + kredit)
                {
                    behållning -= belopp;
                    return true;
                }
                else return false;
            }

            public override double BeräknaRänta()
            {
                double ränta = 0;
                if (behållning < 0)
                {
                    ränta = behållning * ränteSats / 100;
                    behållning += ränta;
                }
                return ränta;
            }

            public override string ToString()
            {
                return "LåneKonto " + personNr + ": " + behållning;
            }
        }



        public class Bank
        {
            private List<BankKonto> Konton = new List<BankKonto>();

            public double Behållning
            {
                get
                {
                    double behållning = 0;
                    foreach (BankKonto konto in Konton) behållning += konto.Behållning;
                    return behållning;
                }
            }

            public abstract double Ränta();
		/*Här vet jag inte riktigt vad som ska in mer, 
		för antar att funktionen bör göra något. Har även 
		ett felmeddelande för att den är abstract, men det
		är ju för att inte klassen den ingår i är abstract.*/






        }
        [STAThread]
        static void Main()
        {
            // To customize application configuration such as set high DPI settings or default font,
            // see https://aka.ms/applicationconfiguration.
            ApplicationConfiguration.Initialize();
            Application.Run(new Form1());
        }
    }
}

 

Sen bifogar jag koden som jag skrivit till den andra uppgiften som är i boken. Den är körbar, men jag kan ju ärligt säga att jag fick ta hjälp av facit i boken för o få ihop det. 

namespace WinFormsApp7
{
    public partial class Banken : Form
    {
        private Bank bank = new Bank();
        public Banken()
        {
            InitializeComponent();
        }

        private void UppdateraKontoLista()
        {
            lbxKonton.Items.Clear();
            foreach (BankKonto konto in bank.Konton) lbxKonton.Items.Add(konto);
        }
        private void btnInsättning_Click(object sender, EventArgs e)
        {
            if (lbxKonton.SelectedItem != null)
            {
                double belopp;
                if (!double.TryParse(tbxBelopp.Text, out belopp))
                { MessageBox.Show("Felaktigt belopp", Text); return; }

                (lbxKonton.SelectedItem as BankKonto).Insättning(belopp);
                UppdateraKontoLista();
            }
        }

        private void btnUttag_Click(object sender, EventArgs e)
        {
            if (lbxKonton.SelectedItem != null)
            {
                double belopp;
                if (!double.TryParse(tbxBelopp.Text, out belopp))
                { MessageBox.Show("Felaktigt belopp", Text); return; }

                if ((lbxKonton.SelectedItem as BankKonto).Uttag(belopp) == false)
                    MessageBox.Show("Medges ej", Text);
                else UppdateraKontoLista();
            }
        }

        private void btnRegistera_Click(object sender, EventArgs e)
        {
            double ränteSats;
            if (!double.TryParse(tbxRänta.Text, out ränteSats))
            { MessageBox.Show("Felaktig räntesats", Text); return; }

            double kredit;
            if (!double.TryParse(tbxKredit.Text, out kredit))
            { MessageBox.Show("Felaktig kredit", Text); return; }

            BankKonto nyttKonto;
            if (kredit == 0) nyttKonto = new SparKonto(tbxPersonNr.Text, ränteSats);
            else nyttKonto = new LåneKonto(tbxPersonNr.Text, ränteSats, kredit);

            bank.Konton.Add(nyttKonto);
            lbxKonton.Items.Add(nyttKonto);
            foreach (Control kontroll in gbxÖppnaKonto.Controls)
                if (kontroll is TextBox) (kontroll as TextBox).Clear();

        }

        private void btnUppdateraÅrsränta_Click(object sender, EventArgs e)
        {
            foreach(BankKonto konto in bank.Konton)
            {
                konto.BeräknaRänta();
            }
            UppdateraKontoLista();
        }

        public abstract class BankKonto
        {
            protected string personNr;
            protected double behållning;
            protected double ränteSats;

            public BankKonto(string personNr, double ränteSats)
            {
                this.personNr = personNr;
                this.ränteSats = ränteSats;
            }

            public double Behållning
            {
                get { return this.behållning; }
                set { this.behållning = value; }
            }

            public void Insättning(double belopp)
            {
                this.behållning += belopp;
            }

            public abstract bool Uttag(double belopp);
            public abstract double BeräknaRänta();
        }

        public class SparKonto : BankKonto
        {
            public SparKonto(string personNr, double ränteSats) : base(personNr, ränteSats)
            {

            }
            public override bool Uttag(double belopp)
            {
                if (belopp <= behållning)
                {
                    behållning -= belopp;
                    return true;
                }
                else return false;
            }
            public override double BeräknaRänta()
            {
                double ränta = behållning * ränteSats / 100;
                behållning += ränta;
                return ränta;
            }

            public override string ToString()
            {
                return "Sparkonto " + personNr + ": " + behållning;
            }
        }

        public class LåneKonto : BankKonto
        {
            private double kredit;
            public LåneKonto(string personNr, double ränteSats, double Kredit) : base(personNr, ränteSats)
            {
                this.kredit = kredit;
            }

            public override bool Uttag(double belopp)
            {
                if (belopp <= behållning + kredit)
                {
                    behållning -= belopp;
                    return true;
                }
                else return false;
            }

            public override double BeräknaRänta()
            {
                double ränta = 0;
                if (behållning < 0)
                {
                    ränta = behållning * ränteSats / 100;
                    behållning += ränta;
                }
                return ränta;
            }

            public override string ToString()
            {
                return "LåneKonto " + personNr + ": " + behållning;
            }
        }



        public class Bank
        {
            public List<BankKonto> Konton = new List<BankKonto>();

            public double Behållning
            {
                get
                {
                    double behållning = 0;
                    foreach (BankKonto konto in Konton) behållning += konto.Behållning;
                    return behållning;
                }
            }

           

            

            
        }
    }
}

och sedan den lilla filen i main som gjorde att allt fungerade. 

namespace WinFormsApp7
{
    internal static class Program
    {
       

        [STAThread]
        static void Main()
        {
            // To customize application configuration such as set high DPI settings or default font,
            // see https://aka.ms/applicationconfiguration.
            ApplicationConfiguration.Initialize();
            Application.Run(new Banken());
        }
    }
}
thedifference 386
Postad: 17 jul 17:11

Av diagrammet att döma förväntas banken inte ha någon metod Ränta(), så den kan du ta bort. Den saknar dock ToString(). Där skulle du kunna nämna hur många konton banken har.

Du har använt polymorfism korrekt med olika implementationer för Uttag() och BeräknaRänta() som passar till de kontotyper de tillhör. Fast jag såg nu på att på ett SparKonto kan jag inte ta ut alla mina pengar =)

Schwartz 42
Postad: 17 jul 17:35

Tack för svar, nä, enligt boken förväntas inte banken ha någon ränta, men enligt skoluppgiften förväntas väl det? Då ska jag lägga till en ToString på banken. Vad kan det tänkas stå i Ränta()? Tänker att all beräkning görs ju i beräkna ränta? Insåg att jag gjort ett fel o satt en kredit med stort k, men det borde ju inte påverka sparkontot? Är det bara ett konto eller alla sparkonton som beter sig så? Vad skulle detta kunna bero på? Sorry för alla frågor, men försöker verkligen förstå o det går sådär 😅

thedifference 386
Postad: 17 jul 18:17

Att ha Ränta() i Bank ser ut som ett fel av din lärare. Du ska ju inte skapa subclass av Bank. Om du vill använda det så kan det svara med räntesatsen som just den banken använder (inte längre abstract), och sen frågar du banken om räntan när du skapar SparKonto/LåneKonto.

Jo, den stavningsskillnaden spelar absolut roll. Skulle gissa att den bara blir noll vad du än skickar just nu. Vad du egentligen gör är att du använder den kredit-variabel som redan finns och säger till den att använda sitt eget värde, och en double har som default-värde noll. Innan constructorn körs är kredit noll, och efteråt fortfarande noll. Har du provat att använda kredit?

Se detta:

Alla SparKonton använder den logik du angett i klassen. De beräknar ränta på samma sätt, beviljar uttag på samma sätt, och tolkar ditt kreditproblem på samma sätt. Men de har inte tvunget samma behållning.

Schwartz 42
Postad: 17 jul 18:22

Tack, tror jag förstår. Ja, jag provade o använda kredit innan jag fixat felet o då gick det inte ta ut något under 0, det gick inte få kontot till minus, efter ändring funkade det som tänkt, att man kan komma ner på minus ända till gränsen man angett i programmet när man skapar lånekontot. Så det borde varit den variabeln med ett stort K som ställde till det. Jag ska försöka få tag i läraren o fråga om räntegrejen. Tack för hjälpen! 

Svara
Close