MODULE Houtzagerij; (* ZET HIER UW NAAM !!!! *) (* Een houtzagerij gaat als volgt tewerk: ze krijgt een bestelling binnen van een aantal planken met een opgegeven lengte. Hiervoor heeft de zagerij een stock van planken voorradig waaruit de bestelde planken gezaagd worden. De huidige procedure is echter verre van optimaal, er blijven immers veel restplanken over. Nu wil de eigenaar een programma schrijven die de totale kostprijs om een bestelling uit te voeren minimaliseert. Gegeven is een stock van 15 planken met een gegeven lengte en prijs, en een bestelling van 9 planken met een gevraagde lengte (run het programma). Gevraagd: (1) Implementeer de procedure die de zagerij momenteel gebruikt om een bestelling uit te voeren: - de bestelde planken worden in volgorde gemaakt zoals opgegeven - de planken uit de stock worden eveneens in volgorde gebruikt - eerst checkt men of de stock-plank lang genoeg is, indien niet wordt deze plank bij het afval gegooid en niet meer gebruikt indien wel lang genoeg, zaagt men de bestelde plank uit de stock-plank. gebruik hier de procedure 'MaakBesteldePlank' van (2) - bij de volgende plank gaat men verder met de rest van de laatst gebruikte stock-plank. - op het einde gooit men deze rest ook weg. Bereken de totale kost: de prijs van alle gebruikte stock-planken plus de kost van het zagen (constante KOST_ZAGEN). (oplossing: 73,65 euro) (2) Maak een procedure 'MaakBesteldePlank' die een bestelde plank en een stock- plank als parameters heeft. De procedure checkt eerst of de bestelde plank wel met die bepaalde stock-plank gemaakt kan worden en geeft dit eveneens terug. Indien dit kan, wordt de bestelde plank uit de stock-plank gezaagd. Hou rekening met de dikte van de zaag die 1 mm wegzaagt (constante DIKTE_ZAAG). Na het uitvoeren van deze procedure zijn eigenschappen van beide planken aangepast! (3) De houtzagerij verkoopt de planken aan een prijs die per meter berekend wordt (constante VERKOOP_PRIJS_PER_METER). Bereken de verkoopprijs van de bestelling en de winst die de houtzagerij op deze bestelling maakt (verkoopprijs - kost). (4) Vind een algoritme die de huidige procedure verbetert en de kost minimaliseert. Bereken hoe de bestelde planken aangemaakt moeten worden en bereken de kost. Opmerkingen: - roep de Initialisatie-procedure vooraleer een bestelling opnieuw uit te voeren! - maak de procedures algemeen, zodat ze voor elke stock en bestelling blijven werken. Je mag er wel vanuit gaan dat de stock groot genoeg is om de hele bestelling uit te voeren. - gebruik WrFixReal om euro's te printen tot op 2 cijfers na de komma, definitie: WrFixReal(variabele: REAL; aantal_cijfers_na_de_komma, aantal_spaties: CARDINAL); *) FROM IO IMPORT WrStr, WrLn, RdCard, WrCard, RdInt, WrInt, RdKey, RdLn, WrFixReal; CONST AANTAL_STOCK = 15; AANTAL_BESTELLINGEN = 9; KOST_ZAGEN = 1.25; (* in euro *) VERKOOP_PRIJS_PER_METER = 10.00; (* in euro *) DIKTE_ZAAG = 1; (* in mm *) TYPE Plank_StockRc = RECORD lengte: CARDINAL; (* in mm *) prijs: REAL; (* in euro *) END; Plank_BestellingRc = RECORD lengte: CARDINAL; (* in mm *) gemaakt: BOOLEAN; (* of de plank reeds is aangemaakt *) END; VAR (* globale variabelen *) gStock: ARRAY[1..AANTAL_STOCK] OF Plank_StockRc; gBestelling: ARRAY[1..AANTAL_BESTELLINGEN] OF Plank_BestellingRc; (************************** GEGEVEN PROCEDURES ***********************************) PROCEDURE Initialisatie(); (* initialisatie van stock en bestelling *) VAR i: CARDINAL; BEGIN FOR i := 1 TO AANTAL_STOCK DO gStock[i].lengte := 1000 + (i MOD 3) * 1000; (* tussen 1000 & 3000 mm *) gStock[i].prijs := 1.0 + VAL(REAL, gStock[i].lengte) * 0.0032; END; FOR i := 1 TO AANTAL_BESTELLINGEN DO gBestelling[i].gemaakt := FALSE; END; gBestelling[1].lengte := 358; gBestelling[2].lengte := 2358; gBestelling[3].lengte := 1272; gBestelling[4].lengte := 505; gBestelling[5].lengte := 1863; gBestelling[6].lengte := 1760; gBestelling[7].lengte := 587; gBestelling[8].lengte := 294; gBestelling[9].lengte := 1363; END Initialisatie; PROCEDURE WrStock(stock: ARRAY OF Plank_StockRc); (* uitschrijven van de stock *) VAR i: CARDINAL; BEGIN WrStr("Stock van ");WrCard(HIGH(stock)+1, 0);WrStr(" planken:");WrLn; FOR i := 0 TO HIGH(stock) DO WrCard(stock[i].lengte,4);WrStr("mm ");WrFixReal(stock[i].prijs, 2, 6); WrStr(" euro; "); IF ((i MOD 3) = 2) OR (i = HIGH(stock)) THEN WrLn; END; END; END WrStock; PROCEDURE WrBestelling(bestelling: ARRAY OF Plank_BestellingRc); (* uitschrijven van de bestelling, 'OK' als plank is aangemaakt *) VAR i: CARDINAL; BEGIN WrStr("Bestelling van ");WrCard(HIGH(bestelling)+1, 0);WrStr(" planken:");WrLn; FOR i := 0 TO HIGH(bestelling) DO WrCard(bestelling[i].lengte,4);WrStr("mm "); IF bestelling[i].gemaakt THEN WrStr(" OK"); ELSE WrStr("NOK"); END; WrStr("; "); IF ((i MOD 5) = 4) OR (i = HIGH(bestelling)) THEN WrLn; END; END; END WrBestelling; (************************ ZET HIER UW PROCEDURES *********************************) (*********************************************************************************) VAR kost, prijs: REAL; BEGIN WrLn; Initialisatie(); WrStock(gStock); WrBestelling(gBestelling); END Houtzagerij.