C++ Frage (if-verzweigung)

Joined
Dec 26, 2002
Messages
1,764
Points
0
moinsen @all,

ich bestel mir gerade ein Promilleprogramm, womit man die promille im blut berechnen kann.
ich programmiere es zu einer win32 anwendung und
habe da mal ne frage:

Wie ist das zeichen für bis (z.B. ich bin zwischen 50-60 bzw. 50 bis 60 kilo schwer)?
ich will dieses in eine if-abfrage reintun und habe keinen blasen schimmer wie das zeichen für BIS(bzw. füe zwischen oder iwe auch immer) ist.
ich habe hier ganz normal angefangen:

PHP:
#include <iostream>
using namespace std;

int main()
{
    
             // Überschrift
	cout << "Programm zum berechnen der Promillewertes im Blut" << endl;

	// Eingabe 
	cout << "Bitte geben Sie ihr an ob sie (M)aennlich oder (W)eiblich sind " << endl;
	int geschlecht;
	cin >> geschlecht;
	
	int M;
	cin >> M;

	// Berechnung
	if (geschlecht = M)
	
             cout << Wieviel wiegen Sie (NUR Zahlen angeben)? << endl;
	int gewicht;
	cin >> gewicht;
	
  system("PAUSE");	
  return 0;
}

ich will also nun einen maßstab einrichten bei dem gewicht, zB wenn jemand 55 kilo eingibt, das das programm die werte aus dem wert 50-60 kilo(den ich noch einfügen werde eure hilfe). ich hoffe ihr versteht was ich meine und ich hoffe ihr könnt mir auch helfen, wollte das ding eigentlich bis so. abend fertig haben. wollte mo. das nen freund zeigen... er meinte ich würde das eh nicht machen :D aber ichh änge mich da nun total rein, weiß aber nicht wie ich das nun richtig programmieren soll, da unser lehrer das noch nicht erwähnt hat.

MfG Maggy
 
Von C++ habe ich keine Ahnung, aber wenns dort eine For-Schleife gibt, dann solltes darüber gehen. Bereiche werden doch normalerweise über kleiner und größer (gleich) realisiert ggf in Verbindung mit AND :?
 
kp von C++, aber kannste ned einfach 2 if-bedingungen logisch verknüpfen?

also if((m >= 50)&&(m <= 60)){...}

davon abgesehn, kannste das sicher auch intelligenter lösen...

also du nimmst z.b. nur die 10er stelle...

geht folgendermaßen:
Code:
mneu = m%10
m = m - mneu

oder alternativ, falls es keine modulo-operation gibt, schneidest du einfach die letzte ziffer ab:

Code:
int m , mneu;

mneu = m/10;
mneu = mneu*10
m=mneu;

sodass die letzte stelle quasi verfällt...

also bei ner eingabe von m von 50 - 59 kilo würde das ein m von 50 ergeben...

sodass du mit ner einfachen prüfung auf gleichheit prüfen kannst, oder gleich mit dem wert rechnest


aber wenn ich mich recht entsinne, funzt die alkohol-formel auch mit genauen gewichtswerten :o

mfg
 
also öhm was meinst du mit mneu?
"m" ist einfach nur der wert für die eingabe am anfang damit man erstmal das geschlecht auswählt.

und ich will ja das der benutzer nur eine zahl eingibt und das programm in einem ramen von 50-60 eine bestimmte ausgabe gibt. zB wenn einer dann 70 kilo eingibt, das der rechner zwischen 60-70 rechnet und dann ein anderes ergebniss ausgibt.

und das alles einzelnt zu berechnen wegen den kilogramm ist mir persöhnlich viel zu viel arbeit. ich mache da lieber 10er oder 5er schritte, da es da kaum abweichungen gibt.
oder kann ich das auch noch durch eine schleife lösen?
 
du könntest mal die formel für die berechnung posten ;)

dann gibts auch ordentliche tipps..

'mneu' ist einfach nur eine variable zum zwischenspeichern vom wert von 'm'...

integerwerte haben keine stelle nach dem komma...

wenn man also eine 2-stellige integerzahl durch 10 teilt und das integer-ergebnis wieder mit 10 multipliziert, bleibt von der ausgangszahl nur noch die erste zahl übrig...

das war der 2. rechenweg

beispiel:

m = 59
59/10 = 5.9
aber weil integer keine kommastelle haben
ist 59/10= 5 in integer werten

wenn man diese 5 wieder mit 10 multipliziert, kommste auf 50... das speicherste dann wieder als m


also dieses mneu war nur ein zwischenspeicher für die berechnung...

es geht aber auch ohne

Code:
int m;
m = m/10;
m=m*10;

bleibt wieder nur die erste stelle übrig für m < 99 kilo
 
joa die berechnungen kommen erst später. erstmal die vorarbeit etwas machen, damit das auch erstmal alles richtig aufgebaut ist.

und joa wofür brauche ich denn einen zwischenspeicher?
ich progge das so, das ich das später alles zusammenzähle, also alle werte.
 
naja manchmal will man zwischenergebnisse ja mal speichern, wenn man die später braucht und die variable aber überschreibt...

dann musst du die halt irgendwo zwischenspeichern...

spielt ja bei objektorientierten sprachen keine rolle, wie viele variablen du nimmst...

wenn die ned mehr verwendet werden verschrotten die sich ja teilweise selbst...
 
// c (in Promille) = A / (r*G)
// c: Blutalkoholgehalt in Promille
// A: aufgenommener Alkohol in Gramm
// r: Verteilungsfaktor im Körper (0,7 für Männer / 0,6 für Frauen)
// G: Körpergewicht in Kilogramm
 
das bestätigt meine vermutung...

nimm doch einfach die masse wie sie is!

die formel ist doch richtig simpel... da kannste dir jedwede fallunterscheidung wirklich sparen...

einfach das geschlecht abfragen und die masse

und dann mit der formel den wert von c bestimmen...

wobei m und c am besten keine integer-datentyp sind, sondern float, double, long oder sowas...

€€€€€€€€€€€€€€€€€€€€€€€

falls du aber mal später auf so eine frage stößt:

C++ hat doch sicher eine switch-case-anweisung oder?
C hatte definitiv eine...

dann kannste ja per

if(bedingung)
schaltervar = X
elseif(bedingung)
schaltervar = Y
else(bedingung)
schaltervar = Z

unendlich viele zustände unterscheiden und später im switch-case einzeln und übersichtlich abhandeln
 
Last edited:
In PHP könnte mans so machen. Wobei $A, $G und $r natürlich nicht wie hier festgelegt, sondern durch Benutzereingabe an das Proggi gegeben werden...aber das soll ja nur ne Verdeutlichung sein.

// c (in Promille) = A / (r*G)
// c: Blutalkoholgehalt in Promille
// A: aufgenommener Alkohol in Gramm
// r: Verteilungsfaktor im Körper (0,7 für Männer / 0,6 für Frauen)
// G: Körpergewicht in Kilogramm

PHP:
<?
$A = 100;
$G = 80; 
$r = 1; //1=Mann, 2=Frau
  if($r==1) 
     {
     $alk = $A/(0.7*$G);
     echo "Sie sind ein Mann und haben $alk Promille im Blut!";
     exit;
     } else {
     $alk = $A/(0.6*$G);
     echo "Sie sind eine Frau und haben $alk Promille im Blut!";
     exit;
     }
?>

Bereiche kann man natürlich auch in Switch-Anweisungen schreiben :D

zB so:

PHP:
<?
$a=100;
switch($a)
{
case (($a >= 50) && ($a < 60)): echo "sie wiegen zwischen 50 und 59 kg"; break;
case (($a >= 60) && ($a < 70)): echo "sie wiegen zwischen 60 und 69 kg"; break;
case (($a >= 70) && ($a < 80)): echo "sie wiegen zwischen 70 und 79 kg"; break;
case (($a >= 80) && ($a < 90)): echo "sie wiegen zwischen 80 und 89 kg"; break;
case (($a >= 90) && ($a < 100)): echo "sie wiegen zwischen 90 und 99 kg"; break;
default: echo "Alarm, Alarm!"; break;
}
?>

Hier würde also Alarm, Alarm! ausgegeben :D
 
hm joa das vo admi leutet mir schon ein...
das so habe ich noch garnicht in betracht bezogen.
ich hatte mir das so überlegt, das ich immer eine abfrage mache. also bier 0,33 l
bier 0,5 l und so ^^ naja was optimierung bzw. verleichterung angeht bin ich ne null, mache es mir immer schön umständlich xD
ich denke nun über eine liste am anfang nach, da ja nicht jeder weiß, wieviel promille ein bier auslössen kann oder hat jemand noch eine bessere idee?

und joa danke admi und springmaus, seid doch die besten :)


€€€: (zum ersten code von dir)ähm admi, was meinst du mir $alk? also mein programm meint, das es noch nicht bestimmt ist, wo es ganz recht hat und den integer kann ich auch nicht vorsetzten.
der sagt mir:

Code:
 [Warning] initialization to `int' from `double'

wie mache ich das denn nun?
und echo ist doch auch ein befehl in c++? den will er auch nicht so ganz haben.
so habe ich es nun geschrieben:

PHP:
#include <iostream>

using namespace std;

int main()
{
  
 
int A = 100; 
int G = 80; 
int r = 1; //1=Mann, 2=Frau 
  if(r==1) 
     { 
     alk = A/(0.7*G);
     echo "Sie sind ein Mann und haben $alk Promille im Blut!"; 
     exit; 
     } else { 
     alk2 = A/(0.6*G); 
     echo "Sie sind eine Frau und haben $alk Promille im Blut!"; 
 
 
  
  
  system("PAUSE");	
  return 0;
}

obwohl ich mir da etwas unschlüssig bin, wie ich das mit frau und mann mache... irgendwie ist es ja einfach, aber es will mir gerade nicht in den sinn kommen :(
 
Last edited:
Ähm :? Das ist ja auch ein PHP-Programm :D Wie man das in C++ umsetzt kann ich dir auch nicht sagen...aber es müsste ähnliche Funktionen geben. Vermutlich musst du aber den Datentyp der Variablen deklarieren. Versuchs mal mit Float (also irgendwas, das Kommazahlen enthalten kann :D)

$alk ist das Ergebnis; also das c aus der Formel. Du kannst ja bei der Variablendeklaration einen Platzhalter für $alk setzen

Mann und Frau. Naja mach doch eine Abfrage mit Radiobuttons :p
Da kann man dann entweder Frau oder Mann anklicken. Die Eingabe wird dann dem Algorithmus übergeben und diese kann dann damit rechnen

Formular:
1 Zeile = input-Abfrage Gewicht
2 Zeile = input-Abfrage $A
3 Zeile = Radiobutton-Abfrage ob Mann oder Frau

Die Werte liest du aus und übergibst sie dem Programm zur Berechnung...et voila!
 
Last edited:
Maggy said:
obwohl ich mir da etwas unschlüssig bin, wie ich das mit frau und mann mache... irgendwie ist es ja einfach, aber es will mir gerade nicht in den sinn kommen :(

mach doch je nach eingabe eine vorherige definition von r

Code:
if(weiblich){
r=0.6;
}
else{
r=0.7;
}
und dann die rechnung mit r

also

Code:
if(weiblich){
r=0.6;
}
else{
r=0.7;
}
[COLOR=Lime]/*jetz erst die rechnung */[/COLOR]

alk = A/(r*G); 

printf(alk);
 
@ admi, mensch bin ich blöde ^^ öhm echo = cout :p

und nun sagt er mir aber
Code:
 [Warning] assignment to `int' from `double'

und das da macht mir auch nicht wirklich einen sinn.
der wert "r" ist doch schon vergeben.
naj auf jedenfall funzt es nicht :(


PHP:
int A = 100; 
int G = 80; 
int r = 1; //1=Mann, 2=Frau 
  if(1){
      
     r=0.6;
     cout << "Sie sind ein Mann und haben $alk Promille im Blut!" endl; 
     } else { 
     r=0.7;
     cout << "Sie sind eine Frau und haben $alk Promille im Blut!" << endl; 

alk = A/(r*G); 
printf(alk);
 
}
 
Logo, da der Datentyp Integer nur Ganzzahlen darstellt und keine Kommazahlen :p Die Eingaben und das Ergebnis sind aber mit großer Sicherheit reele Zahlen.
Im if muss ja auch ne Bedingung stehen. Wenn da nur 1 steht, weiss er ja nicht, was er machen soll. Ich hab lediglich aus Einfachheits- und Verständnisgründen die Deklaration "r=1" abgefragt. Da ich diese ja so festgelgt habe, gibt if ein true zurück und geht einen Schritt weiter.
 
cout << "Sie sind ein Mann und haben $alk Promille im Blut!" endl;

also
1. machst du die ausgabe, BEVOR du $alk berechnet hast
bei C wurden die variablen imho auch mit %name ausgegeben und ned mit $name... aber ich kenne C++ wie gesagt ned...


2. berechnet der alk nur im else zweig, da du scheinbar die klammern falsch gesetzt hast

3. kommt C++ ohne main() methode aus???
 
Muss es unbedingt C++ sein :? In Java weiß Maus bescheid und die PHP-Lösung kann ich dir geben bzw die Ansätze sind ja schon da.
Das eigentliche Problem ist ja die Festlegung vom aufgenommenen Alkohol in Gramm. Da muss man sich ne Logik überlegen, wie mans am besten rüberbringt. Wer weiß schon wieviel Gramm Alk er aufgenommen hat. Müsste man halt die Möglichkeit bieten die Anzahl, die Menge und die Art des Alkohols anzugeben und zu verarbeiten.
3 Bier a 0,5l ergeben sicherlich nen anderen Wert als 3 Tequila a 0,5l :D
 
hm jo java is zwar ned so kurz, aber dafür irgendwie logischer aufgebaut

Code:
import java.io.*;

String gewicht = "";
int gewichtszahl = 0;
String gewicht = "";
double r = false;
int A = 0;


public class alki


static public void main(String[] args) 
{
[COLOR=Lime]/*methodenaufrufe in der mainmethode*/[/COLOR]

weight();
sex();
alk();
berechnung();
}




[COLOR=Lime]/**************
*gewicht eingeben*
***************/[/COLOR]

    private void weight()
    {
         System.out.println("bitte gewicht eingeben! :)");

          [COLOR=Lime]/*liest benutzereingabe ein*/[/COLOR]
         BufferedReader in = new BufferedReader( new InputStreamReader(System.in));

         [COLOR=Lime]/*prüft, ob eingabe zulässig*/[/COLOR]
         try
         {
         [COLOR=Lime]/*speichern der eingabe als String in 'gewicht'*/[/COLOR]
         gewicht = in.readLine();

         [COLOR=Lime]/*macht aus dem eingabestring nen Integer-wert*/[/COLOR]
         gewichtszahl = Integer.parseInt(gewicht);
        }
        [COLOR=Lime]/*falls die eingabe unzulässig war kommt ne fehlerausgabe*/[/COLOR]
        catch (Exception ex)
        {
             System.out.println(ex);
        }
    }
[COLOR=Lime]/****************
*geschlecht eingeben*
*****************/[/COLOR]

    private void sex()
    {
        System.out.println("sind sie [w]eiblich / [m]ännlich)");
        BufferedReader in = new BufferedReader( new InputStreamReader(System.in));
        String wm = "m";
        try
        {
            wm =in.readLine();
        }
        catch (Exception ex)
        {
            System.out.println("ungueltige eingabe"/n ex);
        }
        if (wm.equalsIgnoreCase("w"))
        {
            r = 0.6;
        }
        if (wm.equalsIgnoreCase("m"))
        {
            r = 0.7;
        }
    }

[COLOR=Lime]/***************
*alkohol getrunken *
***************/[/COLOR]

    private void alk()
    {
         System.out.println("wieviel alkohol haste getrunken? :)");

          [COLOR=Lime]/*liest benutzereingabe ein*/[/COLOR]
         BufferedReader in = new BufferedReader( new InputStreamReader(System.in));

         [COLOR=Lime]/*prüft, ob eingabe zulässig*/[/COLOR]
         try
         {
         [COLOR=Lime]/*speichern der eingabe als String in 'alk'*/[/COLOR]
         alk = in.readLine();

         [COLOR=Lime]/*macht aus dem eingabestring nen Integer-wert*/[/COLOR]
         A = Integer.parseInt(alk);
        }
        [COLOR=Lime]/*falls die eingabe unzulässig war kommt ne fehlerausgabe*/[/COLOR]
        catch (Exception ex)
        {
             System.out.println(ex);
        }
    }



[COLOR=Lime]/**************************
*ab hier die eigentliche berechnung*
***************************/[/COLOR]

     private int berechnung()
     {
          double alkpegel;
     
          alkpegel = A / (r * gewichtszahl);

         System.out.println("du hast " + alkpegel + " promille im blut! das heißt dir fehlen    noch " + (0.00618 - alkpegel) +" zum dresdner rekord :D");
      }
}


man siehts deutlich: dosbox-dialoge sind echt keine stärke von java... hat ne weile gedauert, bis ich das hier mal eben zusammengehackt habe


dafür könnte man mit rund nem drittel an code in java das ganze mit popupfenstern und mouse-button-dialogen erstellen


mit ganz hübschen dialogfenstern, die sich an das betriebssystem anpassen und auf praktisch jedem betriebssystem laufen


DAS macht dann schon mehr her :D
aber aus dem java-AWT-zeugs bin ich schon ne weile raus :)


für so ne dosbox- faxen ist java aber eher ungeeignet... es lebt halt von der grafischen benutzeroberfläche mit fenstern, checkboxes usw...


mfg SM :wub
 
Last edited:
so ok, habe es nun hinbekommen, das er es rechnet nur da ist ein fehler:
multi-character character constant

also was soll das bedeuten? ich habe 2 char-werte drinne, aber kann ja nicht sein, das deswegen das programm nicht läuft :-/
hier mal mein quelltext:

PHP:
#include <iostream>

using namespace std;

int main()
{
    
    //Eingabe
    cout << "bitte geben Sie ihr Geschlecht mit (W)eiblich oder (M)aennlich an" << endl;
    char geschlecht;
    cin >> geschlecht;
    
   
    int Alkoholmenge; 
    int Gewicht;
    int getraenk;
    /*int fraualk = 0.6;
    int mannalk = 0.7;
    int alk2 = Alkoholmenge / fraualk * Gewicht; 
    int alk1 = Alkoholmenge / mannalk * Gewicht;
    cin >> Entscheidung;*/

    

    //Berechung
    if(geschlecht =='W')
    {
         
    cout << "Geben sie ihr Gewicht an" << endl;
    // int Gewicht
    cin >> Gewicht;

    cout << "Wieviel Liter Alkohl haben Sie zu sich genommen?" << endl;
    // int Alkoholmenge;
    cin >> Alkoholmenge;
       
    cout << "Welche Art von Alkohol haben Sie zu sich genommen?(info eingeben fuer die Getraenkeliste)" << endl;
    // int getraenk;
    cin >> getraenk;  
      
    //Alkinfos aufrufen
    while (getraenk == 'info')
        {
        cout << "Alkliste:" << endl;
        cout << "(1)Bier(ca. 5%) (2)Mix-Bier(ca. 2%) (3)Wein(ca. 10%)" << endl;
        cout << "(4)Wermut(cs. 18%) (5)Eierlioer(ca. 20%) (6)Fruchtlikoer(ca. 30%)" << endl;
        cout << "(7)Korn(ca. 32%) (8)Rum(ca. 37%) (9)
        
        cout << "Welche Art von Alkohol haben Sie zu sich genommen?(""info"" eingeben fuer die Getraenkeliste)" << endl;
        
    }                
    }   
    else
    { 
        
    cout << "Sie sind ein Mann" << endl;
    
    }    
 
  
  
  system("PAUSE");	
  return 0;
}
 
was sofort auffällt:

getraenk ist ein datum vom typ integer...

integer kannst du aber nur mit ganzzahlen belegen...

aber NICHT mit strings/chars wie in deinem programm 'info'

cout << "Welche Art von Alkohol haben Sie zu sich genommen?(info eingeben fuer die Getraenkeliste)" << endl;
// int getraenk;
cin >> getraenk;

//Alkinfos aufrufen
while (getraenk == 'info')

nimm lieber die 0 für infos...

also while(getraenk == 0) {...}

denn du kannst bei hochsprachen den variablen keine nicht-vorgesehen werte/datentypen zuweisen

außerdem scheint diese while-schleife insgesamt unsinnig

es wird eine endlosschleife produzieren, weil innerhalb der schleife der getraenk-wert nicht neu gesetzt wird

wenn du 'methoden' bzw 'unterprogramme' schreiben kannt, versuch mal die abfrage des wertes in ein unterprogramm reinzuschreiben

und mit ner if bedingung

>>>unterprogramm aufrufen<<<
if(getraenk == 0)
{
>>>liste ausgeben<<<
>>>unterprogramm aufrufen<<<
}

dass erst einmal dieses unterprogramm aufgerufen wird, dann
dieser if vergleich und bei getraenk == 0 wieder hoch zum unterprogramm springen...
 
Last edited:
Back
Top Bottom