MODULE ProduktiePlanningOpl; (* ZET HIER JE NAAM !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *) <* +NOOPTIMIZE *> FROM IO IMPORT WrLn, RdKey, WrCard, WrStr, WrFixReal, WrChar; CONST AANTAL_PRODUKTEN = 3; AANTAL_MACHINES = 3; TYPE ProduktEn = (P1, P2, P3); ProduktRc = RECORD naam: ARRAY[1..10] OF CHAR; proc: ARRAY[1..10] OF CHAR; (* produktieproces *) verkoopsprijs, materiaalkost: REAL; werkingskost, winst, winstPerUur: REAL; (* vraag 1 *) prodUren: CARDINAL; aantal: CARDINAL; (* toegevoegd voor vraag 4 *) END; VAR gProdukten: ARRAY [P1 .. P3] OF ProduktRc; gMachineWerkingskost: ARRAY ['A'..'C'] OF REAL; (* euro per uur *) (************************** NUTTIGE PROCEDURE voor vraag 4 ***********************************) PROCEDURE VulString(VAR strTo, strFrom: ARRAY OF CHAR; endOfString: CHAR); (* Vult string strTo helemaal op, met de letters van strFrom te herhalen. De letter gegeven met endOfString duidt het einde van strFrom aan strFrom "abco" en strTo 8 groot geeft "abcabcao" *) VAR i, j: CARDINAL; BEGIN j := 0; FOR i := 0 TO HIGH(strTo) -1 DO strTo[i] := strFrom[j]; j := j + 1; IF strFrom[j] = endOfString THEN (* begin tergu vooraan *) j := 0; END; END; strTo[HIGH(strTo)] := endOfString; END VulString; (***********************************************************************************) (* vraag 1 *) PROCEDURE BerekenProduktGegevens(VAR prod: ProduktRc); VAR i: CARDINAL; kost : REAL; BEGIN i := 1; kost := 0.0; REPEAT kost := kost + gMachineWerkingskost[ prod.proc[i] ]; i:= i + 1; UNTIL prod.proc[i] = 'O'; prod.prodUren := i -1; WrCard(prod.prodUren, 5); prod.werkingskost := kost; WrFixReal(prod.werkingskost, 2, 10); prod.winst := prod.verkoopsprijs - prod.materiaalkost - prod.werkingskost; WrFixReal(prod.winst, 2, 10); prod.winstPerUur := prod.winst / VAL(REAL, prod.prodUren); WrFixReal(prod.winstPerUur, 2, 10);WrLn; END BerekenProduktGegevens; (* vraag 2 *) PROCEDURE ProductieMogelijk(product1,product2 : ProduktRc) : BOOLEAN; (*procedure geeft TRUE terug als 2 producten gelijktijdig aangemaakt kunnen worden*) (*indien het niet kan, geeft het FALSE terug en schrijft het wanneer en op welke machine het conflict zich voordoet*) VAR mogelijk : BOOLEAN; teller : CARDINAL; aantal : CARDINAL; BEGIN mogelijk :=TRUE; (* zet eerst op TRUE *) teller:=1; WHILE (product1.proc[teller] # 'O') AND (product2.proc[teller] # 'O') DO (* tot het einde van beide processen *) IF product1.proc[teller] = product2.proc[teller] THEN mogelijk:= FALSE; WrLn;WrStr("Het loopt mis op uur ");WrCard(teller,0);WrStr(" en op machine "); WrChar(product1.proc[teller]); END; teller:=teller+1; END;(*WHILE*) RETURN mogelijk; END ProductieMogelijk; (* vraag 3 *) PROCEDURE ProdPlanning(product1,product2,product3 : ProduktRc); VAR teller: CARDINAL; teller1, teller2, teller3 : CARDINAL; (* de truuk is een teller voor elk produkt te maken *) machine1, machine2: CHAR; BEGIN WrLn; WrStr(" P1 P2 P3");WrLn; WrStr(" == == ==");WrLn; teller1:=1; teller2:=1; teller3:=1; FOR teller := 1 TO 20 DO (* hier kan je ook een while zetten, tot als alle machines 'O' zijn *) WrStr("Uur ");WrCard(teller, 0);WrStr(": "); IF product1.proc[teller1] # 'O' THEN machine1 := product1.proc[teller1]; teller1 := teller1 + 1; ELSE machine1 := '-'; END; WrChar(machine1); WrStr(" "); IF (product2.proc[teller2] # 'O') AND (product2.proc[teller2] # machine1) THEN machine2 := product2.proc[teller2]; teller2 := teller2 + 1; ELSE machine2 := '-'; END; WrChar(machine2); WrStr(" "); IF (product3.proc[teller3] # 'O') AND (product3.proc[teller3] # machine1) AND (product3.proc[teller3] # machine2) THEN WrChar(product3.proc[teller3]);WrStr(" "); teller3:=teller3+1; ELSE WrStr("- "); END; WrLn; END; END ProdPlanning; (* vraag 4 *) PROCEDURE ProdPlanning2(VAR product1,product2,product3 : ProduktRc); VAR teller: CARDINAL; teller1, teller2, teller3 : CARDINAL; (* de truuk is een teller voor elk produkt te maken *) machine1, machine2: CHAR; BEGIN WrLn; WrStr(" P1 P2 P3");WrLn; WrStr(" == == ==");WrLn; teller1:=1; teller2:=1; teller3:=1; FOR teller := 1 TO 50 DO (* tot 50 gaan *) WrStr("Uur ");WrCard(teller, 0);WrStr(": "); machine1 := product1.proc[teller1]; teller1 := teller1 + 1; WrChar(machine1); WrStr(" "); IF product1.proc[teller1] = 'O' THEN (* produkt 1 is af *) teller1 := 1; (* opnieuw beginnen *) product1.aantal := product1.aantal + 1; (* aantal tellen *) END; IF product2.proc[teller2] # machine1 THEN machine2 := product2.proc[teller2]; teller2 := teller2 + 1; ELSE machine2 := '-'; END; WrChar(machine2); WrStr(" "); IF product2.proc[teller2] = 'O' THEN (* produkt 2 is af *) teller2 := 1; product2.aantal := product2.aantal + 1; END; IF (product3.proc[teller3] # machine1) AND (product3.proc[teller3] # machine2) THEN WrChar(product3.proc[teller3]);WrStr(" "); teller3:=teller3+1; ELSE WrStr("- "); END; IF product3.proc[teller3] = 'O' THEN teller3 := 1; product3.aantal := product3.aantal + 1; END; WrLn; END; END ProdPlanning2; (* vraag 5 *) VAR c: CHAR; b: BOOLEAN; p: ProduktEn; winst: REAL; BEGIN WrLn; (* Invullen van de gegeven gegevens *) gProdukten[P1].naam := "P1"; gProdukten[P1].proc := "ABCCBBO";gProdukten[P1].verkoopsprijs := 499.90;gProdukten[P1].materiaalkost := 22.27; gProdukten[P2].naam := "P2"; gProdukten[P2].proc := "BCAACABO";gProdukten[P2].verkoopsprijs := 579.90;gProdukten[P2].materiaalkost := 16.98; gProdukten[P3].naam := "P3"; gProdukten[P3].proc := "AABACAACO";gProdukten[P3].verkoopsprijs := 669.90;gProdukten[P3].materiaalkost := 25.67; gMachineWerkingskost['A'] := 26.55; gMachineWerkingskost['B'] := 41.85; gMachineWerkingskost['C'] := 31.05; (* vraag 1 *) BerekenProduktGegevens(gProdukten[P1]); BerekenProduktGegevens(gProdukten[P2]); BerekenProduktGegevens(gProdukten[P3]); (* vraag 2 *) WrStr("Produkten P1 & P2: "); b := ProductieMogelijk(gProdukten[P1], gProdukten[P2]); WrLn; WrStr("Produkten P2 & P3: "); b := ProductieMogelijk(gProdukten[P2], gProdukten[P3]); WrLn; WrStr("Produkten P1 & P3: "); b := ProductieMogelijk(gProdukten[P1], gProdukten[P3]); WrLn; (* vraag 3 *) ProdPlanning(gProdukten[P1], gProdukten[P2], gProdukten[P3]); (* vraag 4 *) ProdPlanning2(gProdukten[P3], gProdukten[P2], gProdukten[P1]); (* produkt 3 brengt meer op, die zetten we als eerste!!!!*) FOR p := P1 TO P3 DO WrStr("Aantal produkten P1 gemaakt: "); WrCard(gProdukten[p].aantal, 5); WrStr(", winst = "); WrFixReal(gProdukten[p].winst * VAL(REAL, gProdukten[p].aantal), 2, 10); WrLn; winst := winst + gProdukten[p].winst * VAL(REAL, gProdukten[p].aantal); END; WrStr("Totale Winst : ");WrFixReal(winst, 2, 10); (* vraag 5 *) (* laat ik over aan voor de vlijtige student .... *) END ProduktiePlanningOpl.