Funktion für nur Zahlen und nur Buchstaben
-
wie waers mit...?
int isDigit(int ch) { if (ch <= '0') { return 0; } else if (ch >= '9') { return 0; } else { return 1; } }
PS: mit [code] will ich ausdruecken, dass dies fuer mich kein akzeptables C mehr ist.
-
bool isDigit(int ch) { switch(ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return true; default: return false; } }
Übersichtlicher gehts wohl kaum!
-
bool isDigit(int ch) { return (((ch - '0') ? false : true) || ((ch - '1') ? false : true) || ((ch - '2') ? false : true) || ((ch - '3') ? false : true) || ((ch - '4') ? false : true) || ((ch - '5') ? false : true) || ((ch - '6') ? false : true) || ((ch - '7') ? false : true) || ((ch - '8') ? false : true) || ((ch - '9') ? false : true)) ? true : false; }
Schön, so gefällts mir bisher am besten! Oder man nimmt isdigit...
-
nice jungs!
-
Power Off schrieb:
1. Den Datentyp "bool" gibt es erst seit C99. Es gibt immer noch viele Compiler, die keinen bool-Typ haben. Also solltest Du zumindest so etwas wie
#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L typedef enum { false, true } bool; /* fuer alte Compiler */ #endif
dazuschreiben.
seit 99 sind 6 jahre her.
2. Im Gegensatz zu C++ sind in C Zeichenkonstanten vom Typ "int", und nicht "char".
das char dient vor allem der kommentierung, was da reingeht. genauso das bool beim ausgang.
3. Boolescher Ausdruck ohne Kennzeichnung
Ein Anfaenger koennte Verstaendnisprobleme kriegen, wenn er den Ausdruck "return '0' <= ch && ch <= '9';" liest.
Daher waere es besser, ueber den Conditional-If-Operator zu zeigen, welche Werte wann zurueckgegeben werden.mit dem ?: behebst du nir ein problem, das entstanden ist, weil du ist statt bool lieferst.
int isDigit( int ch ){ return '0' <= ch && ch <= '9' ? 1 : 0; }
das ist zu undeutlich, wenn ich deinen gedanken weiterverfolge. denn immernoch muß der anfänger "'0' <= ch && ch <= '9'" lesen und verstehen. das ist auch bei meinem stil ein problem und war eine vernachlässigung, um dich nicht vollends zu erschrecken.
der nube muß erstmal erkennen, daß die teile '0'<=ch und ch<='9' bereits bool zurückgeben.
alsoint isDigit( int ch ){ return ( '0' <= ch ? 1 : 0 ) && ( ch <= '9' ? 1 : 0 ) ; }
und für den gesamtausdrück natürlich auch nocht. woher soll man sonst wissen, was && zurückgibt?
int isDigit( int ch ){ return ( '0' <= ch ? 1 : 0 ) && ( ch <= '9' ? 1 : 0 ) ? 1 : 0; }
wobei ich finde, daß man statt ?1:0 dahinter viel besser !! davor schreibt.
int isDigit( int ch ){ return !!( !!('0' <= ch) && !!(ch <= '9') ); }
ich kann deine gedanken nachvollziehen, aber ich verstehe nicht, warum du das eigentlich machst.
ich hingegen würde
bool isDigit( char ch ){ return '0' <= ch && ch <= '9'; }
verbessern zu
#define RANGE(min,x,max) ((min)<=(x))&&((x)<=(max)) bool isDigit( char ch ){ return RANGE('0',x,'9'); }
-
volkard schrieb:
seit 99 sind 6 jahre her.
Sag das mal jemand, der auf einem alten Betriebssystem mit alten Entwicklungswerkzeugen arbeiten muss. Der freut sich bestimmt!
volkard schrieb:
das char dient vor allem der kommentierung, was da reingeht. genauso das bool beim ausgang.
Dabei vernachlaessigst Du das Problem, dass z.B. getchar() Integers zurueckliefert. D.h. beim Aufruf muss man nach char casten. Toll!
volkard schrieb:
#define RANGE(min,x,max) ((min)<=(x))&&((x)<=(max)) bool isDigit( char ch ){ return RANGE('0',x,'9'); }
Prinzipiell sehr schoen, aber die Parameterreihenfolge ist sehr bizarr (von dem Fehler in isDigit() mal abgesehen -- es muss "ch" statt "x" heissen).
Besser und logischer waere:
#define RANGE(x,min,max) ((min)<=(x))&&((x)<=(max)) bool isDigit( int ch ){ return RANGE( ch, '0', '9' ); }
-
volkard schrieb:
mit dem ?: behebst du nir ein problem, das entstanden ist, weil du ist statt bool lieferst.
Ich verstehe ungefaehr, durch die Tippfehler, was Du damit sagen willst.
Leider ein weiterer Irrtum von Dir: Der Ergebnistyp eines ? : Operatorpaars ist gleich dem Ergebnistyp des eingetretenen Falles.
Also liefert bei "bool" der Ausdruck "x ? true : false" auf jeden Fall ein Ergebnis vom Typ bool.
Siehe auch Kapitel 6.5.15 im C Standard (ISO 9899:1999).
Die Regel "int always wins" gilt schon seit dem ersten C Standard (1990) nicht mehr.
-
Power Off schrieb:
Prinzipiell sehr schoen, aber die Parameterreihenfolge ist sehr bizarr
ja, das "subjekt" sollte an erster stelle in der parameterliste stehen. aber hier gewinnt die konvetion, denn borland liefert seit urzeiten eine range aus mit dem subjekt in der mitte und jeder kennt und mag sie. gleiche geschichte wie random().
-
Power Off schrieb:
volkard schrieb:
mit dem ?: behebst du nir ein problem, das entstanden ist, weil du ist statt bool lieferst.
Ich verstehe ungefaehr, durch die Tippfehler, was Du damit sagen willst.
Leider ein weiterer Irrtum von Dir: Der Ergebnistyp eines ? : Operatorpaars ist gleich dem Ergebnistyp des eingetretenen Falles.warum sagte das?
oder so:
int isDigit( int ch ){ return '0' <= ch && ch <= '9' ? 1 : 0; }
erstmal danke für die ganzen aufklärungen, wie C geht. liege ich noch richtig, daß hier das ?1:0 gar nichts für den compiler bringt? es muß also was sein, was für den menschen da ist. soll das ?1:0 deutlich machen, daß der ausdruck "sozuagen" einen bool liefert, nur im kleidchen eines int? und hierzu sagte ich, daß der bedarf nur entsanden ist, weil du int statt bool lieferst.
-
volkard schrieb:
erstmal danke für die ganzen aufklärungen, wie C geht. liege ich noch richtig, daß hier das ?1:0 gar nichts für den compiler bringt? es muß also was sein, was für den menschen da ist. soll das ?1:0 deutlich machen, daß der ausdruck "sozuagen" einen bool liefert, nur im kleidchen eines int? und hierzu sagte ich, daß der bedarf nur entsanden ist, weil du int statt bool lieferst.
Es waren 2 Versionen, eine mit "bool" und eine ohne.
Und ja, ich finde das mit "? :" lesbarer, vor allem wenn man den Code nur ueberfliegen will, dann seh ich sofort: Aha, da kommt das zurueck.
Das ist halt Geschmackssache.
Genauso wie ich "for ( ; ; ) ... continue ... break" auf die Schnelle lesbarer finde als "while () ..." an der Stelle jedenfalls, wo ich es verwendet habe. Beim Programmieren spart das auch einige Zeit beim Denken, z.B. wie ich das jetzt in eine while-Schleife verpacke. Natuerlich in dem Fall vielleicht nicht angebracht, aus den Gruenden, die ihr genannt habt, aber es spart tatsaechlich Zeit, wenn man haufenweise solchen Code schreiben muss. Wenn man nicht viel Zeit hat, kann's um jeden Sekundenbruchteil gehen, den man spart -- deswegen benutze ich auch GVIM als Editor.
-
Power Off schrieb:
Besser und logischer waere:
#define RANGE(x,min,max) ((min)<=(x))&&((x)<=(max)) bool isDigit( int ch ){ return RANGE( ch, '0', '9' ); }
logischer garantiert nicht, da volkards vorschlag viel näher an der mathematik ist mit 1<=x<=9.
Sag das mal jemand, der auf einem alten Betriebssystem mit alten Entwicklungswerkzeugen arbeiten muss. Der freut sich bestimmt!
irgendwo muss man einen Schlussstrich ziehen.
Leider ein weiterer Irrtum von Dir: Der Ergebnistyp eines ? : Operatorpaars ist gleich dem Ergebnistyp des eingetretenen Falles.
Also liefert bei "bool" der Ausdruck "x ? true : false" auf jeden Fall ein Ergebnis vom Typ bool.
ich glaub, was volkard meint ist: wenn der vergleich bool zurückgibt, hat dein operator absolut keinen sinn, vergleichbar mit folgender Zeile:
!!true;
er bringt keine lesbarkeit mehr, sondern nur mehr code-bloat. Dein Code hat wirklich nur an der Stelle sinn, wo du als "kompabilitätsgründen" int zurückgibst, da er dort etwas _macht_
Und ja, ich finde das mit "? :" lesbarer, vor allem wenn man den Code nur ueberfliegen will, dann seh ich sofort: Aha, da kommt das zurueck.
wenn die funktion bool zurückgibt weis ich: entweder, es kommt true, oder false zurück. "Sachertorte" kann ich als rückgabewert also schon ausschließen
-
Power Off schrieb:
Genauso wie ich "for ( ; ; ) ... continue ... break" auf die Schnelle lesbarer finde als "while () ..." an der Stelle jedenfalls, wo ich es verwendet habe. Beim Programmieren spart das auch einige Zeit beim Denken, z.B. wie ich das jetzt in eine while-Schleife verpacke. Natuerlich in dem Fall vielleicht nicht angebracht, aus den Gruenden, die ihr genannt habt, aber es spart tatsaechlich Zeit, wenn man haufenweise solchen Code schreiben muss. Wenn man nicht viel Zeit hat, kann's um jeden Sekundenbruchteil gehen, den man spart -- deswegen benutze ich auch GVIM als Editor.
Du sagst ja selbst, dass du schon einige Zeit dabei bist. Scheinbar bist du damals sofort in die Zeitdruck-Programmierung eingestiegen während andere hier auch ab und an mal ein paar Momente zum rumbasteln hatten. Anders kann ich mir nämlich nicht erklären wieso dir bei einem Problem nicht intuitiv die passende Schleife einfällt. Ich mache es immer in der Reihenfolge "denken -> tippen", was sich bisher immer als relativ praktisch erwiesen hat. Bei komplexeren Sachen kritzelt man sich dann halt kurz ein Diagramm und denkt mal ein paar Sekunden nach wie man das Problem geeignet strukturieren kann. Das ist vorher ein kleiner Mehraufwand der meiner Erfahrung nach im Endeffekt unheimlich viel Zeit spart.
-
Walli schrieb:
Du sagst ja selbst, dass du schon einige Zeit dabei bist. Scheinbar bist du damals sofort in die Zeitdruck-Programmierung eingestiegen während andere hier auch ab und an mal ein paar Momente zum rumbasteln hatten. Anders kann ich mir nämlich nicht erklären wieso dir bei einem Problem nicht intuitiv die passende Schleife einfällt. Ich mache es immer in der Reihenfolge "denken -> tippen", was sich bisher immer als relativ praktisch erwiesen hat. Bei komplexeren Sachen kritzelt man sich dann halt kurz ein Diagramm und denkt mal ein paar Sekunden nach wie man das Problem geeignet strukturieren kann. Das ist vorher ein kleiner Mehraufwand der meiner Erfahrung nach im Endeffekt unheimlich viel Zeit spart.
Ist ja schoen, dass Du while-Schleifen so cool findest, aber mir gefallen halt for-Schleifen besser.
Was der "richtige Schleifentyp" ist, liegt im Ermessensspielraum des Programmierers, wuerde ich sagen.
Und: Es gibt beim Programmieren durchaus Situationen, in denen man gar keine Zeit zum Denken hat. Toll, wenn Du das Problem noch nicht hattest.
Ich denke beim Programmieren schon lange nicht mehr bewusst nach. Geht alles vollautomatisch.
Diagramme! Du bist echt lustig, Mann!
-
Power Off schrieb:
Ich denke beim Programmieren schon lange nicht mehr bewusst nach.
*kich*
-
Ich denke beim Programmieren schon lange nicht mehr bewusst nach.
Unmöglich.
-
Power Off schrieb:
Ist ja schoen, dass Du while-Schleifen so cool findest, aber mir gefallen halt for-Schleifen besser.
Schön! Warum benutzt du eigentlich eine Hochsprache wenn die so viele unnütze Konstukte bietet?
Power Off schrieb:
Und: Es gibt beim Programmieren durchaus Situationen, in denen man gar keine Zeit zum Denken hat.
Ich möchte nicht deine Software benutzen müssen.
Power Off schrieb:
Diagramme! Du bist echt lustig, Mann!
Ich meine nicht so einen "UML-von-vorne-bis-hinten-Quatsch" wie er einem an der Uni immer als gängige Praxis eingeredet wird sondern simple Skizzen auf Papier. Wenn du die nicht brauchst... schön. Aber du denkst ja sowieso nicht beim programmieren, warum also Gedankenstützen auf Papier? Und sowieso: Du hast ja so wenig Zeit, dass du zu jeder Tages- und Nachtzeit innerhalb von wenigen Minuten auf neue Beiträge reagieren kannst . Langsam wird es echt lächerlich mit dir.
-
Walli schrieb:
Ich meine nicht so einen "UML-von-vorne-bis-hinten-Quatsch" wie er einem an der Uni immer als gängige Praxis eingeredet wird sondern simple Skizzen auf Papier. Wenn du die nicht brauchst... schön. Aber du denkst ja sowieso nicht beim programmieren, warum also Gedankenstützen auf Papier? Und sowieso: Du hast ja so wenig Zeit, dass du zu jeder Tages- und Nachtzeit innerhalb von wenigen Minuten auf neue Beiträge reagieren kannst . Langsam wird es echt lächerlich mit dir.
Wenn ich zur Zeit einen Job haette, wuerde ich mit Sicherheit kaum hier posten ... dann haette ich keine Zeit mehr.
Kommst Du Dir nicht megatoll vor, mit Deinen Vorurteilen?
-
impossible schrieb:
Ich denke beim Programmieren schon lange nicht mehr bewusst nach.
Unmöglich.
Alles ist unmoeglich, solange wie man nicht damit konfrontiert wird.
Ich hatte zwei megastressige Arbeitsverhaeltnisse in den letzten 9 Jahren.
Mit der Zeit geht einem alles in Fleisch und Blut ueber -- wie Autofahren.
Aber sei echt froh, wenn's bei Dir noch nicht so schlimm ist.
-
Power Off schrieb:
Ist ja schoen, dass Du while-Schleifen so cool findest, aber mir gefallen halt for-Schleifen besser.
Er findet while-Schleifen nicht "cool". Der einzige, der Sprachmittel unabhängig von Sinn und Zweck betrachtet, bist du.
Power Off schrieb:
Ich denke beim Programmieren schon lange nicht mehr bewusst nach. Geht alles vollautomatisch.
Man kann deinem Code ansehen, dass er ohne bewusste Hirntätigkeit entstanden ist.
Power Off schrieb:
Mit der Zeit geht einem alles in Fleisch und Blut ueber -- wie Autofahren.
Jetzt will ich nicht nur mit deinem Code nichts zu tun haben, ich will dir auch nicht auf der Straße begegnen.
Wenigestens bist du konsequent. Dein Code passt zu deinem Auftreten.
-
MFK schrieb:
Man kann deinem Code ansehen, dass er ohne bewusste Hirntätigkeit entstanden ist.
Ich fasse das Kompliment auf! Danke!
Nee, im Ernst, es hat Vor- und Nachteile. Nachteil ist: Wenn mir nix einfaellt, hab ich ein Problem. Vorteil ist: Nahezu fehlerfreie Software ohne nachzudenken hinzubekommen kann nicht jeder.
Meine ehem. Arbeitgeber haben sich regelmaessig darauf verlassen, dass ich immer sofort eine Loesung fuer auch noch so komplexe Probleme gefunden habe. Einmal hab ich z.B. ein Projekt realisiert, bei dem vorher ein Gutachten gemacht worden war, dass es technisch unmoeglich sei. Mein Chef sagte mir das, und fragte mich, ob ich es machen wolle. Und ich sagte ja, und dann machte ich es. Der Kunde war sehr zufrieden mit dem Endprodukt.
In der betreffenden Firma machte ich immer die Sachen, die niemand anders machen wollte oder konnte.
Ich bin sozusagen einer der Muellmaenner der Softwareindustrie! Ich mach alles!