Thema_4
bild_1.lst
' Bitmaps in Dialogen ' word-Variablen als Bitmap-Handle ' // Progmm Bild // // irgendein Fenster ...sonst werden die Bilder im Dialog // nicht farbig OPENW #1,0,0,0,0,0 DIALOG #1,20,20,600,500,"Bilder",WS_THICKFRAME,-24,"Courier New" BUTTON "E&xit",101,50,10,500,32 BUTTON "",102,50,50,500,400,BS_OWNERDRAW // ... für Bilder ENDDIALOG bmp0& = LOADBMP("fisch16.bmp") // ein Bild laden aus dem Verzeichnis bmp1& = LOADBMP("geld.bmp") // ein weiteres Bild //zuweisen der Bilder zum OWNERDRAW-Button (normal + klick) _WIN$(DLGITEM(1,102))=STR$(bmp0&)+","+STR$(bmp1&) DLG FILL 1, RGB(0,192,192) SHOWDIALOG #1 REPEAT GETEVENT IF MENU(11)=WM_COMMAND SELECT MENU(12) CASE 101 beenden!=TRUE ENDSELECT ENDIF UNTIL beenden! CLOSEDIALOG #1 CLOSEW #1 FREEBMP bmp0& // nach closew Speicher für Bitmaps wieder freigeben FREEBMP bmp1& ' 'AUFGABEN: 1. Mit Paintbrush eigenes Bild zeichnen, auf Disk ' speichern und in das Programm einbinden. (Pfad) '
type_2.lst
' Strukturierte Daten: TYPE (record, structure) ' Zusammenfassung verschiedener Variablenarten ' Einbindung von Bildern über das Handle ' Eingabe über Dialog ' // Programm type OPENW #1,.05*_X,.05*_Y,.85*_X,.85*_Y,$2F0 TITLEW #1,"Type_1" // Definition der Datenstruktur (Elemente) TYPE person: - STRING(20) name$ - STRING(20) vorname$ - STRING(10) geb$ - STRING(64) bildpfad$ - WORD bildhdl - BYTE kurse - DOUBLE beitrag# ENDTYPE // Dimensionierung von Type-Variablen person: mitglied. person: aufnahme. DIM person: abgang. // DLGBASE UNIT DIALOG #1,32,32,300,250,"Personendaten",WS_THICKFRAME,-16,"Courier New" LTEXT "Name",101,10,10,80,12 LTEXT "Vorname",102,10,30,80,12 LTEXT "geb.",103,10,50,80,12 EDITTEXT "",104,100,10,80,12,WS_BORDER|WS_TABSTOP EDITTEXT "",105,100,30,80,12,WS_BORDER|WS_TABSTOP EDITTEXT "",106,100,50,80,12,WS_BORDER|WS_TABSTOP LTEXT "Kurse",111,10,80,80,12 LTEXT "Beitrag",112,10,100,80,12 EDITTEXT "",113,100,80,80,12,WS_BORDER|WS_TABSTOP EDITTEXT "",114,100,100,80,12,WS_BORDER|WS_TABSTOP BUTTON "BILD",201,16,160,40,12,WS_TABSTOP BUTTON "",202,60,120,80,80,BS_OWNERDRAW|WS_BORDER DEFPUSHBUTTON "übernehmen",301,150,140,60,16,WS_TABSTOP BUTTON "OK",401,150,180,60,16,WS_TABSTOP ENDDIALOG SHOWDIALOG #1 ende!=FALSE REPEAT GETEVENT IF MENU(11)=WM_COMMAND SELECT MENU(12) CASE 201 bild CASE 301 uebernehmen CASE 401 ende!=TRUE ENDSELECT ENDIF UNTIL ende! CLOSEDIALOG #1 // --- Auswertung --- TOPW #1 REPEAT GETEVENT TEXT 10,10,"Inhalt der Type-Variablen Aufnahme." TEXT 10,30, aufnahme.bildpfad$ TEXT 10,50, "Handle: "+STR$(aufnahme.bildhdl) TEXT 10,70,aufnahme.name$+" Beitrag: "+STR$(aufnahme.beitrag#) // mitglied.=aufnahme. // Zuweisung gesamte Type-Variable // TEXT 350,10,"Inhalt von Type-Variable Mitglied." TEXT 350,30,mitglied.bildpfad$ TEXT 350,50, "Handle: "+STR$(mitglied.bildhdl) TEXT 350,70,mitglied.name$+ " Beitrag: "+STR$(mitglied.beitrag#) // Bild an Fenstergröße angepaßt darstellen STRETCH 10,100,aufnahme.bildhdl,_X/1.4,_Y/1.4 // UNTIL MENU(1) = 4 OR INKEY$ = CHR$(27) CLOSEW #1 FREEBMP aufnahme.bildhdl // Freigabe des Bildspeichers // // ---------------------- PROZEDUREN -------------------------- // PROCEDURE bild FILESELECT "C:\TEST\*.*","*.bmp",datei$ // einfache Dateiauswahlbox aufnahme.bildpfad$=datei$ aufnahme.bildhdl=LOADBMP(datei$) // Bild laden ENABLEW DLG(1) // Maus- und Tastatureingaben auf Dialog 1 // Bild darstellen: _WIN$(DLGITEM(1,202))= STR$(aufnahme.bildhdl)+","+STR$(aufnahme.bildhdl)+",,,&+" RETURN PROCEDURE uebernehmen aufnahme.name$=_WIN$(DLGITEM(1,104)) aufnahme.vorname$=_WIN$(DLGITEM(1,105)) aufnahme.geb$=_WIN$(DLGITEM(1,106)) aufnahme.kurse=VAL(_WIN$(DLGITEM(1,113))) aufnahme.beitrag#=VAL(_WIN$(DLGITEM(1,114))) RETURN ' ' AUFGABEN: 1. Weiteres Element in die Datenstruktur einfügen. ' 2. Ausgabefenster als Nutzer in der Größe verändern. (Bild!)
qsort_3.lst
' Sortieren von Daten ' Nutzung des GFA QSORT - Befehls ' //Programm QUICKSORT von Datenfeldern (array) OPENW #1,5,20,_X-10,_Y-40,$2f0 TITLEW #1,"QUICKSORT" OPTION BASE 1 DIM in_firma$(20),firma$(20),in_betrag(20),betrag(20),index%(20) BUTTON "weiter",1000,_X * 0.25,_Y * 0.9,80,32 // Control im Fenster BUTTON "ende",2000,_X*0.5,_Y*0.9,80,32 ende!=FALSE REPEAT CLS GETEVENT ueberschrift FOR i%=1 TO 20 // Werte zufällig zuordnen index%(i%)=i% f1|=RAND(26) f2|=RAND(26) f3|=RAND(26) in_firma$(i%)=CHR$(65+f1|)+CHR$(65+f2|)+CHR$(65+f3|) in_betrag(i%)=ROUND(RND(0)*100,2) TEXT 10,16+16*i%,i% TEXT 50,16+16*i%,in_firma$(i%) TEXT 150,16+16*i%,in_betrag(i%) firma$(i%)=in_firma$(i%) betrag(i%)=in_betrag(i%) NEXT i% ALERT 2,"sortieren|nach",1,"Betrag|Firma",bf| IF bf|=1 QSORT betrag(+),20,index%() // sortiert nach Betrag ELSE QSORT firma$(+),20,index%() // sortiert nach Firma ENDIF CLS weiter!=FALSE REPEAT PEEKEVENT IF MENU(1) = 30 // Control im Fenster angeklickt SELECT MENU(0) // ID des Controls CASE 1000 weiter!=TRUE CASE 2000 ende!=TRUE ENDSELECT ENDIF PEEKEVENT // nochmalige Ereignisabfrage!!! ueberschrift FOR i%=1 TO 20 // Eingegebenes: TEXT 10,16+16*i%,i% TEXT 50,16+16*i%,in_firma$(i%) TEXT 150,16+16*i%,in_betrag(i%) // Sortiertes: TEXT 310,16+16*i%,index%(i%) IF bf|=1 TEXT 310,16,"sortiert nach Betrag " TEXT 350,16+16*i%,firma$(index%(i%)) TEXT 450,16+16*i%,betrag(i%) ELSE TEXT 310,16,"sortiert nach Firma " TEXT 350,16+16*i%,firma$(i%) TEXT 450,16+16*i%,betrag(index%(i%)) ENDIF NEXT i% UNTIL weiter! OR ende! UNTIL ende! CLOSEW #1 //--------------------------------------------- PROCEDURE ueberschrift TEXT 120,0,"Sortieren von zufällig erzeugten Firmen und Beträgen" TEXT 10,16,"Index" TEXT 50,16,"Firma" TEXT 150,16,"Betrag" RETURN ' ' Aufgaben: 1. Analysieren der Wirkung der Indexsortierung
qsoue_4.lst
' Sortierung von vorgegebenen Datenfeldern ' Übungen zum Sortieren ' // OPENW #1,0,0,_X,_Y,$2f0 TITLEW #1,"Sortierung" OPTION BASE 1 DIM betrag(10),sort_betrag(10),index%(10),sort_index%(10) betrag(1)=6.8, betrag(2)=5.5, betrag(3)=1.7575 // 10 beliebige Zahlen betrag(4)=12.7, betrag(5)=6.18, betrag(6)=6.888 betrag(7)=99, betrag(8)=-6.68, betrag(9)=26.8 betrag(10)=-34.8 FOR i%=1 TO 10 index%(i%)=i% // laufende Nr. ins Indexfeld speichern: // index%(1)=1, index%(2)=2, ... sort_betrag(i%)=betrag(i%) // Betrag ins Sortierfeld kopieren sort_index%(i%)=index%(i%) // Index ins Sortierindexfeld kopieren NEXT i% sort!=FALSE, sort_anzeige!=FALSE REPEAT GETEVENT IF NOT sort_anzeige! TEXT 50,350," --> weiter: Leertaste" ENDIF FOR i%=1 TO 10 TEXT 10,60+20*i%,STR$(index%(i%),2,0)+STR$(betrag(i%),12,2)+" DM " NEXT i% taste$=INKEY$ IF taste$=CHR$(32) // Leertaste: Code 32 sort!=TRUE, sort_anzeige!=TRUE ENDIF IF sort! sort!=FALSE // QSORT sort_betrag(+),10,sort_index%() //quicksort // ENDIF IF sort_anzeige! TEXT 50,350," --> beenden: Schließmenü, rechte Maustaste oder ESC" FOR i%=1 TO 10 TEXT 300,60+20*i%, STR$(sort_index%(i%),2,0) + STR$(sort_betrag(i%),12,2) + " DM " NEXT i% ENDIF PEEKEVENT UNTIL MENU(1)=4 OR MOUSEK=2 OR taste$=CHR$(27) CLOSEW #1 ' ' AUFGABEN: 1. Feld absteigend sortieren ' 2. Nur die ersten 5 Elemente sortieren ' 3. Erklären Sie das Zusammenwirken von Betrag und Index
liste_5.lst
' Listenverarbeitung ' zweidimensionales Feld und Liste ' //Programm einfach verkettete Liste OPENW #1,0,0,_X,_Y,0 TITLEW #1,"einfach verkettete Liste" DIM k(20,2) // Kette 20 Zeilen 2 Spalten TEXT 200,10,"Nr. von 1 bis 20; Ende mit nächste Nr. 0" INPUT "Anfang Nr. ";nr% k(0,1)=nr% // Spalte 1: Nummern // Füllen der Liste DO INPUT "Wert: ";wert k(nr%,0)=wert // Spalte 0: Werte INPUT "nächste Nr.,";n_nr% EXIT IF n_nr%=0 k(nr%,1)=n_nr% nr%=n_nr% LOOP // Auswertung CLS 3 TEXT 200,6,"Nr." TEXT 240,6,"Wert" TEXT 300,6,"nächste Nr." FOR i%=0 TO 20 TEXT 200,i%*16+32,i% TEXT 240,i%*16+32,k(i%,0) TEXT 300,i%*16+32,k(i%,1) TEXT 10,_Y-25,"TASTE: -> weiter" NEXT i% KEYGET dd% TEXT 400,10,"Werte in Reihenfolge" j%=k(0,1) i%=0 DO i%++ TEXT 400,i%*16+16,k(j%,0) j%=k(j%,1) EXIT IF j%=0 OR i%=21 LOOP KEYGET dd% CLOSEW #1
hit_6.lst
' Verarbeitung dynamischer Listen ' Kombination der Befehle INSERT(DELETE) SWAP ERASE ' Schwerpunkt: Prozeduren und Funktionen zur Listenverarbeitung ' (ohne Menüs und Dialoge) ' //Programm hitliste OPENW #1,0,0,_X,_Y,$2f0 OPTION BASE 1 DIM hit$(1) hit$(1)=" *** Ende ***" // Eintrag als Endekennung der Liste TEXT 300,20,"Ende der Eingabe mit Titel: Leertaste" // --- Füllen der Hitliste --- DO PEEKEVENT INPUT "Titel:",titel$ EXIT IF titel$=" " INPUT " eifügen auf Platz: ",platz& aufnehmen(titel$,platz&,hit$()) LOOP // --- einen Titel streichen --- INPUT "streiche Titel:",raus$ streichen(raus$,hit$()) // --- suchen eines Titels --- INPUT "Suchen nach: ",titel$ gefunden&=@platz(titel$,hit$()) CLS // --- Anzeige der Liste und Ergebnisse --- REPEAT GETEVENT TEXT 10,16,"gestrichen wurde: (wenn vorhanden!) "+raus$ IF gefunden&<>0 TEXT 10,32,titel$+" ist aktuell auf Platz "+STR$(gefunden&) ELSE TEXT 10,32,titel$+" wurde nicht gefunden" ENDIF FOR i&=1 TO DIM?(hit$()) TEXT 10,64+16*i&,"Platz "+STR$(i&)+": "+hit$(i&) NEXT i& UNTIL MENU(1)=4 CLOSEW #1 // --- Prozeduren und Funktionen --- PROCEDURE aufnehmen(inhalt$,nr&,VAR liste$()) LOCAL j&, d&=DIM?(liste$()) IF nr&>d& OR nr& < 1 ALERT 1,"FALSCHE|NUMMER",1,"OK",ok| ELSE DIM neue_liste$(d&+1) // Platz für neuen Titel FOR j&=1 TO d& neue_liste$(j&)=liste$(j&) // umkopieren NEXT j& INSERT neue_liste$(nr&)=inhalt$ // Titel einfügen SWAP liste$(),neue_liste$() // Deskriptoren tauschen ERASE neue_liste$() // weg damit ENDIF RETURN PROCEDURE streichen(inhalt$,VAR liste$()) LOCAL j&, platz&, d&=DIM?(liste$()) // beachte: Variable und Funktion namensgleich ( & @ ) platz&=@platz(inhalt$,liste$()) // suchen des Titels IF platz&>0 AND platz&d& EXIT IF inhalt$=liste$(i&) LOOP IF i&>d& ALERT 1,"NICHT|GEFUNDEN",1,"OK",ok| i&=0 ENDIF RETURN i& ENDFUNC ' ' AUFGABEN: 1. Überlegung für eine weitere Listenauswertung ' Struktogramm und Prozedur (Funktion) dazu.
baum_7.lst
' Baumstrukturen ' // Programm Baum OPENW #1,10,10,_X-20,_Y-20,$10 TITLEW #1,"Baum" FONT "Courier New",WIDTH 8, HEIGHT 16 TO fnt& SETFONT fnt& CLS 7 DIM bezeich$(0),baum%(0) INPUT "Wurzelbezeichnung: ",wurzel$ //die Wurzel bezeich$(0)=wurzel$ baum%(0)=0 REPEAT ALERT 2,"wählen Sie bitte",1,"NEU|WEG|ENDE",al| SELECT al| CASE 1 INPUT "Neu an: ",bezeichnung$ INPUT "Untergliederung: ",unterglied$ neu(bezeichnung$,unterglied$,bezeich$(),baum%()) CASE 2 INPUT "beseitige: ",bezeichnung$ weg(bezeichnung$,bezeich$(),baum%()) ENDSELECT CLS 7 // Ausgabe FOR i%=0 TO DIM?(baum%())-1 TEXT 300+20*baum%(i%),16+16*i%,STR$(baum%(i%))+" "+bezeich$(i%) NEXT i% UNTIL al|=3 SETFONT SYSTEM_FONT FREEFONT fnt& CLOSEW #1 //------------------------------------ PROCEDURE neu(bez$,untergl$,VAR bezeich$(),baum%()) LOCAL d%,i%,index% index%=@suchen(bez$,bezeich$()) IF index%=-1 ALERT 1,"sorry",1,"OK",al| // nicht gefunden ELSE d%=DIM?(bezeich$()) i%=0 DIM bezeich_neu$(d%),baum_neu%(d%) // 1 El. mehr (ab 0.) FOR i%=0 TO d%-1 bezeich_neu$(i%)=bezeich$(i%) baum_neu%(i%)=baum%(i%) NEXT i% INSERT bezeich_neu$(index%+1)=untergl$ INSERT baum_neu%(index%+1)=baum%(index%)+1 // nächste Ebene SWAP bezeich$(),bezeich_neu$() SWAP baum%(),baum_neu%() ERASE bezeich_neu$(),baum_neu%() ENDIF RETURN PROCEDURE weg(bez$,VAR bezeich$(),baum%()) LOCAL d%,index%,ebene% index%=@suchen(bez$,bezeich$()) IF index%=-1 OR bez$=wurzel$ ALERT 1,"sorry",1,"OK",al| // nicht gefunden oder Wurzel ELSE d%=DIM?(baum%()) ebene%=baum%(index%) DELETE bezeich$(index%) DELETE baum%(index%) DEC d% WHILE baum%(index%)>ebene% DELETE bezeich$(index%) DELETE baum%(index%) DEC d% WEND DIM bezeich_neu$(d%-1),baum_neu%(d%-1) FOR i%=0 TO d%-1 bezeich_neu$(i%)=bezeich$(i%) baum_neu%(i%)=baum%(i%) NEXT i% SWAP bezeich$(),bezeich_neu$() SWAP baum%(),baum_neu%() ERASE bezeich_neu$(),baum_neu%() ENDIF RETURN FUNCTION suchen(bezeichnung$,VAR bezeich$()) LOCAL i%,d% i%=0 d%=DIM?(bezeich$()) DO EXIT IF bezeichnung$=bezeich$(i%) INC i% EXIT IF i%=d% LOOP IF i%=d% RETURN -1 // nicht gefunden! ELSE RETURN i% ENDIF ENDFUNC ' ' AUFGABEN: 1. Überlegung zu weiteren Prozeduren zur Baum- ' bearbeitung.