STRESS mit C/C++ Hilfe!!!!
-
Hallo Zusammen
Unterdessen haben wir eine Aufgabe bekommen. Ihr könnt ja mal reinschauen und mir TIPPS geben. Will nicht gerade das resultat. Aber ein Anfang wäre toll.
Danke
-
guck dir z.b. verschiedene atoi() implementierungen an, etwa sowas: http://home.att.net/~jackklein/c/code/getint.html
versuch zu verstehen wie das funzt und dann mach was eigenes draus.
-
Generell solltest du, wenn dir kein Lösungsansatz einfällt, das ganze einfach mal auf dem Papier per Hand machen. Nimm dir eine Zahl und überlege einfach, wie ihr Wert in Rechenschritten zu Stande kommt. Das machste dann einfach in C++ nach.
Ein Tip ist das Dezimalsystem.
-
Du könntest eine kleine Funktion machen, der du nur eine Ziffer übergibst und die dann in einem String zurückgibt (z.B. durch if-Abfragen)
In deiner Hauptfunktion musst du dann nur noch die Ziffern im Array auslesen, sie mit der Funktion in Strings umwandeln und dann zusammensetzen.
-
Ich war mal so nett (na gut eher gelangweilt =)) und hab dir das Grundgerüst für Aufgabe1 gemacht, extras wie nen - oder + vor der Zahl und Längenbegrenzung musst allerdings du einfügen.
Und wieso verwendet dein Lehrer keine Referenz für den Integer 'wert'?
bool stringToInt (char* str, int* wert) { *wert = 0; for( int i = strlen( str ) - 1, pow = 1; i >= 0; --i, pow *= 10 ) { if( isdigit( str[ i ] ) ) { *wert += ( ( str[ i ] - 48 ) * pow ); } else { return false; } } return true; }
-
User--- schrieb:
Ich war mal so nett (na gut eher gelangweilt =)) und hab dir das Grundgerüst für Aufgabe1 gemacht, extras wie nen - oder + vor der Zahl und Längenbegrenzung musst allerdings du einfügen.
Und wieso verwendet dein Lehrer keine Referenz für den Integer 'wert'?
bool stringToInt (char* str, int* wert) { *wert = 0; for( int i = strlen( str ) - 1, pow = 1; i >= 0; --i, pow *= 10 ) { if( isdigit( str[ i ] ) ) { *wert += ( ( str[ i ] - 48 ) * pow ); } else { return false; } } return true; }frickler

-
Und was soll diese Funktion genau bewirken?

-
Ich bringe es einfach nicht fertig.Bitte Hilfe....Danke

-
ähm...nein?
präsentier uns erstmal deine überlegungen, und sag uns, was du nicht kannst. Dann können wir deine Lücken schließen. Wir könnten dir das programm zwar jetzt lösen, aber was dann? die nächsten aufgaben werden garantiert nicht leichter, und du wirst uns wieder um hilfe bitten müssen...aber werden wir dir ewig helfen wollen?
-
Ok Also. Um ehrlich zu sein verstehe ich die Aufgabenstellung nicht richtig. Ich soll ein strin wert eingeben und es soll es dann als int wert ausgeben. Indem es in der ASCI tabelle durchsucht und den wert ausgibt? oder soll es einfach den wert überprüfen und wenn es von 0-9 ist true, alles andere false?
Ich brauche einen startpunkt von was ich ausgehen kann und ein funktionprototyp ist nicht gerade das was ich will.klar hast du recht. ich will es auch lernen und es fertig bringen, aber bei mir hat es noch nicht klick gemacht. wie könnte ich den stoff richtig lernen?Danke
-
OK, gehen wir mal die Aufgabe 1 durch. Vielleicht macht's ja dann klick.
Schreiben Sie eine Funktion, die einen String
String ist hoffentlich klar, oder? Letztendlich ist das nichts anderes wie eine Sequenz von Zeichen. Es gibt verschiedene Repräsentationen von Strings, wie zB C-Strings. Das ist aber ein Detail der Implementierung, darum kümmern wir uns später. Und durch den Funktionsprototyp hat euch der Lehrer ja bereits C-Strings vorgegeben, also old-style nullterminiert.
in einen echten int-Wert umwandeln kann.
Dürfte eigentlich auch klar sein. Dafür steht uns der Typ int zur Verfügung.
Warum im Funktionsprototyp ein Zeiger auf int übergeben wird, liegt daran, dass in C++ Parameter by-value übergeben werden. Alles was du damit in der Funktion machst, überträgt sich somit nicht nach aussen. Deshalb der Zeiger (obwohl es in C++ dafür eigenlich Referenzen gibt), damit wir den äusseren int Wert ändern können. Stichwort: Dereferenzieren.Die Funktion muss also den String Zeichen für Zeichen untersuchen und aus den gefundenen
Ziffern „irgendwie“ den numerischen Wert erstellen.Dazu solltest du dir mal Zahlensysteme anschauen und wie diese funktionieren. Jedem Zahlensystem liegt eine Basis zu Grunde (zB dezimal
10). Und die Wertigkeit jeder Ziffer wird entsprechend durch die Basis bestimmt. Jedes Zeichen unseres Strings ist so eine Ziffer. Was du nun machen musst, ist, jedes Zeichen unseres Strings zu separieren und entsprechend der Basis die Wertigkeit zu bestimmen. Dann addierst du einfach alles auf, um den Gesamtwert (für unser int) zu bekommen. Nur mal als kleinen Gedankenanstoss:[b]12345[/b] = [b]1[/b] * 10000 + [b]2[/b] * 1000 + [b]3[/b] * 100 + [b]4[/b] * 10 + [b]5[/b] * 1Ein Problem hierbei ist, die Zeichen unseres Strings in ihren numerischen Wert umzuwandeln. Bedenke '1' != 1. Hier hilft dir aber die ASCII Tabelle weiter.
Wenn die Funktion ihre Arbeit nicht korrekt
beenden kann, weil z.B. ein ungültiges Zeichen gefunden wird, soll sie ihre Arbeit abbrechen
und einen Fehler zurück melden.Tja, auch das sollte eigentlich klar sein. Hier hilft, dass du einfach jedes Zeichen unseres Strings prüfst, ob es eine passende Ziffer entsprechend unserer Basis sein kann. Wenn nicht, dann gibts halt ein return false.
Der Prototyp der Funktion soll so aussehen:
bool stringToInt (char* str, int* wert);Ehrlich gesagt, kein schöner Prototyp. Mach zumindest
bool stringToInt (const char* str, int* wert);daraus. Und wenn dein Lehrer meckert, dann verweise ihn auf diesen Thread bzw. dieses Forum.

Hierbei ist str ein Zeiger auf den String, der umgewandelt werden soll, wert ist ein Zeiger auf
eine int-Variable, in die der gefundene Wert gelegt werden soll. Wenn ein Fehler auftritt, gibt die
Funktion als Rückgabewert false zurück. In diesem Fall darf der Wert, worauf der Zeiger
wert zeigt, nicht verändert werden. Wenn alles geklappt hat, gibt die Funktion true zurück.Auch das verrät uns schon ein Implementationsdetail. Kleiner Tipp, wir führen unsere Umwandlung in einer temporären int Variable durch und schreiben wert erst am Ende, sofern keine Fehler auftraten.
Gültige Zeichen für einen int-Wert sind die Zifferzeichen 0 – 9 und eventuell an erster Stelle ein
Minuszeichen.Nicht ganz korrekt. int ist einfach ein Typ für Ganzzahlwerte, vollkommen wertungsfrei bzgl. des Zahlensystems. Wahrscheinlich will euch euer Lehrer damit einfach sagen, dass ihr das dezimale Zahlensystem verwenden sollt.
Beachten Sie zudem, dass ein String nicht beliebig lang sein darf, int-Werte können nicht
beliebig gross werden.Den ersten Teil des Satzes kannst du getrost ignorieren, den zweiten nicht. Überlauf ist eben ein weiterer Aspekt der Fehlerbetrachtung. Darüber würde ich mir aber erst am Ende Gedanken machen, zumal das etwas tricky ist. Zuerst sollte mal der grundlegende Algo stehen.
-
___
-
Ohne den Code jetzt im Detail durchgeschaut zu haben, sieht doch schon mal nicht schlecht aus. Alles was ich dir dazu sagen kann, ist, testen, testen, testen.
Und hierif(*str = '-')hat sich unser const schon ausgezahlt. Der Compiler sollte dir einen Fehler bringen und dich, darüber nochmal nachzudenken (= != ==).
-
Ich bekomme beim compilieren einen Fehler genau an dieser Stelle if(*str='-')
Die Nachricht lautet: 32 > assignment of read-only location <Und was könnte ich im Basisprogramm für Testwerte eingeben Zbs?Danke
-
----
-
Du dereferenzierst hier
if (*str == wert )den Pointer auf eine char-Variable und vergleichst ihn dann mit nem Zeiger auf einen double wert, den du oben im Funktionsprototyp vereinbart hast. Und weil du eine Zahl mit einer Speicheraddresse vergleichst meckert er.
-
Was kann ich dagegen tun?
-
jerico schrieb:
Was kann ich dagegen tun?
beginnst du bitte mal, selber zu denken?
btw: es wäre schön, wenn du deinen code wieder reineditieren würdest, so hat das ganze einen Kristallkugel character
-
Ich weiß nich was du mit der Zeile anfangen willst, aber entweder du hast Wert mit großem W gemeint, dann musst du das natürlich hinschreiben, oder du hast wert mit kleinem W gemeint, dann musst du den Pointer dereferenzieren. Aber da kann man ehrlich gesagt auch selbst draufkommen.
MfG
-
-.--