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

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

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.

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

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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