Eingabe von Zahlen/Daten überprüfen

«oMeE»
Hi zusammen smile

Hier im Forum und bei Google fand ich nichts dazu.
Ich schreibe gerade ein Programm (Konsole smile ) zur Errechnung des BMI-Werts.

Jetzt wollte ich gerne die Eingaben überprüfen lassen,
z.B. 'Sind Sie männlich oder weiblich (m/w)?'

Hier sollte überprüft werden ob wirklich auch 'w' oder 'm' eingeben wurde.
Wenn nicht sollte die Frage und Eingabe wiederholt werden, bis halt 'w' oder 'm'
eingeben wurde.

Wie ist dies allerdings möglich, so dass bei falsch Eingabe er immer wieder zum Ausgangspunkt spring, also zur Frage.
Wollte nicht unbedingt die Frage x mal schreiben.

Danke schonmal im Voraus für die Antworten Augenzwinkern


Gruss
«oMeE»
Hanfling
int cin.get()
Liest dir ein Zeichen aus der Standardeingabe. Rest solltest du schaffen (eigentlich selbst das).
p-Logic
Zitat:
Original von «oMeE»
Wie ist dies allerdings möglich, so dass bei falsch Eingabe er immer wieder zum Ausgangspunkt spring, also zur Frage.
Wollte nicht unbedingt die Frage x mal schreiben.


Dafür hat uns der Gott des C eine Botschaft gesandt! Er teilte uns in seiner unglaublichen Güte mit, dass wir uns nicht an solchen Sachen Tot schreiben sollen! großes Grinsen
(Wäre auch schwierig für dich das mit X*Frage zu lösen.)
Und er sandte uns die Schleifen: for, repeat und while und sagte: Auf dass ihr Glücklichen Code schreibet!!

In jedem gutem Tut gibts dazu eigentlich Informationen (FAlls du das nicht schon heraus gefunden hast)

BTW: Wie willst du das* eigentlich ohne Kontrollstruckturen bewerkstelligen verwirrt

*
Zitat:
Original von «oMeE»
Wollte nicht unbedingt die Frage x mal schreiben.
Hanfling
Der gute Brian Augenzwinkern

/edit
pfff.... wer brauch schon Schleifen... if/goto reicht großes Grinsen
Oder Exceptions...

/edit2
Also das mit dem so lange loopen wegen dem Geschlecht habe ich auch ohne Kontrollstrukturen hingekriegt, der Rest könnte was schwerer werden....
Hanfling
Zitat:
Original von p-Logic
BTW: Wie willst du das* eigentlich ohne Kontrollstruckturen bewerkstelligen verwirrt

Wieso geht doch? großes Grinsen
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
#include <iostream>
#include <string>
using namespace std;

char *slim_slut = "Uhm, how about chocolate?";
char *norm_slut = "Ok well... you feel to fad, right?";
char *fat_slut = "You are too fad slut!";

char *slim_guy = "maybe you should eat something";
char *norm_guy = "you are perfectly normal";
char *fat_guy = "beer, chips and couch-fishing";

typedef void (*VP)();

VP sexfp[256];
VP massfp[2];
VP heightfp[2];

char *str_m[256];
char *str_f[256];

double m;
double h;

void sex();
void sex_m();
void sex_f();
void sex_init();

void mass();
void mass_init();

void height();
void height_init();

void strings_init();

void init();

void sex()
{
	unsigned char c;
	cout << "Sex (m/f): ";
	cin >> c;
	sexfp[c]();
}

void sex_m()
{
	double bmi = m / ((h/100)*(h/100));
	cout << "BMI: " << bmi << endl;
	cout << str_m[(unsigned char)bmi] << endl;
	exit(0);
}

void sex_f()
{
	double bmi = m / ((h/100)*(h/100));
	cout << "BMI: " << bmi << endl;
	cout << str_f[(unsigned char)bmi] << endl;
	exit(0);
}

void sex_init()
{
	sexfp[0] = &sex;
	sexfp[1] = &sex;
	memcpy(&sexfp[2], sexfp, sizeof(VP) * 2);
	memcpy(&sexfp[4], sexfp, sizeof(VP) * 4);
	memcpy(&sexfp[8], sexfp, sizeof(VP) * 8);
	memcpy(&sexfp[16], sexfp, sizeof(VP) * 16);
	memcpy(&sexfp[32], sexfp, sizeof(VP) * 32);
	memcpy(&sexfp[64], sexfp, sizeof(VP) * 64);
	memcpy(&sexfp[128], sexfp, sizeof(VP) * 128);
	sexfp['m'] = &sex_m;
	sexfp['f'] = &sex_f;
}

void mass()
{
	int f;
	cout << "Mass: " << flush;
	cin >> m;
	f = (int)cin.good();
	cin.clear();
	cin.ignore();
	massfp[f]();
}

void mass_init()
{
	massfp[0] = &mass;
	massfp[1] = &height;
}

void height()
{
	int f;
	cout << "Height: " << flush;
	cin >> h;
	f = (int)cin.good();
	cin.clear();
	cin.ignore();
	heightfp[f]();
}

void height_init()
{
	heightfp[0] = &height;
	heightfp[1] = &sex;
}

void strings_init()
{
	str_m[0] = fat_guy;
	str_m[1] = fat_guy;
	memcpy(&str_m[2], str_m, sizeof(VP) * 2);
	memcpy(&str_m[4], str_m, sizeof(VP) * 4);
	memcpy(&str_m[8], str_m, sizeof(VP) * 8);
	memcpy(&str_m[16], str_m, sizeof(VP) * 16);
	memcpy(&str_m[32], str_m, sizeof(VP) * 32);
	memcpy(&str_m[64], str_m, sizeof(VP) * 64);
	memcpy(&str_m[128], str_m, sizeof(VP) * 128);
	
	str_m[20] = norm_guy;
	str_m[21] = norm_guy;
	memcpy(&str_m[22], &str_m[20], sizeof(VP) * 2);
	memcpy(&str_m[24], &str_m[20], sizeof(VP) * 2);
	
	str_m[0] = slim_guy;
	str_m[1] = slim_guy;
	memcpy(&str_m[2], str_m, sizeof(VP) * 2);
	memcpy(&str_m[4], str_m, sizeof(VP) * 4);
	memcpy(&str_m[8], str_m, sizeof(VP) * 8);
	memcpy(&str_m[16], str_m, sizeof(VP) * 4);
	
	str_f[0] = fat_slut;
	str_f[1] = fat_slut;
	memcpy(&str_f[2], str_f, sizeof(VP) * 2);
	memcpy(&str_f[4], str_f, sizeof(VP) * 4);
	memcpy(&str_f[8], str_f, sizeof(VP) * 8);
	memcpy(&str_f[16], str_f, sizeof(VP) * 16);
	memcpy(&str_f[32], str_f, sizeof(VP) * 32);
	memcpy(&str_f[64], str_f, sizeof(VP) * 64);
	memcpy(&str_f[128], str_f, sizeof(VP) * 128);
	
	str_f[20] = norm_slut;
	str_f[21] = norm_slut;
	memcpy(&str_f[22], &str_f[20], sizeof(VP) * 2);
	memcpy(&str_f[24], &str_f[20], sizeof(VP) * 2);
	
	str_f[0] = slim_slut;
	str_f[1] = slim_slut;
	memcpy(&str_f[2], str_f, sizeof(VP) * 2);
	memcpy(&str_f[4], str_f, sizeof(VP) * 4);
	memcpy(&str_f[8], str_f, sizeof(VP) * 8);
	memcpy(&str_f[16], str_f, sizeof(VP) * 4);
}

void init()
{
	mass_init();
	height_init();
	sex_init();
	strings_init();
}

int main(int argc, char **argv)
{
	cout << "Evil BMI(TM) by Hanfling" << endl;
	init();
	mass();

	return 0;
}
p-Logic
kichern lol kichern
Ja, es geht.

Da will man mal mit seinem spärlichem Wissen prahlen, und dann kommst du... Augenzwinkern
Aber oMeE wäre glaube ich auf die Idee nicht so schnell gekommen, und ehrlich gesagt helfen ihm die Schleifen ein bisschen mehr.

Mit sowas kann man newbies leicht vom proggen abbringen Augenzwinkern

Die, die jetzt meinen, C++ sei zu schwer für sie, sollten wissen, dass das kein Programmieren ist, das ist fortgeschrittene binaere Phylosophie.
Es ist ein Hobby von Hanfling solche Sachen zu machen.
Alle Stunts und Geistige Anstrengungen wurden durch einen geschuhlten Codejunky großes Grinsen durchgeführt und sollten nicht zu hause nach gemacht werden! Augenzwinkern


Ja, ich bin neidisch,... großes Grinsen
Respekt

mal ne kleine Frage: ist sexfp['m'] das gleiche wie sexfp[109]? Also kann man statt dem Index als Zahl auch einen char nehmen, der den ASCII-Wert der Zahl hat?
Hanfling
Jop, mit ' ' benutzt du ja den ASCII Wert des Zeichens. Und nen char ist ja auch nur ein sehr kurzer int, usw. Evtl. wird das intern noch zu einem int32 gecastet, aber ist eigentlich schon dann recht compilerintern.

Etwas was mir nicht gefällt ist allerdings, das man die Stringausgabe bestimmt durch irgendwelche Mathematischen Spiellerreien bestimmt etwas simpler machen könnte, aber vorallm das der Code darauf aufbaut das true == 1 ist. Ich hätte da zwar ne Idee wie man das umgehen könnte mit einem Macro / Funktion, irgendwie...
(ein bool wird nicht größer als 32bit sein bei x86 => alle bits addieren zu einer Zahl, kann dann maximal 32 sein. Das vielleicht ein Paar mal machen / oder in einen "kleinereren" 32 bit array packen, aber würde recht aufwendig)

Aber danke für die Beschäftigung, habe im Moment akkute langweile irgendwie/bzw. brauch ein Projekt auf das ich Lust habe.
daHooligan
p-Logic hat ausnahmsweise mal vollkommen recht,
Hanfling redet auch mit Servern... binär...
Hanfling
Nein meine Gedanken können über Mnemonics CPUs steuern. Augenzwinkern
cyph3x
n'abend

will ja nich meckern ( klasse Strukturierung Augenzwinkern aber meint ihr nicht, dass 175 Zeilen _ein bisschen_ aufwendig sind für ein Programm, dass dir den BMI ausrechnet ??
Das schreit nach dem minimalen Gegenbeispiel ...
daHooligan
dann her damit!!
wenn du es nicht beser hin kriegst lass das rummotzen
cyph3x
Wenn man's auf die nackte Funktionalität reduziert wirds relativ kurz, kommt drauf an wie übersichtlich du das Programm haben und vorallem wie weit du die Unterscheidung zwischen männlich / weiblich treiben willst.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
#include <stdio.h>
int main(){
	char sex;
	float bmi, mass, height = 0.0;	
	printf( "mass 	( in kg ) :	\0" );	scanf( "%f", &mass );
	printf( "height	( in m )  :	\0" );  scanf( "%f", &height );
	for( sex = 0, fflush( stdin );
	     (( sex!='m' ) && ( sex!='f' ));
	     printf( "sex ( m / f ) :	\0" ), scanf( "%c", &sex )) fflush( stdin );
	printf( "\nDein BMI liegt bei %.1f, das bedeutet du \0", bmi = mass / ( height * height ));
	if( bmi < 20.0 ) printf( "hast Untergewicht.\n\0" );
	else    if( bmi < 25 ) printf( "hast Normalgewicht.\n\0" );
		else	if( bmi < 30 ) printf( "hast Übergewicht.\n\0" );
			else	if( bmi < 35 ) printf( "solltest zum Arzt gehen ( Adipositas Grad I ).\n\0" );
				else	if( bmi < 40 ) printf( "solltest zum Arzt gehen ( Adipositas Grad II ).\n\0" );
					else printf( "passt wahrscheinlich nicht mehr durch die Haustuer um zum Arzt zu rollen.\n\0" );
	return( 0 );
}

Irgendwie hab ich bei deinem Programm die Klassenstruktur vermisst *g*.
daHooligan
und wenn man die ganze überprüfung haben will braucht man wohl 157 Zeilen Code...
aber egal, wenigstens jemand, der nicht nur meckert sondern auch noch was davon versteht Augenzwinkern
Hanfling
Wow super du bist ja so toll, das kann jeder nach 3 Tutorials, Sorry das ich etwas aggressiv bin, aber du hast da wohl voll was vom Thema verpeilt.

Das mit einfacher Lösung posten ist mal wieder das typische 'ich wich dir den Arsch bei deiner Unselbstständigkeit ab'- Verhalten.

Das es eine einfache Lösung gibt ist selbstverständlich, es ging nur darum keine Sprachmittel zur Programmflusskontrolle zu nehmen...

Abgesehen davon erfüllt es nichtmal die Anforderung die Werte zu überprüfen.
Abgesehen davon Segfault dein Programm bei einer falschen Eingabe.

Wenn du meinst was tolles zu posten ok, auch wenns am Thema vorbei ist, aber dann machs wenigstens anständig.

Ja ich weiß das es mies ist, aber ich krieg nun mal den Rappel wenn ich viele Stunden an sowas sitze nur um alles wie if/else/etc. zu vermeiden und dann kommt einer daher und meint "das geht doch einfacher"....