OGLASI - ALGORITMI

OGLASI - ALGORITMI

Avtor: Petra Velikanje

BESEDILO NALOGE

Na datoteki imamo zapisane podatke o tem časih predvajanja reklamnih sporočil na posameznih TV programih v toku enega dne. V vsaki vrstici je zapis oblike:

oznaka_programa čas_začetka čas_konca

Časi so zapisani v obliki hh:mm:ss v oznaki programa pa so lahko poljubni znaki (tudi presledki). Napiši program, ki prebere podatke z datoteke in poišče najdaljšega izmed intervalov, v katerem je največ televizijskih postaj hkrati predvajalo oglase.

Vnesi ime datoteke: podatki.txt

Največ hkratnih oglasov: 3

Čas prevajanja: 18:55:23 -18:58:10 na TV 99, Firbec TV in Q2Q

OPIS PROBLEMA IN IDEJA REŠITVE

Naloga od nas zahteva, da iz datoteke v kateri so shranjeni časi predvajana oglasov in ime tv programa na katerem se je oglas odvrtel, poiščemo tiste oglase, ki so se predvajali istočasno.

Problema se lotimo tako, da najprej podatke preberemo iz datoteke in prepišemo v tabelo. Nato pa primerjamo predvajane čase na posameznem TV programu med seboj. Če se časi ujemajo jih preštejemo. Na koncu pa še izpišemo na katerih TV programih se istočasno vrtijo.

RAZLAGA ALGORITMA

Najprej od uporabnika zahtevamo ime datoteke s katere bomo prebrali podatke

Console.Write("Vnesi ime Datoteke: ");
string datoteka=Console.ReadLine();

Nato preverimo, če datoteka obstaja. V primeru,da datoteka obstaja, ustvarimo nekaj pomožnih tabel, ki jih bomo rabili pri reševanju.

string RezIme = "";//niz, ki nam pove imena TV programov
string indeksiImen = "";//niz v katerem imamo indekse imen.
string[] imeTV = new string[0];//tabela imen programov
DateTime[] zacetki = new DateTime[0];//tabela začetkov predvajanja oglasa
DateTime[] konci = new DateTime[0];//tabela koncev predvajanja oglasa
DateTime[] CasOglasa = new DateTime[2];//Začetek in konec največ hkratnih oglasov
int stevilo = 0;

Odpremo datoteko in se z zanko while sprehodimo skozi datoteko. Podatke v vsaki vrstici pa razdelimo v več tabel. Na primer podatke začetka predvajanja dodamo v tabelo, kjer hranimo podatke o začetkih predvajanj oglasa.

while (vrstica != null)
                {
                    string[] trenutna = vrstica.Split(' ');
                    string ime = "";
                    //sestavimo ime tv kanala
                    for (int i = 0; i < trenutna.Length - 2; i++)
                    {
                        ime += trenutna[i] + "";
                    }
                    string[] tab1 = dodajIme(imeTV, ime);//ime dodamo v tabelo imen
                    imeTV = tab1;
                    //Začetek predvajanja spremenimo iz niza v objekt tipa DateTime
                    string[] tabCas = trenutna[trenutna.Length - 2].Split(':');
                    int[] tabCasZacetek = new int[tabCas.Length];
                    for (int i = 0; i < tabCas.Length; i++)
                    {
                        tabCasZacetek[i] = int.Parse(tabCas[i]);
                    }
                    DateTime cas1 = new DateTime(1, 1, 1, tabCasZacetek[0], tabCasZacetek[1], tabCasZacetek[2]);
                    //Začetek predvajanja zapišemo v tabelo, kjer hranimo začetke predvajanj.
                    zacetki = DodajCas(zacetki, cas1);
                    //Konec predvajanja spremenimo iz niza v objekt tipa DateTime
                    tabCas = trenutna[trenutna.Length - 1].Split(':');
                    int[] tabCasKonec = new int[tabCas.Length];
                    for (int i = 0; i < tabCas.Length; i++)
                    {
                        tabCasKonec[i] = int.Parse(tabCas[i]);
                    }
                    DateTime cas2 = new DateTime(1, 1, 1, tabCasKonec[0], tabCasKonec[1], tabCasKonec[2]);
                    //Konec predvajanja zapišemo v tabelo, kjer hranimo začetke predvajanj.
                    konci = DodajCas(konci, cas2);
                    vrstica = beri.ReadLine();

                }

Ko imamo podatke sortirane, pa preštejemo vse TV programe, ki so istočsno predvajali oglas. To naredimo tako, da gremo skozi tabelo kjer hranimo konce predvajanj in pogledamo, če se slučajno ujemata. Če se ujemata pa primerjamo še začetka predvajanj. Tudi ta dva podatka se morata ujemati. Istočasno pa si zapomnimo tudi indekse imen,ki jih imamo shranjene v tabeli imen.

//gremo skozi tabelo koncev in pogledamo ujemanja.
                //poiščemo tudi indekse imen
                for (int i = 0; i < konci.Length; i++)
                {
                    int st = 0;
                    string imena = "";
                    for (int j = i + 1; j < konci.Length; j++)
                    {
                        if ((konci[i] == konci[j]) && (zacetki[i] == zacetki[j]))
                        {
                            imena += "" + i + ";" + j + ";";
                            if (st == 0)
                            {
                                st++;
                            }
                            st++;
                        }
                    }
                    if (st > stevilo)
                    {
                        stevilo = st;
                        indeksiImen = imena;
                    }
                }

RAZLAGA ALGORITMA

Pogledamo ali smo dobili enak čas predvajanja vsaj na dveh TV programih. V primeru, da to ne drži, pa to sporočimo.

if (stevilo == 0)
                {
                    Console.WriteLine("Oglasi so se predvajali ob različnem času!");

                }

Poščemo še imena TV programov in jih zapišemo kot niz.

bool[] TabIndeksiImen = new bool[konci.Length];//tabela, ki nam pove ali je določeno ime TV programa
                    //predvajalo oglas ob določenem času.
                    indeksiImen = indeksiImen.Substring(0, indeksiImen.Length - 1);//odrežemo zadnji znak
                    string[] inImen = indeksiImen.Split(';');
                    for (int i = 0; i < inImen.Length; i++)
                    {//napolnimo tabelo, ki nam pove ime TV programa, ki je predvajalo oglas ob določenem času
                        int indeksImena;
                        if (int.TryParse(inImen[i], out indeksImena))
                        {
                            TabIndeksiImen[indeksImena] = true;
                            CasOglasa[0] = zacetki[indeksImena];
                            CasOglasa[1] = konci[indeksImena];
                        }
                    }
                    int st1 = stevilo;
                    // sestavimo niz v katerem naštejemo imena TV kanalov.
                    for (int j = 0; j < TabIndeksiImen.Length; j++)
                    {
                        if (TabIndeksiImen[j] == true)
                        {
                            if (st1 == 1)
                            {
                                RezIme = RezIme.Substring(0, RezIme.Length - 2);
                                RezIme += " in " + imeTV[j];
                            }
                            else
                            {
                                RezIme += imeTV[j] + ", ";
                            }
                            st1--;
                        }

Na konncu pa izpišemo še rezultat.

 //izpišemo rezultat
                    Console.WriteLine("Največ hkratnih oglasov: " + stevilo);
                    Console.WriteLine("Cas predvajanja: " + CasOglasa[0].ToString("H:mm:ss") + "-" + CasOglasa[1].ToString("H:mm:ss") + " na " + RezIme);

V primeru, da datoteka ne obstaja pa to tudi povemo uporabniku.

//V primeru da datoteka ne obstaja pa uporabnika obvestimo o tem.
            else
            {
                Console.WriteLine("Datoteka ne obstaja!");
            }

            Console.ReadKey(true);
        }

TESTNI PRIMERI

Da bi program testirali bomo izbrali:

  1. Primer, ko datoteka ne obstaja.
  2. Primer, ko imamo same različne čase predvajanj.
  3. Primer, ko imamo več istih časov.

FILMČEK

0%
0%