Rešena naloga: CITATI

Rešena naloga: CITATI

Avtor: Maja Vrenko

BESEDILO NALOGE

Recimo, da bi radi citirali razne strani iz neke knjige; to naredimo tako, da naštejemo številke teh strani v strogo naraščajočem vrstnem redu, na primer 2, 5, 6, 8, 11, 28, 29, 30, 31, 67. Če se v tem seznamu kdaj pojavita dve ali več zaporednih strani, ga lahko zapišemo krajše: obdržimo le prvo in zadnjo številko strani iz take skupine več zaporednih številk, med njiju pa zapišimo vezaj: 2, 5–6, 8, 11, 28–31, 67.
Napiši program, ki prebere več seznamov številk strani z vhodne datoteke (pri čemer bo vsaka številka v svoji vrstici), na izhodno datoteko pa izpiše te sezname v zgoraj določeni obliki (v eni vrstici, z vejicami, presledki in vezaji). Seznami števil na vhodni datoteki so med seboj ločeni z vrstico, v kateri je le niz "#NOV SEZNAM#". V vhodnem seznamu številke strani niso nujno v naraščajočem vrstnem redu, vse pa so cela števila, večja od 0. Predpostaviš lahko, da je v vhodnem seznamu vsaj ena številka in da se nobena številka v njem ne pojavi več kot enkrat.

OPIS PROBLEMA

Potrebno je napisati program, ki iz datoteke prebere števila, katera predstavljajo številke strani. Števila so lahko v več seznamih (vsako število je v svoji vrsti ). Seznami so med seboj ločeni z vrstico, v kateri je napis "#NOV SEZNAM#". Prebrane podatke o straneh program uredi po velikosti in združi zaporedne strani med seboj z vezajem.

IDEJA REŠITVE

Najprej preštejemo vsa števila v datoteki. Pri štetju vrstice z napisom "#NOV SEZNAM#" spustimo. Ko preštejemo vsa števila, deklariramo tabelo ustrezne dolžine. Ko je tabela deklarirana, uporabimo program za hitro urejanje elementov v tabeli (ta program smo napisali že na vajah). Ko so števila urejena, se sprehodimo skozi tabelo. Sočasno s tem števila dodajamo v nek že prej narejen prazen niz. Če si števila sledijo zaporedoma, jih v niz ne napišemo takoj, ampak preverimo koliko je zaporednih števil. V seznam vpišemo tako le prvo in zanje število zaporednih števil ter jih med seboj povežemo z vezajem. Dobljen niz na koncu zapišemo na datoteko.

RAZLAGA ALGORITMA

Program, ki smo ga napisali za reševanje zgornjega problema, dobi dva vhodna podatka. Vhodna podatka sta datoteki. Prva datoteka bo datoteka, na kateri so zapisani seznami števil in druga, na katero bomo napisali končni niz.

Najprej deklariramo tri spremenljivke in sicer dva niza in eno celoštevilsko spremenljivko. Prvi niz se imenuje vrstica in je namenjen branju vrstic iz datoteke. Drugi niz pa niz, ki bo služil zapisu končne rešitve. Celoštevilska spremenljivka se imenuje stevec in bo služila za štetje števil v vhodni datoteki.

(citati_prva.jpg)

V nadaljevanju uporabimo while zanko, ki ponavlja stavke znotraj toliko časa, dokler ne pridemo do konca datoteke. Ukaz f_beri.EndOfStream omogoča, da se datoteka prebere do konca. Znotraj while zanke preberemo trenutno vrstico iz datoteke. Nato z if stavkom preverimo ujemanje prebrane vrstice z nizom »#NOV SEZNAM#«. Če je pogoj različnosti izpolnjen, to pomeni, da se v vrstici nahaja število. Posledično povečamo spremenljivko stevec. V nasprotnem primeru ne naredimo ničesar. Ko se while zanka zaključi, datoteko, ki smo jo na začetku odprli za branje, zapremo. Uporabimo ukaz f_beri.Close().

(citati_druga.jpg)

Takoj za tem datoteko ponovno odpremo za branje. Deklariramo celoštevilsko tabelo velikosti spremenljivke stevec z naslednjim ukazom:

int[] tabela = new int[stevec];

Deklariramo tudi dve novi spremenljivki in sicer eno celoštevilsko spremenljivko i ter en niz vrstica1. Celoštevilski spremenljivki i nastavimo začetno vrednost na 0. Spremenljivko bomo uporabili, za vnos števil v tabelo. Nizu vrstica1 pa določimo začetno vrednost s tem, da preberemo prvo vrstico iz datoteke.

(citati_tretja.jpg)

V nadaljevanju uporabimo while zanko, ki ponavlja stavke znotraj toliko časa, dokler prebrana vrstica ni enaka vrednosti null. Na vsakem koraku while zanke primerjamo neujemanje spremenljivke vrstica1 z nizom »#NOV SEZNAM#«. Če je pogoj izpolnjen, to pomeni, da je spremenljivki vrstica1 shranjeno število, zato ga zapišemo v tabelo. Preden ga zapišemo v tabelo moramo tip spremenljivke vrstica1 spremeniti v celoštevilski. Saj, ko beremo iz datoteke, se tip samostojno nastavi na niz. Niz spremenimo v celo število z naslednjim ukazom:
int.Parse(vrstica1);
Znotraj while zanke še preberemo novo vrstico z datoteke. Tako si zagotovimo, da se while zanka dejansko zaključi (se ne »zaciklamo«).

(citati_cetrta.jpg)

Nato uporabimo program za hitro urejanje tabel, ki smo ga izdelali že na vajah. Z njegovo pomočjo uredimo tabelo. S tem zagotovimo, da so vsa števila, ki smo jih prebrali iz datoteke, urejena po velikosti. Pri hitrem urejanju najprej preverimo, če je začetek (začetni indeks) večji od konca (končni indeks). Če je pogoj izpolnjen, v tabeli ne naredimo ničesar. V nasprotnem primeru uporabimo pomožno metodo Preuredi, s pomočjo katere najdemo pivotni indeks. Nato preverimo, če je pivot manjši od začetnega indeksa. Če je pogoj izpolnjen, rekurzivno kličemo metodo HitroUredi z vhodnimi podatki začetna vhodna tabela, začetni indeks in pivot manjši za ena. V nasprotnem primeru rekurzivno kličemo metodo HitroUredi z vhodnimi podatki začetna vhodna tabela, pivotni indeks povečan za ena in konec. S pomočjo tega tabelo urejamo po delih. Ta metoda ne vrne ničesar (ima svoje učinke na vhodni tabeli – le ta je na koncu urejena po velikosti).

(citati_peta.jpg) (citati_sesta.jpg)

V nadaljevanju uporabimo for zanko, ki ponavlja stavke znotraj toliko časa, dokler ne pridemo do konca tabele. Znotraj for zanke najprej preverimo, če je dolžina niza enaka 0. Če je enaka pomeni, da smo pri prvemu številu, zato ga v niz le dodamo. Za vse naslednje znake preverimo, ujemanje trenutnega znaka z njegovim predhodnikom povečanim za 1. Če se števili ujemata povečamo števec j. Števec j povečujemo dokler ne pridemo do števil, ki si nista zaporedni. Takrat v niz dodamo pomišljaj in zadnje število, ki je ustrezalo pogoju zaporednosti. Števec j zmanjšamo za 1, da pridemo ponovno na število, ki je bilo različno. Potrebujem tudi zaustavitveni pogoj, kateri omogoča zaključitev zanke, če se ujemajo tudi števila na koncu v datoteki. S tem zagotovimo, da se dolžina datoteke ne preseže. Različna števila v niz le zapišemo (tista, ki si niso zaporedna).

(citati_sedma.jpg)

Niz, ki ga dobimo na koncu, zapišemo v vhodno datoteko namenjeno pisanju. Vse odprte datoteke na koncu zapremo. Torej obe vhodni datoteki.

TESTNI PRIMERI

Testne primere predstavljajo datoteke z različni podatki. Delovanje smo poizkusili:

  • na prazni datoteki;
  • na datoteki z le enim seznamom;
  • na datoteki z več različnimi seznami;
  • na datoteki z že urejenimi seznami.

FILMČEK TESTIRANJA REŠITVE

0%
0%