RandyK Geschrieben 25. November 2010 Geschrieben 25. November 2010 Hey Leute, hab mich grad erst angemeldet, weil ich von der uni ne happige Programmieraufgabe gestellt bekommen habe, bei der ich einfach nicht weiter weiß. eigentlich hab ich mit dem anfängerzeug überhaupt keine probleme, aber da ich getchar() mangels nutzen noch nie verwendet hab hab ich einfach keine ahnung was ich hier machen soll. also die aufgabe ist zusammengefasst das nachprogrammieren der scanf() funktion für eine double variable. die genaue aufgabenstellung lautet wie folgt: Schreiben Sie ein C-Programm, das den Benutzer zur Eingabe einer Fließkommazahl auffordert und dann ein möglichst langes Anfangsstück der Benutzereingabe als Fließkommazahl in Festpunktdarstellung interpretiert und in einer double-Variable abspeichert, deren Wert am Ende ausgegeben wird. Benutzen Sie für den Einlesevorgang nur die Bibliotheksfunktion getchar. Fangen Sie ungültige Eingaben (z.B. Eingaben, die mit einem Buchstaben beginnen) ab und berücksichtigen Sie auch negative Zahlen. Auch die Zahl 0 soll erkannt werden, beachten Sie aber, dass keine Zahlen mit mehr als einer Stelle mit der Ziffer 0 beginnen. Sie dürfen nur den bisherigen Vorlesungsstoff verwenden, als z.B. insbesondere keine Felder (Arrays)! mit array wär das ganze ja kein problem, aber das darf man ja nicht verwenden.... ich muss also irgendwie in einer schleife mit getchar zeichen für zeichen einlesen und aus den bisher eingelesenen zeichen die zahl berechnen. die funktion wäre dabei z.b. für c=getchar(), d=variable zum zwischenspeichern des zeichens und die zählvariable i in einer schleife if(i>1) {d=10*d+c;} soweit so gut. allerdings hab ich keine ahnung wie man getchar in einer schleife verwendet und das eingegebene zeichen zwischenspeichert. ich habe alles erdenkliche versucht und gegoogelt ohne ende, finde aber nix dazu. ich hoffe jemand, der sich etwas damit auskennt kann mir weiterhelfen. grüße Randy Zitieren
RandyK Geschrieben 2. Dezember 2010 Autor Geschrieben 2. Dezember 2010 (bearbeitet) Hey Leute, kann mir wirklich keiner helfen? Abgabe is zwar schon vorbei, aber mich würde die Lösung immernoch brennend interessieren, ich schreib in ner Woche Klausur..... so sieht der Code bisher aus, funktioniert aber iwie nich: #include <stdio.h> main() { char c; int value=0; while(1) { if((c=getchar())!='\n') {value=value*10+(c-'0');} else {break;} } printf("%i",value); } } wär toll, wenn mir jemand helfen könnte. Grüße Randy Bearbeitet 2. Dezember 2010 von RandyK Zitieren
RandyK Geschrieben 2. Dezember 2010 Autor Geschrieben 2. Dezember 2010 ok, sorry.... habs grad hinbekommen. #include <stdio.h> main() { char c; int value=0; while(1) { c=getchar(); if(c!='\n') { value=value*10+(c-'0'); } else {break;} } printf("%i",value); } Zitieren
Klotzkopp Geschrieben 2. Dezember 2010 Geschrieben 2. Dezember 2010 ok, sorry.... habs grad hinbekommen.Nein. Du liest eine Ganzzahl (int) ein. Du sollst eine Zahl mit Dezimalteil (double) einlesen. Negative Zahlen bewältigt dein Code auch nicht. Zitieren
lilith2k3 Geschrieben 2. Dezember 2010 Geschrieben 2. Dezember 2010 Nein. Du liest eine Ganzzahl (int) ein. Du sollst eine Zahl mit Dezimalteil (double) einlesen. Negative Zahlen bewältigt dein Code auch nicht. Naja, aber da kann man ja schonmal drauf aufbauen Zitieren
RandyK Geschrieben 2. Dezember 2010 Autor Geschrieben 2. Dezember 2010 (bearbeitet) ja, schon klar... mein Hauptproblem war ja überhaupt zeichenketten mit getchar() einzulesen... habs jetz hinbekommen. Der Code sieht so aus: #include <stdio.h> main() { char c,d='0'; int value=0,value2=0,e=1; while(1) { c=getchar(); if(c=='\n') { printf("Keine Eingabe!\n"); break; } if(c=='+') { d='+'; c=getchar(); } if(c=='-') { d='-'; c=getchar(); } if(c<48||c>57) { printf("Ungueltige Eingabe!\n"); break; } while(1) { while(c>47&&c<58) { value=value*10+(c-'0'); c=getchar(); } if(c=='.') { c=getchar(); while(c>47&&c<58) { value2=value2*10+(c-'0'); c=getchar(); } } break; } if(d!='0'){printf("%c%i.%i\n",d,value,value2);} else {printf("%i.%i\n",value,value2);} break; } } allerdings krieg ich die Abfrage ob die erste Stelle ne null is nich hin... wenn man nur eine Null eingibt, soll es 0.0 ausgeben. Wenn aber nach der Null noch eine andere Zahl kommt, solls eine Fehlermeldung ausspucken. Aber das is das einzige, was dann noch fehlt... Beispiel: Eingabe:0, Ausgabe:0.0, Eingabe:01.9, Ausgabe:Fehlermeldung Gruß Randy Bearbeitet 2. Dezember 2010 von RandyK Zitieren
Servior Geschrieben 2. Dezember 2010 Geschrieben 2. Dezember 2010 Wenn Erste Zeichen = 0 Dann Wenn Zweite Zeichen <> . Dann - Ansonsten - Fehler Zitieren
RandyK Geschrieben 2. Dezember 2010 Autor Geschrieben 2. Dezember 2010 danke für den Tipp!!! Code is jetz fertig... #include <stdio.h> main() { char c,d='0'; int value=0,value2=0,e; while(1) { c=getchar(); if(c=='\n') { printf("Keine Eingabe!\n"); break; } if(c=='+') { d='+'; c=getchar(); } if(c=='-') { d='-'; c=getchar(); } if(c<48||c>57) { printf("Ungueltige Eingabe!\n"); break; } if(c=='0') { c=getchar(); if(c>'0'&&c<='9') { printf("die Erste Zahl darf keine Null sein!\n"); break; } } while(1) { while(c>47&&c<58) { value=value*10+(c-'0'); c=getchar(); } if(c=='.') { c=getchar(); while(c>47&&c<58) { value2=value2*10+(c-'0'); c=getchar(); } } break; } if(d!='0') {printf("%c%i.%i\n",d,value,value2);} else {printf("%i.%i\n",value,value2);} break; } } bis bald Randy Zitieren
Klotzkopp Geschrieben 2. Dezember 2010 Geschrieben 2. Dezember 2010 Du solltest laut Aufgabenstellung in einen double einlesen, nicht in zwei int. Die äußerste while-Schleife ist außerdem überflüssig, da du sie sowieso nach dem ersten Durchlauf mit break verlässt. Zitieren
RandyK Geschrieben 2. Dezember 2010 Autor Geschrieben 2. Dezember 2010 jo, richtig, einen int für die vorkommastellen, einen für die danach... ausgabe is dann "%i.%i" also einfach mit punkt zwischen den integern. Funktioniert einwandfrei. Wieso ist die schleife überflüssig, gibts noch eine andere möglichkeit bei if-abfragen das programm zu beenden, als den break befehl in ner endlosschleife? Zitieren
Klotzkopp Geschrieben 2. Dezember 2010 Geschrieben 2. Dezember 2010 Funktioniert einwandfrei.Nein, funktioniert nur, wenn der Nachkommateil nicht mit einer 0 anfängt. Gib doch mal 0.01 ein. Und laut Aufgabenstellung sollst du in einen double einlesen, nicht in zwei int. gibts noch eine andere möglichkeit bei if-abfragen das programm zu beenden, als den break befehl in ner endlosschleife?Dein while-break-Konstrukt ist im Prinzip ein verstecktes goto. Du könntest if-else-Kaskaden verwenden, oder mit einer return-Anweisung die main-Funktion verlassen und damit das Programm beenden. Zitieren
RandyK Geschrieben 2. Dezember 2010 Autor Geschrieben 2. Dezember 2010 okay, also dass ich nicht auf return komme ist schon komisch^^ , oder? aber was meinst du mit if-else-kaskaden? tjo und wie lässt sich das mit dem nachkommateil bewerkstelligen? Zitieren
RandyK Geschrieben 2. Dezember 2010 Autor Geschrieben 2. Dezember 2010 (bearbeitet) okay, vielen Dank für die Tipps, ich glaub jetz hab ichs hingekriegt... deine Tipps, waren Gold wert, sonst hätt ich ja alles falsch gemacht^^ wieder einiges gelernt! Auch danke an ale anderen #include <stdio.h> main() { char c,d='0'; double value=0,value2=0,e,result; int i=0,j,k=1; c=getchar(); if(c=='\n') { printf("Keine Eingabe!\n"); return 0; } if(c=='+') { d='+'; c=getchar(); } if(c=='-') { d='-'; c=getchar(); } if(c<48||c>57) { printf("Ungueltige Eingabe!\n"); return 0; } if(c=='0') { c=getchar(); if(c>'0'&&c<='9') { printf("die Erste Ziffer darf keine Null sein!\n"); return 0; } } while(c>47&&c<58) { value=value*10+(c-'0'); c=getchar(); } if(c=='.') { c=getchar(); while(c>47&&c<58) { value2=value2*10+(c-'0'); c=getchar(); i++; } } for(j=0;j<i;j++) {k=k*10;} value2=value2/k; result=value+value2; printf("%lf",result); return 0; } EDIT: Ach ja, aber was if-else-Kaskaden sind, würde mich trotzdem interessieren... Gruß Randy Bearbeitet 2. Dezember 2010 von RandyK 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.