sqrt
-
hi
#include<iostream> #include<cmath> using namespace std; int main() { double eingabe; //Hier kann ich kein int eingeben, sonst Fehler double wurzel; cout << "Programm zur Wurzelberechnung" << endl; cout << endl; cout << "Geben Sie bitte eine Zahl ein: "; cin >> eingabe; if (eingabe >= 1) { wurzel = sqrt(eingabe); cout << "Wurzel von " << eingabe << " = " << wurzel << endl; } else { cout << "Wurzel negativer Zahlen kann nicht " "berechnet werden." << endl; } cout << endl; cout << "Programm wird beendet." << endl; return 0; }
das ist der code um den es geht, wenn ich also int eingabe eingebe dann gibt es fehlermeldung: overload.
vorschläge gibt es auch, und zwar setze ich dann double, so wie ich es oben ja dann auch gemacht habe.
wenn der mir nur den fehler melden würde wäre ja ok, aber kompilieren will der nicht. nur wenn (in dem fall) der wert auch double ist.
wie sage ich dem jetzt das er das int eingabe annehmen soll, ich könnte auch die cout ausgabe formatieren, doch soll er nur mit nicht kommazahlen rechnen.
compiler: gcc version 3.3 20030226 (prerelease) (SuSE Linux)
unter windows mit dev-cpp 4.9.83 ist genau das selbe.danke
-
du überprüfst die eingabe ob sie eine Zahl ist...
btw zur Programmlogik ... Man kann durchaus Wurzeln aus negativen Zahlen ziehen.
-
wer sagt denn das man das nicht kann?
das ist aber nicht mein problem!
-
Was genau willst du erreichen? Beschreib dein Problem bitte etwas genauer.
double kann auch ganze Zahlen speichern. Zwar nicht immer verlustfrei, aber die Genauigkeit reicht fast immer aus.
Willst du testen, ob der Anwender eine Ganzzahl oder eine Kommazahl eingegeben hat?inline bool KommaZahl(const double& d) { // Klappt allerdings nicht immer: return static_cast<double>(static_cast<int>(d)) != d; } int main() { /* irgendwas */ if(KommaZahl(d)) { // Zahl mit Komma } else { // Zahl ohne Komma (-> verlustfrei als int darstellbar) } /* irgendwas */ }
Die Funktion testet nicht wirklich, ob es ein Komma gibt. Sie testet eher, ob beim Darstellen der Zahl als int ein Verlust auftritt.
Oder willst du einfach nur, dass cout kein Komma ausspuckt?
btw:
Ist jede Zahl, die kleiner als 1 ist, negativ?
-
Er sagt, es soll nicht mit Komma gerechnet werden. Also lass int eingabe und wandel dann die eingabe in ein double um. Und das Ergebnis kannst wieder entweder runden oder einfach in ein int umwandeln.
Hab ich jetzt richtig verstanden, was du gemeint hast?
-
hi
unabhängig davon ob der user eine ganzzahl oder eine kommazahl eingibt, es soll immer ohne komma gerechnet werden.
bsp:
der user gibt die zahl 23 ein, dann kommt als ergebnis 4.79583 raus.
wenn der user aber 23.8438 eingibt dann soll auch 4.79583 rauskommen.
es soll also nur mit einer ganzzahl gerechnet werden nicht mit einer gleitkommazahl.der tip mit static_cast war genau das was ich wollte, danke
#include <iostream> #include <cstdio> using namespace std; /*Wo kann man eigentlich sehen was im sogenannten Namespace liegt oder was nicht?, gibt es eine Referenz dazu?*/ int main() { double eingabe; //Eingabe sowohl Gleitkomma als auch Ganzzahl, bessere Lösung double wurzel; cout << "Programm zur Wurzelberechnung" << endl; cout << endl; cout << "Geben Sie bitte eine Zahl ein: "; cin >> eingabe; //Es erfolgt eine Umwandlung in eine GZ(int) damit nicht mit einer GKZ gerechnet wird eingabe = static_cast<int>(eingabe); if (eingabe >= 0) { wurzel = sqrt(eingabe); cout << "Wurzel von " << eingabe << " = " << wurzel << endl; } else { cout << "Wurzel negativer Zahlen kann nicht " "berechnet werden." << endl; } cout << endl; cout << "Programm wird beendet." << endl; return 0; }
btw:
Ist jede Zahl, die kleiner als 1 ist, negativ?nein! fehler von mir
ich brauche ein neues buch zum lernen. das mit dem static_cast habe ich dann mal gegoogelt und gefunden. in meinem buch wurde das (noch?) nicht erklärt genauso was ein namespace ist. da steht man soll es nur benutzen damit man keine fehlermeldung bekommt.
cui
-
Du musst eine explizite Typumwandlung vornehmen, dann kann eingabe ein int-Wert sein. Dies muss deshalb explizit geschehen, weil verschiedene Überladungen von sqrt() existieren, nämlich für double, long double und float (sagt der Compiler in der Fehlermeldung). Der Compiler kann dann nicht selbst entscheiden, in welchen Typ er den int umwandeln soll und gibt eine Fehlermeldung aus. Würde nur eine Version von sqrt() existieren, würde die Typumwandlung vom Compiler implizit durchgeführt.
Du kannst die Wurzel - wenn Du willst - auch an einen int-Wert übergeben. Dann wird aber automatisch der gebrochene Teil des Ergebnisses abgeschnitten. Deshalb warnt der Compiler auch davor (das Programm läuft aber trotzdem fehlerfrei!!). Durch eine weitere explizite Umwandlung, kannst Du als Ergebnis einen int-Wert an wurzel zuweisen, dann verschwindet die Compiler-Warnung.wurzel = sqrt((double)eingabe); // double zurückgeben, eingabe int wurzel = (int)sqrt((double)eingabe); // int zurückgeben, eingabe int
Gruss,
Andreas
-
1ntrud0r schrieb:
btw zur Programmlogik ... Man kann durchaus Wurzeln aus negativen Zahlen ziehen.
Ja, aber nur in C und nicht in R. Und für ersteres ist double wohl eher ungeeignet.
-
@Andreas2: Was soll das? Wieso zeigst du die brutealen C-Casts. Der static_cast ist vollkommen ausreichend.
Nochwas prinzipielles: Heutzutage werden Variablen immer so spät wie möglich definiert.
#include <iostream> #include <cmath> using namespace std; int main() { cout << "Programm zur Wurzelberechnung\n\n"; // hier muss noch nicht geflsuht werden double eingabe; cout << "Geben Sie bitte eine Zahl ein: "; cin >> eingabe; //Es erfolgt eine Umwandlung in eine GZ(int) damit nicht mit einer GKZ gerechnet wird eingabe = floor(eingabe); // floor passt irgendwie besser if (eingabe >= 0) { double wurzel = sqrt(eingabe); // und jetzt merkst du auf einmal, dass die Variable überflüssig wird cout << "Wurzel von " << eingabe << " = " << wurzel << endl; } else { cout << "Wurzel negativer Zahlen kann nicht " "berechnet werden." << endl; } cout << '\n; cout << "Programm wird beendet." << endl; return 0; }
std::floor runded den wert ab, was hier wohl das passenste ist.
Das mit den Namensräumen ist eigentlich auch recht einfach. Du kannst einen namensraum aufmachen, der dann mehrere Klasse und Funktionen gruppiert
namespace Foo { void bar () { ... } class Quer { ... }; }
Später sprichst du die Bestandteile dann per Namensraum::Element an, also hier Foo::bar() oder Foo::Quer. Du kannst aber auch ein using verwenden, um den ganzen Namensraum oder auch nur Teile davon im aktuellen Scope bekannt zu machen. Mit using namespace std; machst du den Namensraum std im globalen Scope bekannt. Alle Elemente der Standardbibliothek sind in diesem Namensraum definiert. Wenn du das using weglässt musst du std::cout, ... verwenden.
Wenn du den MSVC verwendest sind nur die neueren Teile im Namensraum std und die von C stammenden nicht. Das ist manchaml ganzschön lästig.
-
Helium schrieb:
@Andreas2: Was soll das? Wieso zeigst du die brutealen C-Casts. Der static_cast ist vollkommen ausreichend.
Brutal? In diesem Sinne ist der gleichbedeutend mit static_cast, man übersieht ihn nur leichter.
-
Viel besser waere eine while-Schleife
!!
mfg Gaunlet
-
Brutal? In diesem Sinne ist der gleichbedeutend mit static_cast, man übersieht ihn nur leichter.
Wie er hier gebaucht wird ist doch egal. Er ist und bleibt brutal. Ich kann ein Gewehr auch benutzen, um meine Wäsche daran aufzuhängen, dennnoch bleibt es eine Waffe.
Viel besser waere eine while-Schleife !!
Und noch Besser würde mir jetzt ein Wiener Schnitzel gefallen.
-
Helium schrieb:
Ich kann ein Gewehr auch benutzen, um meine Wäsche daran aufzuhängen...
Ui wie brutal
. Ich meinte auch nur, dass er zwar Verwirrung stiftet aber sich an dem Kompilat nichts ändert. Brutal ist das falsche Wort. Hinterlistig wäre besser.
-
Ich finde ihn sehr brutal. Er castet einfach wild durch die gegend ohne Rücksicht auf Verluste
-
Naja, C++ hat ihn immerhin ein wenig gedrosselt.
-
Wen eine mögliche warnung d. compilers nicht stört, der kann eingabe auch als
int deklarieren, was imho die absicht d. programmiererIn besser ausdrückt, auf floor verzichten und folgendes tun:int eingabe; cin >> eingabe; double ergebnis = sqrt(double(eingabe));
-
Nachdem das geklärt ist:
Wie soll man eine Wurzel aus einem negativen Radikanden ziehen?
MfG MAV
-
Mis2com schrieb:
Wie soll man eine Wurzel aus einem negativen Radikanden ziehen?
Hier eine kleine Einführung:
http://www.uni-ulm.de/~s_fwinkl/komplex/komplex.html
-
Mis2com schrieb:
Wie soll man eine Wurzel aus einem negativen Radikanden ziehen?
Das geht wie gesagt nur in C (nicht zu verwechseln mit der Programmiersprache
).
-
Schreib doch |C, wie es die meisten hier im Forum tun. Dann ist es eindeutiger.