Massiivide kombineerimine ja lahku löömine

Antud ülesanne on osa 25.02 toimuvast praktikumi tunnitööst ning sellele järgneb kodutöö.

Tunnitöö

Taust

Postiasutuse kaubad paiknevad kahes vahelaos – ladu A ja ladu B.  Kaupade andmeteks on nende kaalud. Kaubad viiakse mõlemast vahelaost sorteerimiskeskusse, kus need järjestatakse kahanevasse järjekorda. Seejärel kaubad väljastatakse.

Tunnitöö ülesanne on vastavuses Algoritm (3) slaidiga

Implementatsioon programmis

Alustuseks on välja pakutud potentsiaalne programmi struktuur. Allpool leiad vihjeid kuidas seda kõike programmina tööle panna.

Näidis programmi väljundist

 

1. samm: muutujad

Esiteks on meil vaja muutujad deklareerida. Nendeks on meil massiivid, kus andmed hoitakse- laduA, laduB ja sorteerimiskeskus. Aja säästmiseks algväärtustame lähteandmete massiivid – st paigutame väärtused massiivi muutuja deklareerimise hetkel.  Massiivi suurus otsustatakse algväärtustatud elementide arvu järgi – st kui kirjutame loogeliste sulgude vahele 6 numbrit, siis massiivi suuruseks saab 6.

Lisaks laduA massiivi programmi lisamisele tuleb ka samal põhimõttel luua laduB massiiv. Kasuta laduB jaoks erinevat liikmete arvu!

Enne sorteerimiskeskuse loomist peame me teadma aga kui suured on laduA ja laduB massiivid. Selleks, et mitte seda staatiliselt programmi kirjutada, võime seda hoopiski pärida. Selleks on olemas sizeof operaator, mis ütleb loodud muutuja suuruse.

Lähenemine: massiivi suurus jagatuna ühe elemendi suurusega annab meile elementide arvu. (samuti nagu ühe elemendi suurus * elementide arv annab kogusuuruse)

Tee täpselt sama nüüd kogusB jaoks.

Lõpuks arvuta välja sorteerimiskeskuse suurus – selleks on kahe lao suuruste summa.

Nüüd peaks olema sul deklareeritud kõik 3 massiivi, kaks neist algväärtustatud ning 3 suurust sisaldavat muutujat, vastavalt igale ühele neist kolmest massiivist.

2. samm: algmassiivide väljastus

Kontrollimaks kas lähteandmed on korrektsed tuleks väljastada laduA ja laduB massiivid. Väljastuseks võid julgelt võtta malli eelnevas kahes tunnis tehtud massiivi väljastusest. Väljastus peaks olema ühes reas, eraldatuna tühikuga. Vajadusel täienda deklareeritud muutujate loetelu.

3. samm: ümberpaigutamine

Enne kui saame hakata sorteerima oma tulemust, peame me kaks eraldiseisvat massiivi kombineerima üheks ehk siis kahest massiivist kopeerima kõik arvud kolmandasse massiivi. Selleks kopeerime esmalt väärtused alguses laduA massiivist oma sorteerimiskeskusse ning seejärel laduB massiivist sorteerimiskeskusse.

Selleks on välja pakutud järgnev algoritm. Seda, nagu paljusid ülesandeid, on matemaatiliselt võimalik indekseerida mitmeti. Näiteks saab seda lahendada ilma teist loendurit kasutamata jne. Välja on pakutud lahendus, kus esimeses tsüklis kasutatakse loendamiseks ainult loendurit i, kopeerides kõik elemendid ükshaaval üle samadele positsioonidele. Seejärel aga teise lao jaoks võetakse kasutusele uus loendur, mis algab nullist, kuid eelmises tsüklis kasutusel olnud loendur i jätkab sealt, kus ta varem oli.

 

Realiseeri antud algoritm ladude kokku paneku jaoks. Kui sellega said hakkama oleks paslik ka saadud massiiv välja printida, et veenduda korrektses implementatsioonis. Kui kõik on korrektne võid edasi minna

4. samm: sorteerimine

Massiivi saad sorteerida mullsordi meetodil mida vaatlesime eelmisel nädalal. Võta eelmine nädal loodud koodist mullsordi osa, muuda muutujate nimed vastavaks tänase koodiga ja ongi tehtud.

5. samm: väljasta sorteeritud massiiv

Täpselt samamoodi nagu varem massiivi väljastust sai tehtud tuleb nüüd väljastada ka sorteeritud massiiv. Kui see tehtud, tule näita oma töö ette ja kui kõik korras saad punkti.

Edasijõudnutele:

Lao kaupade arv küsitakse kasutajalt. Mõlemal laol on defineeritud maksimaalne lubatud kaupade arv, st

Kaupade arvu küsides tuleb veenduda, et kaupade arv ei ole negatiivne ega suurem kui lubatud maksimaalne arv. Selleks kasuta do while() lauset. Kasuta liittingimust tsükli tingimusenam mis ei lubaks tsüklist enne väljuda, kui kasutajalt saadud number on sobilik.

Vihjeks veel nii palju, et tsükli tingimus peab olema kombineeritud kahest tingimusest (liittingimus). Selle saavutamiseks kasutatakse loogilisi operaatoreid (otsides märksõna logical operators). See tuleks omal käel otsida ja rakendada.

Kodutöö

Kodutöö raames tuleb teha vastandtegevus – ühe massiivi tükeldamine kaheks. Kodutöö raames loo nii täispikk UML kui ka kood mis sellele vastab.

  • Klaviatuurilt loetakse sisse massiivi liikmed, milleks on reaalarvud. Liikmete arv on defineeritud.
  • Klaviatuurilt loetakse sisse eraldaja, reaalarv
  • Jaota algsest massiivist numbrid kahte eraldi massiivi –   suuremadEraldajast[] ja vaiksemadEraldajast[]. Massiivi suuremadEraldajast[] kopeeri kõik arvud, mis on loetud eraldaja väärtusest suuremad ning massiivi vaiksemadEraldajast[] eraldajast väiksemad arvud. Eraldajaga sama väärtust omavaid numbreid ignoreeritakse ning üle ei kopeerita.
  • Väljasta leitud massiivid