Funktion für nur Zahlen und nur Buchstaben
-
volkard schrieb:
du darfst inzwischen sogar in C kleine funktionen bauen. SCNR
Gell, sowas hat seine Vorteile!
-
Power Off schrieb:
Konfusius schrieb:
@PowerOff
das funzt leider nicht. wenn du zB "123Hallo" eingibst, dann wird scanf() "123" einlesen, 1 zurückgeben, und den rest der eingabe unberührt lassen.Hast recht, gegen Tippfehler nicht immun.
Hier ist eine bessere Loesung:
#include <stdio.h> int readnum( int* result ) { int v = 0; /* wert */ int s = 1; /* vorzeichen: 1 = +, -1 = - */ int k = 0; /* ok; 0 = falsch, 1 = wahr */ int c = getchar(); while ( c != EOF && c != '\n' && c != '-' && ( c < '0' || c > '9' ) ) { c = getchar(); } if ( c == '-' ) { s = -1; c = getchar(); } while ( c >= '0' && c <= '9' ) { v = v * 10 + ( c - '0' ); c = getchar(); k = 1; } while ( c != EOF && c != '\n' ) c = getchar(); if ( k ) *result = v * s; return k; } int main( int argc, char** argv ) { int w; for (;;) { int nflds; printf( "Watt eingeben (Ganze Zahl): " ); if ( !readnum(&w) ) { /* Benutzer hat keine Ganzzahl eingegeben */ printf( "\nHaeh?! Was soll das darstellen? Gib doch eine Ganzzahl ein!\n" ); continue; } break; } printf( "\nWatt = %d\n", w ); /* Sichtkontrolle */ return 0; }
bauste immer so schlechten code?
-
compilerbauer seit 1986 schrieb:
bauste immer so schlechten code?
Grundsätzlich, warum?
-
while( 1 )
{
int taste = getch();
if( taste=='\r' )break;
if( taste>='0' && taste<='9' || taste=='\b' )
{
}
else
{continue;} //ignorieren; continue= sprung zum while(1)
int len = strlen( Buffer );
Buffer[len]=taste;
Buffer[len+1]=0;
putch( taste ); //anzeigen
}
soweit funzt das auch, aber nun muss ich noch wissen wie ich das taste=='\b'
so richtig einbaue, das ich auch backspace benutzen kann...
-
Doedel schrieb:
soweit funzt das auch, aber nun muss ich noch wissen wie ich das taste=='\b'
so richtig einbaue, das ich auch backspace benutzen kann...mach einfach "for(;;)cout<<getch()<<' '; udn schau dir an, welche zahl (oder welche zahlen!) ein druck auf die gesuchte taste erzeugt.
-
Power Off schrieb:
compilerbauer seit 1986 schrieb:
bauste immer so schlechten code?
Grundsätzlich, warum?
um deine beiträge in anderen diskussionen in neuem licht zu sehen.
[cpp] for (;;) { int nflds; printf( "Watt eingeben (Ganze Zahl): " ); if ( !readnum(&w) ) { printf( "\nHaeh?! Was soll das darstellen? Gib doch eine Ganzzahl ein!\n" ); continue; } break; } [/cpp]
was man sich alles einfallen läßt, um ein goto zu vermeiden.
mach doch lieber sowas mit goto, wenn du schleifen noch nicht so kannst.printf( "Watt eingeben (Ganze Zahl): " ); while ( !readnum(&w) ) printf( "\nHaeh?! Was soll das darstellen? Gib doch eine Ganzzahl ein!\n" );
-
was ist denn mit (&w) gemeint?
-
volkard schrieb:
was man sich alles einfallen läßt, um ein goto zu vermeiden.
mach doch lieber sowas mit goto, wenn du schleifen noch nicht so kannst.Ja klar, ich mache das bloß, weil ich mich mit Schleifen nicht auskenne.
Falls Dir "continue" und "break" unbekannt sein sollten, schau mal in
den C Standard (ISO 9899:1999) unter Kapitel 6.8.6.2 und 6.8.6.3.
-
Doedel schrieb:
was ist denn mit (&w) gemeint?
Ermittelt die Adresse von "w". Nötig, weil readnum() einen Zeiger auf Integer erwartet.
-
der gibt mir for(;;)cout<<getch()<<' ';
da ne 8 aus für Backspace, wie bau ich das jetzt in das Programm ein???
-
@Doedel kauf dir n buch ueber c und schau dir mal die funktionen der stdio an!
und lerne lerne... programmieren hat auch viel mit lesen zu tun!!!
-
hab ich schon.... hab ich bloß schlauerweise nicht mit!
aber trotzdem danke erstmal, ich krieg das schon noch hin!!!
-
Doedel schrieb:
der gibt mir for(;;)cout<<getch()<<' ';
da ne 8 aus für Backspace, wie bau ich das jetzt in das Programm ein???so:
8
schreibs einfach hin, so wie '\n' oder 'a' auch.
-
Power Off schrieb:
volkard schrieb:
was man sich alles einfallen läßt, um ein goto zu vermeiden.
mach doch lieber sowas mit goto, wenn du schleifen noch nicht so kannst.Ja klar, ich mache das bloß, weil ich mich mit Schleifen nicht auskenne.
und das fatale dran ist ja, daß nach eigenen angaben schon recht lange programmierst.
Falls Dir "continue" und "break" unbekannt sein sollten, schau mal in
den C Standard (ISO 9899:1999) unter Kapitel 6.8.6.2 und 6.8.6.3.es geht doch nicht drum., continue und break einzusetzen, sondern es nicht einzusetzen.
du hast dort, wo ein while reicht, stattdessen for, if, break und continue gesetzt. das ist doch pures obfuscating. und die andere funktion ist schlicht unlesbar. deswegen hab ich sie auch nicht verbessert, weil ich keine lust hab, ein rätsel da zu lösen, was die funktion macht.
aber falls du mal lust hast, nimm wenigstens isdigit, mach das überlesen von whitespaces in ne eigene funktion, mach das lesen eines unsigneds in eine funktion und signed-lesen wird mithilfe von unsigned-lesen implementiert. und schau wenigstens nach dem schreiben nochmal über den code, ob was zu verbessern ist.
-
volkard schrieb:
Power Off schrieb:
volkard schrieb:
was man sich alles einfallen läßt, um ein goto zu vermeiden.
mach doch lieber sowas mit goto, wenn du schleifen noch nicht so kannst.Ja klar, ich mache das bloß, weil ich mich mit Schleifen nicht auskenne.
und das fatale dran ist ja, daß nach eigenen angaben schon recht lange programmierst.
das mein ich ja er soll erst mal LERNEN!!
-
volkard schrieb:
es geht doch nicht drum., continue und break einzusetzen, sondern es nicht einzusetzen.
du hast dort, wo ein while reicht, stattdessen for, if, break und continue gesetzt. das ist doch pures obfuscating. und die andere funktion ist schlicht unlesbar. deswegen hab ich sie auch nicht verbessert, weil ich keine lust hab, ein rätsel da zu lösen, was die funktion macht.
aber falls du mal lust hast, nimm wenigstens isdigit, mach das überlesen von whitespaces in ne eigene funktion, mach das lesen eines unsigneds in eine funktion und signed-lesen wird mithilfe von unsigned-lesen implementiert. und schau wenigstens nach dem schreiben nochmal über den code, ob was zu verbessern ist.Wenn Du kein C kannst, dann lass es, volkard. C Bücher gibt's zuhauf.
-
Hier ist eine kommentierte Fassung dieses simplen C Codes, den volkard nicht verstanden hat:
#include <stdio.h> int readnum( int* result ) { int v = 0; /* wert */ int s = 1; /* vorzeichen: 1 = +, -1 = - */ int k = 0; /* ok; 0 = falsch, 1 = wahr */ int c = getchar(); /* lies erstes Zeichen */ /* lies bis entweder EOF, LF, -, oder 0..9 auftaucht */ while ( c != EOF && c != '\n' && c != '-' && ( c < '0' || c > '9' ) ) { c = getchar(); } /* wurde ein - gefunden, setze das Vorzeichen auf negativ. */ if ( c == '-' ) { s = -1; c = getchar(); } /* lies Ziffern (falls vorhanden) */ while ( c >= '0' && c <= '9' ) { /* multipliziere Wert mit 10 und addiere Nominalwert der Ziffer. * Anschliessend, lies naechstes Zeichen */ v = v * 10 + ( c - '0' ); c = getchar(); /* setze "ok" auf 1; Wert enthaelt Ziffern */ k = 1; } /* lies bis Zeilen- oder Dateiende */ while ( c != EOF && c != '\n' ) c = getchar(); /* Ist der Wert in Ordnung, setze Ergebnis mit Vorzeichen */ if ( k ) *result = v * s; /* kehre zurueck */ return k; } int main( int argc, char** argv ) { int w; for (;;) { /* Endlosschleife bis Abbruchbedingung */ int nflds; printf( "Watt eingeben (Ganze Zahl): " ); if ( !readnum(&w) ) { /* Benutzer hat keine Ganzzahl eingegeben */ printf( "\nHaeh?! Was soll das darstellen? Gib doch eine Ganzzahl ein!\n" ); /* Benutzereingabe wiederholen */ continue; } /* Wert erhalten; Benutzereingabe abbrechen */ break; } /* Wert ausgeben */ printf( "\nWatt = %d\n", w ); /* Sichtkontrolle */ return 0; }
Ich hoffe, volkard, dass bei Dir jetzt die Lichter angehen. Fuer jemanden, der andere belehrt, solltest Du wirklich solchen Code lesen koennen (noch dazu als Verfechter der Null-Kommentar-Ideologie, nach der jemand, der einen Source nicht lesen kann, die entsprechende Programmiersprache nicht kann).
-
Power Off schrieb:
Hier ist eine kommentierte Fassung dieses simplen C Codes
lol. die kommentare hättest du dir auch sparen können. was die einzelnen anweisungen machen, ist schon klar.
noch dazu als Verfechter der Null-Kommentar-Ideologie, nach der jemand, der einen Source nicht lesen kann, die entsprechende Programmiersprache nicht kann).
ich vertrete, daß man code vereinfachen soll statt ihn zu kommentieren.
also deine kommentare haben nix gebracht.diesen code halte ich für sehr schlecht lesbar.
int main( int argc, char** argv ) { int w; for (;;) { /* Endlosschleife bis Abbruchbedingung */ int nflds; printf( "Watt eingeben (Ganze Zahl): " ); if ( !readnum(&w) ) { /* Benutzer hat keine Ganzzahl eingegeben */ printf( "\nHaeh?! Was soll das darstellen? Gib doch eine Ganzzahl ein!\n" ); /* Benutzereingabe wiederholen */ continue; } /* Wert erhalten; Benutzereingabe abbrechen */ break; } /* Wert ausgeben */ printf( "\nWatt = %d\n", w ); /* Sichtkontrolle */ return 0; }
und diesen kann ich besser lesen
int main() { int w; printf( "Watt eingeben (Ganze Zahl): " ); while( !readnum(&w) ) printf( "\nHaeh?! Was soll das darstellen? Gib doch eine Ganzzahl ein!\n" ); printf( "\nWatt = %d\n", w ); return 0; }
kann auch sein, daß ich einen schrecklichen fehler mache, aber bewirken die beiden programme nicht das gleiche? falls ja, warum hast du for, break und continue verwendet statt einfach while? ist das mit for in deinen augen besserer code?
-
Au weia. Immernoch nicht gemerkt, dass die while Schleife von volkard dasselbe macht? Dabei kürzer und übersichtlicher als dein for-if-continue-break Geraffel ist?
Und deine Kommentare mit /**/ sind auch schlimm. Zum auskommentieren von ganzen Blöcken nimmst du dann ernsthaft // für jede Zeile?
Edit: Zu spät
-
TactX schrieb:
Au weia. Immernoch nicht gemerkt, dass die while Schleife von volkard dasselbe macht? Dabei kürzer und übersichtlicher als dein for-if-continue-break Geraffel ist?
Und deine Kommentare mit /**/ sind auch schlimm. Zum auskommentieren von ganzen Blöcken nimmst du dann ernsthaft // für jede Zeile?
Edit: Zu spät
Das ist doch völlig egal, welchen Schleifentyp ich da verwende.
Und die Standard-C Kommentare verwende ich grundsätzlich immer in C, weil es immer noch Compiler gibt, die in C keine Zeilenkommentare lesen können (warum auch immer, da sie js schon lange im Standard drin sind).
Ihr solltet echt mal real-world C-Code sehen. Dagegen ist mein Code extrem sauber und aufgeräumt, und auch leicht lesbar.
Klugscheißer gibt's überall.