Račun

Račun

Avtor: Katja Pleško

OPIS PROBLEMA

Sestavi razred Oseba in razred Račun s komponentama (Oseba lastnik in double stanje), konstruktorji in objektnimi metodami za dostop do komponent, Dvig, Polog in Prenos denarja. Za vsakega lastnika poznaš njegovo ime, priimek, naslov, starost in davčno številko.

  • Izpiši ime in priimek osebe v tabeli računov, ki ima največ denarja.
  • Izračunaj, koliko denarja imajo skupaj osebe v tabeli objektov tipa Račun.
  • Izračunaj, koliko denarja imajo skupaj osebe stare med x in y let (parametra) v tabeli objektov tipa Račun.
  • V tabeli objektov tipa Račun imamo zbrane osebe, ki jim bomo nakazali vsakemu po 1500€. Spremeni njihova stanja in na zaslon izpiši naslove teh oseb skupaj z novim stanjem.
  • Vsaj en problem po vaši izbiri: Izpiši ime in priimek osebe v tabeli računov, ki ima najmanj denarja.

IDEJA REŠITVE

Sestavimo razred Oseba in razred Račun s komponentama Oseba lastnik in double stanje, konstruktorji in objektnimi metodami za dostop do komponent, Dvig, Polog in Prenos denarja. Za vsakega lastnika poznamo njegovo ime, priimek, naslov, starost in davčno številko.

Sestavimo dva testna programa. Prvi služi zato, da v njem ustvarimo vsaj 20 objektov in jih zapišemo na datoteko. V drugem testnem programu pa naredimo naslednje: napišemo metode za reševanje zastavljenih problemov. Ustvarimo vsaj en objekt in ga dodamo v datoteko, preberemo vse podatke z datoteke v tabelo, tabelo pregledno izpišemo. Nato kličemo metode, ki so potrebne, da rešimo zastavljene probleme in pregledno izpišemo rezultate. Na koncu v datoteko zapišemo ponovno vse podatke vseh objektov (ne glede na to, ali so jih zgornje metode spremenile ali ne) v tabeli, med sabo ločene z znakom';'.

RAZRED OSEBA - PROGRAM

V razredu oseba definiramo naslednje komoponente: "ime, priimek, naslov, starost, davcnaStevilka". Napišemo "get" in "set" metode.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Nal_Racun
{
    public class Oseba
    {
        private string ime;
        private string priimek;
        private string naslov;
        private int starost;
        private int davcnaStevilka;

        public string Ime
        {
            get { return this.ime; }
            set { this.ime = value; }
        }

        public string Priimek
        {
            get { return this.priimek; }
            set { this.priimek = value; }
        }

        public string Naslov
        {
            get { return this.naslov; }
            set { this.naslov = value; }
        }

        public int Starost
        {
            get { return this.starost; }
            set { this.starost = value; }
        }

        public int DavcnaStevilka
        {
            get { return this.davcnaStevilka; }
            set { this.davcnaStevilka = value; }
        }

        public Oseba(string ime, string priimek, string naslov, int starost, int davcnaStevilka)
        {
            this.ime = ime;
            this.priimek = priimek;
            this.naslov = naslov;
            this.starost = starost;
            this.davcnaStevilka = davcnaStevilka;
        }

        public String PripraviZaZapis()
        {
            return String.Format("{0}:{1}:{2}:{3}:{4}",
                this.ime,
                this.priimek,
                this.naslov,
                this.starost,
                this.davcnaStevilka);
        }
        public override String ToString()
        {
            return String.Format("{0} {1} {2} {3} {4}",
                this.ime,
                this.priimek,
                this.naslov,
                this.starost,
                this.davcnaStevilka);
        }

    }
}

RAZRED RAČUN

Definiramo razred Racun, kjer ustvarimo komponente lastnik in stanje . Dodamo ustrezne get in set metode. V nadaljevanju sledi celoten program, nato pa še razlaga posameznih delov programa.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Nal_Racun
{

    public class Racun
    {
        private Oseba lastnik;
        private double stanje;

        public Oseba Lastnik
        {
            get { return this.lastnik; }
            set { this.lastnik = value; }
        }

        public double Stanje
        {
            get { return this.stanje; }
            set { this.stanje = value; }
        }

        public Racun(Oseba lastnik, double stanje)
        {
            this.lastnik = lastnik;
            this.stanje = stanje;
        }

        public Racun(Oseba lastnik)
        {
            this.lastnik = lastnik;
            this.stanje = 0.0;
        }

        public bool Dvig(double znesek)
        {
            //denar lahko dvignemo le če imamo na računu dovolj denarja
            if (this.stanje < znesek)
            {
                //denarja ne moremo dvigniti vrnemo false;
                return false;
            }
            //odstejemo znesek, ki ga dvignemo od stanja na racunu
            this.stanje -= znesek;
            //dvig je bil uspešen zato vrnemo true
            return true;
        }

        public void Polog(double znesek)
        {
            this.stanje += znesek;
        }

        //Iz racuna "this" prenesemo znesek na racun "racun1"
        public bool Prenos(double znesek, Racun racun1)
        {
            if (this.Dvig(znesek))
            {
                racun1.Polog(znesek);
                return true;
            }
            return false;
        }

        public void DodajNaDatoteko(string imeDatoteke)
        {
            StreamWriter sw;
            if (!File.Exists(imeDatoteke))
            {
                sw = File.CreateText(imeDatoteke);
            }
            else
            {
                sw = File.AppendText(imeDatoteke);
            }
            sw.WriteLine(this.PripraviZaZapis());
            sw.Close();
        }

        public static Racun[] PreberiIzDatoteke(string imeDatoteke)
        {
            if (!File.Exists(imeDatoteke))
            {
                //datoteka ne obstaja vrnemo prazno tabelo racunov.
                return new Racun[0];
            }
            int steviloZapisov = PrestejVrstice(imeDatoteke);
            Racun[] racuni = new Racun[steviloZapisov];
            StreamReader dat = File.OpenText(imeDatoteke);
            for (int index = 0; index < steviloZapisov; index++)
            {
                string vrstica = dat.ReadLine();
                string[] razbitaVrstica = vrstica.Split(':');
                Oseba oseba = new Oseba(razbitaVrstica[0],
                    razbitaVrstica[1],
                    razbitaVrstica[2],
                    int.Parse(razbitaVrstica[3]),
                    int.Parse(razbitaVrstica[4]));
                Racun racun = new Racun(oseba, double.Parse(razbitaVrstica[5]));
                racuni[index] = racun;
            }
            dat.Close();
            return racuni;
        }

        public static int PrestejVrstice(string imeDatoteke)
        {
            StreamReader dat = File.OpenText(imeDatoteke);
            int stevec = 0;
            string vrstica = dat.ReadLine();
            while (vrstica != null)
            {
                stevec++;
                vrstica = dat.ReadLine();
            }
            dat.Close();
            return stevec;
        }

        public String PripraviZaZapis()
        {
            return String.Format("{0}:{1}", this.lastnik.PripraviZaZapis(),
                this.stanje);
        }

        public override String ToString()
        {
            return String.Format("{0} {1}", this.lastnik.ToString(),
            this.stanje);
        }
    }
}

RAZRED RAČUN - nadaljevanje

Poglejmo si razred Račun po funkcijah, ki smo jih definirali.

Napišemo funkcijo public bool Dvig(dobule znesek) v kateri preverimo, če imamo dovolj denarja na računu za dvig zneska. Če nimamo dovolj denarja, vrnemo vrednost false, sicer odštejemo znesek, ki ga dvignemo od stanja na računu in vrnemu vrednost true.


    public bool Dvig(double znesek)
        {
            //denar lahko dvignemo le če imamo na računu dovolj denarja
            if (this.stanje < znesek)
            {
                //denarja ne moremo dvigniti vrnemo false;
                return false;
            }
            //odstejemo znesek, ki ga dvignemo od stanja na racunu
            this.stanje -= znesek;
            //dvig je bil uspešen zato vrnemo true
            return true;
        }


Napišemo funkcijo public void Polog(double znesek) , kjer položimo na račun vrednost spremenljivke znesek . Torej povečamo spremenljivko stanje .


  public void Polog(double znesek)
        {
            this.stanje += znesek;
        }


Napišemo funkcji public bool Prenos(double znesek, Racun racun1) , ki nam iz računa this prenese znesek na račun racun1 . Preveriti moramo,če lahko sploh dvignemo denar. V pogojnem stavku if preverjamo s funkcijo "Dvig" ali je denar možno dvigniti. Če je pogoj izpolnjen, bomo na racun1 nakazali znesek in vrnili vrednost true , sicer bomo vrnili vrednost false .


        //Iz racuna "this" prenesemo znesek na racun "racun1"
        public bool Prenos(double znesek, Racun racun1)
        {
            if (this.Dvig(znesek))
            {
                racun1.Polog(znesek);
                return true;
            }
            return false;
        }

RAZRED RAČUN - nadaljevanje

Napišemo še funkcije: DodajNaDatoteko (string imeDatoteke) , ki objekt this zapiše (doda) vrstico, kjer doda vse podatke objekta, med sabo ločene z znakom ';', ter funkcijo PreberiZDatoteke(string imeDatoteke) , ki vrne tabelo objektov, kjer posamezni objekt vsebuje podatke, ki so zapisani v posamezni vrstici datoteke, med sabo ločeni z znakom ';'. Napišemo še pomožne funkcije PrestejVrstice(string imeDatoteke) , ki presteje vrstice, PripravaZaZapis() ,kjer pripravimo vse potrebno za zapis, ter funkcjo String ToString() , ki jih uporabimo v funkcijah DodajNaDatoteko in PreberiZDatoteke .


        public void DodajNaDatoteko(string imeDatoteke)
        {
            StreamWriter sw;
            if (!File.Exists(imeDatoteke))
            {
                sw = File.CreateText(imeDatoteke);
            }
            else
            {
                sw = File.AppendText(imeDatoteke);
            }
            sw.WriteLine(this.PripraviZaZapis());
            sw.Close();
        }

        public static Racun[] PreberiIzDatoteke(string imeDatoteke)
        {
            if (!File.Exists(imeDatoteke))
            {
                //datoteka ne obstaja vrnemo prazno tabelo racunov.
                return new Racun[0];
            }
            int steviloZapisov = PrestejVrstice(imeDatoteke);
            Racun[] racuni = new Racun[steviloZapisov];
            StreamReader dat = File.OpenText(imeDatoteke);
            for (int index = 0; index < steviloZapisov; index++)
            {
                string vrstica = dat.ReadLine();
                string[] razbitaVrstica = vrstica.Split(':');
                Oseba oseba = new Oseba(razbitaVrstica[0],
                    razbitaVrstica[1],
                    razbitaVrstica[2],
                    int.Parse(razbitaVrstica[3]),
                    int.Parse(razbitaVrstica[4]));
                Racun racun = new Racun(oseba, double.Parse(razbitaVrstica[5]));
                racuni[index] = racun;
            }
            dat.Close();
            return racuni;
        }

        public static int PrestejVrstice(string imeDatoteke)
        {
            StreamReader dat = File.OpenText(imeDatoteke);
            int stevec = 0;
            string vrstica = dat.ReadLine();
            while (vrstica != null)
            {
                stevec++;
                vrstica = dat.ReadLine();
            }
            dat.Close();
            return stevec;
        }

        public String PripraviZaZapis()
        {
            return String.Format("{0}:{1}", this.lastnik.PripraviZaZapis(),
                this.stanje);
        }

        public override String ToString()
        {
            return String.Format("{0} {1}", this.lastnik.ToString(),
            this.stanje);
        }
    }
}

GENERIRANJE PODATKOV TESTNI PROGRAM

Ustvarimo naključne objekte in jih zapišemo na datoteko.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Nal_Racun;


namespace Test_PripravaPodatkov
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Generiranje testnih podatkov.");

            string imeDatoteke = "";

            imeDatoteke = @"../../../Racun/TestniPodatki/TestniPodatkiRacun.txt";

            //želimo ustvariti novo testno datoteko
            //zato jo v primeru, da že obstaja izbrišemo
            if (File.Exists(imeDatoteke))
            {
                File.Delete(imeDatoteke);
            }


            Console.WriteLine("Generiranje testne datoteke....");

            GenerirajTestnePodatkeRacun(imeDatoteke);
        }

        private static void GenerirajTestnePodatkeRacun(string imeDatoteke)
        {
            for(int i= 0; i < 21; i++)
            {
                //vstavljanje testnih podatkov na datoteko
                Racun racun = new Racun(new Oseba("Ime" + i, "Priimek" + i, "Naslov" + i, i * 2, 12345678 + i), i * 112.50);
                racun.DodajNaDatoteko(imeDatoteke);
            }
        }


    }
}

TESTNI PROGRAM NALOGE RAČUN

V testnem programu naloge Račun smo napisali metode za reševanje zastavljenih primerov. Sledi program s komentarji:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Nal_Racun
{
    class Program
    {
        //Testni program naloge Račun
        static void Main(string[] args)
        {
            //Kreiranje objekta tipa Račun
            string imeTestneDatoteke = @"../../../Racun/TestniPodatki/TestniPodatkiRacun.txt";
            Racun racun = new Racun(new Oseba("Katja", "Plesko", "Lepa pot 2", 23, 55443322),1324.55);
            //Dodajanje novega objekta na datoteko
            racun.DodajNaDatoteko(imeTestneDatoteke);
            //Branje podatkov iz datoteke v tabelo objektov
            Racun[] racuni = Racun.PreberiIzDatoteke(imeTestneDatoteke);
            //Izpis Tabele
            Console.WriteLine();
            Console.WriteLine("Izpis vseh racunov: ");
            IzpisiTabeloRacunov(racuni);
            //Klic metod za reševanje zastavljenih problemov
            Console.WriteLine();
            Console.WriteLine("Izpis osebe z največ denarja: ");
            IzpisOsebeZNajvečDenarja(racuni);
            Console.WriteLine();
            Console.WriteLine("Izpis vsote denarja vseh oseb v tabeli računov: ");
            Console.WriteLine(VsotaDenarja(racuni));
            Console.WriteLine();
            Console.WriteLine("Izpis vsote denarja vseh oseb v tabeli računov starih med 10 in 35 let: ");
            Console.WriteLine(VsotaDenarjaOsebMedXinYleti(racuni,10,35));
            Console.WriteLine();
            Console.WriteLine("Nakazi 1500€ ter izpiši naslove oseb, ki smo jim nakazali denar:");
            racuni = NakaziTerIzpisi(racuni);
            Console.WriteLine();
            Console.WriteLine("Izpis osebe z najmanj denarja: ");
            IzpisOsebeZNajmanjDenarja(racuni);
            //Zapis podatkov v datoteko
            Console.WriteLine();
            Console.WriteLine("Zapis podatkov v datoteko rezultat.txt ");
            string imeDatoteke = "rezultat.txt";
            ZapisVDatoteko(imeDatoteke, racuni);

            Console.WriteLine("Spremenjeni podatki so shranjeni v datoteko " + imeDatoteke + ".");
            Console.ReadLine();
        }

        //Izpis tabele racunov
        private static void IzpisiTabeloRacunov(Racun[] tabRacunov)
        {
            for (int index = 0; index < tabRacunov.Length; index++)
            {
                Console.WriteLine(tabRacunov[index].ToString());
            }
        }

        //Metode za reševanje zastavljenih problemov

        //Izpiši ime in priimek osebe v tabeli računov, ki ima največ denarja.

        private static void IzpisOsebeZNajvečDenarja(Racun[] tabRacunov)
        {
            int maxIndex = 0;
            for (int index = 1; index < tabRacunov.Length; index++)
            {
                if (tabRacunov[index].Stanje > tabRacunov[maxIndex].Stanje)
                {
                    maxIndex = index;
                }
            }
            Console.WriteLine(String.Format("Oseba z največ denarja: {0}", tabRacunov[maxIndex].Lastnik.ToString()));
        }

        //Izračunaj, koliko denarja imajo skupaj osebe v tabeli objektov tipa Račun.
        private static double VsotaDenarja(Racun[] tabRacunov)
        {
            double vsota = 0.0;
            for (int index = 0; index < tabRacunov.Length; index++)
            {
                vsota += tabRacunov[index].Stanje;
            }
            return vsota;
        }

        //Izračunaj,  koliko denarja imajo skupaj osebe stare med x in y let (parametra) v tabeli objektov tipa
        private static double VsotaDenarjaOsebMedXinYleti(Racun[] tabRacunov, int x, int y)
        {
            double vsota = 0.0;
            for (int index = 0; index < tabRacunov.Length; index++)
            {
                if (tabRacunov[index].Lastnik.Starost >= x && tabRacunov[index].Lastnik.Starost <= y)
                {
                    vsota += tabRacunov[index].Stanje;
                }
            }
            return vsota;
        }

        //V tabeli objektov tipa Račun imamo zbrane osebe, ki jim bomo nakazali vsakemu po 1500€.
        //Spremeni njihova stanja in na zaslon izpiši naslove teh oseb skupaj z novim stanjem.

        private static Racun[] NakaziTerIzpisi(Racun[] tabRacunov)
        {
            for (int index = 0; index < tabRacunov.Length; index++)
            {
                tabRacunov[index].Polog(1500.00);
                Console.WriteLine(String.Format("Naslov: {0} Stanje: {1}",
                    tabRacunov[index].Lastnik.Naslov, tabRacunov[index].Stanje));
            }
            return tabRacunov;
        }

        //Izpiši ime in priimek osebe v tabeli računov, ki ima najmanj denarja.

        private static void IzpisOsebeZNajmanjDenarja(Racun[] tabRacunov)
        {
            int minIndex = 0;
            for (int index = 1; index < tabRacunov.Length; index++)
            {
                if (tabRacunov[index].Stanje < tabRacunov[minIndex].Stanje)
                {
                    minIndex = index;
                }
            }
            Console.WriteLine(String.Format("Oseba z najmanj denarja: {0}", tabRacunov[minIndex].Lastnik.ToString()));
        }

        //Zapis podatkov v datoteko

        private static void ZapisVDatoteko(string imeDat,Racun[] tabRacunov)
        {
            for (int index = 0; index < tabRacunov.Length; index++)
            {
                tabRacunov[index].DodajNaDatoteko(imeDat);
            }
        }

    }
}

TESTNI PRIMERI

0%
0%