Zbrirka rešenih nalog

Zbrirka rešenih nalog

Avtor: Urška Belehar

KOLO

Besedilo naloge

Napišite razred Kolo, s katerim predstavite kolesa. Vsako kolo ima neko število prestav, barvo, tip (gorsko, cestno, treking), in za koliko ljudi je namenjeno. Napišite osnovni konstruktor (sami določite privzete vrednosti), dva dodatna konstruktorja, ustrezne get/set metode. Rešite naslednje probleme:

- Izpišite koliko koles posamezne barve je v tabeli koles.

- Vsa kolesa rumene barve prebarvajte v rdeče.

- Koliko ljudi se lahko pelje s cestnimi kolesi, ki so v tabeli.

- Izpišite koliko koles posameznega tipa je v tabeli koles.

KOLO - Opis problema in ideja rešitve

Napisati bomo morali razred Kolo. V njem bomo napisali

- tri konstruktorje (osnovnega in dva dodatna),

- get/set metode,

- metodo, ki bo kolesa dodala na datoteko,

- metodo, ki bo kolesa prebrala z datoteke in jih dodala v tabelo,

- metode, ki bodo izpisala število koles posamezne barve,

- število koles posameznega tipa,

- število ljudi, ki se lahko pelje s cestnimi kolesi,

- metodo, ki bo vsa rumena kolesa prebarvala v rdeča.

Ustvarili bomo tudi dva testna programa. V enem bomo ustvarili 20 koles s podatki: število prestav, barva, tip, število ljudi, ki se lahko naenkrat z njim vozi. Ta kolesa bomo zapisali na datoteko.

V drugem testnem programu pa bomo napisali:

- metode, ki bodo rešile zastavljene probleme,

- eno kolo bomo dodali na datoteko,

- prebrali bomo vse podatke iz datoteke v tabelo,

- le-to tabelo izpisali,

- izpisali rezultate zastavljenih problemov,

- v neko datoteko zapisali vse podatke vseh objektov.

KOLO - Razlaga algoritma

Uporabimo public class, ker znotraj razreda ni omejitev, vedno lahko dostopamo do komponent stPrestav, barva, tip in stOseb.

public class Kolo

{

int stPrestav;

string barva;

string tip;

int stOseb;

Napišemo polni konstruktor ter dva dodatna konstruktorja: eden za parameter prejme niz, drugi pa ima vse komponente že določene.

polni konstruktor

public Kolo(int steviloPrestav, string b, string t, int steviloOseb)

{

this.stPrestav = steviloPrestav;

this.barva = b;

this.tip = t;

this.stOseb = steviloOseb;

}

konstruktor, ki kot parameter prejme niz. V njem preverimo, da so podatki smiselni.

public Kolo(string niz)

{

string[] tabela = niz.Split(';');

če je število prestav manjše od 12, nas opozori

if (int.Parse(tabela[0]) < 12)

{ Console.WriteLine("Nimamo koles z manj kot 12 prestavami!");

throw new ArgumentException();

}

else

{

this.stPrestav = int.Parse(tabela[0]);

}

če je število oseb manjše od 1

if (int.Parse(tabela[3]) < 1)

{

Console.WriteLine("Vsaj ena oseba se lahko vozi s kolesom!");

throw new ArgumentException();

}

else

{

this.stOseb = int.Parse(tabela[3]);

}

this.barva = tabela[1];

this.tip = tabela[2];

}

dodatni konstruktor

public Kolo()

{

this.stPrestav = 32;

this.barva = "rdeca";

this.tip = "gorsko";

this.stOseb = 2;

}

"get" metode so metode za dostop do stanj, "set" pa so metode za dostop do lastnosti

get,set metode

public int SteviloPrestav

{

get { return this.stPrestav; }

set { this.stPrestav = value; }

}

public string Barva

{

get { return this.barva; }

set { this.barva = value; }

}

public string Tip

{

get { return this.tip; }

set { this.tip = value; }

}

public int StevilOseb

{

get { return this.stOseb; }

set { this.stOseb = value; }

}

metoda za izpis ToString; override se uporabi zaradi dedovanja, metoda ToString je vedno na voljo

public override string ToString()

{

string niz = this.stPrestav + ";" + this.barva + ";" + this.tip + ";" + this.stOseb;

return niz;

}

metoda doda kolesa na datoteko

public void DodajNaDatoteko(string imeDatoteke)

{

StreamWriter f = File.AppendText(imeDatoteke); odpremo za branje

f.WriteLine(this.ToString()); dodamo na datoteko

f.Close(); zapremo

}

metoda prebere kolesa z datoteke imeDatoteke in jih zapiše v tabelo

public static Kolo[] PreberiZDatoteke(string imeDatoteke)

{

StreamReader f = File.OpenText(imeDatoteke); odpremo za branje

int st = 0; števec vrstice postavimo na 0

while (!f.EndOfStream) dokler ni konec datoteke

{

st++; povečujemo števec

f.ReadLine(); beremo vrstice

}

f.Close(); zapremo

Kolo[] tabela = new Kolo[st]; nova tabela, dolžina je enaka števcu

f = File.OpenText(imeDatoteke); odpremo datoteko

st = -1; zato, da začnemo v tabeli šteti od 0!

while (!f.EndOfStream) dokler ni konec

{

st++; povečujemo števec

tabela[st] = new Kolo(f.ReadLine()); dodajamo vrstice iz datoteke v tabelo

}

f.Close();

return tabela;

}

metoda, ki vrne števila koles posamezne barve

oznaka int pove, da bomo kot rezultat vračali celo število

public static int SteviloKolesPosamezneBarve(string imeDatoteke, string b)

{

Kolo[] tabKoles = PreberiZDatoteke(imeDatoteke); datoteko spremenimo v tabelo

int stKoles = 0;števec postavimo na 0

preštejemo število koles posamezne barve

for (int i = 0; i < tabKoles.Length; i++)

{

if (tabKoles[i].barva == b) če se barva ujema s podano barvo

{

stKoles++; povečamo števec

}

}

return stKoles;

}

metoda, ki rumena kolesa spremeni v rdeča in jih zapiše na novo datoteko

void uporabimo, ker nič ne vračamo

public static void RumenaVrdeca(string imeDatoteke,string imeDatoteke1)

{

Kolo[] tabela = PreberiZDatoteke(imeDatoteke);datoteko pretvorimo v tabelo

for (int i = 0; i < tabela.Length; i++)

{

if (tabela[i].barva == "rumena")če je barva kolesa rumena

{

tabela[i].barva = "rdeča"; jo spremeni v rdečo

}

tabela[i].DodajNaDatoteko(imeDatoteke1);to zapiši na novo datoteko

}

}

metoda, ki vrne število oseb, ki se lahko vozijo s cestnimi kolesi, glede na tabelo

public static int SteviloOsebNaCestnih(string imeDatoteke, string t)

{

Kolo[] tabela = PreberiZDatoteke(imeDatoteke);datoteko pretvorimo v tabelo

int kolikoOseb = 0;števec postavimo na 0

for (int i = 0; i < tabela.Length; i++)se sprehodimo po tabeli

{

if (tabela[i].tip == "cestno") če je kolo cestno

{

kolikoOseb = kolikoOseb + tabela[i].stOseb;trenutnemu številu oseb dodaj število, ki se nahaja v spremenljivki stOseb(ker je število oseb, ki se lahko vozi z določenim kolesom 1 ali 2)

}

}

return kolikoOseb;

}

metoda, ki vrne števila koles posameznega tipa

public static int SteviloKolesPosameznegaTipa(string imeDatoteke, string t)

{

Kolo[] tabKoles = PreberiZDatoteke(imeDatoteke);

int stKoles = 0;

for (int i = 0; i < tabKoles.Length; i++)

{

if (tabKoles[i].tip == t)če se tip ujema s podanim

{

stKoles++; povečaj števec

}

}

return stKoles;

}

KOLO - Testni primeri

Napisala sem TestniProgram1, v katerem ustvarim 20 koles in jih zapišem na datoteko.

static void TestniProgram1(string imeDatoteke)

{

FileStream f = new FileStream(imeDatoteke, FileMode.Create);

TextWriter p = new StreamWriter(f);

p.Write("");

p.Close();

Console.WriteLine("Ustvarimo 20 koles in jih zapišemo na datoteko:"); besedilo znotraj narekovajev se bo izpisalo na konzolo, ko bomo pognali program

Kolo kolo1 = new Kolo(18, "rumena", "gorsko", 1);

Kolo kolo2 = new Kolo(24, "rumena", "gorsko", 1);

Kolo kolo3 = new Kolo(24, "rdeča", "cestno", 2);

Kolo kolo4 = new Kolo(32, "bela", "gorsko", 1);

in tako naprej, dokler nimamo 20 koles

nato vsa ta kolesa dodamo na datoteko s pomočjo metode DodajNaDatoteko, ki smo jo zapisali zgoraj

kolo1.DodajNaDatoteko(imeDatoteke);

kolo2.DodajNaDatoteko(imeDatoteke);

kolo3.DodajNaDatoteko(imeDatoteke);

kolo4.DodajNaDatoteko(imeDatoteke); ,...

}

Sedaj imamo na datoteki imeDatoteke zapisano vseh 20 koles.

S pomočjo TestnegaPrograma2 pa bomo vsa ta kolesa izpisali na konzolo in izpisali rezultate zastavljenih problemov.

static void TestniProgram2(string imeDatoteke,string imeDatoteke1)

{

datoteki pretvorimo v tabeli

Kolo[] tabela = PreberiZDatoteke(imeDatoteke);

Kolo[] tabela1 = PreberiZDatoteke(imeDatoteke1);

izpišemo tabelo koles

Console.WriteLine("Tabela koles: ");

foreach (Kolo kolo in tabela)

Console.WriteLine(kolo.ToString());

Console.WriteLine("-------------------------------------------");

dodamo novo, 21. kolo

Console.WriteLine("DODAMO KOLO");

Kolo kolo21 = new Kolo(32, "rdeča", "treking", 1);

Console.WriteLine(kolo21.ToString());

kolo21.DodajNaDatoteko(imeDatoteke);

Console.WriteLine("-------------------------------------------");

s klicom metode SteviloKolesPosamezneBarve preštejemo, koliko imamo v tabeli belih koles, rumenih koles, in rdečih koles. Vse to izpišemo.

Console.WriteLine("ŠTEVILO KOLES POSAMEZNE BARVE");

Console.WriteLine(SteviloKolesPosamezneBarve(imeDatoteke, "bela") + " belih koles");

Console.WriteLine(SteviloKolesPosamezneBarve(imeDatoteke, "rumena") + " rumenih koles");

Console.WriteLine(SteviloKolesPosamezneBarve(imeDatoteke, "rdeča") + " rdečih koles");

Console.WriteLine("-------------------------------------------");

Console.Write("ŠTEVILO LJUDI, KI SE LAHKO PELJEJO S CESTNIMI KOLESI IZ TABELE: ");

Console.WriteLine(SteviloOsebNaCestnih(imeDatoteke, "cestno") + " oseb");

Console.WriteLine("-------------------------------------------");

s klicom metode SteviloKolesPosameznegaTipa preštejemo, koliko gorskih, treking in cestnih koles imamo v tabeli

Console.WriteLine("ŠTEVILO KOLES POSAMEZNEGA TIPA: ");

Console.WriteLine(SteviloKolesPosameznegaTipa(imeDatoteke, "gorsko") + " gorskih koles");

Console.WriteLine(SteviloKolesPosameznegaTipa(imeDatoteke, "cestno") + " cestnih koles");

Console.WriteLine(SteviloKolesPosameznegaTipa(imeDatoteke, "treking") + " treking koles");

Console.WriteLine("-------------------------------------------");

Vsa kolesa rumene barve prebarvamo v rdeča s klicom funkcije RumenaVRdeca

Console.WriteLine("RUMENA KOLESA PREBARVAMO V RDEČA");

Kolo.RumenaVrdeca(imeDatoteke,imeDatoteke1);

Console.WriteLine(SteviloKolesPosamezneBarve(imeDatoteke1, "rumena") + " rumenih koles");

Console.WriteLine(SteviloKolesPosamezneBarve(imeDatoteke1, "rdeča") + " rdečih koles");

V datoteko imDat.txt zapišemo vse rezultate skupaj.

string imeDatoteke2 = "imeDat.txt";

foreach (Kolo kolo in tabela)

kolo.DodajNaDatoteko(imeDatoteke2);

foreach (Kolo kolo in tabela1)

kolo.DodajNaDatoteko(imeDatoteke2);

Console.ReadLine();

}

Sedaj pa napišemo ukaze za izvedbo zgornjih programov.

static void Main(string[] args)

{

string imeDatoteke = "kolesa.txt"; v spremenljivko imeDatoteke zapišemo datteko kolesa.txt, kamor se bo zapisalo vseh 20 koles in dodatno, 21. kolo. Ta datoteka mora obstajati preden jo pokličemo

string imeDatoteke1 = "brezRumenih.txt";v sprem imeDatoteke2 bomo shranili datoteko brezRumenih.txt, kamor se bodo zapisala vsa kolesa, potem ko bodo iz rumene prebarvana v rdečo

TestniProgram1(imeDatoteke);izvedemo ukaze, ki se nahajajo v testnem programu 1

TestniProgram2(imeDatoteke, imeDatoteke1);izvedemo ukaze, ki se nahajajo v testnem programu 2

}

}

KOLO - Filmček, ki prikaže testiranje

PREDAVALNICE

Besedilo naloge

Na neki šoli prirejajo večji dogodek. Potekal bo ves dan in bo obsegal kopico predavanj. Vsako predavanje ima znan čas zacetka in konca ter zasede eno predavalnico. Nekatera predavanja potekajo hkrati, zato je seveda potrebnih vec ucilnic. (Casi predavanj so doloceni tako, da je v cas posameznega predavanja že zajet tudi cas, ki je potreben za to, da se na koncu predavanja predavalnica izprazni in da lahko vanjo pridejo poslušalci naslednjega predavanja. Torej, ce imamo podatek, da se neko predavanje zacne ob istem casu, ob katerem se neko drugo predavanje konca, to pomeni, da lahko ti dve predavanji uporabljata isto predavalnico.) Pomagaj ravnatelju napisati program, ki bo izracunal najvecje število hkratnih predavanj, da bo znal priskrbeti potrebno število predavalnic. Ravnatelj pozna cas (ure in minute) zacetka in konca vsakega dogodka. Zapisani so na datoteki. Preberi te podatke in izpiši potrebno število predavalnic. Poskusi najti cim ucinkovitejši postopek, ki bo deloval hitro tudi v primerih, ko je predavanj zelo veliko. Koliko je minut v enem dnevu?

PREDAVALNICE - Opis problema in ideja rešitve

Napisala bom razred Predavanja, v katerem bodo komponente: začetek, ki bo tipa DateTime, začetek v minutah tipa int, konec tipa DateTime in konec v minutah tipa int.

V glavnem programu odpremo datoteko in preberemo vrstico za vrstico. Nato preberemo posamezne vrstice iz datoteke in podatke ločimo z znakom ;. Ločimo še začetek in konec predavanj glede na ure in minute in oba dva (začetek in konec) pretvorimo v minute. Zatem napišemo algoritem, ki izračuna število predavalnic, ki jih bomo potrebovali.

PREDAVALNICE - Razlaga algoritma

Napišemo komponente do katerih lahko vedno dostopamo.

class Predavanje { public DateTime zacetek;

public int zacetek_v_min;

public DateTime konec;

public int konec_v_min;

}

class Program

{

static void Main(string[] args)

{

string sDatoteka = "Predavanja.txt"; ime datoteke, iz katere naj se preberejo predavanja

string sVrstica;

char sLociloPolj = (';'); znak, ki predstavlja ločila med podatki enega predavanja

char sLociloUrInMinut = ('.'); znak, ki predstavlja ločilo med uro in minuto predavanja

int i, iMaxStPredavalnic = 0, iStevecPredavalnic = 0;

ArrayList aPredavanja = new ArrayList();prazen seznam aPredavanja

ArrayList aIntervali = new ArrayList();prazen seznam aIntevali

prvi parameter pomeni datoteko s predavanji - če ni parametrov vzame privzeto vrednost

if (args.Count() > 0) sDatoteka = args[0];

preverimo če datoteka obstaja

if (!File.Exists(sDatoteka))če dat ne obstaja, vrnemo opozorilo

{ Console.WriteLine("Ne morem odpreti datoteke " + sDatoteka);

Console.ReadKey();

return;

}

odpremo obstoječo datoteko za branje

StreamReader s = File.OpenText(sDatoteka);

branje predavanj iz datoteke vrstico za vrstico do konca datoteke

do

{ sVrstica = s.ReadLine();

if (sVrstica != null)dokler ni konec datoteke

{

preberemo posamezne podatke o predavanju iz vrstice

string[] sPolja = sVrstica.Split(sLociloPolj); vrstico razdelimo na več delov, glede na znak ;

if (sPolja.Count() >= 2) če obstajata vsaj dve polji (začetek in konec predavanja)

{

Predavanje pred = new Predavanje();

niz, ki se nahaja na prvem mestu(začetek),razdelimo na ure in minute, glede na znak .

string[] sUraInMinuta = sPolja[0].Split(sLociloUrInMinut);

v pred.zacetek shranimo ure in minute začetka predavanja s pomočjo metode Convert, ki jo uporabimo, ker spreminjamo iz tipa string v int pred.zacetek = new DateTime(2011, 1, 1, Convert.ToInt32(sUraInMinuta[0], 10), Convert.ToInt32(sUraInMinuta[1], 10), 0);

izračunamo začetek predavanja v minutah

pred.zacetek_v_min = pred.zacetek.Hour * 60 + pred.zacetek.Minute;

enak postopek še za konec predavanja

sUraInMinuta = sPolja[1].Split(sLociloUrInMinut);

DateTime vsebuje parametre: leto, mesec, dan, ura, minute, sekunde

pred.konec = new DateTime(2011, 1, 1, Convert.ToInt32(sUraInMinuta[0], 10), Convert.ToInt32(sUraInMinuta[1], 10), 0);

pred.konec_v_min = pred.konec.Hour * 60 + pred.konec.Minute;

aPredavanja.Add(pred); dodamo na seznam

}

}

}

while (sVrstica != null); dokler ni konec datoteke

algoritem za število potrebnih predavalnic

korak 1 - sestavimo sortiran seznam, ki vsebuje začetke in konce vseh predavanj (v minutah), pri čemer ponavljajoče ne pišemo v seznam

for (i = 0; i < aPredavanja.Count; i++)

{ če se v seznamu intervali določena ura še ni pojavila

if (aIntervali.IndexOf(((Predavanje)aPredavanja[i]).zacetek_v_min) == -1)

{ jo dodajmo

aIntervali.Add(((Predavanje)aPredavanja[i]).zacetek_v_min); }

if (aIntervali.IndexOf(((Predavanje)aPredavanja[i]).konec_v_min) == -1)

{

aIntervali.Add(((Predavanje)aPredavanja[i]).konec_v_min);

}

}

aIntervali.Sort();razvrstimo elemente

korak 2 - za vsak interval ugotovimo s koliko predavanj se pokriva in sproti ugotavljamo maksimum predavalnic

for (i = 0; i < aIntervali.Count - 1; i++)

{

iStevecPredavalnic = 0;

for (int j = 0; j < aPredavanja.Count; j++)

{

če je začetek predavanja 1 manjši od konca pred. 2 in hkrati, če je konec pred. 1 večji od začetka pred. 2

if (((Predavanje)aPredavanja[j]).zacetek_v_min < ((int)aIntervali[i + 1]) && ((Predavanje)aPredavanja[j]).konec_v_min > ((int)aIntervali[i]))

{

iStevecPredavalnic++; povečamo števec

}

}

if (iStevecPredavalnic > iMaxStPredavalnic)

{

iMaxStPredavalnic = iStevecPredavalnic;

}

}

Console.WriteLine("Število potrebnih predavalnic: " + iMaxStPredavalnic);

s.Close();

Console.ReadKey();

}

}

}

PREDAVALNICE - Testni primeri

V datoteki "predavanja.txt" imamo shranjene naslednje podatke:

10.00;12.00

11.00;12.00

10.00;11.00

08.00;10.00

09.00;11.00

12.00;14.00

13.00;14.00

11.00;13.00

12.00;15.00

10.00;12.00

09.00;12.00

08.00;09.00

12.00;16.00

16.00;18.00

15.00;17.00

17.00;18.00

14.00;17.00

09.00;10.00

11.00;12.00

13.00;15.00

Ko zaženemo program, se nam izpiše, da potrebujemo 6 predavalnic (kar pomeni največ 6 predavalnic naenkrat).

PREDAVALNICE - Filmček , ki prikaže testiranje

FIKSNA VSOTA

Besedilo naloge:

Med n različnimi števili, zapisanimi v urejeni tabeli, bi radi poiskali tak par števil, da bo njuna vsota enaka m. V spodnjem zaporedju je za m=100 primeren par 10 + 90. 2 7 10 14 24 31 35 44 45 60 67 69 75 90 95 Kako se lotiti dela? Če bi slepo preizkušali vse možne pare, jih seštevali in preverjali njihove vsote, bi za n števil potrebovali 1 2n(n − 1) seštevanj — že pri tisoč številih bi bilo seštevanj skoraj pol milijona, pri milijon številih pa že pol bilijona. . . Gre hitreje? Za začetek poskusi kar na roko poiskati še kak par z vsoto 100 v gornji tabeli, nato pa izumljeni postopek zapiši v obliki podprograma IzpisiPare(a: array [1..n] of integer), ki izpiše vse primerne pare. Če ti uspe nalogo rešiti z manj kot n seštevanji, si na pravi poti.

FIKSNA VSOTA - Opis problema in ideja rešitve

Problema mi žal ni uspelo rešiti z: array [1..n] of integer). Program pa bi lahko napisala tako, da kot parameter podamo seznam števil in vsoto, ki jo iščemo. Nato se sprehodimo po seznamu in poiščemo ustrezen par.

FIKSNA VSOTA - Razlaga algoritma

kot parameter podamo seznam in vsoto

public static void IzpisiPare(int[] seznam, int vsota)

{

int stevec = 0; števec postavimo na 0

se sprehodimo po seznamu z i in j

for (int i = 0; i < seznam.Length; i++)

{

for (int j = 0; j < seznam.Length; j++)

{ če je število na i-tem mestu + število na j-tem mestu enako v in je v enako vsoti

int v = seznam[i] + seznam[j];

if (v == vsota)

{

ipiši ti dve števili in njuno vsoto

Console.WriteLine(seznam[i]+ "+" + seznam[j] +"=" +vsota);

stevec++; povečamo števec

j += 1;povečamo j za 1

}

}

}

izpišemo še število parov, ki ustrezajo

Console.WriteLine("Stevilo parov, ki ustreza podani vsoti: " + stevec);

FIKSNA VSOTA - Testni primeri

Za testne primere izberemo seznam števil, kjer le en par ustreza vsoti, potem enega z dvema paroma, in enega, kjer je eno izmed števil negativno.

static void Main(string[] args)

{

int[] seznam = { 2, 7, 10, 14, 24, 31, 35, 44, 45, 60, 67, 69, 75, 90, 95 };

int vsota = 100;

IzpisiPare(seznam, vsota);

int[] seznam1 = { 3, 5, 7, 9 };

int vsota1 = 12;

IzpisiPare(seznam1, vsota1);

int[] seznam2 = { -1, 2, 4, 5, 7, 11};

int vsota2 = 10;

IzpisiPare(seznam2, vsota2);

Console.ReadKey();

}

FIKSNA VSOTA - Filmček, ki prikaže testiranje

0%
0%