app/schulis-simulationssystem/3.0/src/op1

Raw file
Back to index

1
2
3
4
PACKETobjektrepraesentation1DEFINESbewegecursorauflinkpositionen,zeichneverbindung,gibinformation,box,boxohnerahmen,objekttext:LETmaxlink=8;LETrechts=1,links=2,oben=3,unten=4,stern="*",blank=" ",maxlength=9,plus=" + ",differentialzeichen="d ",rand="    ",zuweisung=" = ";WINDOW VARfenster:=standardfenster;PROCboxaufbs(OBJEKT CONSTobj,INT CONSTi,j,BOOL CONSTbelegt):IFbelegtTHENschreibevolleboxaufbs;ELSEschreibeleereboxaufbs;FI.schreibevolleboxaufbs:newout(fenster,i,j,eckeobenlinks+typkennzeichen(obj)+((maxlength-1)*waagerecht)+eckeobenrechts);newout(fenster,i,j+1,senkrecht+objektname(obj)+senkrecht);newout(fenster,i,j+2,eckeuntenlinks+(maxlength*waagerecht)+eckeuntenrechts);.schreibeleereboxaufbs:TEXT CONSTleer:=(maxlength+2)*blank;newout(fenster,i,j,leer);newout(fenster,i,j+1,leer);newout(fenster,i,j+2,leer).END PROCboxaufbs;PROCbox(INT CONSTi,j):CELL CONSTc:=cell(i,j);box(objekt(c),gpos(mpos(c)),belegt(c))END PROCbox;PROCbox(OBJEKT CONSTobj,GPOS CONSTgitterpos,BOOL CONSTstatus):IFimgitter(gitterpos)THENboxaufbs(obj,iwindowpos(gitterpos),jwindowpos(gitterpos),status)FI END PROCbox;TEXT PROCobjektname(OBJEKT CONSTobj):blank+text(name(obj),maxlength-2)+ggfstern.ggfstern:IFlength(name(obj))>(maxlength-2)THENsternELSEblankFI.END PROCobjektname;PROCboxohnerahmen(OBJEKT CONSTobj,GPOS CONSTgitterpos):IFimgitter(gitterpos)THENboxohnerahmenaufbs(obj,iwindowpos(gitterpos),jwindowpos(gitterpos))FI END PROCboxohnerahmen;PROCboxohnerahmenaufbs(OBJEKT CONSTobj,INT CONSTi,j):newout(fenster,i+1,j+1,objektname(obj))END PROCboxohnerahmenaufbs;PROCnewout(TEXT CONSTt):INT VARi,j;getcursor(fenster,i,j);newout(fenster,i,j,t)END PROCnewout;PROClineout(TEXT CONSTt):INT VARi,j;getcursor(fenster,i,j);lineout(fenster,i,j,t)END PROClineout;INT PROCbewegecursorauflinkpositionen(GPOS CONSTgp,TEXT CONSTzulaessigepositionen):bewegebscursorauflinkpositionen(i,j,zulaessigepositionen).i:iwindowpos(gp).j:jwindowpos(gp).END PROCbewegecursorauflinkpositionen;INT PROCbewegebscursorauflinkpositionen(INT CONSTi,j,TEXT CONSTzulaessigepositionen):LETesc="�",return="
";TEXT CONSTcursorbewegungen:="��";INT VARergebnis:=1;startpositioneinnehmen;REPlesetaste;bewegeggfcursorUNTILabbruchgewuenschtPER;behandleabbruch.startpositioneinnehmen:setzelinkposition(position,i,j).position:int(zulaessigepositionenSUBergebnis).lesetaste:TEXT VARtaste;inchar(taste).bewegeggfcursor:SELECTpos(cursorbewegungen,taste)OF CASE1:rechtsCASE2:linksEND SELECT.rechts:IFergebnis=length(zulaessigepositionen)THENergebnis:=1ELSEergebnisINCR1FI;setzelinkposition(position,i,j).links:IFergebnis=1THENergebnis:=length(zulaessigepositionen)ELSEergebnisDECR1FI;setzelinkposition(position,i,j).abbruchgewuenscht:taste=escORtaste=return.behandleabbruch:IFtaste=escTHEN0ELSEpositionFI.END PROCbewegebscursorauflinkpositionen;PROCsetzelinkposition(INT CONSTergebnis,i,j):SELECTergebnisOF CASE1,2,3:cursor(fenster,i+2*ergebnis+1,j)CASE4:cursor(fenster,i+maxlength+1,j+1)CASE5,6,7:cursor(fenster,i+2*(maxlink-ergebnis)+1,j+2)CASE8:cursor(fenster,i,j+1)ENDSELECT END PROCsetzelinkposition;PROCsetzelinkposition(INT CONSTergebnis,GPOS CONSTgp):setzelinkposition(ergebnis,i,j).i:iwindowpos(gp).j:jwindowpos(gp).END PROCsetzelinkposition;PROCsetzestartposition(INT CONSTergebnis,INT VARi,j):SELECTergebnisOF CASE1,2,3:i:=i+2*ergebnis+1;jDECR1CASE4:i:=i+maxlength+2;jINCR1CASE5,6,7:i:=i+2*(maxlink-ergebnis)+1;jINCR3CASE8:iDECR1;jINCR1ENDSELECT END PROCsetzestartposition;PROCzeichneverbindung(MPOS CONSTvon,INT CONSTvonnr,MPOS CONSTbis,INT CONSTbisnr):INT VARvi,vj,bi,bj,ai,aj,alterichtung,neuerichtung;GPOS VARgvon,gbis;IF NOT(imgitter(von)ORimgitter(bis))THEN LEAVEzeichneverbindungFI;bestimmeviundvj;bestimmebiundbj;gehevonspalteviinzeilevjnachzeilebj;gehenachspaltebi;IFimgitter(bis)THENschreibeendsymbolFI.bestimmeviundvj:IFimgitter(von)THENgvon:=gpos(von);vi:=iwindowpos(gvon);vj:=jwindowpos(gvon);setzelinkposition(vonnr,gvon);schreibestartsymbol;setzestartposition(vonnr,vi,vj);IF NOTimgitter(bis)THENbi:=randwertfuerbi;bj:=randwertfuerbj
FI;FI.bestimmebiundbj:IFimgitter(bis)THENgbis:=gpos(bis);bi:=iwindowpos(gbis);bj:=jwindowpos(gbis);setzestartposition(bisnr,bi,bj);IF NOTimgitter(von)THENvi:=randwertfuervi;vj:=randwertfuervjFI;FI.randwertfuerbi:IFimpos(bis)=impos(von)THENviELIFimpos(bis)<impos(gitterstart)THEN1ELIFimpos(bis)<=impos(gitterstart)+igittersize-1THENiwindowpos(gpos(newmpos(impos(bis),jmpos(von))))ELSEareaxsize(standardfenster)FI.randwertfuerbj:IFjmpos(bis)=jmpos(von)THENvjELIFjmpos(bis)<jmpos(gitterstart)THEN1ELIFjmpos(bis)<=jmpos(gitterstart)+jgittersize-1THENjwindowpos(gpos(newmpos(impos(von),jmpos(bis))))ELSEareaysize(standardfenster)FI.randwertfuervi:IFimpos(von)=impos(bis)THENbiELIFimpos(von)<impos(gitterstart)THEN1ELIFimpos(von)<=impos(gitterstart)+igittersize-1THENiwindowpos(gpos(newmpos(impos(von),jmpos(bis))))ELSEareaxsize(standardfenster)FI.randwertfuervj:IFjmpos(bis)=jmpos(von)THENbjELIFjmpos(von)<jmpos(gitterstart)THEN1ELIFjmpos(von)<=jmpos(gitterstart)+jgittersize-1THENjwindowpos(gpos(newmpos(impos(bis),jmpos(von))))ELSEareaysize(standardfenster)FI.gehevonspalteviinzeilevjnachzeilebj:ai:=vi;aj:=vj;neuerichtung:=anfangsrichtung;IFsuedostTHENgehetendenziellnachsuedostELIFsuedwestTHENgehetendenziellnachsuedwestELIFnordostTHENgehetendenziellnachnordostELSEgehetendenziellnachnordwestFI.suedost:aj<bjANDai<bi.suedwest:aj<bjANDai>=bi.nordost:aj>=bjANDai<bi.gehetendenziellnachsuedost:WHILE(aj<bj)OR(NOTzeilefrei)REP IFuntenplatzTHENgeheevtlnachuntenELIFrechtsplatzTHENnachrechts(alterichtung,neuerichtung,ai,aj)FI PER.gehetendenziellnachsuedwest:WHILE(aj<bj)OR(NOTzeilefrei)REP IFuntenplatzTHENgeheevtlnachuntenELIFlinksplatzTHENnachlinks(alterichtung,neuerichtung,ai,aj)FI PER.gehetendenziellnachnordost:WHILE(aj>bj)OR(NOTzeilefrei)REP IFobenplatzTHENgeheevtlnachobenELIFrechtsplatzTHENnachrechts(alterichtung,neuerichtung,ai,aj)FI PER.gehetendenziellnachnordwest:WHILE(aj>bj)OR(NOTzeilefrei)REP IFobenplatzTHENgeheevtlnachobenELIFlinksplatzTHENnachlinks(alterichtung,neuerichtung,ai,aj)FI PER.gehenachspaltebi:IFai<biTHEN WHILE NOT(ai=bi)REPnachrechts(alterichtung,neuerichtung,ai,aj)PER ELIFai>biTHEN WHILE NOT(ai=bi)REPnachlinks(alterichtung,neuerichtung,ai,aj)PER FI;IFaj<bjTHEN WHILE NOT(aj=bj)REPnachunten(alterichtung,neuerichtung,ai,aj)PER ELIFaj>bjTHEN WHILE NOT(aj=bj)REPnachoben(alterichtung,neuerichtung,ai,aj)PER FI.geheevtlnachunten:IFobjektenichtingleichergitterspalteANDletzterichtunglinksoderrechtsANDstartpunktuntenoderobenanderboxTHENfuehreeinenschrittindieletzterichtungausFI;nachunten(alterichtung,neuerichtung,ai,aj).objektenichtingleichergitterspalte:igpos(gvon)<>igpos(gbis).letzterichtunglinksoderrechts:neuerichtung=rechtsORneuerichtung=links.startpunktuntenoderobenanderbox:vonnr<4OR(vonnr>4ANDvonnr<8).geheevtlnachoben:IFobjektenichtingleichergitterspalteANDletzterichtunglinksoderrechtsANDstartpunktuntenoderobenanderboxTHENfuehreeinenschrittindieletzterichtungausFI;nachoben(alterichtung,neuerichtung,ai,aj).fuehreeinenschrittindieletzterichtungaus:IFneuerichtung=rechtsTHENnachrechts(alterichtung,neuerichtung,ai,aj)ELSEnachlinks(alterichtung,neuerichtung,ai,aj)FI.zeilefrei:INT VARax:=areax(fenster);zwischenraumohnebox(areay(fenster)+aj-1,min(ax+ai-1,ax+bi-1),max(ax+ai-1,ax+bi-1)).anfangsrichtung:SELECTvonnrOF CASE1,2,3:lineout(fenster,ai,aj,senkrecht);obenCASE4:lineout(fenster,ai,aj,waagerecht);rechtsCASE5,6,7:lineout(fenster,ai,aj,senkrecht);untenCASE8:lineout(fenster,ai,aj,waagerecht);linksOTHERWISE0END SELECT.obenplatz:NOTinbox(ai,aj-1).untenplatz:NOTinbox(ai,aj+1).rechtsplatz:NOTinbox(ai+1,aj).linksplatz:NOTinbox(ai-1,aj).schreibestartsymbol:lineout(startsymbol).startsymbol:SELECTvonnrOF CASE1,2,3:"^"CASE4:">"CASE5,6,7:"v"CASE8:"<"OTHERWISE""END SELECT.schreibeendsymbol:TEXT VARendsymbol:=pfeil;setzelinkposition(bisnr,gbis);lineout(endsymbol).pfeil:SELECTbisnrOF CASE1,2,3:lineout(fenster,bi,bj,ecksymbol(neuerichtung,unten));"v"CASE4:lineout(fenster,bi,bj,ecksymbol(neuerichtung,links));"<"CASE5,6,7:lineout(fenster,bi,bj,ecksymbol(
neuerichtung,oben));"^"CASE8:lineout(fenster,bi,bj,ecksymbol(neuerichtung,rechts));">"OTHERWISE""END SELECT.END PROCzeichneverbindung;PROCnachrechts(INT VARalterichtung,neuerichtung,ai,aj):alterichtung:=neuerichtung;neuerichtung:=rechts;richtungswechsel(alterichtung,neuerichtung,ai,aj);aiINCR1;lineout(fenster,ai,aj,waagerecht)END PROCnachrechts;PROCnachlinks(INT VARalterichtung,neuerichtung,ai,aj):alterichtung:=neuerichtung;neuerichtung:=links;richtungswechsel(alterichtung,neuerichtung,ai,aj);aiDECR1;lineout(fenster,ai,aj,waagerecht)END PROCnachlinks;PROCnachoben(INT VARalterichtung,neuerichtung,ai,aj):alterichtung:=neuerichtung;neuerichtung:=oben;richtungswechsel(alterichtung,neuerichtung,ai,aj);ajDECR1;lineout(fenster,ai,aj,senkrecht)END PROCnachoben;PROCnachunten(INT VARalterichtung,neuerichtung,ai,aj):alterichtung:=neuerichtung;neuerichtung:=unten;richtungswechsel(alterichtung,neuerichtung,ai,aj);ajINCR1;lineout(fenster,ai,aj,senkrecht)END PROCnachunten;PROCrichtungswechsel(INT CONSTalterichtung,neuerichtung,ai,aj):IFalterichtung<>neuerichtungTHEN TEXT VARecke:=ecksymbol(alterichtung,neuerichtung);IFecke<>""THENlineout(fenster,ai,aj,ecke)FI FI END PROCrichtungswechsel;TEXT PROCecksymbol(INT CONSTalt,neu):SELECTaltOF CASEunten:altuntenCASEoben:altobenCASErechts:altrechtsCASElinks:altlinksOTHERWISE""END SELECT.altunten:SELECTneuOF CASErechts:eckeuntenlinksCASElinks:eckeuntenrechtsOTHERWISE""END SELECT.altrechts:SELECTneuOF CASEunten:eckeobenrechtsCASEoben:eckeuntenrechtsOTHERWISE""END SELECT.altoben:SELECTneuOF CASErechts:eckeobenlinksCASElinks:eckeobenrechtsOTHERWISE""END SELECT.altlinks:SELECTneuOF CASEunten:eckeobenlinksCASEoben:eckeuntenlinksOTHERWISE""END SELECT.END PROCecksymbol;BOOL PROCinbox(INT CONSTi,j):inboxspeicher(areay(fenster)+j-1,areax(fenster)+i-1)<>blankEND PROCinbox;PROCgibinformation(INT CONSTnr):IFnr>0THEN WINDOW VARw:=window(1,2,79,23);boxinfo(w,anwendungstext(nr))FI END PROCgibinformation;PROCobjekttext(FILE VARf,MPOS CONSTmp):IFtyp(objekt(mp))=variableTHENstelledifferentialquotientenzusammenELIFtyp(objekt(mp))=ergebnisTHENstellesummezusammenELIFtyp(objekt(mp))=parameterTHENzeigenamenELIFtyp(objekt(mp))=formelTHENinformiereueberarithmetischenausdruckFI.zeigenamen:putline(f,rand+elanname(objekt(mp)));line(f).stelledifferentialquotientenzusammen:stellelinkeseitederdglzusammen;schreibenenner;schreibebruchstrichundrechteseite;schreibezaehler;line(f).stellesummezusammen:putline(f,rand+elanname(objekt(mp))+zuweisung+summederankommendenpfeile);line(f).stellelinkeseitederdglzusammen:TEXT VARnenner:=differentialzeichen+elanname(objekt(mp)),zaehler:=differentialzeichen+elanname(new(zeit)),strich:=max(LENGTHnenner,LENGTHzaehler)*"-".schreibenenner:putline(f,rand+(abs((LENGTHstrich)-(LENGTHnenner))DIV2)*blank+nenner).schreibebruchstrichundrechteseite:putline(f,rand+strich+zuweisung+summederankommendenpfeile).schreibezaehler:putline(f,rand+(abs((LENGTHstrich)-(LENGTHzaehler))DIV2)*blank+zaehler).summederankommendenpfeile:IFkeineverbindungvonanderenobjektenaufgebautTHEN"0.0"ELSE TEXT VARterm:="";FORiFROM1UPTOmaxlinkREPnotiereeinquellobjektPER;subtext(term,1,(LENGTHterm)-(LENGTHplus))FI.notiereeinquellobjekt:IFcEINGANGiTHENtermCATnamederquelle;termCATplusFI.namederquelle:elanname(objekt(quelle)).quelle:quellenposition.quellenposition:cUEBERi.keineverbindungvonanderenobjektenaufgebaut:INT VARi,z:=0;FORiFROM1UPTOmaxlinkREP IFcEINGANGiTHENzINCR1FI PER;z=0.c:cell(mp).informiereueberarithmetischenausdruck:putline(f,rand+elanname(objekt(mp))+zuweisung+ausdruck(objekt(mp)));line(f).END PROCobjekttext;END PACKETobjektrepraesentation1;