Autor |
Beitrag |
Lance_Hardwood
Hält's aus hier
Beiträge: 3
|
Verfasst: So 22.02.15 15:30
Hallo liebe community,
ich befinde mich derzeit mitten im Lernen für meine Abiturprüfungen und muss zudem noch eine Facharbeit und ein dazugehöriges, selbstgeschriebenes Programm fertigstellen.
Da ich in Info nun wahrlich kein Überflieger bin, bereitet mir mein Programm ein wenig Sorgen.
Ich schreibe ein multiple choice quiz in wirklich simpelster Form:
Ich habe eine StartForm (Unit1) und gelange über den start-button auf unit2, auf welcher die erste Frage in einem Panel steht und 4 Antwortmöglichkeiten über RadioButtons geboten werden.
Zur nächsten Frage (Unit3) geht es über das Klicken eines "weiter"-Buttons, welcher nicht reagiert, falls keine Auswahl der RadioButtons getroffen wurde.
Ich bin mir im Klaren, dass diese Lösung einem Programmierer wahrscheinlich die Haare zu Berge stehen lässt, aber ich wollte erst einmal irgendetwas auf die Beine stellen.
Die Units mit den Fragen ließen sich ja beliebig duplizieren und am Ende soll eine Punktezahl, welche sich aus der Anzahl der richtig beantworteten Fragen ergibt, ausgegeben werden.
Wie mache ich das ?
Deklariere ich eine globale Variable in UNit1 und inkrementiere diese einfach bei Anklicken des richtigen RadioButtons?
hier mein Quelltext von der Unit2 (erste Frage):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Unit3, StdCtrls, ExtCtrls;
type TForm2 = class(TForm) FragePanel: TPanel; RadioButton1: TRadioButton; RadioButton2: TRadioButton; RadioButton3: TRadioButton; RadioButton4: TRadioButton; Button2: TButton; procedure Button2Click(Sender: TObject); private public end;
var Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button2Click(Sender: TObject); begin if not (RadioButton1.checked or RadioButton2.checked or RadioButton3.checked or Radiobutton4.checked) then begin ShowMessage('Bitte eine Auswahl treffen!'); end; if (RadioButton1.checked or RadioButton2.checked or RadioButton3.checked or Radiobutton4.checked) then begin form2.hide; form3.show; end; end;
end. |
Danke für eure Mühe!
Moderiert von Narses: Delphi-Tags hinzugefügtModeriert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 24.02.2015 um 12:00
|
|
Xion
Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mo 23.02.15 12:22
Lance_Hardwood hat folgendes geschrieben : | Da ich in Info nun wahrlich kein Überflieger bin, bereitet mir mein Programm ein wenig Sorgen. |
Warum schreibst du denn deine Facharbeit in einem Fach, das dir nicht liegt
Lance_Hardwood hat folgendes geschrieben : | Ich bin mir im Klaren, dass diese Lösung einem Programmierer wahrscheinlich die Haare zu Berge stehen lässt |
Ich dachte da jetzt eher an Fußnägel, aber ok
Lance_Hardwood hat folgendes geschrieben : | Die Units mit den Fragen ließen sich ja beliebig duplizieren und am Ende soll eine Punktezahl, welche sich aus der Anzahl der richtig beantworteten Fragen ergibt, ausgegeben werden. |
Wow, also bei uns musste man für eine Facharbeit noch echt was leisten. Ich habe damals eine 3D-Simulation des Planetensystems mit den entsprechenden physikalischen Grundlagen geschrieben...und meine Facharbeit war nicht in Informatik. Wohnst du etwa in Bremen? *duck*
Dein Code ist auch wirklich anspruchsvoll für eine Arbeit, für die man 1 Jahr (oder mehr?) Zeit hat...
Ok, jetzt habe ich erstmal genügend fiese Kommentare für heute ausgeteilt Aber das musste jetzt einfach mal sein
Um dein seltsames Konzept fortzuführen, könntest du dem Radiobutton mit der richtigen Antwort einen Tag (im Objektinspektor) von 1 zuweisen und den anderen einen Tag von 0. Dann musst du am Ende nur alle Tags der selektierten RadioButtons zusammenzählen. Das sind dann die richtigen Antworten. (Alle_Antworten-Richtige_Antworten)=Falsche_Antworten.
Allerdings gehe ich mal davon aus, dass dieses Vorgehen deinem Lehrer garnicht gefallen wird...außer er hat euch so gut wie garnichts beigebracht
Ein normales Vorgehen würde so aussehen: Lösche alle Units bis auf Unit1 und Unit2. Eine Unit zum Anzeigen der Fragen genügt.
Die Fragen schreibst du dann in ein Record. Etwa so in Unit2:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| type TQuestionData = record question: String; answer0: String; answer1: String; answer2: String; answer3: String; correctAnswer: integer; end;
var questions: array of TQuestionData;
procedure InitializeQuestions; begin SetLength(questions, 1); questions[0].question := 'Ein Pottwal und ein ...'; questions[0].answer0 := 'Bügeleisen'; questions[0].answer1 := 'Petunientopf'; questions[0].answer2 := 'Delphin'; questions[0].answer3 := 'Pangalaktischer Donnergurgler'; questions[0].correctAnswer := 1; end;
procedure LoadQuestion(idx: integer); begin selectedQuestion := idx; Label1 := questions[idx].question; ... end;
procedure TestAnswers(); begin if ((questions[ selectedQuestion ].correctAnswer = 0) and (RadioButton0.Checked)) or ((questions[ selectedQuestion ].correctAnswer = 1) and (RadioButton1.Checked)) or ((questions[ selectedQuestion ].correctAnswer = 2) and (RadioButton2.Checked)) or ((questions[ selectedQuestion ].correctAnswer = 3) and (RadioButton3.Checked)) then correctAnswers := correctAnswers + 1 else wrongAnswers := wrongAnswers + 1; end; |
Das ist mal ein grobes Konzept zur Vorgehensweise. In diesem Fall ist die "globale Variable" zum zählen ein Attribut von Unit2.
Eine nett gemeinte Warnung:
Sei vorsichtig was zu jetzt als nächstes fragst, denn wenn diese Frage zeigt, dass du nur den Quelltext von oben kopiert hast ohne verstehen zu wollen, was da passiert, dann wird vermutlich niemand mehr antworten.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Für diesen Beitrag haben gedankt: Lance_Hardwood
|
|
Lance_Hardwood
Hält's aus hier
Beiträge: 3
|
Verfasst: Mo 23.02.15 19:21
Hallo Xion,
danke, dass du dir trotz meines miserablen Ansatzes dennoch die Mühe machst, mir zu helfen.
Zu meiner Verteidigung: Die Facharbeit in Info ist Teil des letzten Kurshalbjahres und keineswegs freiwillig. Weiterhin bin ich nicht ganz so ein degenerierter Schimpanse, wie es mein "Quelltext" und Ansatz für das Programm erscheinen lassen, tatsächlich arbeite ich sogar an einem Einser-Abitur. Info ist mit Abstand mein schlechtestes Fach. (leider)
Da mir die Zeit wegläuft, werde ich es wohl mit meinem seltsamen Konzept weiter versuchen.
Deswegen meine Frage: Wie kann ich die tags der richtigen RadioButtons am Ende zusammenzählen und als Nachricht o.ä. als Ergebnis nach der letzten Frage erscheinen lassen?
Grüße,
Till
p.s. nette Anspielung auf Douglas Adams im Quelltext..
|
|
platzwart
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Mo 23.02.15 20:14
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
Für diesen Beitrag haben gedankt: Lance_Hardwood
|
|
Xion
Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mo 23.02.15 22:19
Lance_Hardwood hat folgendes geschrieben : | [...]tatsächlich arbeite ich sogar an einem Einser-Abitur. Info ist mit Abstand mein schlechtestes Fach |
Man kann ja nicht in allem gut sein Es ist mir jetzt aber umso mehr unbegreiflich, warum du ausgerechnet Facharbeit in Informatik machst...scheinbar meinst du mit Facharbeit was anders als ich. Bei uns war eine Facharbeit damals Teil eines Leistungskurses, für die man sich (zur Vorbereitung auf die Studienarbeiten in der Universität) selbstständig Informationen recherchieren, einen Text von 20(?) Seiten schreiben und das Ergebnis präsentieren sollte. Eigenständiges, wissenschaftliches Arbeiten auf niedrigem Niveau also.
Man konnte außerdem in jedem Fall das Fach frei wählen, niemand hätte das in einem schlechten Fach gemacht.
Zu der konkreten Frage:
Bei deinem Aufbau solltest du in Unit1 deine Variablen anlegen, welche korrekte und inkorrekte Antworten zählen. Möchtest du nun nicht erst am Ende, sondern mit den Fragen jeweils diese zählen und anzeigen, dann kannst du es so machen:
In Unit1 definierst du eine Funktion, welche das Zählen übernimmt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure EvaluateQuestion( Form: TForm ); begin if Form.RadioButton1.Checked then begin correctAnswers := correctAnswers + RadioButton1.Tag; wrongAnswers := wrongAnswers + (1-RadioButton1.Tag); end; if Form.RadioButton2.Checked then begin correctAnswers := correctAnswers + RadioButton2.Tag; wrongAnswers := wrongAnswers + (1-RadioButton2.Tag); end; if Form.RadioButton3.Checked then begin correctAnswers := correctAnswers + RadioButton3.Tag; wrongAnswers := wrongAnswers + (1-RadioButton3.Tag); end; if Form.RadioButton4.Checked then begin correctAnswers := correctAnswers + RadioButton4.Tag; wrongAnswers := wrongAnswers + (1-RadioButton4.Tag); end;
end; |
So wie ich das verstanden habe hast du dann x Units mit jeweils einer Form und den RadioButtons. Dem RadioButton mit der richtigen Antwort weist du wie gesagt einen Tag von 1 zu, den andren eine 0. Dann funktioniert obige Funktion schonmal.
Nun rufst du diese Funktion immer auf, wenn du die Form verlässt (Button2Click in deinem Quelltext):
Delphi-Quelltext 1:
| Unit1.EvaluateQuestion(Form2); |
Damit das klappt, musst du die Unit1 binden, und zwar unter Implementation, sonst gibts auf die Finger wegen zirkulärer Referenz:
Delphi-Quelltext 1: 2:
| implementation uses Unit1; |
Wenn du das so umsetzt, dann kommst du fast ganz ohne Programmierung aus (mal von der Funktion oben abgesehen), da du alles Wesentliche im Objektinspektor einstellen kannst. Das ist irgendwie nicht das, was ich mir als Lehrer vorstellen würde
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Zuletzt bearbeitet von Xion am Mo 23.02.15 22:26, insgesamt 3-mal bearbeitet
|
|
Lance_Hardwood
Hält's aus hier
Beiträge: 3
|
Verfasst: Mo 23.02.15 22:24
So eine Facharbeit über 25 Seiten habe ich in Geschichte verfasst. (was ich auch studieren möchte) - 15 Punkte
Das hier in Info ist lediglich der Prozess einer Programmentwicklung und deren Stadien, worüber wir in einer kleinen Arbeit Dokumentation ablegen sollen.
Grüße,
Till Moderiert von Narses: Beiträge zusammengefasstHallo Xion,
vielen Dank für deine Mühe und Hilfe.
hast du eine Idee, wie ich die Punktezahl am Ende, nach der letzten Frage dem Nutzer ansprechend präsentieren kann?
Grüße,
Till
|
|
bole
Beiträge: 107
Erhaltene Danke: 15
win 10
|
Verfasst: Di 24.02.15 00:49
Lance_Hardwood hat folgendes geschrieben : |
Da mir die Zeit wegläuft, werde ich es wohl mit meinem seltsamen Konzept weiter versuchen. |
Das läuft unter Beratungsresistent!
Wie bist Du auf die Idee gekommen das so zu programmieren? Dies mit x Forms und Units dies zu programmieren ist meiner Meinung nach um einiges koplizierter zumal Dir Xion beinahe den gesammten Quelltext geschrieben hat. Das einzig was für ein einfaches Quiz fehlt sind ein paar definitionen, das Quiz Abbruch und die Form mit 2 Buttons ('Nächste Frage', Antwort check') bei dehnen Du im onClick Ereignis die entsprechende Procedure aufrust.
Ich bin zwar nicht Lehrer aber zu meiner Zeit als Schüler hat man auch für ein Programm das nicht super läuft aber wenigstens eine vernünftigen Ansatz verfolgt eine bessere Note bekommen als für so eine bastelei wie Du sie geplant hast... Gib's bei euch einen Bonus für das skurilste programm
Gruss
Bole
_________________ ein programm macht nicht das was du willst sondern was du schreibst!
|
|
Xion
Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Di 24.02.15 10:37
Lance_Hardwood hat folgendes geschrieben : | hast du eine Idee, wie ich die Punktezahl am Ende, nach der letzten Frage dem Nutzer ansprechend präsentieren kann? |
Hmm, also da du nur zwei Werte hast, ist da nicht viel zu präsentieren. Mehr als zwei Labels mit der Anzahl der richtigen/falschen Antworten ist da nicht drin...naja, vielleicht eine ProgressBar, mit einer Farbe zwischen rot (alles falsch), gelb (50/50) und grün (alles richtig).
Du könntest höchstens den Fragen noch Themengebiete zuweisen und dann mehrere solcher ProgressBars anzeigen, in welchem Gebiet der Nutzer gut und schlecht war.
bole hat folgendes geschrieben : | Gib's bei euch einen Bonus für das skurilste programm |
Also erstens sind solche Boni in der C-Gemeinde auch verbreitet und außerdem ist der Ansatz nicht so schlecht wie es vielleicht scheint. Wenn man das Ziel hat, möglichst wenig Quelltext zu schreiben und dieses Konzept dann per Copy&Paste weiterzuführen, dann ist dieses Ziel recht gut mit dem gewählten Ansatz erreicht worden. Ok, es ist echt fies unpraktisch und etwas absurd, aber es funktioniert. Rein technisch gesehen.
Ich fand es eigentlich immer unfair, wenn Lehrer eine Aufgabenstellung formulieren und dann doch etwas ganz anderes bewertet haben.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 24.02.15 11:38
Mal etwas ganz anderes: wenn man auf manuell eingefügte RadioButtons verzichtet und stattdessen eine RadioGroup verwendet, der die Buttons über die Items-Eigenschaft hinzugefügt werden, kann man auf die lästigen Checked-Abfragen verzichten, es genügt dann der Vergleich des ItemIndex der RadioGroup mit dem CorrectAnswer-Feld des Records.
|
|
bole
Beiträge: 107
Erhaltene Danke: 15
win 10
|
Verfasst: Di 24.02.15 12:19
Zitat: | "Ich fand es eigentlich immer unfair, wenn Lehrer eine Aufgabenstellung formulieren und dann doch etwas ganz anderes bewertet haben. |
Das ist so allerdings gehört zur Bewertung eines Programms nicht nur das hoffentlich lauffähige Programm sondern auch der Sourcecode und das Konzept. Meiner Meinung nach ist das Konzept und der Source Code sogar wichtiger als das Programm. Bei diesem Konzept ist die Wartbarkeit und Erweiterbarkeit wohl gegen 0 tendierend...
Gruss
Bole
_________________ ein programm macht nicht das was du willst sondern was du schreibst!
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 24.02.15 12:54
Moin!
Ich grätsche hier mal zwischen und möchte dran erinnern, dass es hier um ein konkretes Programm-Projekt geht. Verlagert doch bitte die Diskussion um Bewertung einer solchen Arbeit (und alles weitere, was nicht zu dem Projekt gehört) in eine separate Diskussion im Off-Topic. Danke.
Man man, wir scheinen ja wirklich langsam Mangel an Hausaufgaben-Threads zu haben, wenn sich alle so da drauf stürzen...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
|