Naloga: Knjiga

Naloga: Knjiga

Avtor: Gregor Šoln

Navodilo naloge in ideja rešitve

Knjiga

Sestavi razred Knjiga, ki vsebuje ime in priimek avtorja, naslov knjige, leto izida, zvrst in število strani.

  • Izpiši statistiko knjig po posameznih zvrsteh.
  • Alenka želi med počitnicami prebrati tri najdebelejše knjige. Poišči jih.
  • Zaradi cenzure je potrebno vse knjige avtorja X Y odstraniti iz knjižnice, podatke o teh knjigi pa izbrisati iz datoteke.
  • Podatki o knjigah so zbrani v datoteki. Ker so bili pri vodenju evidence o knjig površni, se nekateri zapisi pojavijo večkrat, vendar tako, da podatki niso smiselni. (Leto izida se lahko spreminja. Pri novi izdaji se lahko spremeni število strani, ne pa tudi zvrst.) Poišči vse sumljive vnose in jih zapiši v novo datoteko.

Ideja rešitve

Sestaviti je potrebno razred Knjiga. Razred bo vseboval različne metode s pomočjo katerih bomo ugotovili katere so tri najdebelejše knjige, izpisali bomo statistiko knjig po zvrsteh in uredili nepravilne zapise objektov na datoteki.

Razreda Knjiga

Obejtk tipa Knjiga bomo ustvarili z ukazom Knjiga objekt = new Knjiga() . Ker v ukazu ni nobenih dodatnih parametrov gre za prazen konstruktor, ki ustvari prazen objekt.
Ker pa ne želimo praznih objektov, saj ne vsebujejo nobenih podatkov, bomo ustvarili konstruktorje, ki za parameter prejmejo podatke, s katerim lahko določimo knjigo. Kot parameter bomo prebrali naslov knjige, ime avtorja, priimek avtorja, leto izida, izdaja, število strani in zvrst.

Definiranje privatnih spremenljivk

Preden začenemo s pisanjem konstruktorjev je potrebno v razredu opisati privatne spremenljivke za katerimi bomo delali v nadaljevanju. Napišemo jih na začetek razreda.

namespace KnjigaClass
{
    public class Knjiga
    {
        /// <summary>
        /// privatne spremenjivke
        /// </summary>
        private string _avtorIme;
        private string _avtorPri;
        private string _naslov;
        private int _letoIzida;
        private string _zvrst;
        private int _stStrani;
        private int _izdaja;

Podrobnosti


namespace KnjigaClass
{
    public class Knjiga
    {
        /// <summary>
        /// privatne spremenjivke
        /// </summary>
        private string _avtorIme;
        private string _avtorPri;
        private string _naslov;
        private int _letoIzida;
        private string _zvrst;
        private int _stStrani;
        private int _izdaja;
    }

}

Zapri

Get in Set metode

Za vsako privatno spremenljivko, ki smo jo definirali pa je potrebno definirati t.i. get/set metode. S pomočjo metode set bomo spremenljivkam lahko nastavljali nove vrednosti. Z metodo get pa bomo pridobili vrednost spremenljivke.


        public string AvtorIme
        {
            get { return this._avtorIme; }
            set { this._avtorIme = value; }
        }

Zgornji primer prikazuje primer set/get metode na spremenjivki _avtorIme. Spremenljivka hrani podatke o imenu avtorja knjige. Enako kot je definirana get/set metoda za ime avtorja, storimo tudi za druge spremenljivke.

Podrobnosti


namespace KnjigaClass
{
    public class Knjiga
    {
        /// <summary>
        /// privatne spremenjivke
        /// </summary>
        private string _avtorIme;
        private string _avtorPri;
        private string _naslov;
        private int _letoIzida;
        private string _zvrst;
        private int _stStrani;
        private int _izdaja;
        private string _zacasna; //začasena spremenljivka za zapis, ki ga prberemo iz datoteke

        public string AvtorIme
        {
            get { return this._avtorIme; }
            set { this._avtorIme = value; }
        }
        public string AvtorPri
        {
            get { return this._avtorPri; }
            set { this._avtorPri = value; }
        }
        public string Naslov
        {
            get { return this._naslov; }
            set { this._naslov = value; }
        }
        public int LetoIzida
        {
            get { return this._letoIzida; }
            set { this._letoIzida = value; }
        }
        public string Zvrst
        {
            get { return this._zvrst; }
            set { this._zvrst = value; }
        }
        public int StStrani
        {
            get { return this._stStrani; }
            set { this._stStrani = value; }
        }
        public int Izdaja
        {
            get { return this._izdaja; }
            set { this._izdaja = value; }
        }
    }

}

Zapri

Konstruktor

Konstruktorjev bo potrebno definirati več, saj kot parametere pričakujemo različne oblike podatkov o knjigah.

  • Podan je en sam parameter v obliki niza. Podatki o knjigi so v nizu ločeni z podpičjem.
  • Podanih je toliko parametrov kolikor je podatkov o knjigi. Vsak podatek je samostojen parameter.
  • Podatkov o knjigi ni, zato definiramo prazen konstruktor, brez parametrov.

Konstruktor, ki kot parameter prejme niz podatkov


        public Knjiga(string s)
        {
                string[] niz = s.Split(';');
                this.Naslov = niz[0];
                this.AvtorIme = niz[1];
                this.AvtorPri = niz[2];
                this.Zvrst = niz[3];
                this.LetoIzida = int.Parse(niz[4]);
                this.StStrani = int.Parse(niz[5]);
                try
                {
                    this.Izdaja = int.Parse(niz[6]);
                }
                catch { }
        }

V zgornjem primeru vidimo, da smo parameter podali kot niz podatkov, ki so med seboj ločeni z znakom ;. Niz najprej razdelimo s funkcijo Split(';') in shranimo v tabelo nizov. Nize nato dodelimo ustreznim privatnim spremenljivkam, ki smo jih definirali na začetku.

Prikazali smo le en primer dfiniranja konstruktorja. Ostala dva sta prikazana tukaj.
Konstruktorji

Podrobnosti


public Knjiga(string naslov, string avtorIme, string avtorPri, string zvrst, int letoIzida, int stStrani)
        {
            this.Naslov = naslov;
            this.AvtorIme = avtorIme;
            this.AvtorPri = avtorPri;
            this.Zvrst = zvrst;
            this.AvtorPri = avtorPri;
            this.StStrani = stStrani;
            this.LetoIzida = letoIzida;
        }

public Knjiga(string naslov, string avtorIme, string avtorPri, string zvrst, int letoIzida, int stStrani, int izdaja)
        {
            this.Naslov = naslov;
            this.AvtorIme = avtorIme;
            this.AvtorPri = avtorPri;
            this.Zvrst = zvrst;
            this.AvtorPri = avtorPri;
            this.StStrani = stStrani;
            this.LetoIzida = letoIzida;
            //if (izdaja == this.Izdaja + 1) this.Izdaja = izdaja;
            this.Izdaja = izdaja;
        }

public Knjiga(string s)
        {
                string[] niz = s.Split(';');

                this.Naslov = niz[0];
                this.AvtorIme = niz[1];
                this.AvtorPri = niz[2];
                this.Zvrst = niz[3];
                this.LetoIzida = int.Parse(niz[4]);
                this.StStrani = int.Parse(niz[5]);
                try
                {
                    this.Izdaja = int.Parse(niz[6]);
                }
                catch { }
        }

Zapri

Statistika knjig po zvrsteh

Knjige lahko uredimo po njihovih zvrsteh. Na podlagi tega bomo prešteli vse knjige po zvrsteh in izpisali njihovo statistiko.

Z metodo IzpisiStatistiko(Knjiga[] seznam) izpišemo statistiko knjig, ki jih podamo kot seznam objektov tipa Knjiga.

Sprehoditi se je potrebno po celotnem seznamu in za vsako knjigo je potrebno preveriti za katero zvrst gre. Za tovrstno štetje uporabimo blok switch. Še prej pa definiramo tabelo stevci številskega podatkovnega tipa, ki nam bo omgočala štetje knjig po zvrsteh.


                switch (knjiga.Zvrst)
                {
                    case "poezija": stevci[0]++; break;
                    case "dokumentarni": stevci[1]++; break;
                    case "roman": stevci[2]++; break;
                    case "grozljivka": stevci[3]++; break;
                    case "komedija": stevci[4]++; break;
                    case "ljubezenski": stevci[5]++; break;
                    case "zgodovinski": stevci[6]++; break;
                }

Tabela števci ima dolžino 7 in vsaka celica te tabele predstavlja ustrezno zvrst. Ko med preverjanjem naletimo na ustrezno zvrst, vrednost ustrezne celice v tabeli povečamo za ena. V desnem razdelku okna si lahko ogledamo katere celice predstavljajo določeno zvrst.

Statistiko knjig izpišemo tako, da za usterzno zvrst izpišemo ustrezno število zvezdic (*), ki ponazarjajo število knjig v določeni zvrsti.

Sprehodimo se po tabeli stevci in ko naletimo na indeks, ki ponazarja ustrezno zvrst izpišemo njeno ime ter zvezdice, ki jih je toliko kolikor je knjig v zvrsti. Zvezdice izpisujemo s pomočjo zanke for.Na spodnjem primeru si lahko ogledamo kako izpišemo statistiko knjig za zvrst poezija.


            //sprehodimo se po celotni tabeli
            for (int i = 0; i < stevci.Length; i++)
            {
                if (i == 0) //indeks 0 predstavlja zvrst poezija
                {
                    Console.Write("poezija : "); //izpišemo ime
                    for (int j = 0; j < stevci[i]; j++)
                        Console.Write("*"); //dopišemo zvezdice
                    Console.WriteLine();
                }

Spodaj lahko vidimo kateri indeksi tabele stevci predstvljajo določeno zvrst.

poezija [0]
dokumentarni [1]
roman [2]
grozljivka [3]
komedija [4]
ljubezenski [5]
zgodovinsk [6]

Metoda IzpisiStatistiko

Podrobnosti

public void IzpisiStatistiko(Knjiga[] seznam)
        {

            // poezija, dokumentarni, roman, grozljivka, komedija, ljubezenski, zgodovinski
            //[   0          1          2         3         4           5            6     ]
            int[] stevci = new int[7];
            foreach (Knjiga knjiga in seznam)
            {
                switch (knjiga.Zvrst)
                {
                    case "poezija": stevci[0]++; break;
                    case "dokumentarni": stevci[1]++; break;
                    case "roman": stevci[2]++; break;
                    case "grozljivka": stevci[3]++; break;
                    case "komedija": stevci[4]++; break;
                    case "ljubezenski": stevci[5]++; break;
                    case "zgodovinski": stevci[6]++; break;
                }
            }

            for (int i = 0; i < stevci.Length; i++)
            {
                if (i == 0)
                {
                    Console.Write("poezija : ");
                    for (int j = 0; j < stevci[i]; j++)
                        Console.Write("*");
                    Console.WriteLine();
                }
                if (i == 1)
                {
                    Console.Write("dokumentarni : ");
                    for (int j = 0; j < stevci[i]; j++)
                        Console.Write("*");
                    Console.WriteLine();
                }
                if (i == 2)
                {
                    Console.Write("roman : ");
                    for (int j = 0; j < stevci[i]; j++)
                        Console.Write("*");
                    Console.WriteLine();
                }
                if (i == 3)
                {
                    Console.Write("grozljivka : ");
                    for (int j = 0; j < stevci[i]; j++)
                        Console.Write("*");
                    Console.WriteLine();
                }
                if (i == 4)
                {
                    Console.Write("komedija : ");
                    for (int j = 0; j < stevci[i]; j++)
                        Console.Write("*");
                    Console.WriteLine();
                }

                if (i == 5)
                {
                    Console.Write("ljubezenski : ");
                    for (int j = 0; j < stevci[i]; j++)
                        Console.Write("*");
                    Console.WriteLine();
                }
                if (i == 6)
                {
                    Console.Write("zgodovinski : ");
                    for (int j = 0; j < stevci[i]; j++)
                        Console.Write("*");
                    Console.WriteLine();
                }
            }
        }

Zapri

Tri najdebelejše knjige

Metoda vrniNajdebelejse je sestavljena tako, da seznam knjig uredi po številu strani padajoče. Nato izberemo prve tri objekte, ki se pojavijo na urejenem seznamu in ti trije objekti predstavljajo tri najdebelejše knjige.

Seznam uredimo padajoče po številu strani

Tabelo knjig dobimo kot parameter metode. Nato definiramo novo tabelo, ki ima dolžino 3 in je tipa Knjiga[].

Z ukazom var urejenSeznam = seznam.OrderByDescending(x => x.StStrani).ToList(); dobimo urejen seznam objektov, ki so urejeni padajoče po številu strani. Sedaj prve tri objekte prepišemo v tabelo, ki smo jo prej definirali. To tabelo na konu tudi vrnemo.

Podrobnosti

public Knjiga[] VrniNajdebelejse(Knjiga[] seznam)
        {
            //po st strani padajoč seznam
            var urejenSeznam = seznam.OrderByDescending(x => x.StStrani).ToList();
            Knjiga[] tri = new Knjiga[3];
            tri[0] = urejenSeznam[0];
            tri[1] = urejenSeznam[1];
            tri[2] = urejenSeznam[2];
            return tri;
        }

Zapri

Popravi neustrezne

Ker se na datoteki pojavljajo zapisi, ki so neustrezni je potrebno datoteko pregledati in odpraviti neustrezne zapise objektov.

Z metodo odstraniNeustrezne preberemo vsebino datoteke in nato preverimo ali so prebrani podatki ustrezni.

Najprej definiramo tabelo objektov tipa Knjiga, kjer bomo hranili objekte, ki bodo prebrani iz datoteke. Nato definiramo novo tabelo številskega podatkovnega tipa, ki je enake dolžine in ima ime odstrani.

Knjiga[] prebrano = new Knjiga[stVrstic + 1];
int[] odstrani = new int[stVrstic + 1];

Nato preberemo vsebino datoteke in jo shranimo v tabelo tako, da prebran zapis pretvorimo v objekt in nato objekt shranimo v tabelo.

Urejanje vsebine

Vsebino preverjamo tako, da vsak element tabele primerjamo z ostalimi elementi. Za tovrstne preglede uporabimo dvojno zanko for.
for (int i = 0; i < prebrano.Length; i++)
   for (int j = i + 1; j < prebrano.Length-1; j++)

Nato pridejo na vrsto koraki, kjer z if stavki preverjamo neustreznost izdaje, leto izida in zvrst, ki se je morebiti spremenila ob ponovni izdaji.
Pri izdajah je pomembno paziti na to, da gre res za naslednjo izdajo in pri tem se morata pravilno ujemati tudi letnici izida.

Ko naletimo na neustrezen zapis, si zapomnemo indeks njegove pojavitve. S tem indeksom dostopamo do ustreznega elementa v tabeli odstrani in mu nastavimo vrednost 1. Če je zapis ustrezen se v tabeli odstrani za ta zapis shrani vrednost 0, ki pomeni da je zapis vredu.

Na koncu zapišemo objekte nazaj na datoteko tako, da sproti preverjamo istoležne elemente v tabeli odstrani in če ima kateri izmed teh kdaj vrednost 1, ga preskočimo in ne zapišemo na datoteko.

Metoda odstraniNeustrezne
Celoten testni program
Celoten razred Knjiga

Na naslednji strani si oglejmo video posnetek izvajanja testnega primera, ki je opisan na zgornji povezavi "testni program".

Podrobnosti

public void odstraniNeustrezne(string imeDatoteke, int stVrstic)
        {
            Knjiga[] prebrano = new Knjiga[stVrstic + 1];
            int[] odstrani = new int[stVrstic + 1];
            int m = 0;

            StreamReader sr = new StreamReader(imeDatoteke); //preberemo vsebino datoteke
            String vrstica = sr.ReadLine();
            while (vrstica != null)
            {
                Knjiga gen = new Knjiga(vrstica);
                prebrano[m] = (gen);
                vrstica = sr.ReadLine();
                m++;
            }
            sr.Close();
            //preglej izdaje
            for (int i = 0; i < prebrano.Length; i++)
                for (int j = i + 1; j < prebrano.Length-1; j++)
                {
                    if (prebrano[i].Naslov.ToString() == prebrano[j].Naslov.ToString())
                        if (prebrano[i].AvtorIme.ToString() == prebrano[j].AvtorIme.ToString())
                            if (prebrano[i].AvtorPri.ToString() == prebrano[j].AvtorPri.ToString())
                                //preveri ali izdaji ustrezata
                                if (prebrano[i].Izdaja < prebrano[j].Izdaja)
                                    if (prebrano[i].LetoIzida <= prebrano[j].LetoIzida)
                                        //preverimo ali se zvrst ujema
                                        if (prebrano[i].Zvrst.ToString() == prebrano[j].Zvrst.ToString())
                                            odstrani[j] = 0;
                                        else { odstrani[j] = 1; }
                                    else { odstrani[j] = 1; }
                                else { odstrani[i] = 1; }
                            else { odstrani[i] = 0; }
                        else { odstrani[i] = 0; }
                    else { odstrani[i] = 0; }
                }
            StreamWriter sw = new StreamWriter("urejene_knjige.txt");
            for (int k = 0; k < prebrano.Length-1; k++)
            {
                if (odstrani[k] == 0) sw.WriteLine(prebrano[k].ToString());
            }
            sw.Close();

        }
        /// <summary>
        /// metoda izpiše vsebino tabele
        /// </summary>
        /// <param name="seznam"></param>
        public void izpisiTabelo(Knjiga[] seznam)
        {
            for (int i = 0; i < seznam.Length; i++)
            {
                Console.WriteLine(seznam[i].Naslov + "; " + seznam[i].AvtorIme + " " + seznam[i].AvtorPri + "; \n" +
                                    "Leto izida: "+seznam[i].LetoIzida.ToString() + "; \n" +
                                    "Izdaja: "+seznam[i].Izdaja.ToString() + "; \n" +
                                    "Stevilo strani: "+seznam[i].StStrani.ToString());
                Console.WriteLine();
            }
        }

Zapri

Podrobnosti


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

namespace test
{
    class Program
    {
        Random rnd = new Random();
        static void Main(string[] args)
        {
            Knjiga testna = new Knjiga();

            Knjiga testna1 = new Knjiga("Na gredici;Nikolaj;Pravo;zgodovinski;1063;226;3");
            Knjiga testna2 = new Knjiga("Na vodi;Veljko;Kralj;zgodovinski;1616;784;3");
            Knjiga testna3 = new Knjiga("Na travi;Jurij;Zeleni;dokumentarni;1388;565;2");
            Knjiga testna4 = new Knjiga("Zemljevidi;Trije;Avtorji;dokumentarni;1597;678;9");
            Knjiga testna5 = new Knjiga("Naravne znamenitosti;Karmen;Žmauc;dokumentarni;1392;62;1");
            Knjiga testna6 = new Knjiga("Ognjeni vrč;Miha;Krvinski;roman;1294;593;2");
            Knjiga testna7 = new Knjiga("Na koncu;Valerij;Kocjančič;ljubezenski;1020;680;9");
            Knjiga testna8 = new Knjiga("Uf to je to;Sklizovski;Valenak;komedija;1285;937;3");
            Knjiga testna9 = new Knjiga("Come on, babe jump!;Mikova;Oda;komedija;1758;695;5");
            Knjiga testna10 = new Knjiga("Mi vsi;Gorazdovski;Verivoj;grozljivka;1836;830;3");
            Knjiga testna11 = new Knjiga("Na severu;Velikomaj;Druško;dokumentarni;1392;833;1");
            Knjiga testna12 = new Knjiga("Pod drevesom;Onaj;Brkovski;roman;1916;194;4");
            Knjiga testna13 = new Knjiga("Zelen je ta svet;Meri;Okovskanski;poezija;1399;517;2");
            Knjiga testna14 = new Knjiga("Zelen je ta svet;Meri;Okovskanski;poezija;1300;517;3");


            Knjiga [] objekti = new Knjiga[14];
            objekti[0] = testna1;
            objekti[1] = testna2;
            objekti[2] = testna3;
            objekti[3] = testna4;
            objekti[4] = testna5;
            objekti[5] = testna6;
            objekti[6] = testna7;
            objekti[7] = testna8;
            objekti[8] = testna9;
            objekti[9] = testna10;
            objekti[10] = testna11;
            objekti[11] = testna12;
            objekti[12] = testna13;
            objekti[13] = testna14;

            Console.WriteLine("Zapisujem objekte na datoteko");
            //zapisovanje objektov na datoteko
            testna.TvoriDatoteko("knjige.txt", objekti);
            Console.ReadKey();

            Console.WriteLine();
            Console.WriteLine("Berem zapise iz datoteke. Shranjeni bodo v tabelo");
            Knjiga[] prebraniObjekti = testna.PreberiZDatoteke("knjige.txt");

            Console.WriteLine();
            Console.WriteLine("Obejkti shranjeni v tabelo");
            Console.ReadKey();

            Console.WriteLine();
            Console.WriteLine("Izpisujem tabelo..");
            testna.izpisiTabelo(prebraniObjekti);
            Console.ReadKey();

            Console.WriteLine();
            Console.WriteLine("Statistika knjig po zvrsteh");
            testna.IzpisiStatistiko(prebraniObjekti);
            Console.ReadKey();

            //Poiščemo tri najdebelejše knjige
            Knjiga[] najdebelejse = testna.VrniNajdebelejse(prebraniObjekti);
            Console.WriteLine();
            Console.WriteLine("Tri najdebelejše knjige: ");
            Console.WriteLine();
            Console.WriteLine(najdebelejse[0].ToString());
            Console.WriteLine(najdebelejse[1].ToString());
            Console.WriteLine(najdebelejse[2].ToString());
            Console.ReadKey();

            Console.WriteLine();
            Console.WriteLine("Sedaj popravljam nepravilnosti v datoteki..");
            testna.odstraniNeustrezne("knjige.txt", prebraniObjekti.Length);
            Console.WriteLine("Urejeni podatki shranjeni v datoteki: urejene_knjige.txt");
            Console.ReadKey();

            Console.WriteLine("Urejeno vsebino dodajam na staro datoteko");
            testna.DodajNaDatoteko("knjige.txt",prebraniObjekti);
            Console.WriteLine("Objekti dodani na datoteko");
            Console.ReadKey();

        }
    }
}

Zapri

Podrobnosti

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

namespace KnjigaClass
{
    public class Knjiga
    {
        /// <summary>
        /// privatne spremenjivke
        /// </summary>
        private string _avtorIme;
        private string _avtorPri;
        private string _naslov;
        private int _letoIzida;
        private string _zvrst;
        private int _stStrani;
        private int _izdaja;
        private string _zacasna; //začasena spremenljivka za zapis, ki ga prberemo iz datoteke

        public string AvtorIme
        {
            get { return this._avtorIme; }
            set { this._avtorIme = value; }
        }
        public string AvtorPri
        {
            get { return this._avtorPri; }
            set { this._avtorPri = value; }
        }
        public string Naslov
        {
            get { return this._naslov; }
            set { this._naslov = value; }
        }
        public int LetoIzida
        {
            get { return this._letoIzida; }
            set { this._letoIzida = value; }
        }
        public string Zvrst
        {
            get { return this._zvrst; }
            set { this._zvrst = value; }
        }
        public int StStrani
        {
            get { return this._stStrani; }
            set { this._stStrani = value; }
        }
        public int Izdaja
        {
            get { return this._izdaja; }
            set { this._izdaja = value; }
        }
        /// <summary>
        /// konstruktor zahteva vnos vseh parametrov
        /// </summary>
        /// <param name="naslov">Naslov Knjige</param>
        /// <param name="avtorIme">Ime avtorja</param>
        /// <param name="avtorPri">Priimek avtorja</param>
        /// <param name="zvrst">Zvrst knjige</param>
        /// <param name="letoIzida">Leto izdaje</param>
        /// <param name="stStrani">Število strani</param>
        public Knjiga(string naslov, string avtorIme, string avtorPri, string zvrst, int letoIzida, int stStrani)
        {
            this.Naslov = naslov;
            this.AvtorIme = avtorIme;
            this.AvtorPri = avtorPri;
            this.Zvrst = zvrst;
            this.AvtorPri = avtorPri;
            this.StStrani = stStrani;
            this.LetoIzida = letoIzida;
        }
        /// <summary>
        /// konstruktor z izdajo
        /// </summary>
        /// <param name="naslov">Naslov knjige</param>
        /// <param name="avtorIme">Ime avtorja</param>
        /// <param name="avtorPri">Priimek avtorja</param>
        /// <param name="zvrst">Zvrst knjige</param>
        /// <param name="letoIzida">Leto izdaje</param>
        /// <param name="stStrani">Število strani</param>
        /// <param name="izdaja">Izdaja po vrsti</param>
        public Knjiga(string naslov, string avtorIme, string avtorPri, string zvrst, int letoIzida, int stStrani, int izdaja)
        {
            this.Naslov = naslov;
            this.AvtorIme = avtorIme;
            this.AvtorPri = avtorPri;
            this.Zvrst = zvrst;
            this.AvtorPri = avtorPri;
            this.StStrani = stStrani;
            this.LetoIzida = letoIzida;
            //if (izdaja == this.Izdaja + 1) this.Izdaja = izdaja;
            this.Izdaja = izdaja;
        }
        /// <summary>
        /// prazen konstruktor, brez parametrov
        /// </summary>
        public Knjiga()
        {
        }
        /// <summary>
        /// Kontruktor, ki prejme podatke v obliki enega niz
        /// podatki so med seboj ločeni z ; (podpičjem)
        /// </summary>
        /// <returns>naslov imeAvtor priAvtor zvrst letoIzdaje strani izdaja</returns>
        public Knjiga(string s)
        {
                string[] niz = s.Split(';');

                this.Naslov = niz[0];
                this.AvtorIme = niz[1];
                this.AvtorPri = niz[2];
                this.Zvrst = niz[3];
                this.LetoIzida = int.Parse(niz[4]);
                this.StStrani = int.Parse(niz[5]);
                try
                {
                    this.Izdaja = int.Parse(niz[6]);
                }
                catch { }
        }
        /// <summary>
        /// na datoteko se doda knjigo (objekt)
        /// </summary>
        /// <param name="imeDatoteke"></param>
        /// <param name="knjige"></param>
        public void DodajNaDatoteko(string imeDatoteke, Knjiga[] knjige)
        {
            StreamWriter sw = new StreamWriter(imeDatoteke, true);
            sw.WriteLine();
            foreach(Knjiga k in knjige)
                sw.WriteLine(k.ToString());
            sw.Close();
        }
        /// <summary>
        /// prebere zapise iz datoteke in ga vrne
        /// </summary>
        /// <param name="imeDatoteke"></param>
        public Knjiga[] PreberiZDatoteke(string imeDatoteke)
        {
            StreamReader sr = new StreamReader(imeDatoteke);
            String[] prebrano = sr.ReadToEnd().Split('\n');
            sr.Close();


            Knjiga[] prebraniObjekti = new Knjiga[14];
            for (int i = 0; i < prebrano.Length; i++)
            {
                if (prebrano[i] != "")
                {
                    Knjiga zacasni = new Knjiga(prebrano[i]);
                    prebraniObjekti[i] = zacasni;
                }
            }
            return prebraniObjekti;
        }
        /// <summary>
        /// izpiše vsebino datoteke na zaslon
        /// </summary>
        /// <param name="imeDatoteke"></param>
        public void IzpisiDatoteko(string imeDatoteke)
        {
            StreamReader sw = new StreamReader(imeDatoteke);
            Console.WriteLine(sw.ReadToEnd());
            sw.Close();
        }
        /// <summary>
        /// funkcija tvori tekstovno datoteko in vanjo vnese toliko
        /// nizov kolikor je podano število elementov
        /// </summary>
        /// <param name="imeDatoteke"></param>
        /// <param name="stElementov"></param>
        public void TvoriDatoteko(string imeDatoteke, Knjiga[] seznam)
        {
            StreamWriter sr = new StreamWriter(imeDatoteke);
            for (int i = 0; i < seznam.Length; i++)
                sr.WriteLine(seznam[i].ToString());
            sr.Close();
        }
        /// <summary>
        /// metoda za izpis podatkov o knjigi
        /// </summary>
        /// <returns>niz</returns>
        public override string ToString()
        {
            return this.Naslov+";"+this.AvtorIme+";"+this.AvtorPri+";"+this.Zvrst+";"+this.LetoIzida+";"+this.StStrani+";"+this.Izdaja;
        }
        /// <summary>
        /// metoda izpiše statistiko knjig po zvrsteh
        /// poezija, dokumentarni, roman, grozljivka, komedija, ljubezenski, zgodovinski
        /// </summary>
        /// <param name="seznam"></param>
        public void IzpisiStatistiko(Knjiga[] seznam)
        {

            // poezija, dokumentarni, roman, grozljivka, komedija, ljubezenski, zgodovinski
            //[   0          1          2         3         4           5            6     ]
            int[] stevci = new int[7];
            foreach (Knjiga knjiga in seznam)
            {
                switch (knjiga.Zvrst)
                {
                    case "poezija": stevci[0]++; break;
                    case "dokumentarni": stevci[1]++; break;
                    case "roman": stevci[2]++; break;
                    case "grozljivka": stevci[3]++; break;
                    case "komedija": stevci[4]++; break;
                    case "ljubezenski": stevci[5]++; break;
                    case "zgodovinski": stevci[6]++; break;
                }
            }

            for (int i = 0; i < stevci.Length; i++)
            {
                if (i == 0)
                {
                    Console.Write("poezija : ");
                    for (int j = 0; j < stevci[i]; j++)
                        Console.Write("*");
                    Console.WriteLine();
                }
                if (i == 1)
                {
                    Console.Write("dokumentarni : ");
                    for (int j = 0; j < stevci[i]; j++)
                        Console.Write("*");
                    Console.WriteLine();
                }
                if (i == 2)
                {
                    Console.Write("roman : ");
                    for (int j = 0; j < stevci[i]; j++)
                        Console.Write("*");
                    Console.WriteLine();
                }
                if (i == 3)
                {
                    Console.Write("grozljivka : ");
                    for (int j = 0; j < stevci[i]; j++)
                        Console.Write("*");
                    Console.WriteLine();
                }
                if (i == 4)
                {
                    Console.Write("komedija : ");
                    for (int j = 0; j < stevci[i]; j++)
                        Console.Write("*");
                    Console.WriteLine();
                }

                if (i == 5)
                {
                    Console.Write("ljubezenski : ");
                    for (int j = 0; j < stevci[i]; j++)
                        Console.Write("*");
                    Console.WriteLine();
                }
                if (i == 6)
                {
                    Console.Write("zgodovinski : ");
                    for (int j = 0; j < stevci[i]; j++)
                        Console.Write("*");
                    Console.WriteLine();
                }
            }
        }
        /// <summary>
        /// metoda vrne tri najdebelejše knjige iz seznama, ki ga dobi kot parameter
        /// </summary>
        /// <param name="seznam"></param>
        /// <returns></returns>
        public Knjiga[] VrniNajdebelejse(Knjiga[] seznam)
        {
            //po st strani padajoč seznam
            var urejenSeznam = seznam.OrderByDescending(x => x.StStrani).ToList();
            Knjiga[] tri = new Knjiga[3];
            tri[0] = urejenSeznam[0];
            tri[1] = urejenSeznam[1];
            tri[2] = urejenSeznam[2];
            return tri;
        }
        /// <summary>
        /// Metoda odstrani neustrezne zapise na datoteki
        /// </summary>
        /// <param name="imeDatoteke"></param>
        /// <param name="stPot"></param>
        public void odstraniNeustrezne(string imeDatoteke, int stVrstic)
        {
            Knjiga[] prebrano = new Knjiga[stVrstic + 1];
            int[] odstrani = new int[stVrstic + 1];
            int m = 0;

            StreamReader sr = new StreamReader(imeDatoteke); //preberemo vsebino datoteke
            String vrstica = sr.ReadLine();
            while (vrstica != null)
            {
                Knjiga gen = new Knjiga(vrstica);
                prebrano[m] = (gen);
                vrstica = sr.ReadLine();
                m++;
            }
            sr.Close();
            //preglej izdaje
            for (int i = 0; i < prebrano.Length; i++)
                for (int j = i + 1; j < prebrano.Length-1; j++)
                {
                    if (prebrano[i].Naslov.ToString() == prebrano[j].Naslov.ToString())
                        if (prebrano[i].AvtorIme.ToString() == prebrano[j].AvtorIme.ToString())
                            if (prebrano[i].AvtorPri.ToString() == prebrano[j].AvtorPri.ToString())
                                //preveri ali izdaji ustrezata
                                if (prebrano[i].Izdaja < prebrano[j].Izdaja)
                                    if (prebrano[i].LetoIzida <= prebrano[j].LetoIzida)
                                        //preverimo ali se zvrst ujema
                                        if (prebrano[i].Zvrst.ToString() == prebrano[j].Zvrst.ToString())
                                            odstrani[j] = 0;
                                        else { odstrani[j] = 1; }
                                    else { odstrani[j] = 1; }
                                else { odstrani[i] = 1; }
                            else { odstrani[i] = 0; }
                        else { odstrani[i] = 0; }
                    else { odstrani[i] = 0; }
                }
            StreamWriter sw = new StreamWriter("urejene_knjige.txt");
            for (int k = 0; k < prebrano.Length-1; k++)
            {
                if (odstrani[k] == 0) sw.WriteLine(prebrano[k].ToString());
            }
            sw.Close();

        }
        /// <summary>
        /// metoda izpiše vsebino tabele
        /// </summary>
        /// <param name="seznam"></param>
        public void izpisiTabelo(Knjiga[] seznam)
        {
            for (int i = 0; i < seznam.Length; i++)
            {
                Console.WriteLine(seznam[i].Naslov + "; " + seznam[i].AvtorIme + " " + seznam[i].AvtorPri + "; \n" +
                                    "Leto izida: "+seznam[i].LetoIzida.ToString() + "; \n" +
                                    "Izdaja: "+seznam[i].Izdaja.ToString() + "; \n" +
                                    "Stevilo strani: "+seznam[i].StStrani.ToString());
                Console.WriteLine();
            }
        }

    }
}

Zapri

Video: testni primeri

0%
0%