Lestvica

Lestvica

Avtor: Vera Kabanova

Navodila

Na datotekah prva.txt in druga.txt so zapisane podatki o priljubljenosti skladb na lokalni radijski postaji Vreščalo. V vsaki vrstici so podatki: ime izvajalca in naslov skladbe ter število glasov. Podatek o številu glasov je s podpičjem ločen od ostalih podatkov. Podatki NISO urejeni, se pa vsaka skladba pojavi samo enkrat. Ob koncu drugega leta je želel DJ Ropotalo poiskati tisto skladbo, kateri je priljubljenost najbolj narastla ali padla v enem letu. (Priljubljenost je uvrstitev na lestvici glede na število prejetih glasov. Pazi: Nekatere skladbe se lahko pojavijo le na eni lestvici.)

Rešitev

IDEJA REŠITVE:
Opazimo da je problem simetričen - če iščemo največji padec v drugi datoteki glede na prvo, dobimo isto, kot če iščemo največji vzpon v prvi datoteki glede na drugo. Zato napišemo pomožni program, ki na datotekah prva.txt in druga.txt poišče pesem z navečjim padcem. V funkciji Lestvica samo dvakrat pokličemo ta pomožni program.

RAZLAGA ALGORITMA:
Naprej definiramo pomožno funkcijo, ki vrača niz (ime pesmi) -  static string najvecPadec(string prva, string druga)  . Nato definiramo spremenljvki maxPadec in imePesmi, kamur bomo shranjevali vrednost največjega padca in ime pesmi, ki temu padcu ustreza. Ustvarimo tudi spremenljivki, kamur bomo sharanjevali tekoče prebrane vrstici iz obeh datotek. Prvo datoteko odpremo za branje. In jo z while zanko (dokler ni tekoča prebrana vrstica null) beremo po vrsticah. Vsako vrstico, ki jo preberemo, razbijemo na dele (ime in popularnost) z ukazom Split - string[] besede1 = vrstica_prve.Split(';') . Znotraj te zanke ustvarimo spremenljivko jeVDrugi, ki je tipa bool in je namenjenatemu daza posamezno vrstico prve datoteke ugotavljamo, če je tudi v drugi.
V zunanji while zanki odpremo tudi drugo datoteko za branje in jo beremo po vrsticah v notranji while zanki. Tudi vrstice druge datoteke razbijemo na dele z ukazom Split. Znatraj notranje while zanke poiščemo tako vrstico druge datoteke, v kateri se ime pesmi ujema z imenom pesmi v tekoči vrstici prve datoteke - if (besede1[0] == besede2[0])  . Ko tako vrstico najdemo, spremenljivko jeVDrugi takoj nastavimo na true. Nato pa preverimo če je razlika vrednosti popularnosti v prvi in drugi datoteki večja od trenutne vrednosti spremenljivke maxPadec. Če to velja, to razliko vrednosti shranimo v spremenljivko maxPadec, ime tekoče pesmi pa v spremenljivko imePesmi.
Ko pridemo ven iz notranje while zanke, drugo datoteko zapremo. Nato se pa vprašamo, če je tekoča pesem iz prve datoteke nastopala v drugi. Če je vrednost spremenljivke jeVDrugi false, tekoča pesem nastopa samo v prvi datoteki, torej je njen padec enak kar njeni popularnosti v prvi datoteki. Preverimo, če je ta vrednost večja od trenutne vrednosti spremenljivke maxPadec. Če to velja, to razliko vrednosti shranimo v spremenljivko maxPadec, ime tekoče pesmi pa v spremenljivko imePesmi.
Ko pridemo ven iz zunanje while zanke, zapremo prvo datoteko in vrnemo spremenljivko imePesmi.
Napišemo še funkcijo Lestvica, ki vrne tabelo iz dveh nizov - prvi niz je ime pesmi, ki je doživela največji padec, drugi pa ime pesmi, ki je doživela največji vzpon.
Da dobimo največji padec, pokličemo funkcijo najvecPadec za datoteki "prva.txt" in "druga.txt". Da dobimo največji vzpon pa za datoteki "druga.txt" in "prva.txt".

Koda

(lestvica_koda1.jpg) (lestvica_koda2.jpg) (Lestvica1.jpg)

Testni primeri

Pri tej nalogi je več možnosti deogajanja. Lahko se zgodi, da ima največji padec komad, ki je prisoten v obeh datotekah, ali pa komad, ki je prisoten le v prvi datoteki. Lahko se pa zgodi, da noben komad nima padca - vsem komadom je popularnost tekom leta narasla. Enako za narastek popularnosti - lahko se zgodi, da gre za komad iz obeh datotek, komad iz le druge datoteke ali noben. Testne primere sem si izbrala tako, da bi stestirala prav vse te možnosti.

  1. Pri prvem primeru imamo vse komade v obeh seznamih - torej in največji padec in največji vzpon bo imela pelem, ki se nahaja v obeh seznamih:

    (Lestvica2.jpg)

    Največji padec pričakujemo od pesmi "Tricky - Overcome", največji napredek pa od pesmi "Puscifer - The mission".

  2. V drugem primeru popularnosti pesmi samo padajo. Na prvem seznamu nastopajo pesmi, ki jih na drugem seznamu ni.

    (Lestvica3.jpg)

    Največji padec pričakujemo od pesmi "Moloko - Time is now", ki je ni na drugem seznamu, največjega napredka pa ne bo - namesto imena pesmi se bo izpisal zank "/".

  3. Pri tretjem primeruv drudo detoteko le dodamo Eno pesem, ki je v p rvi datoteki ni - tako pričakujemo, da nam program vrne to novo pesem kot tisto z najvišjim vzponom. Pesem z največjim padcem bo ostala ista. Obe pesmi sta v samo po eni datoteki.

    (Lestvica4.jpg)
  4. Pri zadnjem bodo priljubljenosti skladb samo naraščali.

    (Lestvica5.jpg)

    Največji vzpon pričakujemo od pesmi "Portishead - Sour Times", največjega padca pa ne bo - namesto imena pesmi se bo izpisal zank "/".

Test

0%
0%