Gelöst: Mehrere .txt auswerten Fehler

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
R3dFox
Beiträge: 13
Registriert: Sa 23. Jan 2021, 12:33

Gelöst: Mehrere .txt auswerten Fehler

Beitrag von R3dFox »

-Achtung Anfänger-

Aufgabe:
Programm soll den Durchschnitt berechnen
Erklärung:
n=wie viele txt es gibt
m=wie txt heißt (1. txt = '1.txt' usw.)
k=Variable zum zählen

Wenn ich den Button klicke kommt immer der Fehler: project hat "Exception-Klasse>RunError(103)<ausgelöst in Zeile 86: e0:=StrToInt(Wert[9])+e0;

Code: Alles auswählen

procedure TForm12.Button1Click(Sender: TObject);
var
  Werte: TStringArray;
  Ant: TextFile;
  Zeile: String;
  n, i, k, e1, e2, e3, e4, e5, e6, e7, e8, e9, e0: Byte;
  m: AnsiString;
begin
  n:=StrToInt(Edit1.Text);
  m:='0';
  k:=StrToInt('0');
  i:=StrToInt('0');
  e1:=StrToInt('0');
  e2:=StrToInt('0');
  e3:=StrToInt('0');
  e4:=StrToInt('0');
  e5:=StrToInt('0');
  e6:=StrToInt('0');
  e7:=StrToInt('0');
  e8:=StrToInt('0');
  e9:=StrToInt('0');
  e0:=StrToInt('0');

  repeat
      i:=i+1;
      k:=k+1;
      m:='+k+';
      //try
        AssignFile(Ant, 'C:\Users\R3dFox\Desktop\umfrage\data\'+m+'.txt');
        //Reset(Ant);
        while not EOF(Ant) do
        begin
          Readln(Ant, Zeile);
          Werte:= Zeile.Split(';');
          e1:=StrToInt(Werte[0])+e1;
          e2:=StrToInt(Werte[1])+e2;
          e3:=StrToInt(Werte[2])+e3;
          e4:=StrToInt(Werte[3])+e4;
          e5:=StrToInt(Werte[4])+e5;
          e6:=StrToInt(Werte[5])+e6;
          e7:=StrToInt(Werte[6])+e7;
          e8:=StrToInt(Werte[7])+e8;
          e9:=StrToInt(Werte[8])+e9;
          e0:=StrToInt(Werte[9])+e0;
        end;
      //finally
       // CloseFile(Ant);
      //end;
  until i=n;

  Label1.Caption:=FloatToStrF(e1/n, ffnumber, 8, 1);
  Label2.Caption:=FloatToStrF(e2/n, ffnumber, 8, 1);
  Label3.Caption:=FloatToStrF(e3/n, ffnumber, 8, 1);
  Label4.Caption:=FloatToStrF(e4/n, ffnumber, 8, 1);
  Label5.Caption:=FloatToStrF(e5/n, ffnumber, 8, 1);
  Label6.Caption:=FloatToStrF(e6/n, ffnumber, 8, 1);
  Label7.Caption:=FloatToStrF(e7/n, ffnumber, 8, 1);
  Label8.Caption:=FloatToStrF(e8/n, ffnumber, 8, 1);
  Label9.Caption:=FloatToStrF(e9/n, ffnumber, 8, 1);
  Label10.Caption:=FloatToStrF(e0/n, ffnumber, 8, 1);
end;

end.                                
Zuletzt geändert von R3dFox am So 7. Feb 2021, 11:56, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Mehrere .txt auswerten Fehler

Beitrag von af0815 »

Dein Werte Array witd zu kurz sein. Du prüfst ja nicht wieviele Einträge wirklich da sind.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

R3dFox
Beiträge: 13
Registriert: Sa 23. Jan 2021, 12:33

Re: Mehrere .txt auswerten Fehler

Beitrag von R3dFox »

Ich habe gerade noch einmal getestet und der Fehler muss bei der Variable 'm' liegen. Wenn ich bei AssignFile(F, 'C:\...\'+m+'.txt'); anstatt dem " '+m+' " direkt eine Datei, also 1.txt eingebe, funktioniert es.. Woran kann das liegen? :roll:

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Mehrere .txt auswerten Fehler

Beitrag von af0815 »

Code: Alles auswählen

      k:=k+1;
      m:='+k+';
was erwartest du in m ? Mehr als '+k+' wird dort nicht drinnenstehen. Dein k verwandelt sich nicht von selbst in das was du wünscht.

Schon mal nach IntToStr() in Verbindung mit Pascal gesucht ? Weil du willst eine Variable vom Typ byte in einen String verwandeln. Dazu braucht man eine Funktion die dir das umwandelt.
Du kannst dir entweder mit dem Debugger die Variable m ausgeben lassen oder mit ShowMessage(m) einmal anzeigen lassen was du wirklich da in der Variablem m drinnen hast.

Schau dir das mal an

Code: Alles auswählen

procedure TForm12.Button1Click(Sender: TObject);
var
  Werte: TStringArray;
  Ant: TextFile;
  Zeile: String;
  n, i, k, e1, e2, e3, e4, e5, e6, e7, e8, e9, e0: Byte;
  m: AnsiString;
  fn : string;
begin
  n:=StrToInt(Edit1.Text);
  m:='0';
  k:=StrToInt('0');
  i:=StrToInt('0');
  e1:=StrToInt('0');
  e2:=StrToInt('0');
  e3:=StrToInt('0');
  e4:=StrToInt('0');
  e5:=StrToInt('0');
  e6:=StrToInt('0');
  e7:=StrToInt('0');
  e8:=StrToInt('0');
  e9:=StrToInt('0');
  e0:=StrToInt('0');

  repeat
      i:=i+1;
      k:=k+1;
      m:='+k+';
      //try
        fn :=  'C:\Users\R3dFox\Desktop\umfrage\data\'+m+'.txt';
        showmessage('Das ist mein Filename='+fn);
        AssignFile(Ant, fn);
        //Reset(Ant);
        while not EOF(Ant) do
        begin
          Readln(Ant, Zeile);
          Werte:= Zeile.Split(';');
          e1:=StrToInt(Werte[0])+e1;
          e2:=StrToInt(Werte[1])+e2;
          e3:=StrToInt(Werte[2])+e3;
          e4:=StrToInt(Werte[3])+e4;
          e5:=StrToInt(Werte[4])+e5;
          e6:=StrToInt(Werte[5])+e6;
          e7:=StrToInt(Werte[6])+e7;
          e8:=StrToInt(Werte[7])+e8;
          e9:=StrToInt(Werte[8])+e9;
          e0:=StrToInt(Werte[9])+e0;
        end;
      //finally
       // CloseFile(Ant);
      //end;
  until i=n;

  Label1.Caption:=FloatToStrF(e1/n, ffnumber, 8, 1);
  Label2.Caption:=FloatToStrF(e2/n, ffnumber, 8, 1);
  Label3.Caption:=FloatToStrF(e3/n, ffnumber, 8, 1);
  Label4.Caption:=FloatToStrF(e4/n, ffnumber, 8, 1);
  Label5.Caption:=FloatToStrF(e5/n, ffnumber, 8, 1);
  Label6.Caption:=FloatToStrF(e6/n, ffnumber, 8, 1);
  Label7.Caption:=FloatToStrF(e7/n, ffnumber, 8, 1);
  Label8.Caption:=FloatToStrF(e8/n, ffnumber, 8, 1);
  Label9.Caption:=FloatToStrF(e9/n, ffnumber, 8, 1);
  Label10.Caption:=FloatToStrF(e0/n, ffnumber, 8, 1);
end;

end. 
eventuell musst du bei uses noch Dialogs hinzufügen. Im aufpopenden Fenster siehst du, was du wirklich für einen Dateinamen zusammengebastelst hast. Mehr will ich gar nicht schreiben, weil Hausübungen sollten Übungen bleiben.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

R3dFox
Beiträge: 13
Registriert: Sa 23. Jan 2021, 12:33

Re: Mehrere .txt auswerten Fehler

Beitrag von R3dFox »

Oh man ich bin blöd.. habe jetzt einfach "m:=IntToStr(k)" geschrieben und es funktioniert!
Vielen Dank! Endlich klappt es!

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Mehrere .txt auswerten Fehler

Beitrag von h-elsner »

Wenn du jetzt noch deine vielen Umwandlungen von string nach integer da ersetzt, wo es sinnlos ist, dann wird dein Quellcode übersichtlicher und es wird für dich und alle anderen auch klarer, welche Variablen Zahlen (integer oder byte) und welche Texte (strings) sind.

Ich würde übrigens für die Zahlenwerte integer nehmen. Bei Byte fliegt dir wieder alles um die Ohren, was über 255 ist.

Also statt k:=StrToInt('0'); einfach k:=0; schreiben.

Unten hast du es ja perfekt erkannt, dass deine Durchschnittswerte Floating point Nummern ergeben.

Das ist übrings meiner Meinung nach das Schöne am Pascal, dass man die Variablen vorher definieren muss, was es wirklich ist. Das macht den Kopf klarer und man erkennt besser was man womit genau macht. Klar muss man etwas mehr schreiben (die ganzen Umwandlungen, z.B. IntToStr(); StrToInt() usw.), aber dafür macht baut man dann weniger Fehler in den Code ein. Siehe bei dir: Es wird eine fehler gemeldet und du wirst gezwungen, über die Nutzung deiner Variablen nachzudenken. Und wenn du das tust, wirst du sehen, wie hübsch und elegant dein Programm noch werden kann.

Viel Spaß noch beim Programmieren. Ich bin auch nur Amateur, aber trotz bescheidener Kenntnisse macht es Laune...

Gruß HE

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Mehrere .txt auswerten Fehler

Beitrag von wp_xyz »

Noch eine Anregung: Du hast für den Mittelwert der Umfrageergebnisse jeder Frage eine Variable reserviert und offenbar enthält deine Umfrage 10 Fragen, so dass du 10 Variablen definierst, e0..e9. Was, wenn du zum Beispiel später nochmal eine Umfrage machst und diese mit demselben Programm auswerten willst, und diese Umfrage hat 50 Fragen? Dann musst du 40 weitere Variablen einfügen und an vielen Stellen Code ändern, um die neuen Variablen zu verwenden.

Für solche Fälle gibt es Arrays:

Code: Alles auswählen

const
  AnzahlFragen = 10;
var
  Ergebnisse: array[0..AnzahlFragen-1] of double; 
Damit kannst du die vielen Zeilen "e1 := StrToInt(Werte[0])+e1;", "e2 := StrToInt(Werte[1] + e2" usw in einer for-Schleife zusammenfassen:

Code: Alles auswählen

var
  i: Integer;
...
  for i := 0 to Anzahlfragen-1 do
    Ergebnisse[i] := StrToInt(Werte[i]) + Ergebnisse[i];
Wenn du nun in einer neuen Umfrage eine andere Anzahl von Fragen hast, musst du nur die Konstante "AnzahlFragen" ändern, und der Rest bleibt unverändert (und sogar das kann man noch automatisieren).

R3dFox
Beiträge: 13
Registriert: Sa 23. Jan 2021, 12:33

Re: Mehrere .txt auswerten Fehler

Beitrag von R3dFox »

Erstmal vielen Dank an h-eisner. Habe ich geändert.
Hätte noch die Frage, ob man die einzelnen Variablen die alle Integer sind und am Anfang auf 0 gesetzt werden zusammenfassen kann. Also k, i, e1, usw :=0. Geht das ?

Dann an wp_xyz. Wo müsste ich das 'for i:=0...usw.' einbauen? Ich blick gerade nicht mehr ganz durch. So viel neues :?

Mein aktuell funktionierender Quelltext:

Code: Alles auswählen

procedure TForm12.Button1Click(Sender: TObject);
var
  Werte: TStringArray;
  F: TextFile;
  Zeile: String;
  n, i, k, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10: Integer;
  m: AnsiString;
begin
  n:=StrToInt(Edit1.Text);
  m:='0';
  k:=0;
  i:=0;
  e1:=0;
  e2:=0;
  e3:=0;
  e4:=0;
  e5:=0;
  e6:=0;
  e7:=0;
  e8:=0;
  e9:=0;
  e10:=0;
  repeat
    i:=i+1;
    k:=k+1;
    m:=IntToStr(k);
    AssignFile(F, 'C:\Users\R3dFox\Desktop\umfrage\data\'+m+'.txt'); //Weist F die Datei zu
    Reset(F); //Öffnet die Datei zum lesen
      while not EOF(F) do
      begin
        Readln(F, Zeile);
        Werte:= Zeile.Split(';');
        e1:=StrToInt(Werte[0])+e1;
        e2:=StrToInt(Werte[1])+e2;
        e3:=StrToInt(Werte[2])+e3;
        e4:=StrToInt(Werte[3])+e4;
        e5:=StrToInt(Werte[4])+e5;
        e6:=StrToInt(Werte[5])+e6;
        e7:=StrToInt(Werte[6])+e7;
        e8:=StrToInt(Werte[7])+e8;
        e9:=StrToInt(Werte[8])+e9;
        e10:=StrToInt(Werte[9])+e10;
      end;
        CloseFile(F);
  until i=n;
  Label1.Caption:=FloatToStrF(e1/n, ffnumber, 4, 1);
  Label2.Caption:=FloatToStrF(e2/n, ffnumber, 4, 1);
  Label3.Caption:=FloatToStrF(e3/n, ffnumber, 4, 1);
  Label4.Caption:=FloatToStrF(e4/n, ffnumber, 4, 1);
  Label5.Caption:=FloatToStrF(e5/n, ffnumber, 4, 1);
  Label6.Caption:=FloatToStrF(e6/n, ffnumber, 4, 1);
  Label7.Caption:=FloatToStrF(e7/n, ffnumber, 4, 1);
  Label8.Caption:=FloatToStrF(e8/n, ffnumber, 4, 1);
  Label9.Caption:=FloatToStrF(e9/n, ffnumber, 4, 1);
  Label10.Caption:=FloatToStrF(e10/n, ffnumber, 4, 1);
end; 

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Mehrere .txt auswerten Fehler

Beitrag von wp_xyz »

Im Anhang findest du ein kleines Projekt, in dem statt einzelner Ergebnis-Variablen ein Array verwendet wird. Außerdem wird für die Anzeige der Ergebnisse ein StringGrid verwendet, das eine flexible Änderung der Zeilenzahl (d.h. Anzahl der Fragen) zulässt. Ich habe einige Kommentare reingeschreiben. Um Verwirrung vorzubeugen: da mir nicht mehr als 4 einigermaßen sinnvolle Fragen eingefallen sind, habe ich keine 10 Fragen vorgesehen.
Dateianhänge
umfrage.zip
(3.17 KiB) 56-mal heruntergeladen

R3dFox
Beiträge: 13
Registriert: Sa 23. Jan 2021, 12:33

Re: Mehrere .txt auswerten Fehler

Beitrag von R3dFox »

Oh wow.. Vielen Dank dafür. Ich werde es ausprobieren und dann bescheid geben, wenn alles funktioniert. :)

R3dFox
Beiträge: 13
Registriert: Sa 23. Jan 2021, 12:33

Re: Mehrere .txt auswerten Fehler

Beitrag von R3dFox »

Es hat funktioniert. Es war auch super verständlich erklärt.
Kann mich gar nicht genug bedanken!

Werde diese Frage nun als gelöst markieren und falls ich weitere Fragen habe eine neue erstellen.

Danke an alle die mir geholfen haben. Sehr nette Leute. Super Forum!:)

Antworten