Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo zusammen,

ich habe folgende Problemstellung:

Ich muß ein Programm schreiben, das

Werte aus einer ASCII-Datei einliest,

diese als Variablen aufnimmt,

mit den Variablen eine Berechnung

der Form r=a1*x^2+a2*x+a3+b1*y^2+b2*y+b3

(a1, a2, a3, b1, b2, b3, x, y aus der Datei)

vornimmt

und das Ergebnis(hier r) in eine zweite ASCII-Datei ausgibt.

Mir macht insbesondere der Datenim- und export und die Deklaration der

Variablen Sorgen. Hat jemand einen Tipp, wie ich das Problem

lösen kann?

Dank im voraus

DocBrown

Geschrieben

Hi DocBrown,

die Schwierigkeit liegt hier darin, dass eine Berechnung mit Werten gemacht werden muss, die als ASCII vorliegen. Also muessen die verschiedenen Substrings herausgeparst und in Zahlentypen (int, float, usw.) umgewandelt werden. Dies geht am besten, indem man die gesamte Formel erstmal als String bzw. char[] in den Arbeitsspeicher liest. Die noetigen Umwandlungsfunktionen (atoi(), atof()) findest Du in der stdlib.h.

Wird ne huebsche Hampelei und ist ganz lehrreich. ;)

Uli

Geschrieben

Hi EisenUli!

Erstmal lieben Dank für Deine Antwort.

Wenn ich Dich richtig verstanden habe, gehst Du davon aus, daß sich dies gesamte Formel in der Datei befindet.

Ich brauche die ASCII-Datei nur für die einzeln Variablen.

Die Formel selbst kann ich im Programm selbst definieren.

Mein größtes Problem ist das "Heraus-Parsen" der Zahlen aus der ASCII-Datei und Definieren dieser Zahlen als Variablen im Programm, bzw. das Zurück-Parsen einer anderen Variablen(des Ergebnisses der Berechnung) in eine andere ASCII-Datei.

Soweit durch Nachlesen herausgefunden habe, wird das über die Funktionen fopen, fread, etc. aus stdio.h realisiert. Ich steige nur leider nicht durch den genauen Funktionsaufruf durch.

DocBrown

Geschrieben

Nun gut, wenn die Variablen in ASCII-Form einzeln in Dateien stehen wird die Sache etwas einfacher. Dann also erstmal als String auslesen und dann munter drauf los. Files behandelst Du mit symbolischen Pointern, die man mit fopen() auf die jeweilige Datei setzt. Hat man dies, gibt es einen ganzen Zoo von Funktionen fuer Lesen oder Schreiben, Pointersetzen usw. Das alles zu erklaeren wuerde hier zu weit fuehren. Du wirst nicht umhinkommen, erstmal ein entsprechendes Tutorial zu dem Thema oder ein Buch zu studieren. Am Beispiel wird dann schnell klar, wie es geht.

Uli

Geschrieben

#include <stdio.h>

#include <iostream.h>

int lese_zahl(unsigned char *,int*); //liesst die zahlen aus der datei

void speicher(FILE *,char *,int); //speichert die ergebnisse in die datei

void main()

{

unsigned char puffer[256];

int zaehler=0;

int laenge;

FILE *fp;

int a1, a2, a3, b1, b2, b3, x, y;

fp=fopen("ein.txt","r"); //datei öffnen

laenge=fread(puffer,1,256,fp); //und in den puffer laden

fclose(fp); //datei schließen

a1=lese_zahl(puffer,&zaehler); //lese a1 usw.

a2=lese_zahl(puffer,&zaehler);

a3=lese_zahl(puffer,&zaehler);

b1=lese_zahl(puffer,&zaehler);

b2=lese_zahl(puffer,&zaehler);

b3=lese_zahl(puffer,&zaehler);

x=lese_zahl(puffer,&zaehler);

y=lese_zahl(puffer,&zaehler);

/* hier kommt deine berechnung rein*/

fp=fopen("aus.txt","w"); //erstelle eine datei aus.txt

speicher(fp,"a1",a1); //speicher "a1=..." usw.

speicher(fp,"a2",a2);

speicher(fp,"a3",a3);

speicher(fp,"b1",b1);

speicher(fp,"b2",b2);

speicher(fp,"b3",b3);

speicher(fp,"x",x);

speicher(fp,"y",y);

fclose(fp);

}

// diese funktion wandelt ascII- zahlen in int um

// übergabe von puffer und zähler als adresse

int lese_zahl(unsigned char *p,int* i)

{

int variable=0,v,x;

x = *i; //adresseninhalt nach x (zaehler)

for (;p[x]!='=';x++) {} //bis zum nächsten '=' gehen

x++; //zum zeichen nach '='

for (;p[x]<='9' && p[x]>='0';x++) //solange pufferzeichen >'0'-zeichen und <'9'-zeichen im ASCII

{

v=p[x]-'0'; //mache zeichen zur ziffer

variable=variable*10+v; //dualzahl * 10 + ziffer

}

*i = x; //aktuelle pufferpos merken

return variable; //rüchgabe der neuen variablen

}

//speichert text und zahl in eine datei

//übergabe von dateihandle, adresse des textanfangs und die zahl

void speicher(FILE *hwd,char *text,int zahl)

{

char stringzahl[20]; //maximale länge von 19 ziffern

int i=18; //letzte ziffer an pos 18

stringzahl[19]=0; //pos nach letzter ziffer muß 0 sein (stringabschluß)

for (;zahl>0;i--) //solange zahl >0

{

stringzahl=zahl%10+'0'; //ziffer zu zeichen und in den string

zahl=zahl/10; //zahl /10 (rest verschwindet bei int)

}

i++; //durch schleife eine pos zu weit vorn

fprintf(hwd,"%s=%s\n",text,stringzahl+i);

//speichern von text und zahlenstring

}

  

Geschrieben

So jetzt noch mit float.

#include <stdio.h>

#include <iostream.h>

#include <math.h>

float lese_zahl(unsigned char *,int*); //liesst die zahlen aus der datei

void main()

{

unsigned char puffer[256];

int zaehler=0;

int laenge;

FILE *fp;

float a1, a2, a3, b1, b2, b3, x, y;

fp=fopen("ein.txt","r"); //datei öffnen

laenge=fread(puffer,1,256,fp); //und in den puffer laden

fclose(fp); //datei schließen

a1=lese_zahl(puffer,&zaehler); //lese a1 usw.

a2=lese_zahl(puffer,&zaehler);

a3=lese_zahl(puffer,&zaehler);

b1=lese_zahl(puffer,&zaehler);

b2=lese_zahl(puffer,&zaehler);

b3=lese_zahl(puffer,&zaehler);

x=lese_zahl(puffer,&zaehler);

y=lese_zahl(puffer,&zaehler);

/* hier kommt deine berechnung rein*/

fp=fopen("aus.txt","w"); //erstelle eine datei aus.txt

fprintf(fp,"a1=%f\n",a1); //ausgabe der floatzahlen

fprintf(fp,"a1=%f\n",a2);

fprintf(fp,"a1=%f\n",a3);

fprintf(fp,"a1=%f\n",b1);

fprintf(fp,"a1=%f\n",b2);

fprintf(fp,"a1=%f\n",b3);

fprintf(fp,"a1=%f\n",x);

fprintf(fp,"a1=%f\n",y);

fclose(fp);

}

// diese funktion wandelt ascII- zahlen in int um

// übergabe von puffer und zähler als adresse

float lese_zahl(unsigned char *p,int* i)

{

float variable=0;

int v,x,k;

x = *i; //adresseninhalt nach x (zaehler)

for (;p[x]!='=';x++) {} //bis zum nächsten '=' gehen

x++; //zum zeichen nach '='

for (;p[x]<='9' && p[x]>='0';x++) //solange pufferzeichen >'0'-zeichen und <'9'-zeichen im ASCII

{

v=p[x]-'0'; //mache zeichen zur ziffer

variable=variable*10+v; //dualzahl * 10 + ziffer

}

if (p[x]=='.' ||p[x]==',') //wenn punkt oder komma dann

{

x++; //zum nächsten zeichen

for (k=1;p[x]<='9' && p[x]>='0';x++)//solange pufferzeichen >'0'-zeichen und <'9'-zeichen im ASCII

{

v=p[x]-'0'; //mache zeichen zur ziffer

variable = variable+v/pow(10,k);//floatzahl + ziffer / 10 hoch k

k++; //exponent+1

}

}

*i = x; //aktuelle pufferpos merken

return variable; //rüchgabe der neuen variablen

}

:D

Geschrieben

jau toosten, was dagegen, wenn du meine sachen auch mal programmierst ... :D:D:D ?!

ich hab da noch son nervendes ekliges riesen tcl programm das nie das tut was man ihm sagt ... *ggg*

Geschrieben

warum so umständlich. wenn ich das richtig verstanden habe stehen die wertte in einer datei und zwar schon der reihe nach.

Beispiel:

// datei: ein.txt

1 2 3 4 5 6 7 8 9 0

und diese werte sollen der reihe nach in verschiedene variablen gespeichert werden.

wenn dem so ist würde ich folgendes programm nehmen.

#include <stdio.h>

int main()

{

FILE* datei;

int a1,a2,a3,a4,a5;

datei = fopen ("ein.txt", "r");

fscanf (datei, "%d %d %d %d %d", &a1, &a2, &a3, &a4, &a5);

fclose (datei);

/* Berechnungen durchführen */

datei = fopen ("zwei.txt", "w");

fprintf (datei, "ergebnis == %d", ergebnis_der_berechnung);

fclose (datei);

}

ist meiner meinung nach etwas einfacher wie das beispiel von toosten...

Geschrieben

Und was machst du bei einem tippfehler (ein leerzeichen mehr) ?

Mein prog reagiert nur auf '=' und nimmt die zahl dahinter solange zahlen kommen und dann sucht es das nächste '=' usw. .

Geschrieben

gegenfrage: was ist schwerer ? zahlen in einer reihe zu schreiben und zwischen jeder ein leerzeichen lassen oder eine = und dahinter eine zahl zu schreiben. ich denke das man bei beiden arten keine größeren probleme haben sollte.

Geschrieben

Schön zu sehen, daß es außer mir noch ein paar andere Anwendungsentwickler gibt, die einmal wirklich selber eine Anwendung entwickeln können.

JUNGS->Wir müssen den Namen der Fachinformatiker in Ehre halten - sonst werden wir noch mit den anderen Luschen, die nur zum Popeln in den Unterricht gekommen sind, verglichen.

Nicht vergessen, der Ruf aller Fachinformatiker fällt nachher auch auf uns zurück!

  • 3 Wochen später...
Geschrieben
Original erstellt von Crush1:

<STRONG>...JUNGS->Wir müssen den Namen der Fachinformatiker in Ehre halten - sonst werden wir noch mit den anderen Luschen, die nur zum Popeln in den Unterricht gekommen sind, verglichen.

Nicht vergessen, der Ruf aller Fachinformatiker fällt nachher auch auf uns zurück!...</STRONG>

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...