Reševanje naloge ŠTUDENT

Reševanje naloge ŠTUDENT

Avtor: Tanja Kokalj

BESEDILO NALOGE

Vsi razredi naj obvezno vsebujejo naslednji dve metodi (torej jih morate obvezno napisati!):

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

Pri sestavljanju razredov si prej oglejte problem(e), ki ga (jih) rešujete, da boste vedeli, kako mora biti zgrajen (katere podatke in metode vsebuje). Za vsako nalogo sestavite dva testna programa. Prvi služi zato, da v njem ustvarite vsaj 20 objektov in jih zapišite na datoteko. V "pravem" testnem programu pa naredite naslednje:

  • Napišite ustrezne metode za reševanje zastavljenih problemov.
  • Ustvarite vsaj en objekt in ga dodajte (z DodajNaDatotekov) v datoteko (na tej je sedaj vsaj 21 objektov).
  • Preberite vse podatke z datoteke v tabelo.
  • Tabelo potem pregledno izpišite.
  • Nato kličite metode, ki so potrebne, da rešite zastavljene probleme in pregledno izpišite rezultate.
  • Na koncu V datoteko z imenom imeDat (parameter) zapišite 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 ':' (podatki o posameznem objektu gredo v svojo vrstico).

ŠTUDENT

Napišite razred Student, s katerim predstavite vse smiselne lastnosti in metode za študente. Rešite naslednje probleme:

  • Vrnite novo tabelo, ki naj vsebuje le tiste študente, ki niso v zadnjem letniku.
  • Vrnite tabelo tistih študentov, ki so v zadnjem letniku.
  • Vsi študenti v tabeli naj "napredujejo" v višji letnik. Prej tiste, ki so v zadnjem, 4. letniku, pa izločite (glejte prejšnjo metodo).
  • Vrnite tabelo, ki vsebuje število študentov posameznega letnika.
  • Koliko je deklet v tabeli študentov?
  • Izpiši študente, ki niso iz Ljubljane!
  • Karierni center bi rad posredoval študentom 3. in 4. letnika Finančne matematike razpis za delo v Zavarovalnici Triglav.

OPIS PROBLEMA IN IDEJA REŠITVE TER RAZLAGA ALGORITMA

Na začetku moramo definirati vse parametre našega objekta. Torej objektu Student priredimo vpisno številko, ime, priimek, spol letnik, program ter kraj bivanja študenta.

class Student
   {
      public int vpisna;
      public string ime;
      public string priimek;
      public string spol;
      public int letnik;
      public string program;
      public string mesto;

      public Student(int v, string i, string p, string s, int l, string prog,
      string m)
      {
          vpisna = v;
          ime = i;
          priimek = p;
          spol = s;
          letnik = l;
          program = prog;
          mesto = m;
       }

Naslednja metoda, ki je nujno potrebna je napredovanje. Ta metoda deluje na tak način, da pogleda v katerem letniku je študent in če ni v 4. potem ga premestimo v višji letnik.

       public bool napreduj()
       {
           if (this.letnik < 4)
           {
               this.letnik++;
            }
            else
            {
               return false;
            }
            return true;
        }

Pri metodi predzadnjiLetnik pogledamo ali je študent v tretjem letniku. V primeru, da je vrnemo true sicer pa false.


        public bool predzadnjiLetnik()
        {
            if (this.letnik == 3)
            {
                 return true;
            }
            else
            {
                 return false;
            }
        }

Podobno kot zgornja metoda deluje tudi zadnjiLetnik.


        public bool zadnjiLetnik()
        {
            if (this.letnik == 4)
            {
                return true;
            }
            else
            {
                return false;
            }
         }

Z metodo jeZenska pregledujemo ali je študent ženskega spola. To metodo bomo potrebovali pri reševanju nalog.


       public bool jeZenska()
         {
             if (this.spol == "Z")
             {
                 return true;
             }
             return false;
         }

Pri pregledovanju podatkov bomo potrebovali tudi metodo za dodajanje objektov v datoteko. Zapisovali bomo s pomočjo pisalca. Vsak objekt bomo zapisali z več argumenti, ki bodo ločeni z podpičjem.


         public void DodajNaDatoteko(string imeDatoteke)
         {
              FileStream stream = new FileStream(imeDatoteke, FileMode.Append);
              TextWriter pisalec = new StreamWriter(stream);
              pisalec.WriteLine(this.vpisna + ";" + this.ime + ";" + this.priimek +
              ";" + this.spol + ";" + this.letnik + ";" + this.program + ";" +
              this.mesto);
              pisalec.Close();
         }

Metoda jeIzMesta bo preverjala ali je dani objekt (študent) in nekega kraja. Na primer zanimalo nas bo ali je študent Peter iz Kopra.


         public bool jeIzMesta(string imeMesta)
         {
              if (this.mesto.Equals(imeMesta))
              {
                  return true;
               }
              return false;
          }

Prav tako kot nas bo zanimalo ali je iz nekega mesta nas bo tudi zanimalo ali določen študent opravlja določen program. Tudi ta metoda nam bo vrnila ali True ali False.

          public bool jeStudentPrograma(string imePrograma)
          {
              if (this.program.Equals(imePrograma))
              {
                  return true;
              }
              return false;
          }

Ker pa bi radi videli s kakšnimi objekti delamo pa bomo uredili tudi izpis. Metodo ToString bomo priredili tako, da bo v nam bolj razumljivem prikazu. Iz izpisa se bo videlo, da gledamo študenta. Podatki nam bodo povedali njegove ime, priimek, spol, letnik izobraževanja, program ter mesto bivanja.


          override public string ToString()
          {
              return "<Študent - ime: "+this.ime + " priimek: " + this.priimek +
      "spol: " + this.spol + " letnik:" + this.letnik+ " program: "
      +this.program + " mesto: "+ this.mesto +">";
          }
      }

Ustvarili bomo še zunanjo metodo preberiZDatoteke. Ta nam bo iz dane datoteke prebrala podatke in pretvorila v objekte. Vse podatke pa bo združila v seznam List.


      static List<Student> PreberiZDatoteke(string imeDatoteke)
      {
          StreamReader bralec = new StreamReader(imeDatoteke);
          string[] vrstice = bralec.ReadToEnd().Split('\n');

          // Odstranimo dodatni \r znak, ki se pojavi na konci vrstice
          for (int i = 0; i < vrstice.Length; i++)
          {
              if (vrstice[i].Length > 0)
                  vrstice[i] = vrstice[i].Substring(0, vrstice[i].Length - 1);
          }
          List<Student> tabelaStudentov = new List<Student>();

S pomočjo for zanke vse podatke iz datoteke damo v seznam list. Vsak nov element v seznamu predstavlja eno vrstico iz datoteke in predstavlja objekt student.


          for (int i = 0; i < vrstice.Length; i++)
          {
              if (vrstice[i].Length < 1) continue;
              string[] podatkiOStudentu = vrstice[i].Split(';');

              tabelaStudentov.Add(new Student(int.Parse(podatkiOStudentu[0]),
                  podatkiOStudentu[1],
                  podatkiOStudentu[2],
                  podatkiOStudentu[3],
                  int.Parse(podatkiOStudentu[4]),
                  podatkiOStudentu[5],
                  podatkiOStudentu[6]));

          }

          return tabelaStudentov;
      }

Na koncu dobimo kot rezultat tabelo študentov.

TESTNI PRIMERI

Datoteko na katero bomo zapisali nekaj naključnih študentov najprej pobrišemo. Nato vanjo začnemo zapisoviti študente.


static void test1(string imeDat)
{
    // Datoteko najprej pobrišemo:
    FileStream stream = new FileStream(imeDat, FileMode.Create);
    TextWriter writer = new StreamWriter(stream);
    writer.Write("");
    writer.Close();

    // Generiramo 20 študentov in jih zapišemo v datoteko.
    Student student = new Student(27000000, "Lojze", "Novak", "M", 1, "Pedagoška
    matematika", "Ljubljana");
    student.DodajNaDatoteko(imeDat);
    student = new Student(27000001, "Marinka", "Horvat", "Z", 3, "Finančna
    matematika", "Ljubljana");
    student.DodajNaDatoteko(imeDat);
    student = new Student(27000002, "Sebastjan", "Kranjc", "M", 4, "Praktična
    matematika", "Ljubljana");
    student.DodajNaDatoteko(imeDat);
    student = new Student(27000003, "Marko", "Kovačič", "M", 2, "Pedagoška
    matematika", "Maribor");
    student.DodajNaDatoteko(imeDat);
    student = new Student(27000004, "Jaka", "Zupančič", "M", 4, "Pedagoška
    matematika", "Maribor");
    student.DodajNaDatoteko(imeDat);
    student = new Student(27000005, "Barbara", "Kovač", "Z", 3, "Finančna matematika",
    "Ljubljana");
    student.DodajNaDatoteko(imeDat);
}

Naknadno vpišemo še enega študenta, da vidimo ali zapisovanje deluje tudi če prekinemo.


static void test2(string imeDat)
{

     //Ustvarimo še en objekt in ga dodamo na datoteko
     Student student = new Student(27000001, "Marko", "Novak", "M", 3, "Finančna
     matematika", "Celje");
     student.DodajNaDatoteko(imeDat);

Nato preberemo študente iz datoteke. S tem ukazom dobimo tabelo objektov.


     // Preberemo tabelo študentov z datoteke
     List<Student> tabelaStudentov = PreberiZDatoteke(imeDat);

Nato s pomočjo metode ToString tabelo študentov izpišemo v konzolnem oknu.


     // Izpišemo tabelo študentov
     Console.WriteLine("Tabela študentov:");
     foreach (Student s in tabelaStudentov)
     {
         Console.WriteLine(s.ToString());
     }

Nato gremo čez tabelo in preverimo kateri niso v zadnjem letniku. Na koncu pa vrnemo tabelo tistih študentov, ki ustrezajo temu pogoju.


     // Vrnite novo tabelo, ki naj vsebuje le tiste študente, ki niso v zadnjem
   letniku.
     List<Student> nisoVZadnjemLetniku = new List<Student>();
     for (int i = 0; i < tabelaStudentov.Count; i++)
     {
         if (!tabelaStudentov[i].zadnjiLetnik())
         {
             nisoVZadnjemLetniku.Add(tabelaStudentov[i]);
         }
      }

Nato študente, ki niso v zadnjem letniku še izpišemo.


      Console.WriteLine("V zadnjem letniku niso:");
      foreach (Student s in nisoVZadnjemLetniku)
      {
             Console.WriteLine(s.ToString());
      }

Podobno kot v zgornjem primeru preverimo ali so študenti v zadnjem letniku. Če so, jih dodamo v tabelo.


      // Vrnite tabelo tistih študentov, ki so v zadnjem letniku.
      List<Student> soVZadnjemLetniku = new List<Student>();
      for (int i = 0; i < tabelaStudentov.Count; i++)
      {
           if (tabelaStudentov[i].zadnjiLetnik())
           {
               soVZadnjemLetniku.Add(tabelaStudentov[i]);
           }
      }

Študente zadnjega letnika še izpišemo v konzolno okno.


      Console.WriteLine("\nV zadnjem letniku so:");
      foreach (Student s in soVZadnjemLetniku)
      {
           Console.WriteLine(s.ToString());
      }

V tem delu kode bomo študente premeščali v višji letnik. Tega ne bomo izvedli le v primeru, če bo študent zadnjega letnika.


      // Vsi študenti v tabeli naj "napredujejo" v višji letnik. Prej tiste, ki so v
      zadnjem, 4. letniku, pa izločite.
      for (int i = 0; i < tabelaStudentov.Count; i++)
      {
           tabelaStudentov[i].napreduj();
      }

Preverimo ali je študent v zadnjem letniku. V primeru, da je ga vržemo iz seznama vseh študentov.


      for (int i = 0; i < soVZadnjemLetniku.Count; i++)
      {
           tabelaStudentov.Remove(soVZadnjemLetniku[i]);
      }

Prenovljeno tabelo študentov izpišemo.


      Console.WriteLine("\nTabela študentov po napredovanju:");
      foreach (Student s in tabelaStudentov)
      {
           Console.WriteLine(s.ToString());
      }

V tem delu kode bomo prešteli število študentov v vsakem letniku.


      // Vrnite tabelo, ki vsebuje število študentov posameznega letnika.
      int[] steviloStudentovPoLetnikih = new int[4];
      for (int i = 0; i < tabelaStudentov.Count; i++)
      {
           steviloStudentovPoLetnikih[tabelaStudentov[i].letnik - 1] += 1;
      }

      Console.WriteLine("\nŠtevilo študentov posameznega letnika:");
      for (int i = 0; i < steviloStudentovPoLetnikih.Length; i++)
      {
           Console.WriteLine((i + 1) + ". letnik: " + steviloStudentovPoLetnikih[i]);
      }

Prešteli bomo število deklet v tabeli študentov. Torej parameter steviloDeklet bomo povečali vsakič, ko bo element tabele ženskega spola.


      // Koliko je deklet v tabeli študentov?
      int steviloDeklet = 0;
      for (int i = 0; i < tabelaStudentov.Count; i++)
      {
           if (tabelaStudentov[i].jeZenska())
           {
               steviloDeklet++;
           }
      }
      Console.WriteLine("\nV tabeli študentov je " + steviloDeklet + " deklet.");

Zanima nas koliko študentov prihaja iz Ljubljane. Zato bomo šli čez celoten seznam in pregledali kraj bivanja. V primeru, da je to Ljubljana bomo objekt izpisali sicer pa ignorirali.


      // Izpiši študente, ki niso iz Ljubljane
      Console.WriteLine("\nŠtudenti, ki niso iz Ljubljane:");
      for (int i = 0; i < tabelaStudentov.Count; i++)
      {
           if (!tabelaStudentov[i].jeIzMesta("Ljubljana"))
           {
               Console.WriteLine(tabelaStudentov[i].ToString());
           }
      }

Karierni center bi rad posredoval študentom 3. in 4. letnika Finančne matematike razpis za delo v Zavarovalnici Triglav. Da bi ugotovili komu morajo poslati obvestilo bomo izpisali vse študente, ki ustrezajo tem pogojem. S pomočjo for zanke bomo šli čez celotno tabelo študentov. Vsak element bomo z if stavkom preverili ali je študent na programu finančna matematika in v 3. ali 4. letniku. V primeru, da bo objekt zadoščal vsem trem zahtevam se bo izpisal v konzolnem oknu.


      // Študenti finančne matematike, 3. ali 4. letnik
      Console.WriteLine("\nŠtudenti finančne matematike, ki so v 3. ali 4. letniku:");
      for (int i = 0; i < tabelaStudentov.Count; i++)
      {
          if (tabelaStudentov[i].jeStudentPrograma("Finančna matematika") &&
              (tabelaStudentov[i].predzadnjiLetnik() ||
      tabelaStudentov[i].zadnjiLetnik()))
          {
               Console.WriteLine(tabelaStudentov[i].ToString());
          }
       }

Na koncu moramo vse študente zapisati v končno datoteko.


      // V izhodno datoteko vpiši tabelo študentov:
      string imeKoncneDat = "koncna.txt";

      // Datoteko najprej pobrišemo:
      FileStream stream = new FileStream(imeKoncneDat, FileMode.Create);
      TextWriter writer = new StreamWriter(stream);
      writer.Write("");
      writer.Close();

      foreach (Student s in tabelaStudentov)
      {
             s.DodajNaDatoteko(imeKoncneDat);
       }
       Console.Read();
 }

Prikaz testov s pomočjo filmčka

0%
0%