WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Brauche Hilfe in C (http://www.wcm.at/forum/showthread.php?t=72235)

pirate man 03.10.2002 20:21

Brauche Hilfe in C
 
ich bräucht wieder mal eure hilfe in c

unser 1. programm in der schule rechnet das idealgewicht abhängig vom geschlecht aus

mann gibt m oder w ein (fürs geschlecht) und die größe - ausgegeben wird dann das idealgewicht

für den fall, dass etwas anderes als m oder w eingegeben wird, soll sofort nach der eingabe des geschlechts eine meldung kommen, die auf den fehler aufmerksam macht

aber die meldung kommt erst nach eingabe der körpergröße :(

hier is der code:

Code:

#include <stdio.h>
#include <conio.h>

void main ()

{

clrscr();

printf("Sind Sie (m)ännlich oder (w)eiblich?\n");

int kg,kgw;

char ge;
ge=getchar();

printf("\nGeben Sie bitte Ihre Körpergröße in Zentimeter ein:\n");

scanf("%d",&kg);

switch(ge)
{
  case 'm':
  kgw=(kg-100)*0.9;
  break;

  case 'w':
  kgw=(kg-100)*0.85;
  break;

  default: printf("\nSie haben eine falsche Eingabe gemacht!");
}

 printf("\n\nIhr Idealgewicht ist ");
 printf("%d",kgw);
 printf("kg.");

 getch();

}

ich hoffe, ihr könnt mir helfen
danke, schon mal

pc.net 03.10.2002 20:31

soweit ich mich erinnere, sollte das so gehen ...

Code:

#include <stdio.h>
#include <conio.h>

void main ()

{

clrscr();

printf("Sind Sie (m)ännlich oder (w)eiblich?\n");

int kg,kgw;
char ge="a";

// endlosschleife, aus der man nur mit der richtigen eingabe (m oder w) rauskommt
while(ge!='m' &&
      ge!='M' &&
      ge!='w' &&
      ge!='W')
{
  ge=getchar();
}


printf("\nGeben Sie bitte Ihre Körpergröße in Zentimeter ein:\n");

scanf("%d",&kg);

switch(ge)
{
  case 'm':
  kgw=(kg-100)*0.9;
  break;

  case 'w':
  kgw=(kg-100)*0.85;
  break;

  default: printf("\nSie haben eine falsche Eingabe gemacht!");
}

 printf("\n\nIhr Idealgewicht ist ");
 printf("%d",kgw);
 printf("kg.");

 getch();

}


pirate man 03.10.2002 20:40

laut unserem lehrer sollte das mit switch/case zu lösen sein - ohne schleife

pirate man 03.10.2002 20:50

hab jetzt deinen code probiert
wenn ich etwas anderes als m oder w eingeb, hupft der cursor in die nächste zeile und es tut sich nix

kikakater 03.10.2002 21:37

Du solltest die Tastatureingabe ohne Bildschirmecho machen und vor dem scanf mit gotoxy(x,y); den Cursor positionieren. Die Bedingung der while Schleife ist jedenfalls gut gelöst.

Für x und y musst Du selbstverständlich eigene Werte als Literale (=Direktwerte) verwenden, also zum Beispiel gotoxy(2,10); Spalte 2 Zeile 10

mfg Kikakater

pirate man 03.10.2002 21:44

Zitat:

Original geschrieben von kikakater
Du solltest die Tastatureingabe ohne Bildschirmecho machen und vor dem scanf mit gotoxy(x,y); den Cursor positionieren. Die Bedingung der while Schleife ist jedenfalls gut gelöst.

Für x und y musst Du selbstverständlich eigene Werte als Literale (=Direktwerte) verwenden, also zum Beispiel gotoxy(2,10); Spalte 2 Zeile 10

mfg Kikakater

sorry, aber das check ich nicht ;)

kikakater 03.10.2002 22:02

Code:

while(!kbhit()); /* solange keine Taste gedrückt wird kommt bei kbhit() 0 (=false) zurück */

key= getch(); if(kbhit()) key= getch(); /* 2 x getch notwendig für Sondertasten */

if(key>='A' && key<='Z') key+=32; /* von Großbuchstaben generell auf Kleinbuchstaben umschalten */

if(key!='m' && key!='w') printf("falsche Eingabe, m für männlich oder w für weiblich erwartet\n");
else
{

 switch(key) {

  case 'm':

  ...
  break;

  case 'w':

  ...
  break;
 }

}


pirate man 03.10.2002 22:12

das wird unserem lehrer mit sicherheit zu kompliziert sein
die befehle/funktionen, die du verwendest, haben wir noch nicht mal besprochen

kikakater 03.10.2002 22:20

Jedenfalls funktioniert es (Borland C), sonst halt nur key= getch(); verwenden und bei der switch Anweisung:

Code:

case 'm':
case 'M':

...
break;

case 'w':
case 'W':

...
break;


pong 03.10.2002 22:29

@kikakater hab zwar schon lang kein c mehr gesehn, aber fehlt bei deinem case nicht ein default wert (sorry falls ich mich irre)

kikakater 03.10.2002 23:00

Ein default Zweig ist nicht zwingend notwendig, es geht ja nur um das Ausrechnen eines Wertes. Außerdem ist die switch Anweisung im else Zweig einer if(Bedingung==true) Konstruktion eingebettet. Insofern ist dort der default Zweig realisiert ...

pirate man 03.10.2002 23:23

habs jetzt mit einer if-abfrage probiert
für mich wärs logisch, aber es geht nicht - sobald ich was anderes als m oder w eingeb, wird aus dem programm ausgestiegen
Code:

#include <stdio.h>
#include <conio.h>

void main ()

{

clrscr();

printf("Sind Sie (m)„nnlich oder (w)eiblich?\n");

int kg,kgw;

char ge;
ge=getchar();

if(ge!='m' && ge!='w')
{
  printf("\nSie haben eine falsche Eingabe gemacht!");
}
else
{

printf("\nGeben Sie bitte Ihre K”rpergr”áe in Zentimeter ein:\n");

scanf("%d",&kg);

switch(ge)
{
  case 'm':
  kgw=(kg-100)*0.9;
  break;

  case 'w':
  kgw=(kg-100)*0.85;
  break;
}

 printf("\n\nIhr Idealgewicht ist ");
 printf("%d",kgw);
 printf("kg.");

 getch();

}
}


kikakater 03.10.2002 23:57

Ohne erneute Möglichkeit zur - dann korrekten - Eingabe wird das Programm eben weiter ausgeführt. In diesem Fall gibt es eben keine weiteren Befehle nach dem if-Befehl und deswegen wird das Programm beendet.

Verwende eine Schleife um die if() else Konstruktion und ein break; im else Zweig.

Code:

for( ; ; )
{

 key= getch();

 if(key!='m' && key!='M' && key!='w' && key!='W') printf(...);
 else
 {

  scanf(...);

  switch(key)
  {
  ...
  }

  break;
 }

}


pirate man 04.10.2002 00:03

ah, es geht schon
der fehler war, dass das getch(); im else-zweig war ;)

pirate man 04.10.2002 00:30

eine frage hab ich noch
wie bring kann ich das programm dazu bringen, nach der ausgabe ("ihr idealgewicht ist ...") nicht zu schliessen, sondern durch einen tastendruck nochmal von vorn anzufangen (eingabe von geschlecht usw.)?

kikakater 04.10.2002 00:36

Lösung steht oben, eine for Schleife verwenden.

pong 04.10.2002 07:40

Zitat:

Original geschrieben von pirate man
eine frage hab ich noch
wie bring kann ich das programm dazu bringen, nach der ausgabe ("ihr idealgewicht ist ...") nicht zu schliessen, sondern durch einen tastendruck nochmal von vorn anzufangen (eingabe von geschlecht usw.)?

Code:

printf...;
getch();


pirate man 04.10.2002 21:02

hm, hab noch eine frage :rolleyes:
ich will eine aktion ausführen, wenn die eingegebene zahl im bestimmten zahlenbereich ist
beispiel:
wenn die eingegebene zahl im zahlenbereich 10-20 ist, dann den text "blablabla" ausgeben
geht das nur mit if oder auch mit switch/case? habs mit switch/case probiert, aber leider dürften da < und > nicht gehen :(

pc.net 04.10.2002 21:11

bei switch/case kannst du nur exakte werte abfragen ... wertebereich gehen nur mit if ...

pirate man 04.10.2002 21:13

ok, thx

kikakater 04.10.2002 21:24

Na geht eh mit switch/case:

Code:

category= (kg < 10) ? 1 : (kg < 20) ? 2 : (kg < 30) ? 3 : 4;

if(kg<0) category=0;

switch(category)
{
 case 1:
  printf("kg liegt zwischen 0-9\n");
  break;

 case 2:
  printf("kg liegt zwischen 10-19\n");
  break;

 case 3:
  printf("kg liegt zwischen 20-29\n");
  break;

 case 4:
  printf("kg ist 30 oder höher\n");
  break;

 default:
  printf("kg ist in keinem definierten Wertebereich\n");
  break;

}


pirate man 04.10.2002 21:33

hm, mein programm hat einige fehler - und zwar in den zeilen 22, 26, 32, 32, 38, 38, 44, 55
das programm hab ich an diesen post angehängt
ich weiß leider nicht, was ich falsch gemacht hab - trotz dem text, den turbo c ausgibt :(

pc.net 04.10.2002 21:38

@kikakater
boah, elegant ... auf die idee hätt ich eigentlich auch schon mal kommen können :rolleyes:

kikakater 04.10.2002 21:40

Cooles Programm :D

numerische_variable < 22

und nicht

numerische_variable '<22'

die Apostroph Zeichen werden nur für einzelne ASCII also char (=Character) Zeichen verwendet um eben die gerade genannten (ASCII bzw. char) Zeichen zu umschliessen.

Also entweder:

char_variable < 'A'

oder (gleichbedeutend):

char_variable < 65

kikakater 04.10.2002 21:42

@pc.net: Ja ... Hi Fans, Victory Zeichen, *Herum geh 360°* :D

kikakater 04.10.2002 22:21

Code:

#include <stdio.h>
#include <conio.h>

char *diagnose[] = { "Unter" , "Ideal" , "Normal" , "Über" };

void main ()
{
 int gr=1,kgw;
 char ge;
 int diagnose_index;

 for( ; ; )
 {
  clrscr();

  printf("Geben Sie bitte ihr Geschlecht ein (m für männlich/w für weiblich oder e für Ende): ");
  for( ge = 0
    ; ge != 'm' && ge != 'w' && ge != 'e'
    ; printf("\nSie haben eine falsche Eingabe gemacht! Bitte m/w oder e eingeben ") )
  {
  ge=getchar();
  if( ge >= 'A'  &&  ge <= 'Z' ) ge += 32;
  }

  if( ge == 'e' ) break;

  printf("\nGeben Sie bitte Ihr Körpergewicht ein: ");
  scanf("%d",&kgw);
  bmi=kgw/(gr*gr); /* der Wert von gr ist undefinert !!!!!!!!!!! ????????????, im Moment hab' ich gr mit 1 initialisiert :rolleyes: */

  if(ge=='m') diagnose_index = (bmi < 22) ? 0 : (bmi < 24) ? 1 : (bmi < 26) ? 2 : 3;
  if(ge=='w') diagnose_index = (bmi < 21) ? 0 : (bmi < 23) ? 1 : (bmi < 25) ? 2 : 3;

  printf("Sie haben %sgewicht, da Sie einen BMI von %d haben. <Taste> " ,diagnose[diagnose_index] ,bmi);
  getch();

 }

}


pirate man 04.10.2002 22:28

@ kikakater
soweit simma noch gar ned
hab jetzt nochmal das programm angehängt, hab noch immer 6 fehler drin :(

kikakater 04.10.2002 22:38

Code:

printf("%d",&bmi);
-------------^ des is foisch, tut leid

& ist der 'address of' Operator

& bmi oder &bmi oder &      bmi bedeutet liefere die Adresse von bmi

Bei printf musst Du '&' beim Verwenden einer numerischen Variablen weglassen, sonst bekommst Du ein undefiniertes Ergebnis beim printf, möglicherweise einen Laufzeitfehler (falsch gesetzter Stackpointer), weil eine Adresse vier Bytes am Stack belegt, printf nimmt bei '%d' in der Formatangabe aber nur zwei Bytes vom Stack, insofern gibt es deswegen vielleicht sogar einen Programmabsturz.

kikakater 04.10.2002 22:52

variable => 1 ist falsch, es muss variable >= 1 heißen

Als letzte Zeile musst Du noch eine "geschweifte Klammer geschlossen" anfügen >>> } <<<

Du hast eine Klammerebene übersehen ...

Ich wollte Dich zuerst selber die Fehler finden lassen.

Du musst die Fehlerhinweise der Integrierten Entwicklungsumgebung von Turbo C bzw. wahlweise die Compilerfehlermeldungen im Konsolenfenster (DOS) kennenlernen und Bescheid wissen, was sie bedeuten.

pirate man 04.10.2002 22:52

hm, jetzt bleiben noch 2 fehler:
zeile 22: undefined symbol 'bmi'
zeile 55: compound statement missing }

kikakater 04.10.2002 22:59

Du musst bmi am Programmanfang nach void main() { mit int bmi; definieren

Was für eine Bedeutung hat gr ?, diese Variable muß initialisiert werden.

Irgendein Wert dividiert durch 0 ist undefiniert

gr wird höchstwahrscheinlich 0 sein ... :rolleyes:, wenn Du die Variable in Formeln verwendest, sollte auch ein korrekter Wert darin abgespeichert vorliegen, wie gesagt mit 0 gibt es einen "division by zero" Laufzeitfehler durch das EXE DOS Programm über eine CPU Ausnahmebehandlung.

pirate man 04.10.2002 23:37

*grml*
ich programmier php, also sollt ich das eigentlich wissen :rolleyes:
jetzt kommt noch ein error - und zwar bei der klammer nach getch();: compound statement missing }
was heißt das?

kikakater 04.10.2002 23:45

} am Programmende anfügen

Gute Nacht ... und versorge gr mit einem korrekten Wert ;)


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag