Pascal Turbo Pascal - Datei einlesen, Array und Vektorspanne

Derbysieger

Cadet 3rd Year
Registriert
Nov. 2009
Beiträge
54
Hi,
ich brauche dringend Hilfe!
Ich muss eine Informatik Aufgabe bis Montag abgeben.
Die Dateien sind im Anhang.
Kann mir jemand helfen?

Folgende Aufgaben:

Schreiben Sie ein Programm, das die Statistiken Minimum und Maximum jeweils für die Tiefst- und
Höchstwerte berechnet. Weiterhin soll der Tag mit der kleinsten und der mit der gr¨oßten Spanne zwischen
den Kursen ermittelt werden. Die Ergebnisse sollen nach der Berechnung in einen verständlichen Text
eingebettet auf dem Bildschirm ausgegeben werden.

1.) eine Prozedur zur Öffnung der Dateien
2.) die eingelesenen Werte sollen auf zwei Zahlen-Arrays abgelegt werden
3.) Minimum und Maximum sollen jeweils mit Funktionen berechnet werden, wobei Datenvektoren mit dem Schlüsselwort var zu übergeben sind
4.) eine Prozedur zur Berechnung der Spanne des Vektors (Differenz zwischen Höchst- und Tiefstwert)

Zu 1) habe ich einen Ansatz, jedoch wird bei der Ausgabe nur ein teil angezeigt.

Program txt_einlesen;
USES wincrt;

VAR Datei: Text;
Gelesen, Pfad: String;

PROCEDURE OpenTxtFile;
BEGIN
ClrScr;
Writeln('Welche Datei soll eingelesen werden? (Pfad)');
Readln(Pfad);
Assign(Datei, Pfad);
Reset(Datei);

REPEAT
Readln(Datei, Gelesen);
Writeln(Gelesen);
UNTIL EOF (Datei);

Close(Datei);
ReadKey;
END;
Begin
OpenTxtFile;
End.

Bei 2) habe ich überhaupt keine Ahnung, zu 3) habe ich auch einen Ansatz:

Program Minimum;
uses wincrt;
const max =100;
var a : ARRAY[1..max] OF INTEGER;
n,i,k : INTEGER;

begin
writeln('Es wird das Minimum einer Folge von n Zahlen bestimmt. ');
writeln;
writeln('Geben Sie für n die Anzahl der Zahlen an, n= ');
readln(n);
writeln('für i=1,...,',n);
writeln;

BEGIN
write('Geben Sie ',n,' Zahlen ein, a= ');
writeln;
writeln;
FOR i:=1 to n DO read(a);
writeln;
END;

k:=1;
FOR i:= 2 TO n DO
IF a < a[k] THEN k:=i;

writeln('Das Minimum ist a[',k,'] = ',a[k]);
End.
end.
 

Anhänge

  • vowhigh2.txt
    478 Bytes · Aufrufe: 281
  • vowlow2.txt
    480 Bytes · Aufrufe: 239
Zuletzt bearbeitet:
also 2) sollte ein Teil von 1) sein, wo bei du die Datei zeilenweise in eine String-Variablie ließt und dann mittels VAL in eine Zahl umwandelst. Wenn VAL keine Fehlerstelle ausgibt, war das Umwandeln erfolgreich und du kannst die Zahl in dein Array aufnehmen, wobei die Länge des Arrays der Anzahl der Zeilen in der Textdatei minus die Summe der fehlerhaften Umwandlungen mit VAL ist.

Bei 3) sollst du 2 Funktionen schreiben, nicht Programme: function Name(var1:typ):typ;
Da übergibst du die Datenvektoren als "Var-Parameter" (Call by Reference) und das Ergebnis speicherst du in der Variablen "Result", die dem Wert der Funktion entspricht.

Bei 4) ist wiederum eine Prozedur gefordert und keine Funktion. Deswegen arbeitest du hier statt mit der Variablen Result einfach mit einem zusätzlichen VAR-Parameter, den du benutzt, wie du es sonst mit Result in einer Funktion machen würdest.

Zusammenfassend in verständlich sollst du folgendes machen:
- Zwei Textdateien einlesen und die Zahlen (eine je Zeile) in Array of Integer abspeichern.
- Für jedes Array den kleinsten und den größten Wert berechnen. (mit Funktionen)
- Den Index mit der höchsten Differenz zwischen den jeweiligen Elementen beider Arrays ermitteln. (mit Prozeduren)
- Das ganze für normalsterbliche Menschen verständlich am Bildschirm ausgeben.

Damit ist die Aufgabe erklärt und alles weitere wäre Hausaufgaben nicht selber machen.
 
zu 2) habe ich keinen schimmer wie ich das machen soll. das ist ja das problem.
Ein Bsp wäre super
 
Da Turbo Pascal pre Delphi keine Dynamischen Arrays unterstützt, benutzt du statische Arrays passender größe:
Code:
type 
  IntArray = Array[0..Max] of Integer;
var
  MinArray,MaxArray = IntArray;

Dann willst du 2 Dateien einlesen, führst also den gleichen Käse 2mal aus. Klassischer Fall für eine Prozedur oder Funktion. Für beide Fälle ändert sich lediglich die Eingabe (Datei) und Ausgabe (Array). Da dein Lehrer auf Prozeduren zu stehen scheint und wir die Arrays als Funktionsrückgabewerte nicht doppelt im Speicher haben wollen, schreiben wir eine schicke Prozedur mit Var-Parameter:

Code:
procedure ReadFile(Filename:string[255];var AArray:IntArray);

innerhalb dieser Funktion öffnest du die Datei zum lesen...
Code:
  Assign(Datei,Filename);
  Reset(Datei);

...und wiederholst bis zum ende der Datei ...
Code:
while not eof(Datei) do

die eingangs schon erwähnte VAL-Operation auf die eingelesene Zeile:
Code:
    Readln(Datei,ZahlString);
    Val(ZahlString,ZahlWert,FehlerStelle);
    if FehlerStelle = 0 then
    begin
      AArray[i] := ZahlWert;
      inc(i);
    end;

Anschließend wird die Datei geschlossen
Code:
Close(Datei);

Und selbstverständlich für beide Dateien aufgerufen.
Code:
begin
  ReadFile('vowlow2.txt',MinArray);
  ReadFile('vowhigh2.txt',MaxArray);
end.

Probier gar nicht erst, das als copy & paste abzugeben. das wird nciht funktionieren.
 
Also soweit bin ich:

Program aktienkurse;
USES wincrt;

TYPE IntArray = Array[0..56] of integer;

VAR Datei : Text;
Gelesen, Pfad, ZahlString : string;
MinArray, MaxArray, vowlow : IntArray;
ZahlWert, FehlerStelle, i : integer;


PROCEDURE OpenTxtFile(Pfad : string; var vowlow : IntArray);

BEGIN

Assign(Datei, Pfad);
Reset(Datei);

WHILE NOT eof(Datei) DO
readln(Datei, ZahlString);
Val(ZahlString,ZahlWert,FehlerStelle);
IF FehlerStelle = 0 THEN
BEGIN
vowlow := ZahlWert;
inc(i);
END;

Close(Datei);

END;

Begin

Writeln('Welche Datei soll eingelesen werden? Bitte geben sie den Pfad ein: ');
Readln(Pfad);
OpenTxtFile(vowlow);
End.


weiß leider nur nicht wo der fehler ist. Und was bedeutet string[255]?
 
Da es sich hier um eine Hausaufgabe handelt und sowas in diesem Forum nicht erlaubt ist, hab ich auch keine Lust, da großartig was zu machen, obwohl ich dir die Lösung präsentieren könnte, aber ich antworte mal auf eine Frage:
Derbysieger schrieb:
Und was bedeutet string[255]?

Die [255] bedeutet, dass der String 255 Zeichen beinhalten kann. (Längere Strings gibt es unter Turbopascal nicht)
Ein String unter Turbopascal ist nichts weiter, als ein Char-Array (Char = 1 Byte), mit der Besonderheit, dass im Index [0] die Länge des Strings steht.
 
Zuletzt bearbeitet:
Hi,
ja Danke für deine Hilfe. Das Problem ist das diese Aufgabe als Abschluss für einen Pascal-Kurs gedacht ist.
Der wird im Studium als individuelle Ergänzung mit 1LP angerechnet. Da ich aber Wirtschaftswissenschaftler bin habe ich da nicht groß die Ahnung.
Für einen Grundkurs der 4 Abendvorlesung lang war finde ich die Aufgabenstellung schon recht komplex.
Gruß Derbysieger
 
Dein Programm funktioniert nicht, weil du grundliegende Elemente der Turbo-Pascal Syntax nicht kennst.

Ich würde dir empfehlen, den Samstag nochmal darauf zu verwenden, ein entsprechendes Tutorial durchzuarbeiten und rauszufinden, was Begin und End so alles können, was der Unterschied zwischen Prozeduren und Funktionen ist, was es mit lokalen und globalen Variablen auf sich hat, was Parameter sind und warum der werte Freiherr zu Guttenberg seinen akademischen Titel nicht länger führen darf.
 
Zurück
Oben