Naloga z razredi - Pravokotnik

Naloga z razredi - Pravokotnik

Avtor: Poboljšaj Nina

Opis problema in ideja rešitve

Napišite razred Pravokotnik, ki ima podani dve stranici. Stranici sta celi števili. Razred naj vsebuje tudi objektne metode za izračun ploščine in obsega.

  • Izračunajte koliko pravokotnikov ima ploščino manjšo od povprečne ploščine pravokotnikov v tabeli.
  • Vse pravokotnike v tabeli, ki jih lahko spremenite kvadrate. Npr. pravokotnik s stranicami 4 in 6 lahko spremenite v pravokotnik (kvadrat) s stranico 5. Pravokotnik s stranicami 11 in 4 oziroma 10 in 7 pa ne bo mogoče.
  • Iz žice izdelujemo modele pravokotnikov. Koliko metrov žice potrebujemo, če želimo narediti vse pravokotnike v tabeli, ker pravokotnik s stranicama 5 in 12 naredimo kot žični model s stranicama 5 cm in 12 cm. Nalogo pravokotnik rešimo s pomočjo razredov, ki vsebujejo dve metodi:
  • Koliko pravokotnikov ima obseg manjši od povprečnega obsega pravokotnikov v tabeli?

Dodaj Na Datoteko (string ime Datoteke), ki objekt this zapiše vrstico, kjer doda vse podatke objekta, med seboj ločene z znakom ';' Preberi Z Datoteke (string ime Datoteke), ki vrne tabelo objektov, kjer posamezni objekt vsebuje podatke, ki so zapisani v posamezni vrstici datoteke, med seboj ločene z znakom ';' Za dano nalogo sestavimo dva testna programa. V prvem ustvarimo 20 objektov in jih zapišemo na datoteko. V »pravem« testnem programu napišemo ustrezne metode za reševanje problemov. Ustvarimo objekt in ga dodamo (z Dodaj Na Datoteko) v datoteko. Potem preberemo vse podatke z datoteke v tabelo. Potem 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 z imenom imeDat (parameter) ponovno zapišemo vse podatke vseh objektov v tabeli, med seboj ločene z znakom ';'.

Razlaga algoritma

Naredimo razred Pravokotnik. Imamo stranici a in b. Stranici pravokotnika dodamo datoteko. Odpremo datoteko za dodajanje teksta. Dodamo novo vrstico (a;b) in zapremo datoteko.

class Pravokotnik
    {
        //stranici
        public int a;
        public int b;

        public Pravokotnik(int a, int b)//konstruktor
        {
            this.a = a;
            this.b = b;
        }
        public void DodajNaDatoteko(string imeDatoteke)//doda stranici pravokotnika na datoteko
        {
            StreamWriter sw;
            sw = File.AppendText(imeDatoteke);//odprem datoteko v nacinu za dodajanje teksta
            sw.WriteLine(this.a+";"+this.b);//napisem novo vrstico
            sw.Close();//zaprem datoteko
        }

Razlaga algoritma

Potem pa napišemo program, ki prebere vednosti stranic vseh pravokotnikov iz datoteke in vrnemo tabelo novih pravokotnikov. Vse podatke najprej shranimo v niz, zato, da ni treba 2krat pregledovati tabele. Število pravokotnikov shranimo v spremenljivko stPrav, ki jo je 0, saj je sedaj še neznano. Naredimo niz s v katerem bo shranjen trenutni pravokotnik. Odpremo datoteko in preberemo vrstico s. Dokler je niz različen od null vse pravokotnike shranimo v ta niz in jih ločimo z znakom '.'. Potem povečamo število vseh pravokotnikov in iz niza s preberemo novo vrstico. Datoteko zapremo.

 public static Pravokotnik[] PreberiZDatoteke(string imeDatoteke)
        {//prebere vrednosti stranic vseh pravokotnikov iz datoteke in vrne tabelo novih pravokotnikov
            StreamReader sr;
            string vsiPodatki="";//Vse podatke najprej shranimo v niz, zato da ni potrebno 2x pregledovati tabele
            int stPrav = 0; //stevilo vseh pravokotnikov (sedaj je se neznano)
            string s;//niz, v katerem bo shranjen trenutni pravokotnik
            sr = File.OpenText(imeDatoteke);//odprem datoteko
            s = sr.ReadLine();//preberem vrstico
            while (s != null)//pregledamo celo datoteko
            {
                vsiPodatki = vsiPodatki + s+".";//vse pravokotnike shranjujem v ta niz in jih locim z znakom '.'
                stPrav = stPrav + 1;//povecam stevilo vseh pravokotnikov
                s = sr.ReadLine();//preberem novo vrstico
            }
            sr.Close();//zaprem datoteko

Razlaga algoritma

Sedaj ko poznamo število vseh pravokotnikov lahko zgradimo novo tabelo. Pregledamo niz v katerem so shranjeni vsi pravokotniki. Z while preiščemo vse pravokotnike. Če najdemo znak ';' je pred tam nizom znak, ki opisuje stranico a. niz spremenimo v število prestavimo indeks, ki kaže na začetek trenutnega niza. Če pa smo našli znak '.', pomeni, da je pred tem znakom niz, ki opisuje stranico b. Indeks prestavimo na začetek trenutnega niza. V tabelo dodamo niz pravokotnik in povečamo število pregledanih pravokotnikov. Ko pregledamo celotni niz, vrnemo tabelo pravokotnikov.

//sedaj ko poznam stevilo vseh pravokotnikov lahko zgradim novo tabelo:
            Pravokotnik[] tabela = new Pravokotnik[stPrav];
            //pregledamo niz v katerem so shranjeni vsi pravokotniki
            int znakIndeks = 0;//indeks, ki pove kateri znak trenutno gledamo v nizu
            int zacetekNiza=0;//indeks, ki pove na katerem znaku je zacetek trenutnega niza
            int a = -1;//zacetna vrednost stranice a (lahko bi izbrali katerokoli vrednost)
            int b = -1;//zacetna vrednost stranice b (lahko bi izbrali katerokoli vrednost)
            int i=0;//indeks trenutnega pravokotnika
            while(i<stPrav)//poiscemo vse pravokotnike, gledamo znak za znakom
            {
                if (vsiPodatki[znakIndeks].CompareTo(';') == 0)//nasli smo znak ';'
                {
                    //Pred tem znakom je niz, ki opisuje stranico a
                    string sa = vsiPodatki.Substring(zacetekNiza, znakIndeks - zacetekNiza);
                    a = int.Parse(sa);//niz spremenim v stevilo
                    zacetekNiza = znakIndeks + 1;//prestavim indeks, ki kaze na zacetek trenutnega niza
                }
                else if(vsiPodatki[znakIndeks].CompareTo('.')==0)//nasli smo znak '.'
                {
                    //Pred tem znakom je niz, ki opisuje stranico b
                    string sb = vsiPodatki.Substring(zacetekNiza, znakIndeks - zacetekNiza);
                    b = int.Parse(sb);//niz spremenim v stevilo
                    zacetekNiza = znakIndeks + 1;//prestavim indeks, ki kaze na zacetek trenutnega niza
                    tabela[i] = new Pravokotnik(a, b);//v tabelo dodam nov pravokotnik
                    i = i + 1;//povecam stevilo pregledanih pravokotnikov
                }
                znakIndeks = znakIndeks + 1;//prestavim kazalec na naslednji znak
            }
            return tabela;//pregledali smo celotni niz, vrnem tabelo pravokotnikov
        }

Razlaga algoritma

Na koncu še izračunamo ploščino pravokotnika, ki je a*b in obseg pravokotnika, ki se izračuna 2*(a+b).

 public int Ploscina() //izracuna ploscino pravokotnika
        {
            return a * b;
        }
        public int Obseg() //izracuna obseg pravokotnika
        {
            return 2 * (a + b);
        }

Razlaga algoritma

Nato ustvarimo objekte. Naredimo generator naključnih števil. Z zanko naredimo 20 novih pravokotnikov. Za stranici a in b izberemo naključno število med 1 in 100. Naredimo nov pravokotnik in ga dodamo na datoteko.

class UstvariObjekte
    {
        static void Main(string[] args)
        {
            Random rand = new Random();//Generator nakljucnih stevil
            for (int i = 1; i <= 20; i++)//naredimo 20 novih pravokotnikov
            {
                int a = rand.Next(1, 100);//Izbere nakljucno stevilo med 1 in 100
                int b = rand.Next(1, 100);
                Pravokotnik p = new Pravokotnik(a,b);//novi pravokotnik
                p.DodajNaDatoteko("primeri.txt");//pravokotnik dodam na datoteko
            }
        }
    }

Razlaga algoritma

Naredimo razred test. Ustvarimo pravokotnik s stranicama a=15 in b=10 in dodamo pravokotnik v datoteko. Preberemo vse podatke z datoteke v tabelo. Tabelo nato pregledno izpišemo.

class Test
    {
        static void Main(string[] args)
        {
            //Ustvarite vsaj en objekt in ga dodajte v datoteko:
            Pravokotnik pr = new Pravokotnik(15, 10);//nov pravokotnik s stranicama a=15 in b=10
            pr.DodajNaDatoteko("primeri.txt");//dodam pravokotnik v datoteko

            //Preberite vse podatke z datoteke v tabelo:
            Pravokotnik[] tabela = Pravokotnik.PreberiZDatoteke("primeri.txt");

            //Tabelo potem pregledno izpišite:
            for (int i = 0; i < tabela.Length; i++)
            {
                Console.WriteLine(tabela[i].a + ";" + tabela[i].b);
            }
            Console.WriteLine();//Za vecjo preglednost izpisemo se eno prazno vrstico.

Razlaga algoritma

Nato kličemo metode, da rešimo zastavljene probleme. Na koncu v datoteko zapišemo ponovno vse podatke vseh objektov v tabeli, med seboj ločene z znakom ':'. V datoteko rezultati shranimo podatke.

 //Nato kličite metode, ki so potrebne, da rešite zastavljene probleme
            //in pregledno izpišite rezultate:

            //1.) Koliko pravokotnikov ima ploščino manjšo od povprečne ploščine pravokotnikov v tabeli?
            povprecnaPloscina(tabela);

            //2.) Vse pravokotnike v tabeli, ki jih lahko, spremenimo v kvadrate.
            Console.WriteLine("Vsi pravokotniki,ki jih lahko spremenimo v kvadrate:");
            tabela = spremeniVkvadrate(tabela);
            Console.WriteLine();//Za vecjo preglednost izpisemo se eno prazno vrstico.

            //3.) Koliko m žice potrebujemo?
            kolikoZice(tabela);

            //4.) Koliko pravokotnikov ima obseg manjši od povprečnega obsega pravokotnikov v tabeli?
            povprecenObseg(tabela);

            //Na koncu v datoteko zapišite ponovno vse podatke vseh objektov
            //v tabeli, med sabo ločene z znakom ':'
            for (int i = 0; i < tabela.Length; i++)
            {
                StreamWriter sw;
                sw = File.AppendText("rezultati.txt");
                sw.WriteLine(tabela[i].a + ":" + tabela[i].b);
                sw.Close();
            }

            Console.ReadLine();//Da se okno ne zapre, ko program konca.
        }

Razlaga algoritma

Napišemo program, ki izračuna koliko pravokotnikov ima ploščino manjšo od povprečne ploščine v tabeli. Povprečje izračunamo tako, da vsoto ploščin delimo z dolžino tabele. In povprečje ploščin zapišemo. Zapišemo še število pravokotnikov, ki imajo ploščino manjšo od povprečja.

//1.) Koliko pravokotnikov ima ploščino manjšo od povprečne ploščine pravokotnikov v tabeli?
        public static void povprecnaPloscina(Pravokotnik[] tabela)
        {
            int vsota = 0;
            for (int i = 0; i < tabela.Length; i++)
            {
                vsota = vsota + tabela[i].Ploscina();
            }
            double povprecje = vsota / tabela.Length;
            Console.WriteLine("Povprecna ploscina pravokotnikov v tabeli je " + povprecje + ".");
            int stevilo = 0;
            for (int i = 0; i < tabela.Length; i++)
            {
                if (tabela[i].Ploscina() < povprecje) stevilo = stevilo + 1;
            }
            Console.WriteLine(stevilo + " pravokotnikov ima ploscino manjso od povprecne.");
            Console.WriteLine();//Za vecjo preglednost izpisemo eno prazno vrstico.
        }

Razlaga algoritma

Naredimo program, ki v tabeli spremeni vse pravokotnike v kvadrate. Pravokotnik se da spremeniti v kvadrat, če je število a+b deljivo z 2. Če je ostanek pri deljenju števila a+b z 2 enak 0, v tem primeru je stranica kvadrata enaka (a+b)/2, kar pomeni, da lahko naredimo kvadrat. Vrnemo tabelo.

//2.) Vse pravokotnike v tabeli, ki jih lahko, spremenimo v kvadrate.
        public static Pravokotnik[] spremeniVkvadrate(Pravokotnik[] tabela)
        {
            for (int i = 0; i < tabela.Length; i++)
            {
                int a = tabela[i].a;
                int b = tabela[i].b;
                //Pravokotnik se da spremeniti v kvadrat, ce je stevilo (a+b) deljivo z 2.
                if ((a + b) % 2 == 0)//Ostanek pri deljenju stevila (a+b) z 2 mora biti 0.
                {
                    int c=(a+b)/2;//V tem primeru je stranica kvadrata enaka (a+b)/2;
                    Console.WriteLine(a + ";" + b + " --> " + c + ";" + c);
                    tabela[i].a = c;
                    tabela[i].b = c;
                }
            }
            return tabela;
        }

Razlaga algoritma

Program, ki nam izračuna koliko metrov žice potrebujemo, če želimo narediti vse pravokotnike v tabeli naredimo tako, da najprej dolžino nastavimo na nič. Gremo po vseh i-jih v tabeli. Potem pa dolžino delimo s 100, da jo spremenimo v metre. Na koncu izpišemo rezultat.

//3.) Koliko m žice potrebujemo?
        public static void kolikoZice(Pravokotnik[] tabela)
        {
            double dolzina = 0;
            for (int i = 0; i < tabela.Length; i++)
            {
                dolzina = dolzina + tabela[i].Obseg();
            }
            dolzina = dolzina / 100;//centimetre spremenimo v metre
            Console.WriteLine("Ce zelimo narediti vse pravokotnike v tabeli, potrebujemo " + dolzina + " m zice.");
            Console.WriteLine();//Za vecjo preglednost izpisemo se eno prazno vrstico.
        }večvrstični zapis kode

Razlaga algoritma

Naredimo program, ki izračuna koliko pravokotnikov ima obseg manjši od povprečnega obsega pravokotnikov v tabeli.

//4.) Koliko pravokotnikov ima obseg manjši od povprečnega obsega pravokotnikov v tabeli?
        public static void povprecenObseg(Pravokotnik[] tabela)
        {
            int vsota = 0;
            for (int i = 0; i < tabela.Length; i++)
            {
                vsota = vsota + tabela[i].Obseg();
            }
            double povprecje = vsota / tabela.Length;
            Console.WriteLine("Povprecen obseg pravokotnikov v tabeli je " + povprecje + ".");
            int stevilo = 0;
            for (int i = 0; i < tabela.Length; i++)
            {
                if (tabela[i].Obseg() < povprecje) stevilo = stevilo + 1;
            }
            Console.WriteLine(stevilo + " pravokotnikov ima obseg manjsi od povprecnega.");
            Console.WriteLine();//Za vecjo preglednost izpisemo eno prazno vrstico.
        }
    }

Rezultat

Koliko pravokotnikov ima ploščino manjšo od povprečne ploščine pravokotnikov v tabeli?

(1primer.png)

Rezultat

Vse pravokotnike v tabeli, ki jih lahko, spremenimo v kvadrate.

(2primer.png)

Rezultat

Koliko m žice potrebujemo?

(3primer.png)

Rezultat

Koliko pravokotnikov ima obseg manjši od povprečnega obsega pravokotnikov v tabeli?

(4primer.png)

Posnetek

0%
0%