Zum Inhalt springen

[c] mit getchar() scanf()-befehl für double variable nachprogrammieren


Empfohlene Beiträge

Geschrieben

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

Geschrieben (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 von RandyK
Geschrieben

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);

}

Geschrieben (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 von RandyK
Geschrieben

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

Geschrieben

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?

Geschrieben
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.

Geschrieben

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?

Geschrieben (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 von RandyK

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...