Autor Beitrag
Lance_Hardwood
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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):

ausblenden volle Höhe 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:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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 user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 24.02.2015 um 12:00
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: Mo 23.02.15 12:22 
:welcome:

user profile iconLance_Hardwood hat folgendes geschrieben Zum zitierten Posting springen:
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 :shock:

user profile iconLance_Hardwood hat folgendes geschrieben Zum zitierten Posting springen:
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 :mrgreen:

user profile iconLance_Hardwood hat folgendes geschrieben Zum zitierten Posting springen:
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? :twisted: *duck*

Dein Code ist auch wirklich anspruchsvoll für eine Arbeit, für die man 1 Jahr (oder mehr?) Zeit hat... :roll:

Ok, jetzt habe ich erstmal genügend fiese Kommentare für heute ausgeteilt :wink: Aber das musste jetzt einfach mal sein :)

user profile iconLance_Hardwood hat folgendes geschrieben Zum zitierten Posting springen:
Wie mache ich das ?

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 :P

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:

ausblenden volle Höhe 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:
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 = 0and (RadioButton0.Checked))
  or ((questions[ selectedQuestion ].correctAnswer = 1and (RadioButton1.Checked))
  or ((questions[ selectedQuestion ].correctAnswer = 2and (RadioButton2.Checked))
  or ((questions[ selectedQuestion ].correctAnswer = 3and (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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Mo 23.02.15 20:14 
Das hat der Kollege doch schon oben geschrieben :wink:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TestAnswers();
begin
  if ((questions[ selectedQuestion ].correctAnswer = 0and (RadioButton0.Checked))
  or ((questions[ selectedQuestion ].correctAnswer = 1and (RadioButton1.Checked))
  or ((questions[ selectedQuestion ].correctAnswer = 2and (RadioButton2.Checked))
  or ((questions[ selectedQuestion ].correctAnswer = 3and (RadioButton3.Checked)) then
    correctAnswers  := correctAnswers  + 1
  else
    wrongAnswers := wrongAnswers + 1;
end;


Diese Funktion rufst du auf, um zu testen, ob die richtige Antwort gegeben wurde. Entweder wird die Variable correctAnswers oder aber wrongAnswers um eins erhöht. Das sind die Werte, die du dann ausgeben kannst.

Oder aber bei jeder Frage den Tag auslesen (Tag = 0 falscher RadioButton, Tag = 1 korrekter RadioButton) und mitzählen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TestAnswers();
begin
  if RadioButton0.Checked then
    correctAnswers:= correctAnswers + RadioButton0.Tag
  else if RadioButton1.Checked then
    correctAnswers:= correctAnswers + RadioButton1.Tag
  else if ...

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)

Für diesen Beitrag haben gedankt: Lance_Hardwood
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: Mo 23.02.15 22:19 
user profile iconLance_Hardwood hat folgendes geschrieben Zum zitierten Posting springen:
[...]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:
ausblenden 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;

  //noch Einfügen: Aktualisierung der Anzeige
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):
ausblenden 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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 user profile iconNarses: Beiträge zusammengefasst

Hallo 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107
Erhaltene Danke: 15

win 10

BeitragVerfasst: Di 24.02.15 00:49 
user profile iconLance_Hardwood hat folgendes geschrieben Zum zitierten Posting springen:

Da mir die Zeit wegläuft, werde ich es wohl mit meinem seltsamen Konzept weiter versuchen.


Das läuft unter Beratungsresistent! :mrgreen:

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 user profile iconXion 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: Di 24.02.15 10:37 
user profile iconLance_Hardwood hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconbole hat folgendes geschrieben Zum zitierten Posting springen:
Gib's bei euch einen Bonus für das skurilste programm :?

Also erstens sind solche Boni in der C-Gemeinde auch verbreitet :twisted: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107
Erhaltene Danke: 15

win 10

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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. :les: 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. :idea: Danke. :)

Man man, wir scheinen ja wirklich langsam Mangel an Hausaufgaben-Threads zu haben, wenn sich alle so da drauf stürzen... :rofl:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.