gerade und ungerade Zahlen
-
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.