DocBrown Geschrieben 27. Mai 2001 Geschrieben 27. Mai 2001 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 Zitieren
gajUli Geschrieben 27. Mai 2001 Geschrieben 27. Mai 2001 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 Zitieren
DocBrown Geschrieben 27. Mai 2001 Autor Geschrieben 27. Mai 2001 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 Zitieren
gajUli Geschrieben 27. Mai 2001 Geschrieben 27. Mai 2001 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 Zitieren
toosten Geschrieben 27. Mai 2001 Geschrieben 27. Mai 2001 int variable:=0 unsigned char t:=0 int i:=0 solange string!=0 t:=string t:=t-'0' t > 9 nein | ja variable:=variable*10+t | break i++ ps: soll ein struktogramm sein !!! Zitieren
toosten Geschrieben 27. Mai 2001 Geschrieben 27. Mai 2001 #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 } Zitieren
toosten Geschrieben 28. Mai 2001 Geschrieben 28. Mai 2001 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 } Zitieren
Poldi Geschrieben 31. Mai 2001 Geschrieben 31. Mai 2001 jau toosten, was dagegen, wenn du meine sachen auch mal programmierst ... ?! ich hab da noch son nervendes ekliges riesen tcl programm das nie das tut was man ihm sagt ... *ggg* Zitieren
maddin Geschrieben 5. Juni 2001 Geschrieben 5. Juni 2001 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... Zitieren
toosten Geschrieben 5. Juni 2001 Geschrieben 5. Juni 2001 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. . Zitieren
maddin Geschrieben 5. Juni 2001 Geschrieben 5. Juni 2001 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. Zitieren
toosten Geschrieben 5. Juni 2001 Geschrieben 5. Juni 2001 Schon mal was von anwederfreundlich gehört ? :eek: Zitieren
maddin Geschrieben 5. Juni 2001 Geschrieben 5. Juni 2001 schon mal was von wartungsfreundlichem code gehört. aber soll ja jetzt auch egal sein. jeder auf seinem weg. Zitieren
Crush1 Geschrieben 6. Juni 2001 Geschrieben 6. Juni 2001 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! Zitieren
Defender Geschrieben 21. Juni 2001 Geschrieben 21. Juni 2001 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> Zitieren
Defender Geschrieben 21. Juni 2001 Geschrieben 21. Juni 2001 Original erstellt von Defender: <STRONG>[/QB] ...arggh, sorry... :mad: ...also ich hoffe mal nicht dass mein Ruf auf euch zurück fällt... Zitieren
Empfohlene Beiträge
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.