1. Naloga: Kvadrat

1. Naloga: Kvadrat

Avtor: Mateja Smerdel

OPIS PROBLEMA IN IDEJA REŠITVE

Navodilo naloge

Napišite razred Kvadrat, s katerim predstavite kvadrat. Kvadrat je predstavljen z dolžino ene stranice. Sestavite tudi metodi za izračun ploščine in obsega kvadrata.

  • Izračunajte, kakšno površino lahko prekrijete s kvadrati, ki so v tabeli
  • Vrnite kopijo tistega kvadrata, ki ima najmanjši obseg.
  • Vsem tistim kvadratom v tabeli, katerih obseg je več kot 10% manjši od povprečnega obsega vseh kvadratov, spremenite stranico tako, da bodo imeli obseg (do zaokrožitvene napake) enak povprečnemu.
  • Vsaj en (zaželjeno pa več) problem po vaši izbiri ... (opišite jih!)

Poleg tega pa je potrebno napisati še dve metodi:

  • DodajNaDatoteko(string imeDatoteke), ki objekt this zapiše (doda! – glej metodo File.AppendText()) 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 ';'.

Ideja rešitve

Ustvariti je potrebno nov razred in ga ustrezno poimenovati. Znotraj razreda najprej ustvarimo konstruktor, kjer določimo lastnosti razreda ter ustrezne get/set metode. Nato pa še ustrezne funkcije, kot jih zahteva navodilo naloge.

RAZLAGA ALOGRITMA

Najprej ustvarimo nov razred Class in ga poimenujemo Kvadrat . Znotraj razreda najprej ustvarimo konstruktor, s katerim določimo lastnosti razreda Kvadrat . In sicer je kvadrat predstavljen z dolžino ene stranice. Tu preverimo, da ni podana stranica kvadrata negativna ali da ni stranica enaka 0 in v primeru da je sprožimo izjemo, kajti dolžina stranice mora biti pozitivno število. Poleg tega so dodane še ustrezne get/set metode ter metoda za izpis.

         class Kvadrat
        {
            private double stranica;

            public Kvadrat(double a)
            //Konstruktor
            {
                if (a <= 0) //stranica kvadrata mora biti pozitivna
                {
                    Console.WriteLine("Stranica mora biti pozitivna!");
                    throw new Exception();
                }
                else
                    this.stranica = a;
            }
            //get set metoda
            public double a
            {
                get { return this.stranica; }
                set
                {
                    if (value <= 0)
                    {
                        Console.WriteLine("Stranica mora biti pozitivna!");
                        throw new ArgumentException();
                    }
                    else
                        this.stranica = value;
                }
            }
            public override string ToString()
            //Metoda za izpis
            {
                return "" + this.stranica;
            }

            public static implicit operator string(Kvadrat u)
            {
                return u.ToString();
            } 

V nadaljevanju ustvarimo funkcijo DodajNaDatoteko, ta omogoča dodajanje podatkov na datoteko. Kot vhodni parameter sprejme ime datoteke. Metoda najprej odpre datoteko v načinu za dodajanje teksta, na datoteko doda posamezno vrstico in nato datoteko zapre. Posamezne vrstice so na datoteki med seboj ločene s podpičjem.

 public void DodajNaDatoteko(string imeDatoteke)
            //Metoda, ki objekt this zapiše na datoteko, podatki so med seboj ločeni z ';'
            {
                StreamWriter datoteka = File.AppendText(imeDatoteke);//datoteko odpremo v načinu za pisanje
                datoteka.WriteLine(this.ToString() + ";");//objekt this dodamo na datoteko
                datoteka.Close();//datoteko zapremo

            } 

Naslednja metoda je PreberiZDatoteke, ta omogoča branje podatkov z datoteke. Kot vhodni parameter sprejme ime datoteke na kateri so podatki zapisani, kot rezultat pa vrne tabelo objektov tipa Kvadrat, kjer posamezen objekt vsebuje podatke, ki so zapisani v posamezni vrstici datoteke, med seboj ločeni s podpičjem.

 public static Kvadrat[] PreberiZDatoteke(string imeDatoteke)
            {
                StreamReader datoteka = File.OpenText(imeDatoteke);//odpremo datoteko v načinu za branje
                string vrstica = datoteka.ReadLine();//preberemo vrstico
                int stevec = 0;

                while (vrstica != null)
                {
                    vrstica = datoteka.ReadLine();//preštejemo število vrstic v datoteki
                    stevec++;
                }
                datoteka.Close();//datoteko zapremo

                Kvadrat[] tabela = new Kvadrat[stevec];//definiramo tabelo objektov tipa Kvadrat
                StreamReader datoteka2 = File.OpenText(imeDatoteke);//odpremo datoteko v načinu za branje
                string vrstica2;
                double a;

                for (int i = 0; i < stevec; i++)
                {
                    vrstica2 = datoteka2.ReadLine();
                    a = double.Parse(vrstica2.Substring(0, 4));
                    tabela[i] = new Kvadrat(a);
                    Console.WriteLine(tabela[i]);
                }

                return tabela;
            } 

V nadaljevanju ustvarimo metodo za izračun ploščine kvadrata. Ta kot vhodni parameter sprejme dolžino stranice kvadrata (ta je tipa double ), kot rezultat pa vrne ploščino kvadrata z želeno dolžino stranice. Ploščino kvadrata izračunamo po formuli za izračun ploščine kvadrata (stranica*stranica).


public double Ploscina()
            //Metoda, za izračun ploščine kvadrata.
            {
                return this.stranica * this.stranica;
            } 

Nato ustvarimo metodo za izračun obsega kvadrata. Kot vhodni parameter metoda sprejme dolžino ene stranice, ki je tipa double. Kot rezultat pa vrne obseg kvadrata z določeno stranico. Obseg kvadrata izračunamo po formuli za izračun obsega kvadrata (4*stranica).

 public double Obseg()
            //Metoda za izračun obsega kvadrata.
            {
                return 4 * this.stranica;
            }
 

Ustvarimo še funkcijo Povrsina , ta izračuna površino prekrito s kvadrati v tabeli. Kot vhodni parameter sprejme tabelo objektov tipa Kvadrat , kot rezultat pa vrne površino, ki jo lahko prekrijemo s kvadrati iz vhodne tabele. Le-to pa dobimo tako, da najprej definiramo nek števec s katerim bomo postopna računali površino. Sprehodimo se čez tabelo kvadratov in števcu za vsak objekt iz tabele prištejemo ploščino, katero dobimo s pomočjo funkcije Ploscina, ki smo jo definirali že prej.

 public double Povrsina(Kvadrat[] tab)
            //Metoda, ki izračuna površino prekrito s kvadrati v tabeli.
            {
                double povrsina = 0;//spremenljivki povrsina nastavimo začetno vrednost na 0
                for (int i = 0; i < tab.Length; i++)
                {
                    povrsina += tab[i].Ploscina();//površini prištevamo ploščine vsakega objekta iz tabele
                }
                return povrsina;
            } 

Nato ustvarimo metodo NajmanjsiObseg , ta kot vhodni parameter sprejme tabelo objektov tipa Kvadrat . Kot izhod pa vrne kopijo tistega kvadrata iz tabele, ki ima najmanjši obseg. Tu si pomagamo s funkcijo Obseg , ki smo jo definirali zgoraj. V začetku definiramo spremenljivko tipa dobule , v katero shranimo obseg kvadrata ki je v tabeli na prvem mestu. Nato pa skozi for zanko preverjamo skozi dolžino tabele, ali je v tabeli še kakšen kvadrat, ki ima manjši obseg in v primeru da je, le-tega shranimo v spremenljivko. Tako imamo na koncu v spremenljivki najmanjsi shranjen tisti kvadrat iz tabele, ki ima najmanjši obseg in le-tega vrnemo kot rezulat.

 public double NajmnajsiObseg(Kvadrat[] tab)
            //Metoda vrne kopijo tistega kvadrata, ki ima najmanjši obseg.
            {
                double najmanjsi = tab[0].Obseg();//spremenljivki najmanjsi določimo začetno vrednost na
                for (int i = 1; i < tab.Length; i++) //obseg prvega objekta iz kvadrata
                {
                    if (tab[i].Obseg() < najmanjsi)//preverimo če je vrednost trenutnega obsega obejkta manjša
                    {                              //od trenutne najmanjše spremenljivki najmanjsi spremenimo
                        najmanjsi = tab[i].Obseg();//vrednost
                    }
                }
                double k = najmanjsi / 4;//na koncu izračunamo še stranico kvadrata z najmanjšim obsegom
                return k;
            } 

Ustvarimo še funkcijo SpremeniStranico , kateri kot vhodni parameter podamo tabelo objektov tipa Kvadrat . Funkcija spremeni stranico kvadrata vsem tistim kvadratom, katerih obseg je več kot 10% manjši od povprečnega obsega vseh kvadratov iz prvotne tabele, tako da imajo obseg enak povprečnemu.

 public static Kvadrat[] SpremeniStranico(Kvadrat[] tab)
            //Metoda spremeni stranico kvadrata vsem tistim kvadratom, katerih obseg je
            //več kot 10% manjši od povprečnega obsega vseh kvadratov
            {
                double stKvadratov = 0;
                double vsotaObsegov = 0;
                for (int i = 0; i < tab.Length; i++)
                {
                    vsotaObsegov += tab[i].Obseg();//seštejemo obsege vseh kvadratov iz tabele
                    stKvadratov += 1;
                }
                double povprecni = vsotaObsegov / stKvadratov;//izračunamo povprečni obseg
                double a = povprecni * 10 / 100; //izračunamo mejo
                double stranicaKvadrata = povprecni / 4; //določimo povprečno stranico kvadrata
                Kvadrat[] tabelaKvadratov = new Kvadrat[tab.Length];//ustvarimo tabelo objektov tipa Kvadrat,
                for (int i = 0; i < tab.Length; i++)                //velikosti prvotne tabele
                {
                    //napolnimo tabelo s kvadrati
                    if (tab[i].Obseg() < povprecni - a)
                    {
                        tabelaKvadratov[i] = new Kvadrat(stranicaKvadrata);
                    }
                    else
                    {
                        tabelaKvadratov[i] = tab[i];
                        Console.WriteLine(tabelaKvadratov[i]);
                    }
                }
                return tabelaKvadratov;
            } 

Nazadnje ustvarimo še funkcijo UstvariTabeloKvadratov , ta kot vhodni parameter sprejme velikost tabele (tipa int ). Kot izhod pa vrne tabelo kvadratov velikosti velikost , ki jo napolni s kvadrati z naključnimi dolžinami starnic.

 public static Kvadrat[] ustvariTabeloKvadratov(int velikost)
            //ustvari tabelo velikosti 'velikost' s kvadrati z naključnimi dolžinami stranic
            {
                Kvadrat[] tabela = new Kvadrat[velikost];
                Random stevilo = new Random();//ustvarimo generator naključnih števil
                double stranica;
                for (int i = 0; i < velikost; i++)
                {
                    stranica = 10 * stevilo.NextDouble();
                    tabela[i] = new Kvadrat(stranica);
                    Console.WriteLine(tabela[i]);
                }
                return tabela;
            } 

TESTNI PRIMERI

Posnetek delovanja razreda kvadrat v Wink-u.

0%
0%