Sven: Eine Variable für eine entsprechende Antwort counten lassen

folgendes:
Ich habe eine Umfrage programmiert und jetzt will ich eine Auswertung dazu schreiben. Ich habe schon die verschiedenen Antworten den Gruppen der Fragen zugewiesen. Mein Problem ist, dass die Variablen $A1, $A2, $A3, $A4 und $A5 sich nicht steigern.

for($i = 0;$i < $fragenanzahl-1;$i++)
{
 for($b = 0;$b < $teilnehmer;$b++)
{
  if(@{"gruppe".$i+1}[$b] == 1){$A1++;}
  if(@{"gruppe".$i+1}[$b] == 2){$A2++;}
  if(@{"gruppe".$i+1}[$b] == 3){$A3++;}
  if(@{"gruppe".$i+1}[$b] == 4){$A4++;}
  if(@{"gruppe".$i+1}[$b] == 5){$A5++;}
}
Ich habe es auch schon anstatt == mit =~ m/1/g versucht und @ durch $ ersetzt, aber das hat auch nicht geholfen.

Grüße,
Sven

  1. Hallo,

    Ich habe es auch schon anstatt == mit =~ m/1/g versucht und @ durch $ ersetzt, aber das hat auch nicht geholfen.

    Es wäre interessant zu sehen, wie Du die Daten im Vorfeld ausgewertet hast. Vielleicht könntest Du die Statistiken gleich beim Einlesen mit befüllen. Ich vermute, dass die Daten gar nicht in der Form vorliegen, wie es dieses Code-Fragment 'annimmt'.

    BTW: imho machst Du es schon hier etwas kompliziert.

    for($i = 1; $i<$fragenanzahl;$i++) {
      for($b = 0; $b < $teilnehmer; $b++) {
        $A[$gruppe[$i][$b]]++;
        }
      }

    So könnte das aussehen, wenn Du $A1 bis $A5 durch ein Array ersetzt[1] und auch @gruppe.. als zweidimensionales Array anlegst.
    Das alles hat jetzt nicht wirklich etwas mit Deinem Problem zu tun. Ihc wollte es nur gesagt haben.

    Grüße,
    Sven

    Grüße
      Klaus

    [1] wobei 'A' aus zweierlei hinsicht unshcön ist. Erstens hat sichin der Perlgemeinde durchgesetzt keine Großbuchstaben für die Variablenbezeichner zu verwenden. Zweitens ist 'A' absolut nicht aussagekräftig genug. $voting_counts wäre imho  eine bessere Wahl.

    1. Es wäre interessant zu sehen, wie Du die Daten im Vorfeld ausgewertet hast. Vielleicht könntest Du die Statistiken gleich beim Einlesen mit befüllen. Ich vermute, dass die Daten gar nicht in der Form vorliegen, wie es dieses Code-Fragment 'annimmt'.

      #!/usr/bin/perl

      #----------------------------------------#

      Vorbestimmung der Variablen und Arrays

      #----------------------------------------#

      @fragen = "";
      shift(@fragen);
      @antworten = "";
      shift(@antworten);
      $frage = "";
      $aktiviert = 1;
      $fragenanzahl = 0;
      $teilnehmer = 0;
      $antwortengesamt = 0;
      @answers = "";
      shift(@answers);
      $antwort1 = 0;
      $antwort2 = 0;
      $antwort3 = 0;
      $antwort4 = 0;
      $antwort5 = 0;

      #---------------------------------------------------------#

      Speichern der Fragen und Antworten aus fragen in Arrays

      #---------------------------------------------------------#

      open(IN,"C:/wampp2/cgi-bin/fragen");
      while($zeile = <IN>)
      {
       chomp($zeile);
       ($frage,$answer) = split("[(]",$zeile);
       ($answer1,$answer2) = split(" ",$answer);
       ($answer2,$null) = split("[)]",$answer2);
       push(@fragen,$frage);
       push(@answers,$answer1);
       push(@answers,$answer2);
       $fragenanzahl++;
      }
      close(IN);

      #------------------------#

      Leersetzen der Gruppen

      #------------------------#

      for($i = 1;$i <= $fragenanzahl;$i++)
      {
       @{"gruppe".$i} = "";
       shift(@{$array});
      }

      #---------------------------------------------------#

      Zählen und Speichern der Antworten in einem Array

      #---------------------------------------------------#

      $a = 0;
      opendir(DIR,"C:/wampp2/cgi-bin/daten");
       while($datei = readdir(DIR))
      {
       $a++;
       if($a >= 3)
      {
        $teilnehmer++;
        open(IN,"C:/wampp2/cgi-bin/daten/$datei");
        while($zeile = <IN>)
      {
        chomp($zeile);
        ($fragenzahl,$antwort) = split(" ",$zeile);
        push(@antworten,$antwort);
        $antwortengesamt++;
      }
      }
      }
      close(IN);
      closedir(DIR);

      #--------------------------------------------------------------------------#

      Speichern der Antworten in verschiedenen Gruppen (pro Frage eine Gruppe)

      #--------------------------------------------------------------------------#

      $a = 1;
      for($i = 0;$i <= $antwortengesamt;$i++)
      {
        push(@{"gruppe".$a},@antworten[$i]);
        $a++;
        if($a > $fragenanzahl)
      {
         $a = 1;
      }
      }

      #--------------------------------------------------#

      Ausgabe des Anfangs (Teilnehmer und Überschrift)

      #--------------------------------------------------#

      print "content-type: text/html\n\n";
      print "<html>\n<head>\n";
      print "<style type="text/css">\n";
      print "body, table\n{\ncolor:"blue";\nfont-size:10pt;\nfont-family:Comic Sans MS;\n}\n";
      print "h1\n{\ncolor:"red";\nfont-size:18pt;\nfont-family:Comic Sans MS;\n}\n";
      print "i\n{\ncolor:"red";\nfont-size:12pt;\nfont-family:Comic Sans MS;\n}\n";
      print "b\n{\ncolor:"green";\nfont-size:14pt;\nfont-family:Comic Sans MS;\n}\n";
      print "</style>\n</head>\n<body>\n";
      print "<h1>Auswertung</h1>\n";
      print "<b>Anzahl der Teilnehmer: $teilnehmer</b>\n<br><br>\n";

      #-----------------------------------------------#

      Ausgabe der Fragen, Antworten und Statistiken

      #-----------------------------------------------#

      $a = 0;
      for($i = 0;$i < $fragenanzahl-1;$i++)
      {
       for($b = 0;$b < $teilnehmer;$b++)
      {
        if(@{"gruppe".$i+1}[$b] == 1){$antwort1++;}
        if(@{"gruppe".$i+1}[$b] == 2){$antwort2++;}
        if(@{"gruppe".$i+1}[$b] == 3){$antwort3++;} #Hier liegt mein Problem!
        if(@{"gruppe".$i+1}[$b] == 4){$antwort4++;}
        if(@{"gruppe".$i+1}[$b] == 5){$antwort5++;}
      }

      @prozente = $A1/A2+A1/A3+A1/A4+A1/A5;

      print "<i>@fragen[$i]\n</i>\n";
       print "<table border=0>\n<tr>\n<td width=120>\n";
       print "sehr @answers[$a]\n</td>\n<td>\n$antwort1</td></tr>\n<tr>\n<td>\n";
       print "@answers[$a]\n</td>\n<td>\n$antwort2</td>\n</tr>\n<tr>\n<td>\n";
       print "mittelmäßig\n</td>\n<td>\n$antwort3</td>\n</tr>\n<tr>\n<td>\n";
       $a++;
       print "@answers[$a]\n</td>\n<td>\n$antwort4</td>\n</tr>\n<tr>\n<td>\n";
       print "sehr @answers[$a]\n</td>\n<td>\n$antwort5</td>\n</tr>\n</table>";
       $a++;
       $b++;
      $antwort1 = 0;
      $antwort2 = 0;
      $antwort3 = 0;
      $antwort4 = 0;
      $antwort5 = 0;
      }
      print @gruppe1; #nur um zu sehen, dass das mit den Gruppen funzt!

      Der Code ist ein bißchen lang, aber soweit funzt er!

      BTW: imho machst Du es schon hier etwas kompliziert.

      for($i = 1; $i<$fragenanzahl;$i++) {
        for($b = 0; $b < $teilnehmer; $b++) {
          $A[$gruppe[$i][$b]]++;
          }
        }

      So könnte das aussehen, wenn Du $A1 bis $A5 durch ein Array ersetzt[1] und auch @gruppe.. als zweidimensionales Array anlegst.
      Das alles hat jetzt nicht wirklich etwas mit Deinem Problem zu tun. Ihc wollte es nur gesagt haben.

      Als ich den Teil bei mir eingebaut habe, kam ein Servererror!

      Grüße Sven

      1. Hallo,

        #!/usr/bin/perl

        #!/usr/bin/perl -w

        use strict; # danach alle Fehler beheben

        @fragen = "";
        shift(@fragen);

        sowas ist unnoetig:

        my @fragen = ();

        @antworten = "";
        shift(@antworten);

        ditto

        ...

        @answers = "";
        shift(@answers);

        s.o.

        $antwort1 = 0;
        $antwort2 = 0;
        $antwort3 = 0;
        $antwort4 = 0;
        $antwort5 = 0;

        Variablen mit den Endungen 1,2,3,4,5 wollen eigentlich immer Arrays sein

        open(IN,"C:/wampp2/cgi-bin/fragen");

        hier fehlt, wie praktisch ueberall, die Behandluing von eventell auftretenden Fehlern.

        ...

        ($frage,$answer) = split("[(]",$zeile);
        ($answer1,$answer2) = split(" ",$answer);
        ($answer2,$null) = split("[)]",$answer2);

        so etwas ist immer extrem Fehleranfaellig

        my($frage,$answer) = split('[(]',$zeile,2);

        waere imho schon ein Fortschritt, besser muesste es mit einer Regex gehen

        allerdings wuerde ich das Datenformat ueberdenken.

        push(@fragen,$frage);

        ...

        $fragenanzahl++;

        das ist eine reduntante Information, sie laesst sich leicht mit scalar @fragen ermitteln.

        for($i = 1;$i <= $fragenanzahl;$i++)
        {
        @{"gruppe".$i} = "";

        mit perl kann man so etwas machen, hier macht es imho keinen Sinn, ein zweidimensionales Array draengt sich geradezu auf.

        shift(@{$array});

        hier ist ein Fehler, der Dir mit use strict und -w nicht passiert waere.

        $a = 0;
        opendir(DIR,"C:/wampp2/cgi-bin/daten");
        while($datei = readdir(DIR))
        {
        $a++;
        if($a >= 3)
        {
          $teilnehmer++;
          open(IN,"C:/wampp2/cgi-bin/daten/$datei");

        ist Dir klar, dass auch unter WIndows Verzeichnisse andere Verzeichnisse besitzen?

        Zwei Verzeichnisse sind in jedem Verzeichnis vorhanden: . und ..

        Du faengst jedoch diesen Fall nicht richtig ab. if($a >= 3) ist kein probates Mittel.

        while($zeile = <IN>)
        {
          chomp($zeile);
          ($fragenzahl,$antwort) = split(" ",$zeile);
          push(@antworten,$antwort);
          $antwortengesamt++;

        auch hier: reduntante Information, die besser anders abgefragt wird.

        und warum nutzt Du nicht die Information $fragenzahl hier um die Gruppen zu befuellen

        und schenkst Dir die folgende Schleife.

        Der Code ab hier ...

        $a = 1;
        for($i = 0;$i <= $antwortengesamt;$i++)
        {
          push(@{"gruppe".$a},@antworten[$i]);
          $a++;
          if($a > $fragenanzahl)
        {
           $a = 1;
        }
        }

        ... bis hier koennte durch eine Erweiterung in der Einleseschleife ersetzt werden koennen.

        Der Code ist ein bißchen lang, aber soweit funzt er!

        Die Länge ist nicht das Problem;-)

        Als ich den Teil bei mir eingebaut habe, kam ein Servererror!

        Und was steht im Logfile?

        Grüße
          Klaus