Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

FORTRAN: Maximalwert auslesen lassen... Anfänger!

Koch79 / 3 Antworten / Baumansicht Nickles

Hallo zusammen,


ich muss in Fortran 77 ein Programm schreiben, dass aus 2 Spalten eines Textdokumets die Maximlawerte ausließt. Die Spalten sind nur mit (3) Leerzeichen getrennt. Kann mir jemand eine Anweisung geben wie ich das angehen soll? ich bin ziemlicher Anfänger und habe mich gerade in die verschiedenen Datentypen eingearbeitet.


Desweiteren habe ich ein Programm geschrieben zum üben, dass ein Textdokument mit 4 Zahlen drin öffnet und die dann in einer neuen Datei abspeichert. Nur die Formatierung klappt nicht. Aus Zahlen werden immer seltsame Zeichen. 


z.BSP: àý à0   àý à0   àý à0   àý à0


Das Programm sieht so aus: (habe mal alle mir bekannten Datentypen getestet...)


CHARACTER DRU*10
 REAL A(150), B(150)
 INTEGER I,N
 PARAMETER (PAR=1)
 
 N=30
 
 OPEN(1,FILE='DRU_01.txt',STATUS='OLD')
 OPEN(2,FILE='aus.txt',STATUS='UNKNOWN') 
 OPEN(3,FILE='char.txt',STATUS='UNKNOWN')
 OPEN(4,FILE='par.txt',STATUS='UNKNOWN')
  
  DO  I=0,N
  
   READ(1) A(I)
   B(I)=A(I)
   WRITE(2) B(I)
   WRITE(3) DRU
   WRITE(4) PAR
  ENDDO
  
 CLOSE(1)
 CLOSE(2)
 CLOSE(3)
 
 END


 


Hier ein Auszug was in der DRU_01 Datei steht:


0.0000E+00  0.1624E+01
0.1000E+00  0.1576E+01
0.2000E+00  0.1624E+01
0.3000E+00  0.1624E+01
0.4000E+00  0.1576E+01


Könnt ihr mir helfen?????? BITTEEEEE


DANKE


 


 

bei Antwort benachrichtigen
vergisses Koch79 „FORTRAN: Maximalwert auslesen lassen... Anfänger!“
Optionen

Hallo koch79,

ich habe zwar noch nie in Fortran programmiert,
aber ein paar Tips kann ich Dir dennoch geben.

Erst mal eine Kurzanalyse Deines Programms:

Hier definierst Du ein paar Variablen
CHARACTER DRU*10
REAL A(150), B(150)
INTEGER I,N
PARAMETER (PAR=1)

Warum der String DRU 10 Zeichen lang ist und
warum die Arrays A und B auf 150 Einträge dimensioniert
sind, kann ich hier nicht nachvollziehen.
Vermutlich hast Du irgendwelche Größen genommen,
von denen Du annimmst, dass es damit funktioniert.

OPEN(1,FILE='DRU_01.txt',STATUS='OLD')
OPEN(2,FILE='aus.txt',STATUS='UNKNOWN')
OPEN(3,FILE='char.txt',STATUS='UNKNOWN')
OPEN(4,FILE='par.txt',STATUS='UNKNOWN')

Hier öffnest Du ein paar Files, erst mal
kein weiterer Kommentar.

N=30
DO I=0,N

READ(1) A(I)
B(I)=A(I)
WRITE(2) B(I)
WRITE(3) DRU
WRITE(4) PAR
ENDDO

Es wird 30 (oder 31) Mal eine Schleife durchlaufen.
Innerhalb der Schleife wird zunächst aus der Datei 'DRU_01.txt'
ein Wert in die REAL Variable A(I) gelesen,
an B(I) zugewiesen und in die Datei 'aus.txt'
geschrieben.

Die Schleife wird doch nur 30 Mal durchlaufen,
größer brauchen auch die Arrays nicht sein.

Warum verwendest Du überhaupt Arrays.
Hier würde eine einzige normale Variable REAL A ausreichen.

Änderst Du eigentlich jedesmal das Programm ab,
wenn die zu lesende Datei mehr bzw. weniger als 30 Zeilen hat ?

Anschließend schreibst Du, immer noch innerhalb der Schleife,
den Inhalt von DRU in die Datei 'char.txt'.
Die Variable DRU ist aber nur definiert worden und
ihr wurde niemals ein Inhalt/Wert zugewiesen.
Deshalb ist ihr Inhalt entweder zufällig
(Was eben vorher mal im RAM Chip an dieser Speicherfläche gestanden hat)
oder durch die Laufzeitumgebung auf logisch 0 gesetzt worden.
Jedenfalls schreibst Du 30 Mal einen nicht definierten Inhalt
nach 'char.txt', was so wie Dein Beispiel aus der Anfrage
aussehen könnte.

Vermutlich ist PAR der von der Kommandozeile übergebene
Parameter mit Default Wert 1, falls kein Parameter übergeben wurde.
Diesen Wert schreibst Du ebenfalls 30 Mal nach 'par.txt'.

CLOSE(1)
CLOSE(2)
CLOSE(3)

END

Am Schluss schließt Du die Dateien
(warum eigentlich nicht die 4. auch ?)
und beendest das Programm.

Noch eine Anmerkung zu Dateiinhalten.
Nach Deiner Beschreibung sind die Daten in 'DRU_01.txt'
im ASCII Format als String und nicht binär abgespeichert.
Deshalb mußt Du die Werte vermutlich auch als String
in eine String Variable einlesen, wobei der READ Befehl
wahrscheinlich immer nur ein Zeichen liest.
Wenn Du mit den Werten rechnen willst, mußt Du den String anschliessend
mit einer entsprechenden Funktion in REAL Zahlen konvertieren
und an eine REAL Variable zuweisen.


Fazit
Du solltest Dich nochmals mit den Datentypen, deren Verwendung
und Konvertierung auseinandersetzten.

Auch Deine Vorgehensweise bei der Problemanalyse und
Definition von Lösungsalgorythmen ist stark verbesserungswürdig.
Man bekommt den Eindruck, daß Du relativ ziellos mit den Dir bekannten
Sprachmitteln ausprobierst in der Hoffnung, irgendwann nach
X Versuchen auf eine halbwegs praktikable Lösung zu stoßen.
(Evolutionsprinzip durch zufällige Mutation).

Diese Anmerkungen sind wirklich nicht böse gemeint
und ich will hier auch niemanden "niedermachen".
Der Einstieg in die Programmierung ist nunmal nicht leicht.
Das Thema ist für viele Anfänger erst mal sehr abstrakt
und schwer zu packen.
Ich wollte Dir nur mal die Tatsachen vor Augen führen
und ein paar kleine Hinweise geben, die Dich evtl.
auf den richtigen Weg führen.

Gruss, vergisses

bei Antwort benachrichtigen
Koch79 Nachtrag zu: „FORTRAN: Maximalwert auslesen lassen... Anfänger!“
Optionen

Danke Sehr!

Ich habe wirklich im Moment erst mal nur rumprobiert. Wollte nur mal zeichen einlesen und wieder speichern. Mit Maximalwerten hab ich noch nix gemacht. Gestern habe ich immerhin schon mal ein Programm geschrieben, dass 3 Zahlen abfragt (Tastatureingabe) und den Maximalwert bestimmt... Ich bin stolz!

Kannst du mir noch den Tip geben wie ich denn die ASCI Strings einlese und damit rechne? Einfache binärdaten habe ich heute geschafft einzulesen. Maximalwert geht aber noch nicht.
Ich habe einfach eine Datei mit 4 beliebigen Zahlen erstellt...

VIELEN DANK FÜR DEINE MÜHE! DANKE FÜR DIE KRITIK

bei Antwort benachrichtigen
vergisses Koch79 „Danke Sehr! Ich habe wirklich im Moment erst mal nur rumprobiert. Wollte nur mal...“
Optionen

Wie ich bereits sagte, kann ich zwar programmieren,
kenne mich aber mit Fortran überhaupt nicht aus.

In C gibt jede Menge fertige Funktionen in den
Standard Bibliotheken wie z. B. fgets() zum Lesen einer
ganzen Dateizeile und atof() zum Umwandeln von ASCII nach Float.

Vermutlich gibt es was entsprechendes auch in Fortran,
das mußt Du eben in der Doku nachsehen.
Falls nicht, kann man sich diese Funktionen auch
selber bauen, ist eben etwas mehr Arbeit ....

Hier eine kleine Beschreibung der Funktionsprinzipien.

Das Umwandeln von Strings in Zahlen funktioniert ganz
grob beschrieben ungefähr so:

Computer speichern Informationen als Bits und Bytes.
1 Bit ist die kleinste Informationseinheit und kann
2 Zustände darstellen.
1 Byte ist die Zusammenfassung von 8 Bits und kann damit
2 ^ 8 = 256 Zustände darstellen.

ASCII = American Standards Committee for Information Interchange

Jedes ASCII Zeichen wird intern als eine Zahl gespeichert.
Der 8 Bit ASCII Code kann damit theoretisch 256 verschiedene
Zeichen darstellen.
In dieser Tabelle hat das Zeichen "0" den internen Wert von 48
und die "9" den internen Wert von 57.
Um den Ziffernwert aus einem Buchstaben zu errechnen,
brauchst Du also nur 48 vom ASCII Code abzuziehen und danach
prüfen, ob das Ergebnis zwischen 0 und 9 liegt.
(Ansonsten war es keine Zahl, sondern ein anderes Zeichen)

Beispiel:
Aus "123" machst Du damit 3 Werte 1, 2, 3.
Du musst dann die Stelle mitzählen, die Einzelziffern mit der
entsprechenden 10er Potenz multiplizieren und die
Teilergebnisse addieren.
1*100 + 2*10 + 3 = 123

Bei Kommazahlen oder Werten in Exponentialdarstellung
ist das Ganze natuerlich etwas komplizierter.


Das Lesen aus einer Datei kann z. B. ungefähr so aussehen:

Zuerst einen Lesepuffer vom Typ String / CHAR groß genug
zum Aufnehmen der längsten Zeile in der Eingabedatei deklarieren
und auf 0 initialisieren.
Dann eine CHAR Variable zum Lesen einzelner Buchstaben.
Mit dieser CHAR Variable Buchstabe für Buchstabe einlesen
und diesen Wert an den String anhängen.
Hat sie den Wert 10, ist es ein LineFeed (LF).
Hat sie den Wert 13, ist es ein Carriage Return (CR).
MS- DOS Dateien haben am Zeilenende ein CR/LF,
Unix Dateien nur ein LF.
Wenn Du ein Zeilenende gefunden hast,
musst Du den String nach Zahlen absuchen und konvertieren.
Danach den Puffer wieder auf 0 initialisieren und weiter einlesen.
Das Dateiende wird durch ASCII 26 (EOF) markiert.


Ich würde mich allerdings sehr wundern, wenn es keine
Standardfunktionen für die Aufgabenstellung gäbe.

Viel Spaß, vergisses

bei Antwort benachrichtigen