C Ascii to integer und andersherum - getstring()

  • Ersteller Ersteller DefconDev
  • Erstellt am Erstellt am
D

DefconDev

Gast
Hallo, ich habe folgendes Problem. Ich habe eine Hausaufgabe vor mir liegen, aber ich verstehe noch nicht den ablauf bzw. die Logik.

Aufgabenstellung: Es wird eine Eingabe gemacht, von einer dezimalzahl(maximal 5 stellen hat). Diese Eingabe wird mit der Funktion getstring() in einen string gespeichert.

PHP:
 long int ErsteZahl;
PHP:
getstring(ErsteZahl)

Danach soll geprüft werden ob der eingeben String ausschließlich die ASCII Zeichen 0-9 beinhaltet. Wenn ja soll der entsprechende Integerwert berechnet werden.

Und hier hört mein Verständnis für die Aufgabe auf. Die geht zwar noch weiter aber ich verstehe nicht warum man erst einen dezimal wert eingeben soll, der dann als string abgespeichert werden soll und dann soll man ihn auf die Ascii zeichen 0-9 überprüfen, dass wäre in dezimal nur die zahl 50-59. Und dann soll ich den Integerwert berechnen lassen, den ich eigentlich zuvor schon bei der eingabe hätte berechnen müssen wenn ich sie nicht als string gespeichert hätte.


Und worin liegt genau der Unterschied zwischen getstring() und itostring()

Edit:
erstere speichert jedes zeichen nach eingabe der enter taste in einen string, der zweitere speichert den integerwert x in einen string y. Wenn ich ein nummernpad habe und sowieso nur Deziamalzahlen eingeben soll, ist doch der getstring komplett überflüssig oder nicht?
 
Zuletzt bearbeitet von einem Moderator:
warum man erst einen dezimal wert eingeben soll
Diese Eingabe wird mit der Funktion getstring() in einen string gespeichert.
Du gibst also einen String ein. Dass es sich um eine Zahl handelt weiß der PC nicht und soll er auch erstmal prüfen bevors weitergeht - sonst macht die Umwandlung ja keinen Sinn.

und dann soll man ihn auf die Ascii zeichen 0-9 überprüfen, dass wäre in dezimal nur die zahl 50-59
Nein? 5-Stellige Zahlen aus den Ziffern 0 bis 9 gibt es genau 100.000 Stück nämlich 00000 bis 99999.
Du sollst sicher stellen, dass dein Programm nicht plötzlich die Eingabe "67X23" versucht in eine Zahl umzuwandeln.

Und dann soll ich den Integerwert berechnen lassen, den ich eigentlich zuvor schon bei der eingabe hätte berechnen müssen wenn ich sie nicht als string gespeichert hätte.
Typumwandlungen sind einfach manchmal nötig und gerade in C/C++ notwendig zu lernen. Andere Sprachen sind teilweise "netter" und wandeln im Gegensatz zu C implizit sinnvoll um.

Stell dir vor die nächste Aufgabe besteht darin ein Programm zu schreiben was eine Dateigröße erfahen soll und es ist zB erlaubt "10kb" aber auch "24mb" oder "2,5gb" einzugeben. Spätestens dann musst du universell alle Zeichen für die Eingabe zulassen aber Zahl und Einheit getrennt "extrahieren".
 
Zuletzt bearbeitet:
Es wird eine Eingabe gemacht, von einer dezimalzahl(maximal 5 stellen hat). Diese Eingabe wird mit der Funktion getstring() in einen string gespeichert.
Ist das genau so grammatikalisch bedenklich und unpräzise in der Aufgabenstellung formuliert?

Danach soll geprüft werden ob der eingeben String ausschließlich die ASCII Zeichen 0-9 beinhaltet. Wenn ja soll der entsprechende Integerwert berechnet werden
Wenn es nur aus 0-9 besteht (also auch ohne ,.E- usw.) und maximal 5-stellig ist, dann ist es doch schon fast long int (rechnen müsste man dann nichts mehr)?

Die geht zwar noch weiter aber ich verstehe nicht warum man erst einen dezimal wert eingeben soll, der dann als string abgespeichert werden soll und dann soll man ihn auf die Ascii zeichen 0-9 überprüfen, dass wäre in dezimal nur die zahl 50-59
Wieso das denn bitte? maximal 5-stellig hast Du geschrieben und nur aus 0-9, also 0 bis 99999.

Wenn ich ein nummernpad habe und sowieso nur Deziamalzahlen eingeben soll, ist doch der getstring komplett überflüssig oder nicht?
Was für ein Nummernpad?

long int ErsteZahl;
Stammt diese Zeile von Dir oder aus der Aufgabenstellung?

Ich denke es gibt da heftigere Probleme mit dem Verständnis der Aufgabenstellung, evtl. sollten wir diese in Originalfassung bekommen.
 
Bei Hausaufgaben geht es nicht immer um Sinn, sondern einfach um das Erfüllen der Anforderungen. Wenn der Lehrer sagt, dass ihr die Zahl am Ende mit 1 addieren und danach wieder subtrahieren sollt, dann ändert sich das Ergebnis nicht, aber dennoch müssen die Befehle ausgeführt werden.

Im Idealfall gibt der User wirklich nur Zahlen ein, aber was passiert, wenn der User mal einen Buchstaben eingibt, weil er sich vertippt hat? Wenn hier eine Funktion benutzt wird, die nur interger annimmt, wird eine Fehlermeldung zurückgegeben. Ein String nimmt mehr oder weniger alles auf. Sollte der User eine falsche Eingabe gemacht haben, wäre es sinnvoll ihn darauf hinzuweisen und eine erneute Eingabe machen zu lassen. Auch wenn nur Zahlen eingegeben werden, musst du überprüfen, ob es auch maximal fünf Stellen sind (Stichwort Stringlänge / strlen() -> string length).

Lernziel dieser Aufgabe ist sicherlich das hantieren mit verschiedenen Datentypen. Wie wandel ich einen String in einen Interger? Was muss man beachten?
 
Ein Teil der Aufgabenstellung:

Der Benutzer wird aufgefordert nacheinander zwei Dezimalzahlen(mit jeweils maximal 5 Dezimalstellen) über das Keypad einzugeben. Die Eingabe der Dezimalstellen erfolgt unter der Verwendung der Funktion getstring() und liefert somit zwei Strings.

Diese beiden Strings sollen dahin gehend überprüft werden ob diese ausschließlich die ASCII-Zeichen 0-9 beinhalten. Wenn ja so soll der entsprechende Integer-Wert berechnet werden. Ansonsten soll eine Fehlermeldung ausgegeben werden.

Die ASCII Zeichen 0-9 sind in meiner Tabelle die dezimalwerte 48-57 und die hexawerte 30-39. Da fängt für mich schon das große "Warum die Ascii zeichen?" müsste es nicht heißen, überprüfen sie ob nur die dezimalwerte bzw. integerwerte 0-9 eingegeben wurden.

Du gibst also einen String ein. Dass es sich um eine Zahl handelt weiß der PC nicht und soll er auch erstmal prüfen bevors weitergeht - sonst macht die Umwandlung ja keinen Sinn.

Sagen wir mal die eingabe erfolgt über ein virtuelles nummernpad, es hat die ziffern 0-9 aber auch noch ein paar zeichen. Gesetz dem fall der user macht eine eingabe die wirklich nicht nur zahlen betseht, wäre es dann nicht sinniger mit einer while schleife zu überprüfen ob es sich nur um dezimalwerte handelt und dann "true", speicher in eine variable?
 
Zuletzt bearbeitet von einem Moderator:
Nein, die Eingabe funktioniert immer über Zeichen, die nichts anderes sind als eine Hexadezimalzahl. Diese Zahl sagt dem "Programm" was auf dem Bildschirm dargestellt werden soll. Eine direkt Eingabe eines Integer wertes ist gar nicht möglich. Wirst du nun Aufgefordert die Zahl 123 einzugeben, bekommt dein PC die Zahlen: 0X31 0X32 0X33, das lässt sich nicht in einer Zahl speichern sondern nur in einer Zeichenkette/Array usw.

Das mit dem dein Programm arbeitet ist also nicht die Zahl 123 sondern die Ziffer 1, 2 und 3. Diese sollen nun in einen für dein Programm nutzbaren int-Wert umgerechnet werden.
 
Alles klar, ich gebe die ascii zeichen ein, und der rechner sieht keine zahl sondern ledeglich einen code. Eigentlich auch logisch, solche kleinigkeiten vergesse ich immer wieder, wurde bestimmt schon 100mal erwähnt. :-(

dann hat sich der Unterschied zwischen getstring() und integertostring(x,y) auch geklärt. Super danke dir.
 
Schau dir mal eine ASCII-Tabelle an. Hier sieht man, wo der Bereich der Zahlen (0-9) genau zwischen 48 und 57 (Dezimal) liegt. Das ist vielleicht anschaulicher :)
 
Also erstmal danke an alle denkanstöße und hilfestellungen.

PHP:
int main()
{
char string1[100];

do
{putstring("Eingabe der 1. Zahl");
getstring(String1);
}
while(string1 < 6); // Maximal 5 stellen
}

Kann man das so schreiben? Weist der nun automatisch jedem feldelement des "string1" einen wert zu
 
Zuletzt bearbeitet von einem Moderator:
In diesem Forum musst du etwas aufpassen, da Hausaufgabenthreads gern geschlossen werden. Vor allem wenn sie so unvollständig sind.. dein code kompiliert ja nichtmal und hat einige Fehler. Was includest du bisher? Kopier am besten den gesamten Code.

- Einrückung ist extrem wichtig! Dein Code ist unlesbar... und man könnte sagen "Zumutung".
- (string1 < 6). String ist keine Zahl... wie soll string1 mit einer Zahl verglichen werden? Ist es nachts kälter als draußen? ;)
- "Eingabe der 1. Zahl" Und was ist mit der 2. und 3.? Du brauchst in deiner Schleife eine Zählvariable die du auch in der Ausgabe verwendest.
- getstring(String1); Was ist String1? Es gibt nur string1
 
Zuletzt bearbeitet:
PHP:
int main()
    	{
   		char string1[100];
		long int i;	    

    		do
    		{
	
		putstring("Eingabe der 1. Zahl");
    		getstring(String1);
    		i=stringtoi(String1)
		}
    
		while(i < 100000); // Maximal 5 stellen
    	}
Ergänzung ()

Das mit den weiteren zahlen überlege ich gerade noch, nichts sagen.
 
  1. Was ist stringtoi, welches C benutzt Ihr denn?
  2. Da wird jetzt aber nicht geprüft, ob nur 0-9 als Zeichen eingegeben wurde.
  3. Bitte ignoriere nicht, was andere schreiben, das ist ziemlich unhöflich. Du wolltest Hilfe. Siehe z.B. kuddlmuddls Kommentare zu Einrückung, string1 vs. String 1 usw.
 
PHP:
int main()
    	{
   		char string1[100];
		long int n = 0; //Laufvariabel	    

    		do
    		{
	
		putstring("Eingabe der 1. Zahl");
    		string1[n]=getstring(string1);
    		i=stringtoi(string1);
		n=n+1;
		}
    
		while(i < 100000); // Maximal 5 stellen
    	}

stringtoi = stringtointeger.

Ich habe ihn nicht ignoriert, habe es doch eingerückt, das string1 und String1 ist mir gerade erst aufgefallen.


EDIT: Achso, das ist erst mal das Konstrukt, zum ersten aufgabenabschnitt.
PHP:
 if(string1[n]<0x30 && string1[n]>0x39)
das muss ich mir gleich noch überlegen. :-)
 
Zuletzt bearbeitet von einem Moderator:
Es ist in meinen Augen unmöglich eine Zahl zu finden die kleiner ist als 0x30 und gleichzeitig größer als 0x39 ;) Andersrum wäre es wohl sinnvoller. Auch die Bedingung deiner Schleife solltest du nochmal überprüfen, vielleicht solltest du wirklich das ganze Programm posten. Aber vor allem solltest du mal deinem Code beim "arbeiten" zuschauen ;).
 
Hups ^^

PHP:
 if(string1[n]>=0x30 && string1[n]=<0x39)

Das Problem ist, ich kann es zuhause schlecht compilieren, weil gewisse makros fehlen die auf putstring und getstring zugreifen. Ich progge das mit dem AVR studio das wiederrum soll mit dem HAPSIM kommunizieren, nur leider stürtzt das bei der ersten eingabe ab.


Ja, sehe auch gerade dass die bedingung falsch ist, danke für den hinweis, der überprüft so gesehen nur einen integer wert.
 
Zuletzt bearbeitet von einem Moderator:
nur leider stürtzt das bei der ersten eingabe ab.
Das kann auch leicht passieren wenn man mit Arrays hantiert.. da greift man leicht mal auf eine Stelle zu die garnicht mehr zum Array gehört.
Hilfreich ist es immer sich selbst Testausgaben einzubauen.. so im Sinne von
Code:
fprintf(stderr, "Lese jetzt Buchstabe Nr. %d ein\n", n);
// code...
fprintf(stderr, "Buchstabe Nr. %d erfolgreich gelesen\n", n);
Mich wundert aber grundsätzlich, dass du sagst es stürzt ab. Das kompiliert doch nichtmal, oder?
Ich fürchte ohne zu hause zu kompilieren wirst du das nicht fertig bekommen.. daran würde ich zuerst arbeiten.
Wenigstens so ein standard hello-world wie das hier KLICK muss erstmal laufen.


Und nur mal ganz grundsätzlich: Was denkst du was die Zählvariable zählen soll?
 
Zuletzt bearbeitet:
Also ich habe mich nicht korrekt ausgedrückt, er kompiliert die bsp. die ich auf der platte habe schon, nur sobald ich das HAPSIM dazuschalte, damit ich auch was sehe, wie zb durch putstring , zeigt er mir den text an, aber jegliche eingabe auf diesem virtuellen nummernpad führt zum absturz.

Was meinst du mit der Zählervariable? Also in meinem gedankenkonstrukt, wird eine eingabe in string1 gespeichert und der wert dem 0. feldelement des string1 zugewiesen. Dann wird n erhöht um eins. Oder habe ich einen logikfehler? :-)

Nur i ist nicht stimmig, da überlege ich noch. Was mir aufanhieb einfällt,

EDIT
 
Zuletzt bearbeitet von einem Moderator:
Naja, jetzt ist die Bedingung: Gib so lange eine Ziffer ein bis die Multiplikation der einzelnen größer ist als 59050. Wenn du das so möchtest, ist das ja okay, aber ich vermute nicht, dass danach gefragt ist. Vermutlich gibt es ja irgendeine Taste, die ein Ende der Eingabe bedeutet, so dass man z.B auch einfach nur 5 eintippen kann und fertig.

Ich glaube mit Zähler war gemeint eine Zahl die angibt, welche Ziffernstelle als nächstes eingegeben werden soll.

Ich vermute weiter, dass die GetString Funktion vom Lehrer vorgegeben war oder? Wenn ja fehlt vielleicht ein include?
 
Ne das war ein falscher gedanke, dann könnte man immer die ziffer null oder 1 unendlich eingeben und es geht weiter. Mein ziel ist es ja, dass der User nicht mehr als 5 Ziffern eingeben soll, nur fällt mir die lösung noch nicht ein ^^


Ja, unser prof hat es uns vorgegeben, wir dürfen kein sprintf() oder scanf() benutzen.

PHP:
#include "lcd.h"                // "Einbinden der Funktionalität" für die Nutzung des HAPSIM-LCD
#include "keypad.h"             // "Einbinden der Funktionalität" für die Nutzung des HAPSIM-Keypad
#include "my_string.h"  // "Einbinden der Funktionalität" für die Nutzung der eigenen Stringoperation

Also die include funktionieren, wie gesagt das display funktioniert bis zur eingabe der einzelnen buchstaben.
Ergänzung ()

PHP:
while ((n)*(n+1)*(n+2)*(n+3)*(n+4)<59050 || ((n)+(n+1)+(n+2)+(n+3)+(n+4)<=1);

Also ich verstehe diese Formulierung so, wenn das Produkt der einzelnen Feldelemente von string1 größer ist als 59050 oder die Summe der feldelemente größer/gleich 0 ist, sonst wird die anweisung nicht ausgeführt.

Das sollte doch verhindern dass ein user mehr als 5 ziffern eingeben kann oder?

Klar gibt es eine taste zur eingabe der ziffern die mit enter bestätigt wird, aber ich verstehe die aufgabenstellung so, dass evtl ein user mehr als 5 ziffern eingeben will, und daran will ich ihn hindern.


PHP:
while(n > 5) // das sollte meinen gedanken auch umsetzen, dass man maximal 
 // 5 ziffern eingibt oder?

Das Problem was mir einfällt ist, wenn man doch die 6. ziffer eingibt, speichert er die trotzdem in den string und überprüft erst dann ob n größer als 6 ist oder?
 
Zuletzt bearbeitet von einem Moderator:
Also deine Ergänzung ist ne Endlosschleife.

Zweitens, wenn du einzelne Zeichen einlesen kannst, brauchst du gar kein char Array...

So als Hinweis:
Du hast eine Zahl, hängst eine beliebige Ziffer an, welchen Wert hat die Zahl jetzt Zahl*10+Ziffer

Ahh, und noch was, die Funktion, die du programmieren musst, heißt in stdlib.h long atoi(const char*); wobei atoi mehr kann als das was von dir gefordert wird.

Nen Tipp, nehm mal ein Blatt Papier und ein Stift und überleg dir mal, wie du diese Aufgabe von Hand lösen würdest, ala ich hab hier "eine Kästchenreihe da stehen zahlen drin" (char-Array) wie bekomme ich die in ein großen Kästchen (int) und dann wirste schnell ein System finden und das auch in C umsetzten können.
 
Zurück
Oben