gerade und ungerade Zahlen
-
stotty schrieb:
Simon2 schrieb:
Japp!
Wir warten hinter der "Habe schonmal sinnvoll angefangen und mein bisheriges Wissen eingebracht"-Linie auf Dich.
Gruß,
Simon2.
ich entschudlige mich bei dem herren, dass ich erst jetz anfange, mir sowas anzueignen. jeder fängt mal klein an.
den saraksmus kannst du stecken lassen
Das war kein Sarkasmus, sondern ein klar definierter Hinweis, wie Du sinnvolle Hilfe bekommen kannst. Willst Du nicht? Kein Problem ... zumindestens nicht meines.
stotty schrieb:
...soweit bin ich....
Wenn Du das gleich in Deinem Eingangspost geschrieben hättest, hätte man Dir gleich viel zielgerichteter antworten können.
Wenn ich das richtig sehe, liegt Dein Problem darin, dass Du die "integer-Division" durchführst, wenn Du durch ein "int" teilst (implizit: 1 ist ein int und x auch).
Probiere doch mal aus floats zu teilen:
- int Wert in ein float zu kopieren und
- statt 1 die 1.0 nehmen.Übrigens:
In C++ kann man übrigens zur Ein/Ausgabe die viel einfachereren und in vielerlei Hinsicht sichereren "cout" und "cin" nehmen:#include <iostream> using namespace std; int main() { float y1,y2,y3; int x; cout <<"Bitte geben Sie den Wert fuer x an:\n"; cin >> x; ...
Gruß,
Simon2.
-
als erstes mal: hast du C++ oder C in der Uni? dürft ihr cin, cout etc nicht nutzen etc.?
~fricky schrieb:
ich würde jetzt raten: bei sqrt und log sind alle positiven zahlen erlaubt und bei 1/x alles, ausser 0.
sqrt: alles >= 0,
log: alles > 0
/ : alles != 0übrigens:
int x; std::cin >> x; //eingabe prüfen std::cout << "1/x = " << 1.f / static_cast <float> (x) << std::endl;
mit dem static_cast dort bekommst du nen float raus - ohne würde er dir nur einen int berechnen...
log und sqrt sollten ja iwo in <cmath> definiert sein - vermutlich heißen sie dort genau so ^^
bb
-
wie gesagt, die rechnungen sind kein problem. es is nur das mit der geradheit.
und wir dürfen auch nur c++, kein c. wobei ich sagen muss, dass ich den unterschied jetz nich wirklich kenne. auf jeden fall sagen mir die befehle cin und cout nichts.
dann entschuldige ich mich bei simon. viell. sollten wir uns beide in zukunft anders ausdrücken. bei mir kam es nun mal wie ein vorwurf an. kann mit der aussage
Habe schonmal sinnvoll angefangen und mein bisheriges Wissen eingebracht
nichts anfangen....
ich werd mich dann gleich nochma an die aufgabe setzen und eure hinweise beachten
danke schonma
-
stotty schrieb:
und wir dürfen auch nur c++, kein c.
aber ihr habt bis jetzt noch nich cin und cout genutzt und immer printf/scanf/... ?
Glaub ich dir iwie nicht so ganz...bb
-
ich kann dir gern die übungen zeigen, die ich bisher mit unserem übungsleiter durch hab. ich kenn nur scanf und printf....aber ich hab eben das andere ausprobiert. geht wunderbar. danke dafür!
Die aufgabe ist nun auch komplett. danke, dass ihr mir da durch geholfen habt.
-
stotty schrieb:
x muss ich als int eingeben, da ich ja schaun muss, ob die zahl gerade oder ungerade ist. um aber z.b. die wurzel ausrechnen zu können, muss ich muss ich float-variablen einführen.
Du sollst eine beliebige Zahl einlesen. Also
1. Zahl als float einlesen
2. Tests auf negativ und 0 machen
3. Wenn Zahl >= 0 Wurzel
4. Wenn Zahl != 0 1/
5. Wenn Zahl >0 log
6. Test ob die zahl int ist
Hier mal die einfachste Testvariante, die aber nicht immer funktioniert.float f; //einlesen if( int(f) == f) // Zahl ist int
7. Wenn ja alle noch fehlenden Tests
-
@stotty:
- zeig doch mal deine lösung
- sry, aber wo studierst du denn und was vor allem? cin und cout gehören einfach zu C++ - und printf und Konsorten sind nur noch aus Gründen der Abwärtskompatibilität im Standard vorhanden. Man sollte niemals C mit C++ mischen... Also frag mal deinen Übungsleiter (am besten vor dem Testat ^^), warum ihr das nicht verwendet - vll hat er ja am anfang des semesters nen grund dazu genannt (solls ja geben, auch wenn der grund kein guter ist ^^)bb
edit: huch - da steht ja doch nirgendwo, dass er einen int und kein float einlesen sollte... sry ^^
edit nr.2:
def. gerade lt. wikipedia:
"Eine ganze Zahl heißt gerade, wenn sie durch 2 teilbar ist"
Und da ich auch nirgendwo eine Definition für nicht ganze Zahlen gefunden habe, wirst du den float wohl einfach in nen int speichern müssen, die beiden auf gleichheit prüfen und dann beim int entweder mit dem operator & oder % auf gerade bzw. ungerade prüfen müssen...
-
#include<stdio.h>
#include<stdlib.h>
#include<math.h>int main()
{
float y1,y2,y3;
int x;
printf("Bitte geben Sie den Wert fuer x an:\n");
scanf_s("%i",&x);
if(x<0) {
y2=1.0/x;
if(x%2==0) printf("x ist eine negative gerade Zahl. Der Kehrwert lautet %2.2f.\n",y2);
else
printf("x ist eine ungerade negative Zahl. Der Kehrwert lautet %2.2f.\n",y2);
}
else
if(x==0) {
y1=sqrtf(x);
printf("x hat den Wert 0. Die Wurzel aus x ist %2.2f.\n",y1);
}
else
if(x>0) {
y1=sqrtf(x);
y2=1.0/x;
y3=logf(x);
if(x%2==0) printf("x ist eine positive gerade Zahl. Die Wurzel aus x ist %2.2f, der Kehrwert %2.2f und der Logarithmus %2.2f.\n",y1,y2,y3);
else
printf("x ist eine postive ungerade Zahl. Die Wurzel aus x ist %2.2f, der Kehrwert %2.2f und der Logarithmus %2.2f.\n",y1,y2,y3);
}
return 0;
}zumindest funktioniert es. und die aufgabenstellung is erfüllt. verbesserungswürdig ist es warscheinlich auch noch. aber für heut geb ich mich damit zufrieden und geh zur nächsten aufgabe über.
-
ok, wenn ich diese cout und cin befehle benutze, wie kann ich dann einen wert damit wieder ausgeben?
float p;
cout <<"Bitte geben Sie die Endpunktezahl der Klausur an!\n";
cin >> p;cout <<"Die Punktezahl ist %p\n";
oder wie?
-
also das, was du lernst ist aber definitiv C (auch die Header sind C-Header)...
ich hätte es anders gemacht...
float x; std::cin >> x; //überprüfung der eingabe (per std::cin.good()) if(x == int(x)) { int x2 = x; std::cout << "x ist "; if (x2%2) std::cout << "un"; std::cout << "gerade" << std::endl; } else { std::cout << "x ist keine ganze Zahl und somit ist die gerade/ungerade nicht definiert" << std::endl; } std::cout << "1/x = "; if(x != 0) { std::cout << 1/x << std::endl; } else { std::cout << "NaN" << std::endl; } //und so weiter... in etwa so if (x > 0) { std::cout << log(x) << std::endl; } //else.... if (x >= 0) { std::cout << sqrt(x) << std::endl; }
in C natürlich die entsprechnenden Pendants zu
std::cout
undstd::cin
bb
edit:
#include <iostream> //damit std::cout und std::cin vorhanden sind using namespace std; //damit du nicht mehr std::cout und std::cin etc sondern nur noch cout und cin usw schreiben musst - das könnte man auch so umgehen: using std::cout; using std::cin; using std::endl; //oder man lässt es einfach weg und schreibt nen std:: davor int main() { int x; std::cin >> x; if (std::cin.bad()) { std::cout << "falsche Eingabe" << std::endl; } float y; std::cin >> y; //etc. }
das soll dir nur Zeigen, dass der operator >> und << immer richtig überladen wird... Denkbar wäre auch so etwas:
std::cin >> x >> y >> usw >> usf
Dafür musst du nur mal nach streams suchen... sollte auch iwo in der FAQ stehen oder so ^^
bb
-
ok, wenn du sagst, dass das c++ is, fühl ich mich grad von der uni n bissl....naja, egal.
uns wurde auf jedenfall gesagt, dass es c++ wäre. und da ich vorher nu gar keine ahnung hatte, hab ich es nich besser gewusst.komisch
sry, rechtschreibfehler
-
stotty schrieb:
ok, wenn du sagst, dass das c is, fühl ich mich grad von der uni n bissl....naja, egal.
uns wurde auf jedenfall gesagt, dass es c++ wäre.In dem von dir geposteten Code ist nichts, das nicht C wäre. Man kann das aus Kompatibilitätsgründen vielleicht durch einen C++ Compiler jagen (sofern er noch die alten C-Header erlaubt, was viele noch tun), aber mit C++ hat das dennoch nichts, aber auch garnichts zu tun.
cu André
-
@stotty
Du solltest deine Aufgaben besser nicht zusammenfassen. Das hierif(x==0) { y1=sqrtf(x); printf("x hat den Wert 0. Die Wurzel aus x ist %2.2f.\n",y1); }
ist ziemlich unsinnig da die Wurzel aus 0 ja immer 0 ist.
-
is mir klar. aber es ist definiert. und wir sollen die werte nur dann nicht angeben, wenn sie nciht definiert sind.
-
stotty schrieb:
is mir klar. aber es ist definiert. und wir sollen die werte nur dann nicht angeben, wenn sie nciht definiert sind.
Wieso dann noch die mühsame Behandlung des Spezialfalls 0, wenn du die Wurzel sowieso noch einmal errechnest?
-
is zu übungszwecken. so seh ich, dass ich das richtige eingegeben hab. ist klar. dass es nehr arbeit ist. aber es soll letzendlich ne übung sein
-
Dann hoffe ich mal, dass deine Übung zu Erkenntnisgewinn führt.
-
Trotzdem ist es wahrscheinlich nicht schlecht, wenn du dir bereits in Übungen gute Dinge angewöhnst.
Ich meine ja hauptsächlich, dass bei 0 noch einmal die Wurzel ausgerechnet und die Variable einzeln ausgegeben wird. Das ist unnötig und braucht mehr Zeit. Klar macht es bei diesem Beispiel nicht viel aus, aber dann wirst du es bei kritischeren Dingen auch wissen.