Division in C++

J

JTron

Guest
Hallo Habos,

ich mache noch nicht lange C++ und bin grad noch am lernen, habe jetzt mal nen rechner entworfen. Aber bei der Division läufts nich so richtig:

int a;
int b;
cout << "Bitte geben sie zwei Zahlen ein, um sie zu dividieren: \n\n";
cin >> a;
cin >> b;
int div = a / b;
cout << "Das Ergebnis ist: " << div;

Wenn man jetzt 3 und 2 eingibt, kommt 1 raus, also immer die menge ohne den "Rest" aus der Grundschule...

Wie löse ich das Problem?

Dabke schon mal
 
Code:
float a,b;
float div;

^^ sorry.

Ein Int hat keinen Nachkommateil, den man anzeigen könnte.
 
Original von 0wnZ
aber auch
Code:
float div = a/b;
;)
und demnächst bitte Code-Tags benutzen
Das ist eine der vielen Sachen, die ich an C nicht mag ;). Soweit ich mich erinnere, wird mit a,b eine Integerdivision durchgeführt und erst dann das Ergebnis nach Float konvertiert, so dass letzendlich eine 1 herauskommt.
http://www-mdp.eng.cam.ac.uk/CD/engapps/ctutor/assignment.html
bzw:
Mingw/GCC 3.4.2
Code:
int a=6;
int b=7;
float div = a / b;
gibt 0 aus. Einer der Parameter bei der Division muss also entweder schon ein float sein oder explizit zu einem gecastet werden:
Code:
int a=6;
int b=7;
float div = a / float(b);
deswegen finde ich die Lösung von thyrael.lu sauberer.
gez. ehemaliger bzw. gelegentlicher Müslifresser ;)
 
Ich habe geschrieben
Original von 0wnZ
aberAUCH

Es würde ja keinen Sinn ergeben 2 Kommazahlen zu divideren und dann das Ergebnis als Integer wiederzugeben ( es sei denn man ist in der Phyisk und beschränkt sich auf eine bestimmte genauigkeit oder in der Mathematik wenn man rundet, was bei dieser Übungsaufgabe nicht die Zielgebung war )

Also so:
Code:
float a;
float b;
cout << "Bitte geben sie zwei Zahlen ein, um sie zu dividieren: \n\n";
cin >> a;
cin >> b;
floar div = a / b;
cout << "Das Ergebnis ist: " << div;

In C sähe das viel besser aus :)

Code:
#include <stdio.h>

int main()
{
    float zahl1, zahl2;
    
    printf("Geben sie bitte die erste Zahl ein:\n");
    scanf("%f", &zahl1);
    
    printf("Geben Sie bitte die zweite Zahl ein:\n");
    scanf("%f", &zahl2);
    
    float ergebnis = zahl1 / zahl2;
    
    printf("%f / %f = %f", zahl1, zahl2, ergebnis);
}
Ich weiß nicht, aber C gefällt mir sehr gut. Auch wenn ich gerne Schokomüsli mit frischen Bananen esse :D

Richtige Programmierer brauchen keine Kommentierungen; der Code spricht für sich;
Das würde ich meiner Meinung nach sogar als
richtig einschätzen. Wenn du es schaffst 2000 Zeilen Code zu schreiben, der sich von selbst erklärt ist das 1337.
 
mir gefällt C auch sehr gut, danke für dire tipps, aber ich esse liebend gern Müsli mit Kakao, Bananen und Sojamilch^^

ich hab noch ein problem:

ich habe so eine art menü in einem programm gebaut, bei dem man zahlen eingeben muss, um zu einem unterpunkt zu gelangen. ich habe das ganze mir if-konstruktionen gebaut, natürlich auch eine funktion dafür, wenn man eine zahl eingibt, zu der kein unterpunkt existiert. wenn ich alerdings im menü buchstaben eingebe, kommt eine endlosschleife von dieser fehlerfunktion, alles im dos-fenster ohne grafische oberfläche. Wie löse ich das Problem?

ich hab schon über switch() default nachgedacht obs dann geht
 
Bei einem Menu würde ich auf jeden Fall eine switch-Anweisung benutzen. Einfach ideal und wennse schonmal dabei ist...

Code:
char eingabe;
do{
cout << "Bitte wählen:n";
cout << "1: mach einsn";
cout << "2: mach zwein";
cout << "0: mach Schlussn";
cin >> eingabe;
cout << eingabe;
switch (eingabe){
case '1':
eins();
break;
case '2':
zwei();
break;
case '0':
break;
default:
cout << "Bitte nur 1 , 2 oder 0 wählen!n";
break;
}
}while (eingabe!='0');

Kommt dann noch drauf an, wie kompliziert bzw. sicher es sein soll. Für ein einfaches Proggie (lies:eins zum lernen) reicht eingabe als int zu definieren. Dann auf dem Weg weiter: als char damits auch ein Buchstabe sein darf. Und dann würd ich sagen als CString, der vorm switch geparst wird, damits auch mehr als ein Zeichen sein darf.

Das oben ist die char Variante, also nimmt auch einen Buchstaben, wenns mehr Zeichen sind bleiben die aber im Inputstream und werden in der do-while Schleife nacheinander bearbeitet. also die eingabe "Hallo" führt dann 5 mal (!) zur Ausgabe von "Bitte nur blabla eingeben".

Quick and dirty: nach cin >> eingabe; ein cin.ignore(256,'/n'); dann ist Ruhe weil die Eingabe nach dem ersten Zeichen verworfen wird. Dann darf dein Menu aber nur einstellige Auswahlmöglichkeiten haben und ähhhh, naja das wird jetzt zwar nicht kompliziert aber lang... Ich lasses erstmal so stehen weils wahrscheinlich schon etwas weiterhilft...
 
Original von CDW
Original von 0wnZ
aber auch
Code:
float div = a/b;
;)
und demnächst bitte Code-Tags benutzen
Das ist eine der vielen Sachen, die ich an C nicht mag ;). Soweit ich mich erinnere, wird mit a,b eine Integerdivision durchgeführt und erst dann das Ergebnis nach Float konvertiert, so dass letzendlich eine 1 herauskommt.

Ich find das vollkommen legitim. Denn zuerst wird ja die rechte Seite der Zuweisung ausgewertet, und das ist nunmal eine Integerdivision.
Insofern passiert genau das, was man (oder zumindest viele) erwarten würde, die Sprachdefinition ist einfacher und man muss nicht erstmal alle Sonderfälle durchschauen, bevor man eine einfache division mit Zuweisung macht. Das ist gerade eine der Sachen, die mir an C gefallen.
 
[OT]
die Sprachdefinition ist einfacher und man muss nicht erstmal alle Sonderfälle durchschauen,
dann:
a=2,b=3,c=4,d=3;
float div=a+b*c-a/d
Was kommt raus (ohne die Datentypen nachzuschauen)? Von wegen einfacher und klarer und ohne Sonderfälle ;)
Wenn man das z.B in Pascal sieht, dann kann schon alleine aufgrund des '/' Operators (für Integer benutzt man DIV ) sagen, dass alle Operanden Fließkommazahlen sein müssen (sonst ist der Ausdruck ungültig) und dementsprechend 13.333 herauskommt.

Anderes Beispiel (von octogen aus BuHa)
Mein letztes Beispiel ist folgender Prototype:

void function(char **);

Wir dürfen jetzt raten, welches Argument die Funktion gerne hätte:
* einen Array von character-vektoren
* einen Pointer (also die Adresse) von einem character-vektor
* einen Pointer auf einen Pointer auf einen einzelnen character
Selbsterklärender Code in C? Da muss man wirklich l337 sein ;)

Alledings sollte es kein C-Bashing werden, sondern ein Hinweis auf eine mögliche (und ärgerliche) Fehlerquelle ;):
 
Zurück
Oben