Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Nur Eingabe von Zahlen erlauben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
13.05.2003, 20:40 Uhr
Der Computer



Hy!

Ich habe schon in den anderen Berichten nachgeschaut, aber nichts hat mir so richtig weitergeholfen. Ich hoffe, einer von euch kann mir hier weiterhelfen. Bei dem Programm soll eine Fehlermeldung kommen sobald ich etwas anderes als Zahlen eingebe. Das Programm soll nur Zahlen verarbeiten.
Wie programmiere ich so etwas?!
Ich habe euch den Quellcode mit dabeigeschrieben.


#include <stdio.h>
#include <stdlib.h>
#define PAUSE {printf("\nRETURN!\n");fflush(stdin);getchar();}

main()
{
float a,b,c,h;


printf("\n\n Bitte geben Sie einen Wert fuer ein: ");
scanf("%f",&a);
printf("\n\n\n Bitte geben Sie einen Wert fuer b ein: ");
scanf("%f",&b);
printf("\n\n\n Bitte geben Sie einen Wert fuer c ein: ");
scanf("%f",&c);
printf("\n\n\n Bitte geben Sie einen Wert fuer h ein: ");
scanf("%f",&h);

printf("\n\n\n\n\nDie Oberflaeche des Quaders betraegt %.2f Quadratmeter.",(2*a*b)+(2*a*h)+(2*b*c));
PAUSE;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.05.2003, 21:00 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hi Sara,

wenn du das in c machen willst kannst du z.B. erst einen String einlesen und dann schauen, ob das eine Zahl ist. Wenn der user keine 0 eingeben darf kansnt du direkt atof benutzen um den String in eine zahl umzuwandeln, wenn er eine Null erlaubt ist musst du den String halt von hand checken


C++:
int isNumber(char* c){
int i,pointflag=0,breakflag=0,rv=0;
if (c[0]==45 || c[0]==43){i=1;}else{i=0;};            
   for (i=0;i<(int)(strlen(c));i++){                
      if (c[i]==46 && pointflag){breakflag=1;}
      if (c[i]==46){pointflag=1;}
      if ((c[i]>47) && (c[i]<58) || (c[i]==46)){rv=1;} else {breakflag=1;}
      if (breakflag){rv=0;break;}
      
  }
return rv;
}

int main(){
...
char help[10]="abcdefghi";

    while(!isNumber(help)){
        printf("\n\n     Bitte geben Sie einen Wert fuer a ein: ");                        
        scanf("%s",&help);
    }
    a=atof(help);
...

return 0;
}



Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 13.05.2003 um 21:01 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.05.2003, 21:36 Uhr
~Hans
Gast


@Heiko:

C++:
if (c[0]==45 || c[0]==43){i=1;}else{i=0;};            
for (i=0;i<(int)(strlen(c));i++)


Wozu soll die Abfrage (bzw. abhängige Zuweisung) gut sein, wenn Du die Variable gleich wieder überschreibst??

Ich nehme mal an, Du meinst sowas hier:

C++:
if (c[0]==45 || c[0]==43){i=1;}else{i=0;};            
for ( ; i<(int)(strlen(c));i++)




MfG,
Hans,
der sich gerade wieder mal nicht eingeloggt hat
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.05.2003, 21:46 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Hans
Oh, gut das du es sagst.
Es muss natürlich

C++:
for(i=i; i<(int)(strlen(c));i++)


heissen
(das ist quasi der vorzeichen check, ob jemand sowas wie -3.5 oder +376.4 eingegeben hat)

sehr gut aufgepasst


habe das ganze mal verbessert, die funktion ist noch aus meinen anfängertagen gewesen

C++:
bool isNumber(char* c){
int i,pointflag=0;
    if (c[0]==45 || c[0]==43) i=1;else i=0;            
    for (i=i;i<(int)(strlen(c));i++){                
     if (c[i]==46 && pointflag) return false;
     if ((c[i]<48) || (c[ i ]>57) )
         if (c[i]==46) pointflag=1; else return false;
    
    }
return true;
}



Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 13.05.2003 um 22:25 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.05.2003, 22:12 Uhr
~Hans
Gast


'nAbend Heiko,
'ne kurzer Kommentar nur:
Die Zuweisung i=i kannst Du Dir bei der Schleife auch knicken, und die leere Anweisung stehen lassen, so wie ich es gemacht habe. Der Compiler sollte das auch so schlucken, und das i wird dadurch auch nicht verändert. Möglicherweise optimiert er es sowieso heraus, aber das prüfe ich jetzt nicht nach.

cu,
Hans
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.05.2003, 22:16 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hi Hans
Ich hatte damit mal Probleme als ich das weggelassen hatte.
Irgend so ein dummer uralt compiler auf nem unix/solaris system wollte das so nicht fressen, da hab ich dann i=i genommen, weil ich das zum abgegen der Aufgabe brauchte.
Dachte, das wäre dann so die sichere Variante.
Ausserdem sollte diese eine Zuweisung den Aufwand nicht signifikant erhöhen oder?

Gruss Heiko

Ach so hätte ich fast vergessen zu fragen. Wie prüft man den sowas überhaupt nach, was der weg optimiert?
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 13.05.2003 um 22:23 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.05.2003, 22:46 Uhr
~0xdeadbeef
Gast


Standard-C wär sowas:

C++:
float zahl;
do {
    printf("Zahl eingeben:");
} while(1 != scanf("%f", &zahl);


scanf gibt die Anzahl der eingelesenen Variablen zurück, das kann man gut als Flag benutzen (Dazu ist es ja auch da).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.05.2003, 03:07 Uhr
Hans
Library Walker
(Operator)


Moin Heiko,


Zitat:
Ich hatte damit mal Probleme als ich das weggelassen hatte.
Irgend so ein dummer uralt compiler auf nem unix/solaris system wollte das so nicht fressen,

Da wundert mich jetzt aber, weil ich meine, sowas sogar mal in K'nR's "Programmieren in C" gesehen zu haben. Aber kann natürlich sein, das die von sun das wegen schlechten Stils gesperrt haben.

Zitat:
da hab ich dann i=i genommen, weil ich das zum abgegen der Aufgabe brauchte.
Dachte, das wäre dann so die sichere Variante.
Ausserdem sollte diese eine Zuweisung den Aufwand nicht signifikant erhöhen oder?

Das ist allerdings auch wieder wahr.

Zitat:
Gruss Heiko

Ach so hätte ich fast vergessen zu fragen. Wie prüft man den sowas überhaupt nach, was der weg optimiert?


Also ich hab's noch nicht gemacht, aber spontan würde ich sagen, man lässt den Compiler 'ne Assemblerdatei erzeugen, und sieht sich den Assemblercode an. (Setzt natürlich voraus, das man davon auch Ahnung hat... )
Im Zweifelsfall mit lässt man den Compiler mit den unterschiedlichsten Optionen durchlaufen, und vergleicht die jeweiligen Outputs miteinander. - Diese Methode dürfte ab einem gewissen Zeitpunkt allerdings zu aufwendig werdenn...

Ansonsten gibt es noch sogenannte Profiler, womit man das Laufzeitverhalten checken kann...

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 14.05.2003 um 03:14 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.05.2003, 14:59 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Hans
Ok danke,
hab mir sowas schon gedacht, das das komplizierter bzw. aufwendig ist.

Was bist du eigentlich für einer.
Informatikstudent bzw. anderer Student, ehrlich arbeitender Bürger...

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.05.2003, 20:10 Uhr
Der Computer



Hy!

Vielen Dank für die Hilfe, aber geht das Ganze nicht etwas einfacher? Ich bin in C noch ein Anfänger und daher noch nicht so fit darin.
Ich habe mal gelesen, dass man mit Hilfe des ASCII-Codes alle Zahleneingaben akzeptieren und bei allen anderen Eingaben eine Fehlermeldung ausgeben kann. Wisst ihr wie so etwas funktioniert? Habe es auch schon mal versucht, hat aber leider nicht geklappt.

Sara
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: