Denarnica

Denarnica

Avtor: Katja Pleško

OPIS PROBLEMA

Sestavi razred Denarnica, ki vsebuje tri komponente:

  • celoštevilsko spremenljivko, ki predstavlja količino evrov v njej
  • celoštevilsko spremenljivko, ki predstavlja količino centov v njej
  • spremenljivko tipa string, ki vsebuje ime lastnika denarnice.

    Napiši vsaj dva konstruktorja:
  • prazen konstruktor, ki količino evrov in centov v denarnici postavi na 0 in ime lastnika na "NEZNANO"
  • konstruktor, ki sprejme koliko evrov in centov naj bo v denarnici in ime lastnika

    Napiši metode get in set. V set metodi za evre in cente preveri smiselnost podatka - če je količina denarja, ki naj bo v denarnici, manjša od 0, naj se vrednost komponente ne spremeni. Napiši tudi metodo Opis, ki vrne niz V denarnici, katere lastnik je #ime_lastnika, je #st_evrov evrov in #st_centov centov.

  • Izračunaj, koliko denarja imajo skupaj osebe v tabeli objektov tipa Denarnica.
  • Cela skupina (beri vsi v tabeli) lastnikov denarnic se je odpravila v banko. Tam so vse svoje cente "pretopili" v evre (kolikor je šlo, seveda). Če je nekdo imel prej 6€ in 245 centov, ima sedaj v denarnici 8€ in 45 centov.
  • Izpiši imena vseh tistih oseb, ki si lahko privoščijo nakup banjice sladoleda, ki stane 4€ 45 centov. Seveda so vse osebe, ki to lahko, opravile nakup. Pazi, da bodo njihove denarnice odražale to stanje.
  • Božiček je vsem lastnikom denarnic prinesel 6€ in 55 centov. Ustrezno popravi stanje vseh denarnic.
  • Vse evre pretopimo v cente.

IDEJA REŠITVE

Sestavimo razred Denarnica, ki vsebuje tri komponente:

  • int stEvrov (celoštevilska spremenljivka, ki predstavlja količino evrov v denarnici)
  • int stCentov (celoštevilska spremenljivka, ki predstavlja količino centov v denarnici)
  • string lastnik (spremenljivka tipa string, ki predstavlja lastnika denarnice)

    Napišemo dva konstrukturja: prazni konstruktor, ki količino evrov in centov v denarnici postavi na 0 in ime lastnika na »NEZNANO« in konstruktor, ki sprejme koliko evrov in centov naj bo v denarnici in ime lastnika. Napišemo še get in set metodi. V set metodi za evre in cente preverimo še smiselnost podatka, če je količina denarja, ki naj bo denarnici negativna, naj se vrednost komponente ne spremeni.

    Napišemo še metode:
  • Opis, ki vrne niz V denarnici, katere lastnik je #ime_lastnika, je #st_evrov in #st_Cenov centov
  • Pretopi, ki pretopi cente v evre
  • PretopiVCente, ki pretopi evre v cente
  • PozitivnoStanje, ki preveri če je količina denarja v denarnici pozitivna
  • DodajNaDatoteko(string imeDatoteke), ki objekt this zapiše (doda) vrstico, kjer doda vse podatke objekta, med sabo ločene z znakom ';'
  • 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 ';'.

    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';'.

RAZLAGA ALGORITMA + PROGRAM

RAZRED DENARNICA

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

namespace Nal_Denarnica
{
    public class Denarnica
    {
        int stEvrov;
        int stCentov;
        string lastnik;

        public int StEvrov
        {
            get { return stEvrov; }
            set {
                int tmpStEvrov = stEvrov;
                int tmpStCentov = stCentov;
                stEvrov = value;
                if (!PozitivnoStanje())
                {
                    stEvrov = tmpStEvrov;
                    stCentov = tmpStCentov;

                }
            }
        }

        public int StCentov
        {
            get { return stCentov; }
            set {
                int tmpStEvrov = stEvrov;
                int tmpStCentov = stCentov;
                stCentov = value;
                if (!PozitivnoStanje())
                {
                    stEvrov = tmpStEvrov;
                    stCentov = tmpStCentov;

                }
            }
        }

        public string Lastnik
        {
            get { return lastnik; }
            set { lastnik = value; }
        }

        public Denarnica()
        {
            this.stEvrov = 0;
            this.stCentov = 0;
            this.lastnik = "NEZNANO";
        }

        public Denarnica(int stEvrov, int stCentov, string lastnik)
        {
            this.stEvrov = stEvrov;
            this.stCentov = stCentov;
            this.lastnik = lastnik;
        }

        public Denarnica(string lastnik)
        {
            this.stEvrov = 0;
            this.stCentov = 0;
            this.lastnik = lastnik;
        }

        public void Pretopi()
        {
            int stEvrovIzCentov = this.stCentov / 100;
            this.stEvrov += stEvrovIzCentov;
            this.stCentov -= stEvrovIzCentov * 100;
            if (stCentov < 0)
            {
                this.stEvrov -= 1;
                this.stCentov += 100;
            }
        }

        public void PretopivCente()
        {
            int stCentovIzEvrov = this.stEvrov * 100;
            this.stCentov += stCentovIzEvrov;
            this.stEvrov -= stCentovIzEvrov / 100;
        }
        public bool PozitivnoStanje()
        {
            this.Pretopi();
            if (this.stEvrov >= 0 && this.stCentov >= 0)
            {
                return true;
            }
            return false;
        }

        public string Opis()
        {
            return String.Format("V denarnici, katere lastnik je {0}, je {1} evrov in {2} centov.",
                this.lastnik, this.stEvrov, this.stCentov);
        }

        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 Denarnica[] PreberiIzDatoteke(string imeDatoteke)
        {
            if (!File.Exists(imeDatoteke))
            {
                //datoteka ne obstaja vrnemo prazno tabelo racunov.
                return new Denarnica[0];
            }
            int steviloZapisov = PrestejVrstice(imeDatoteke);
            Denarnica[] denarnice = new Denarnica[steviloZapisov];
            StreamReader dat = File.OpenText(imeDatoteke);
            for (int index = 0; index < steviloZapisov; index++)
            {
                string vrstica = dat.ReadLine();
                string[] razbitaVrstica = vrstica.Split(':');
                Denarnica denarnica = new Denarnica(
                    int.Parse(razbitaVrstica[1]),
                    int.Parse(razbitaVrstica[2])
                    , razbitaVrstica[0]);
                denarnice[index] = denarnica;
            }
            dat.Close();
            return denarnice;
        }

        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}:{2}", this.lastnik,
                this.stEvrov, this.stCentov);
        }

        public override String ToString()
        {
            return String.Format("{0} Stevilo evrov: {1} Stevilo centov: {2}", this.lastnik,
               this.stEvrov, this.stCentov);
        }

    }
}

RAZRED DENARNICA

Poglejmo si razred Denarnica po funkcijah, ki smo jih definirali.

Definiramo tri komponente, stEvrov, stCentov, lastnik . Napišemo get in set metode. V set medoti za evre in cente preverimo smiselnost podatka. Če je količina denarja, ki naj bo v denarnici, manjša od 0, naj se vrednost komponente ne spremeni. Za preverjanje pozitivnega stanja napišemo funkcijo public bool PozitivnoStanje()

     int stEvrov;
        int stCentov;
        string lastnik;

        public int StEvrov
        {
            get { return stEvrov; }
            set {
                int tmpStEvrov = stEvrov;
                int tmpStCentov = stCentov;
                stEvrov = value;
                if (!PozitivnoStanje())
                {
                    stEvrov = tmpStEvrov;
                    stCentov = tmpStCentov;

                }
            }
        }
        public int StCentov
        {
            get { return stCentov; }
            set {
                int tmpStEvrov = stEvrov;
                int tmpStCentov = stCentov;
                stCentov = value;
                if (!PozitivnoStanje())
                {
                    stEvrov = tmpStEvrov;
                    stCentov = tmpStCentov;
                }
            }
        }

        public string Lastnik
        {
            get { return lastnik; }
            set { lastnik = value; }
        }

        public bool PozitivnoStanje()
        {
            this.Pretopi();
            if (this.stEvrov >= 0 && this.stCentov >= 0)
            {
                return true;
            }
            return false;
        }

RAZRED DENARNICA - nadaljevanje

Definiramo prazen konstruktor, ki količino evrov in centov v denarnici postavi na 0 in ime lastnika na "NEZNANO"


      public Denarnica()
        {
            this.stEvrov = 0;
            this.stCentov = 0;
            this.lastnik = "NEZNANO";
        }

Definiramo konstruktor, ki sprejme koliko evrov in centov naj bo v denarnici in ime lastnika


        public Denarnica(int stEvrov, int stCentov, string lastnik)
        {
            this.stEvrov = stEvrov;
            this.stCentov = stCentov;
            this.lastnik = lastnik;
        }

Napišemo funkcijo Opis , ki vrne niz V denarnici, katere lastnik je #ime_lastnika, je #st_evrov evrov in #st_centov centov.


        public string Opis()
        {
            return String.Format("V denarnici, katere lastnik je {0}, je {1} evrov in {2} centov.",
                this.lastnik, this.stEvrov, this.stCentov);
        }

RAZRED DENARNICA - nadaljevanje

Napišemo še funkcijo, ki pretopi cente v evre. Kako? V spremenljivki stCentov imamo shranjeno število centov. Da dobimo evre, moramo to stevilo deliti s 100. Rezultat shranimo v novo spremenljivko stEvrovIzCentov . Povečamo stEvrov za toliko, kolikor je vrednost spremenljivke stEvrovIzCentov . stCentov pa zmanjšamo za toliko kolikor smo centov pretopili v evre, torej stEvrovIzCentov pomnoženo s 100, da dobimo cente. S pogojnim stavkom preverimo,če je stCentov manjše od 0. Če je zmanjšamo stEvrov  za 1 in povečamo stCentov za 100.


        public void Pretopi()
        {
            int stEvrovIzCentov = this.stCentov / 100;
            this.stEvrov += stEvrovIzCentov;
            this.stCentov -= stEvrovIzCentov * 100;
            if (stCentov < 0)
            {
                this.stEvrov -= 1;
                this.stCentov += 100;
            }
        }

Podobno izvedemo funkcijo, če želimo evre pretopiti v cente.


        public void PretopivCente()
        {
            int stCentovIzEvrov = this.stEvrov * 100;
            this.stCentov += stCentovIzEvrov;
            this.stEvrov -= stCentovIzEvrov / 100;
        }

RAZRED DENARNICA - 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 Denarnica[] PreberiIzDatoteke(string imeDatoteke)
        {
            if (!File.Exists(imeDatoteke))
            {
                //datoteka ne obstaja vrnemo prazno tabelo racunov.
                return new Denarnica[0];
            }
            int steviloZapisov = PrestejVrstice(imeDatoteke);
            Denarnica[] denarnice = new Denarnica[steviloZapisov];
            StreamReader dat = File.OpenText(imeDatoteke);
            for (int index = 0; index < steviloZapisov; index++)
            {
                string vrstica = dat.ReadLine();
                string[] razbitaVrstica = vrstica.Split(':');
                Denarnica denarnica = new Denarnica(
                    int.Parse(razbitaVrstica[1]),
                    int.Parse(razbitaVrstica[2])
                    , razbitaVrstica[0]);
                denarnice[index] = denarnica;
            }
            dat.Close();
            return denarnice;
        }

        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}:{2}", this.lastnik,
                this.stEvrov, this.stCentov);
        }

        public override String ToString()
        {
            return String.Format("{0} Stevilo evrov: {1} Stevilo centov: {2}", this.lastnik,
               this.stEvrov, this.stCentov);
        }

TESTNI PROGRAM NALOGE DENARNICA

TESTNI PROGRAM

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


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

namespace Nal_Denarnica
{
    class Program
    {
        static void Main(string[] args)
        {
            //Kreiranje objekta tipa Denarnica
            string imeTestneDatoteke = @"../../../Denarnica/TestniPodatki/TestniPodatkiDenarnica.txt";
            Denarnica denarnica = new Denarnica(1,55, "Katja Plesko");
            //Dodajanje novega objekta na datoteko
            denarnica.DodajNaDatoteko(imeTestneDatoteke);
            //Branje podatkov iz datoteke v tabelo objektov
            Denarnica[] denarnice = Denarnica.PreberiIzDatoteke(imeTestneDatoteke);
            //Izpis Tabele
            Console.WriteLine();
            Console.WriteLine("izpis vseh denarnic: ");
            IzpisTabeleDenarnic(denarnice);

            //Klici metod za reševanje zastavljenih problemov
            Console.WriteLine();

            //test metode set...denarnici, ki smo jo ustvarili zgoraj bomo poskušali nastaviti vrednost na -2€
            Console.WriteLine("Izpis denarnice pred spremembo vrednosti stevila evrov: ");
            Console.WriteLine(denarnica.ToString());
            Console.WriteLine("Izpis denarnice po spremembi vrednosti stevila evrov (-2 evra): ");
            denarnica.StEvrov = -2;
            Console.WriteLine(denarnica.ToString());
            Console.WriteLine("Izpis denarnice po spremembi vrednosti stevila cenotv (150 centov): ");
            denarnica.StCentov = 150;
            Console.WriteLine(denarnica.ToString());


            Console.WriteLine();

            Console.WriteLine("Izpis vsote denarja v vseh denarnicah: ");
            Denarnica vsota = VsotaDenarja(denarnice);
            Console.WriteLine(String.Format("Vsota denarja v vseh denarnicah je: {0} evrov in {1} centov.", vsota.StEvrov, vsota.StCentov));
            Console.WriteLine();

            Console.WriteLine("Izpis tabele denarnic po klicu metode pretopi: ");
            denarnice = Pretopi(denarnice);
            IzpisTabeleDenarnic(denarnice);
            Console.WriteLine();

            Console.WriteLine("Izpis tabele denarnic po klicu metode PretopivCente: ");
            denarnice = PretopivCente(denarnice);
            IzpisTabeleDenarnic(denarnice);
            Console.WriteLine();

            Console.WriteLine("Nakup sladoleda: ");
            denarnice = NakupSladoleda(denarnice);

            Console.WriteLine();
            Console.WriteLine("Bozicek: ");
            denarnice = Bozicek(denarnice);
            IzpisTabeleDenarnic(denarnice);
            Console.WriteLine();

            //Zapis podatkov v datoteko
            Console.WriteLine();
            Console.WriteLine("Zapis podatkov v datoteko rezultat.txt ");
            string imeDatoteke = "rezultat.txt";
            ZapisVDatoteko(imeDatoteke, denarnice);

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

        private static void IzpisTabeleDenarnic(Denarnica[] denarnica)
        {
            for (int index = 0; index < denarnica.Length; index++)
            {
                Console.WriteLine(denarnica[index].ToString());
            }
        }

        //Izračunaj, koliko denarja imajo skupaj osebe v tabeli objektov tipa Denarnica.
        private static Denarnica VsotaDenarja(Denarnica[] denarnica)
        {
            //količino denarja si bomo sešteli v objektu tipa denarnica.
            Denarnica vsota = new Denarnica();
            for (int index = 0; index < denarnica.Length; index++)
            {
                vsota.StEvrov += denarnica[index].StEvrov;
                vsota.StCentov += denarnica[index].StCentov;
            }
            vsota.Pretopi();
            return vsota;
        }
        //Cela skupina (beri vsi v tabeli) lastnikov denarnic se je odpravila v banko. Tam so vse svoje cente
        //"pretopili" v evre (kolikor je šlo, seveda). Če je nekdo imel prej 6€ in 245 centov, ima sedaj v
        //denarnici 8€ in 45 centov.
        private static Denarnica[] Pretopi(Denarnica[] denarnica)
        {
            for (int index = 0; index < denarnica.Length; index++)
            {
                denarnica[index].Pretopi();
            }
            return denarnica;
        }

        //Cela skupina (beri vsi v tabeli) lastnikov denarnic se je odpravila v banko. Tam so vse svoje evre
        //"pretopili" v cente.
        private static Denarnica[] PretopivCente(Denarnica[] denarnica)
        {
            for (int index = 0; index < denarnica.Length; index++)
            {
                denarnica[index].PretopivCente();
            }
            return denarnica;
        }

        //Izpiši imena vseh tistih oseb, ki si lahko privoščijo nakup banjice sladoleda, ki stane 4€ 45 centov.
        //Seveda so vse osebe, ki to lahko, opravile nakup. Pazi, da bodo njihove denarnice odražale to stanje.
        private static Denarnica[] NakupSladoleda(Denarnica[] denarnica)
        {
            Console.WriteLine("Izpis oseb, ki lahko kupijo sladoled: ");
            for (int index = 0; index < denarnica.Length; index++)
            {
                Denarnica zacasna = new Denarnica(denarnica[index].StEvrov - 4, denarnica[index].StCentov - 45,"NEZNAN");
                if (zacasna.PozitivnoStanje())
                {
                    denarnica[index].StEvrov -= 4;
                    denarnica[index].StCentov -= 45;
                    Console.WriteLine(denarnica[index].Lastnik);
                }
            }
            return denarnica;
        }

        //Božiček je vsem lastnikom denarnic prinesel 6€ in 55 centov. Ustrezno popravi stanje sveh denarnic.
        private static Denarnica[] Bozicek(Denarnica[] denarnica)
        {
            for (int index = 0; index < denarnica.Length; index++)
            {
                denarnica[index].StEvrov += 6;
                denarnica[index].StCentov += 55;
            }
            return denarnica;
        }
        //Vsaj en (zaželjeno pa več) problem po vaši izbiri ... (opišite jih!


        //Zapis podatkov v datoteko

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

GENERIRANJE PODATKOV TESTNI PROGRAM

Ustvarimo 20 objektov in jih zapišimo na datoteko.


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

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


            string imeDatoteke = "";
            imeDatoteke = @"../../../Denarnica/TestniPodatki/TestniPodatkiDenarnica.txt";

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

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

            GenerirajTestnePodatkeDenarnica(imeDatoteke);

        }

        private static void GenerirajTestnePodatkeDenarnica(string imeDatoteke)
        {
            Random random = new Random();
            for (int i = 0; i < 21; i++)
            {
                int steviloEvrov = random.Next(1000);
                int steviloCentov = random.Next(300);
                Denarnica denarnica = new Denarnica(steviloEvrov,steviloCentov, "Lastnik " + i);
                denarnica.DodajNaDatoteko(imeDatoteke);
            }
        }
    }
}

TESTNI PRIMERI

0%
0%