Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Anfänger Problem - Psychologietest (https://www.delphipraxis.net/91384-anfaenger-problem-psychologietest.html)

Smokers 4. Mai 2007 09:20


Anfänger Problem - Psychologietest
 
Also ich habe folgendes vor / bin dabei
einen psychologie Test zu programmieren der bei einer Frage die auf eine bestimmte Weise beantworte wird, halt den Werten: „schizoid“ , „depressiv“, “hysterisch“, “zwanghaft“ und so genannten Lügenfragen.
Jedoch habe ich im Moment ein Problem das mich stutzen lässt.
Erstmal der Quellcode:

das formular wo so ziemlich außer namensabfrage und auswertung abläuft:
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm2 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    label_vorname: TLabel;
    label_nachname: TLabel;
    Button1: TButton;
    label_text: TLabel;
    Button2: TButton;
    label_frage: TLabel;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    RadioButton4: TRadioButton;
    RadioButton5: TRadioButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    schizoid,hysterisch,depressiv,luegen,zwanghaft:integer;
    Seite:integer;
    //frage:array of tfrage;
     frage: array[1..100,0..2,0..2] of string;
     dummy:integer;
  end;

var
  Form2: TForm2;

implementation

uses Unit1, Unit3;

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
form1.close;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
Radiobutton1.Hide;
Radiobutton2.Hide;
Radiobutton3.Hide;
Radiobutton4.Hide;
Radiobutton5.Hide;

label_text.caption:='Lieber Testteilnehmer,'+#13+#10+'Liebe Testteilnehmerin,'+#13+#10+#13+#10'dies ist ein Test, der Ihr Freizeitverhalten untersuchen wird. Ich bitte Sie, alle Fragen so zu '+#13+#10+'beantworten, dass Ihre Antworten am besten Ihrer Einstellung entsprechen. Neben jeder Frage '+#13+#10+'sehen Sie fünf Antwortmöglichkeiten. Die Kästchen dazwischen geben jeweils Zwischenwerte an,'+#13+#10+' damit Sie ihre Antworten'+#13+#10+'besser abstufen können. Lassen Sie bitte keine Frage aus und entscheiden Sie spontan, welche '+#13+#10+'Antwort am besten zu Ihnen passt.';

Frage[1,0,0]:='Bei Diskussionen halte ich mich her zurück.';
Frage[2,0,0]:='Die meisten Menschen sind mir zu neugierig.';
Frage[3,0,0]:='Ich spiele gerne Fußball.';
Frage[4,0,0]:='Ich werde bestimmt mal im Lotto gewinnen. ';


Frage[1,1,0]:='d';
Frage[2,1,0]:='s.';
Frage[3,1,0]:='z';
Frage[4,1,0]:='dummy';








end;

procedure TForm2.Button2Click(Sender: TObject);
begin
case seite of

0:begin
    label_text.Caption:='';
    label_frage.caption:=frage[1,0,0];
    Radiobutton1.show;
    Radiobutton2.show;
    Radiobutton3.show;
    Radiobutton4.show;
    Radiobutton5.show;
    Seite:=seite+1;

  end;

1..4:

        begin

        if (radiobutton1.Checked=false)AND(radiobutton1.Checked=false)AND(radiobutton2.Checked=false)AND(radiobutton3.Checked=false)AND(radiobutton4.Checked=false)AND(radiobutton5.Checked=false) then
           begin
           messagedlg('Du hast keine Auswahl getroffen',mterror,[mbok],1);
           abort;
        end

        else

          label_frage.caption:=frage[seite+1,0,0];
          if radiobutton1.Checked=true then
            begin
            if frage[(seite+1),1,0]= 'd' then depressiv:=depressiv+2 ;
            if frage[(seite+1),1,0]= 's' then schizoid:=schizoid+2 ;
            if frage[(seite+1),1,0]= 'z' then zwanghaft:=zwanghaft+2 ;
            if frage[(seite+1),1,0]= 'h' then hysterisch:=hysterisch+2 ;
            if frage[(seite+1),1,0]= 'l' then luegen:=luegen+1 ;
            if frage[(seite+1),1,0]= 'dummy' then dummy:=dummy+0 ;
            end;

            if radiobutton2.Checked=true then
            begin
            if frage[seite+1,1,0]= 'd' then depressiv:=depressiv+1 ;
            if frage[seite+1,1,0]= 's' then schizoid:=schizoid+1 ;
            if frage[seite+1,1,0]= 'z' then zwanghaft:=zwanghaft+1 ;
            if frage[seite+1,1,0]= 'h' then hysterisch:=hysterisch+1 ;
            if frage[seite+1,1,0]= 'l' then luegen:=luegen+1 ;
            if frage[seite+1,1,0]= 'dummy' then dummy:=dummy+0 ;
            end;

          messagedlg('Depressiv:'+inttostr(depressiv)+', schizoid:'+inttostr(schizoid)+',zwanghaft:'+inttostr(zwanghaft)+',lügen:'+inttostr(luegen)+'.',mtinformation,[mbok],1);
          Radiobutton1.Checked:=false;
          Radiobutton2.Checked:=false;
          Radiobutton3.Checked:=false;
          Radiobutton4.Checked:=false;
          Radiobutton5.Checked:=false;
          seite:=seite+1;


        end;

5:


      begin
      form2.Hide;
      form3.show;
        form3.label_depressiv.caption:=inttostr(depressiv);
        form3.label_schizoid.caption:=inttostr(schizoid);
        form3.label_zwanghaft.caption:=inttostr(zwanghaft);
        form3.label_hysterisch.caption:=inttostr(hysterisch);
        //form3.label_luegen.caption:=inttostr(luegen);



      end;

end;




end;

end.
So das Problem was gelöst werden muss ist das beim antworten nur bei der Frage : „ frage[3,0,0] “ auch wirklich ein wert zur Variable addiert wird. Bei allen anderen Fragen nicht.


Erstmal nur wichtig das er die Ergebnisse richtig zählt....

\\\\\\\\
Zur kurzen Erläuterung :
1. ich bin absoluter Anfänger

2. ich bin Anfänger ;)

3. ein array mit 3 dimensionen weil ich in der frage / var irgendwo die frage, die kategorie und später auch noch die gegenfrage abspeichert.

Tormentor32 4. Mai 2007 09:41

Re: Anfänger Problem - Psychologietest
 
Hmm soweit ich das verstanden habe, ist in deinem Fall kein 3Dimensionales Array nötig.

Du kannst das Ganze über einen Record lösen:
Delphi-Quellcode:
type
  TFrage = record
    Frage: String;
    Antworten: Array[0..3] of string;
    Zuordnung: Array[0..3] of byte;
  end
So brauchst du nur ein Array[AnzahlDerFragen] of TFrage

Zuordnung sagt, welche Antwort welchem Typ zugeordnet wird, du könntest also zum beispiel folgendes machen:

Delphi-Quellcode:
var
  Fragen: Array[0..99] of TFrage;
//.....
begin
  Fragen[0].Frage := 'Glas ist Halbvoll oder halbleer?'
  Fragen[0].Antwort[0] := 'Halbvoll';
  Fragen[0].Antwort[1] := 'Halbleer';
  //...
  Fragen[0].Zuordnung[0] := 1;
  Fragen[1].Zuordnung[1] := 3; // USW... DU hast ein Array, wo die Anzahl der Jeweiligen Typen drinsteht, so kannst du zum Beispiel

inc(Typen[Fragen[AktuelleFrage].Zuordnung[GewählteFrage]])
Hoffe ich hab das beschrieben was du meinst und es war nicht zun kompliziert

Luckie 4. Mai 2007 09:43

Re: Anfänger Problem - Psychologietest
 
Zitat:

Zitat von Smokers
So das Problem was gelöst werden muss ist das beim antworten nur bei der Frage : „ frage[3,0,0] “ auch wirklich ein wert zur Variable addiert wird. Bei allen anderen Fragen nicht.

Du solltest deinen Quelltext mal gescheit formatieren, dann siehst du wahrscheinlich schon von alleine, was falsch ist.

Smokers 4. Mai 2007 10:07

Re: Anfänger Problem - Psychologietest
 
okay mal abgesehen von dem Beitrag von Luckie der für einen Anfänger
nicht gerade sehr konsruktiv ist schonmal danke an Tormentor32.

Also das mit dem Record hab ich soweit gerafft.
Allerdings ..

Wozu brauche ich ?
Delphi-Quellcode:
Fragen[0].Antwort[0] := 'Halbvoll';
Es gibt indem Sinne keine Antworten...
es läuft nur so ab das man 5 Knöppe hat und ganz links is
"trifft sehr stark zu" und ganz rechts "trifft garnicht zu"

Sodass beim radiobutton1 für diesen den fragenspezifischen presönlichkeits wert "2" addiert wird.
beim Radiobutton2 nurnoch "1"
und bei den restlichen garkeine mehr.

Daher versteh ich im Moment nicht ganz wo ich die addition zu der bersönlickeitsvariable unterbringe.




Zitat:

Hoffe ich hab das beschrieben was du meinst und es war nicht zun kompliziert
--> nur ein ganz bisschen... aber schon ok so^^

Tormentor32 4. Mai 2007 10:23

Re: Anfänger Problem - Psychologietest
 
Hmm dann hab ich dein Quiz ein wenig falsch verstanden...

Bevor ich mir jetzt die Arbeit mache^^ frag ich lieber nochmal nach:

Du willst erreichen, dass man bestimmte Fragen beantwortet, indem man quasi eine Zahl zwischen 1 und 5 angibt (Trifft nicht zu bis trifft voll zu). Jede Frage wird einem bestimmten "Menschtyp" zugeordnet und hinterher wird ausgewertet, welcher Menschtyp die meisten Punkte hat.

Sehe ich das richtig?

Ach übrigens, Luckies Beitrag ist wichtiger als du denkst, denn ein gut durchformatierter Quelltext ist sehr wichtig, und wenn du dein Programm bessispielsweise 2 Jahre lang nicht anguckst, dann kannst du bei einem gut formatiertem Quelltext viel schneller durchblicken.

Smokers 4. Mai 2007 10:43

Re: Anfänger Problem - Psychologietest
 
Also ist ein psychologischer Test der darauf abziehlt am ende die Punkte zahl zu ermitteln zuwieviel % oder Punkten man ein :

-depressiver
-hysterischer
-zwanghafter
-schizoider
Mensch ist.

Man bekommt eine Frage ( so um die 40 sinds ) dann hat man 5 Knöpfe .. so ungefähr (O = radiobutton)

trifft sehr stark zu | O O O O O | trifft garnicht zu.

wenn man ganz links klickt ( also bei "trifft sehr stark zu" ) soll erzu der gruppe die die Frage angehört 2 Punkte hinzu addieren.
Beim 2. Knopf von links nurnoch 1 punkt
und die restlichen 3 Knöpfe immer NUll.

Beispiel :

1. Bei Diskussionen halte ich mich her zurück. (nicht sichtbar : Kategorie: depressiv)

O O O O O ( ich klicke mal den 2. knopf von links an )

-->
Auswertung :

Du bist :

Depressiv : 1 Punkt
-------------------------------------------
Das ist die Hauptaufgabe des Programms.

Später soll noch hinzukommen das es Vergleichsfragen gibt.
z.B.
Frage nr. 2 Ich habe schnell Mitleid
Frage nr. 34 Ich kann gut mit dem Leid anderer mitfühlen

Wenn da beide mit "ja trifft zu" bewertet werden wird das halt gegengerechnet....

aber das erst später.. ^^

Ich hofe war verständlich genug ^^

Luckie 4. Mai 2007 10:52

Re: Anfänger Problem - Psychologietest
 
Zitat:

Zitat von Smokers
okay mal abgesehen von dem Beitrag von Luckie der für einen Anfänger
nicht gerade sehr konsruktiv ist schonmal danke an Tormentor32.

So, findest du? Dann guck dir mal das an:
Delphi-Quellcode:
procedure TForm2.Button2Click(Sender: TObject);
begin
case seite of

0:begin
    label_text.Caption:='';
    label_frage.caption:=frage[1,0,0];
    Radiobutton1.show;
    Radiobutton2.show;
    Radiobutton3.show;
    Radiobutton4.show;
    Radiobutton5.show;
    Seite:=seite+1;

  end;

1..4:

        begin

        if (radiobutton1.Checked=false)AND(radiobutton1.Checked=false)AND(radiobutton2.Checked=false)AND(radiobutton3.Checked=false)AND(radiobutton4.Checked=false)AND(radiobutton5.Checked=false) then
           begin
           messagedlg('Du hast keine Auswahl getroffen',mterror,[mbok],1);
           abort;
        end

        else

          label_frage.caption:=frage[seite+1,0,0];
          if radiobutton1.Checked=true then
            begin
            if frage[(seite+1),1,0]= 'd' then depressiv:=depressiv+2 ;
            if frage[(seite+1),1,0]= 's' then schizoid:=schizoid+2 ;
            if frage[(seite+1),1,0]= 'z' then zwanghaft:=zwanghaft+2 ;
            if frage[(seite+1),1,0]= 'h' then hysterisch:=hysterisch+2 ;
            if frage[(seite+1),1,0]= 'l' then luegen:=luegen+1 ;
            if frage[(seite+1),1,0]= 'dummy' then dummy:=dummy+0 ;
            end;

            if radiobutton2.Checked=true then
            begin
            if frage[seite+1,1,0]= 'd' then depressiv:=depressiv+1 ;
            if frage[seite+1,1,0]= 's' then schizoid:=schizoid+1 ;
            if frage[seite+1,1,0]= 'z' then zwanghaft:=zwanghaft+1 ;
            if frage[seite+1,1,0]= 'h' then hysterisch:=hysterisch+1 ;
            if frage[seite+1,1,0]= 'l' then luegen:=luegen+1 ;
            if frage[seite+1,1,0]= 'dummy' then dummy:=dummy+0 ;
            end;

          messagedlg('Depressiv:'+inttostr(depressiv)+', schizoid:'+inttostr(schizoid)+',zwanghaft:'+inttostr(zwanghaft)+',lügen:'+inttostr(luegen)+'.',mtinformation,[mbok],1);
          Radiobutton1.Checked:=false;
          Radiobutton2.Checked:=false;
          Radiobutton3.Checked:=false;
          Radiobutton4.Checked:=false;
          Radiobutton5.Checked:=false;
          seite:=seite+1;


        end;

5:


      begin
      form2.Hide;
      form3.show;
        form3.label_depressiv.caption:=inttostr(depressiv);
        form3.label_schizoid.caption:=inttostr(schizoid);
        form3.label_zwanghaft.caption:=inttostr(zwanghaft);
        form3.label_hysterisch.caption:=inttostr(hysterisch);
        //form3.label_luegen.caption:=inttostr(luegen);



      end;

end;
Und das:
Delphi-Quellcode:
procedure TForm2.Button2Click(Sender: TObject);
begin
  case seite of
    0:
      begin
        label_text.Caption := '';
        label_frage.caption := frage[1, 0, 0];
        Radiobutton1.show;
        Radiobutton2.show;
        Radiobutton3.show;
        Radiobutton4.show;
        Radiobutton5.show;
        Seite := seite + 1;

      end;
    1..4:
      begin
        if (radiobutton1.Checked = false) and (radiobutton1.Checked = false) and (radiobutton2.Checked = false) and
          (radiobutton3.Checked = false) and (radiobutton4.Checked = false) and (radiobutton5.Checked = false) then
        begin
          messagedlg('Du hast keine Auswahl getroffen', mterror, [mbok], 1);
          abort;
        end
        else
          label_frage.caption := frage[seite + 1, 0, 0];
        if radiobutton1.Checked = true then
        begin
          if frage[(seite + 1), 1, 0] = 'd' then
            depressiv := depressiv + 2;
          if frage[(seite + 1), 1, 0] = 's' then
            schizoid := schizoid + 2;
          if frage[(seite + 1), 1, 0] = 'z' then
            zwanghaft := zwanghaft + 2;
          if frage[(seite + 1), 1, 0] = 'h' then
            hysterisch := hysterisch + 2;
          if frage[(seite + 1), 1, 0] = 'l' then
            luegen := luegen + 1;
          if frage[(seite + 1), 1, 0] = 'dummy' then
            dummy := dummy + 0;
        end;
        if radiobutton2.Checked = true then
        begin
          if frage[seite + 1, 1, 0] = 'd' then
            depressiv := depressiv + 1;
          if frage[seite + 1, 1, 0] = 's' then
            schizoid := schizoid + 1;
          if frage[seite + 1, 1, 0] = 'z' then
            zwanghaft := zwanghaft + 1;
          if frage[seite + 1, 1, 0] = 'h' then
            hysterisch := hysterisch + 1;
          if frage[seite + 1, 1, 0] = 'l' then
            luegen := luegen + 1;
          if frage[seite + 1, 1, 0] = 'dummy' then
            dummy := dummy + 0;
        end;
        messagedlg('Depressiv:' + inttostr(depressiv) + ', schizoid:' + inttostr(schizoid) + ',zwanghaft:' +
          inttostr(zwanghaft) + ',lügen:' + inttostr(luegen) + '.', mtinformation, [mbok], 1);
        Radiobutton1.Checked := false;
        Radiobutton2.Checked := false;
        Radiobutton3.Checked := false;
        Radiobutton4.Checked := false;
        Radiobutton5.Checked := false;
        seite := seite + 1;
      end;
    5:
      begin
        form2.Hide;
        form3.show;
        form3.label_depressiv.caption := inttostr(depressiv);
        form3.label_schizoid.caption := inttostr(schizoid);
        form3.label_zwanghaft.caption := inttostr(zwanghaft);
        form3.label_hysterisch.caption := inttostr(hysterisch);
        //form3.label_luegen.caption:=inttostr(luegen);
      end;
  end;
end;
Formatierter Code hilft die Übersicht zu behalten und Fehler zu vermeiden bzw. schnell zu finden. Fehler wie: Falsch verschachteklte Schleifen und Bedingungen, fehlende begins und ends, Fehler in der Logik und im Programmablauf. Und hier im Forum, können auch noch andere ausser dir den Code lesen und verstehen und das willst du ja wohl.

Tormentor32 4. Mai 2007 11:00

Re: Anfänger Problem - Psychologietest
 
Du solltest jeder Kategorie einen Zahlenwert zuordnen logischerweise:

-depressiver -> 0
-hysterischer -> 1
-zwanghafter -> 2
-schizoider -> 3

Das definierst du dann als Konstanten
Delphi-Quellcode:
const
  depressiv = 0;
  hysterisch = 1;
  zwanghaft = 2;
  schizoid = 3;
Jetzt sieht eine Frage so aus
Delphi-Quellcode:
type
  TFrage = record
    Frage: string;
    Kategorie: byte;
    IndexDerFrageZumGegenrechnen: integer;
    GewaehlteAntwort: byte;
  end;
Jetzt Kannst du zum Beispiel mit
Delphi-Quellcode:
Fragen[0].Kategorie := hysterisch
einfach eine Kategorie zuweisen. In gewählte Antwort wird gespeichert, was der Benutzer gewählt hat, und hinterher, wenn der test fertig ist, kannst du das ganze einfach mit einer Schleife auswerten.

Klar soweit? :wink:

Smokers 4. Mai 2007 11:15

Re: Anfänger Problem - Psychologietest
 
Das war viel konstruktiver =)

Naja ok. Ich finde allerdings deinen Text auch teilweise gewöhnungsbedürftig.^^

Meiner Sieht teilweise aber viel schlimmer aus da hast schon recht was nicht NUR auf 2 Monitore und daher ewig lange Textphrasen, zurück zu führen ist.^^

Klar ich versuch mich zu bessern.
Einmal begin und end vergessen hab ich auch gefunden .. allerdings ändert das dass endergebnis nicht wirklich.

Smokers 4. Mai 2007 12:10

Re: Anfänger Problem - Psychologietest
 
Danke Tormentor32.
Ich werde das gleich mal wenn ich per VNC zu haus wieder ruff kann versuchen.( Bin auf Arbeit xD )
Ich glaube es verstanden zu haben... ^^
Mirbahnt also die Umsetzung vor Augen...hoff ich:

Die Auswertung würde ja dann wiefolgt ablaufen oder?

Delphi-Quellcode:
case Frage[zaehlvariable].antwort of
     1: frage[zaehlvariable].kategorie +2 
     2: frage[zaehlvariable].kategorie +1 
     3: frage[zaehlvariable].kategorie +0 
     4: frage[zaehlvariable].kategorie +0
Allerdings muss ich doch neue var deklarieren oder ? weil die Kategorien sind ja const nichwahr? ^^

( wie gesagt anfänger)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz