C++-Frage

Seite 1 von 3 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/c-frage_199833/page_1 - zur Vollversion wechseln!


ass21 schrieb am 20.09.2008 um 16:13

Hallo an alle,

ich lerne aktuell (seit 2 Wochen) in der Schule C++. Nun haben wir eine Übungsaufgabe bekommen, die ich doch lösen möchte. Ausgegeben werden soll folgendes:

Zitat
Berechnungen zum Kegel {mittig}

Kegeldurchmesser in mm: <Eingabe>

Kegelhöhe in mm: <Eingabe>


Volumen des Kegels: xxxxxxx.xx Kubikmillimeter.
Mantelfläche des Kegels: xxxxxxx.xx Quadratmillimeter.
Oberfläche des Kegels: xxxxxxx.xx Quadratmillimeter.



ENDE mit beliebiger TASTE (mittig)


Bisher habe ich folgendes Zustande gebracht:

Code:
//------------------------------------------------------------
#pragma hdrstop
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define geteilt 2 //Wert zu Umrechnung von Durchmesser zu Radius
#define pi 3.141592654 /*Kreiszahl Pi zur Errechnung der Grundflaeche und Mantelflaeche*/
#define geteiltt 3


//---------------------------------------------------------------------------

void main()

{

float Durchmesser, Hoehe, Volumen, Mantelflaeche, Oberflaeche, Grundflaeche,
      Radius, Seite, Seite1;


printf("\n\tProgramm zur Errechnung von Volumen, Mantelflaeche\n ");
printf("\tund Oberflaeche eines Kegels\n\n");
printf("\tKugeldurchmesser in mm:   ");
scanf("%f", &Durchmesser);
printf("\n\n\n");
printf("\tKegelhoehe in mm      :   ");
scanf("%f", &Hoehe);


Radius= Durchmesser / geteilt;

Seite1=  Radius * Radius + Hoehe * Hoehe; //Nicht sicher

double Seite1 = sqrt("%f", &Seite);  //falsch

Grundflaeche= pi * Radius * Radius;

Volumen= Grundflaeche * Hoehe / geteiltt;

Mantelflaeche= pi * Radius * Seite;

printf("\n\tVolumen : ");
printf("%f", Volumen);
printf("\n\n\n");
printf("%f", Mantelflaeche);

getch();
/* #pragma argsused
int main(int argc, char* argv[])
{
        return 0;  */
}
//---------------------------------------------------------------------------

Wie man ja an dem Kommentar hinter double erkennen kann, ist da was nicht ganz richtig :rolleyes:

Ich will einfach versuchen die Wurzel aus Seite1 zu ziehen, um auf Seite zu kommen (Pythagoras lässt grüßen). Wie bekomme ich das jetzt am dümmsten hin? Die Oberfläche nacher ausrechnen zu lassen ist ja kein Problem mehr.


tia

ass


Bodominjaervi schrieb am 20.09.2008 um 16:18

Mein Programmieren ist schon lange her, aber du lässt bei der sqrt die Adresse berechnen imho. Ich glaube, hier liegt das Problem, gib einfach das & einmal weg.
(Sorry, falls das nicht stimmen sollte)


ass21 schrieb am 20.09.2008 um 16:22

Hab das & weggegeben, hat leider nichts gebracht. Sonst noch Vorschläge?


muene schrieb am 20.09.2008 um 17:17

Ist auch schon eine weile her das ich c++ programmiert habe, aber kannst du das %f nicht weglassen und nur

double Seite1 = sqrt(Seite);

schreiben?
Aber wie gesagt, is schon eine weile her ...

Lg


ass21 schrieb am 20.09.2008 um 17:33

hat leider auch nichts genützt :(


semteX schrieb am 20.09.2008 um 17:33

sqrt nimmt als parameter variablen und keine adressen. du übergibst ihm nur adressen, kein wunder, dass es ihn komplett aufbrennt.

außerdem seh ich, wenn in der c++ referenz nachschau, kein sqrt, welches 2 parameter nehmen würd... i versteh ned wie das ding überhaupt compilen kann


muene schrieb am 20.09.2008 um 17:37

Überseh ich da grad was, aber du definierst "Seite" ja nur am Anfang als "float". Aber du weist ihm nirgends einen Wert zu, oder? (-somit kannst du dann auch keine wurzel draus ziehen)

lg


semteX schrieb am 20.09.2008 um 17:39

das ist das nächste


ass21 schrieb am 20.09.2008 um 17:47

Also die Höhe und den Durchmesser muss man ja eingeben. Wie sieht dann der Quelltext aus mit dem ich dann die Seite s bei dem Kegel bekomme? Bin für alles offen :)


EG schrieb am 20.09.2008 um 17:50

a² + b² = c²

Wenn a und b Katheten sind und c die Hypothinuse

In deinem Fall ist die Hypothinuse die Seite des Kegels s und a bzw b sind der Radius (Durchmesser/2) und die Höhe h.

Sprich:

(d/2)² + h² = s²

=> s = sqrt((d/2)²+h²);

edit: natürlich kannst in cpp ned '²' schreiben sondern musst halt h*h schreiben...


that schrieb am 20.09.2008 um 17:51

Aua, das ist ja kein C++, das ist falsches C.

Fangen wir oben an:

Code:
#pragma hdrstop

Was soll der Unsinn?

Code:
#include <stdio.h>
#include <conio.h>
#include <math.h>

stdio.h gehört so wie printf zu C. I/O in C++ macht man mit <iostream>. conio.h ist irgendein propritäres Zeug aus der DOS-Zeit.

Code:
#define geteilt 2 //Wert zu Umrechnung von Durchmesser zu Radius
#define pi 3.141592654 /*Kreiszahl Pi zur Errechnung der Grundflaeche und Mantelflaeche*/
#define geteiltt 3

Konstanten in C++ macht man mit "const int", "const double" usw, aber nicht mit #define. Deine Namen für 2 und 3 verschlechtern den Code statt ihn zu verbessern - wenns um die Umsetzung einer mathemetischen Formel geht, dann dürfen die Werte dort durchaus direkt drinstehen. Und Pi ist bereits in math.h definiert und heißt dort M_PI.

Code:
void main()

Falsch (wenn auch vom Compiler oft akzeptiert). Richtig ist nur int main() oder int main(int argc, char** argv).

Code:
float Durchmesser, Hoehe, Volumen, Mantelflaeche, Oberflaeche, Grundflaeche,
Radius, Seite, Seite1;

"float" ist nicht falsch, aber in der Praxis kaum nützlich, weil ungenau. Nimm lieber "double".

Code:
printf("\n\tProgramm zur Errechnung von Volumen, Mantelflaeche\n ");

Das ist C-Stil, nicht C++. Wenn du C++ lernst, solltest du nicht die C-Features davon bevorzugen. Mit C++ I/O würdest du hier std::cout << "..." << std::endl; schreiben.

Code:
scanf("%f", &Durchmesser);

Ebenso hier std::cin.

Code:
double Seite1 = sqrt("%f", &Seite); //falsch

Genau. Falsch. "man sqrt" (oder was auch immer du als Dokumentation verwendest), spuckt aus:

double sqrt(double x);

Außerdem redekarierst du da "Seite1", das du oben schon als "float" deklariert hast, als "double". Das geht nicht.

Also: Seite1 = sqrt(Seite);

(was soll überhaupt "Seite1" bedeuten?)
Edit: außerdem ists verkehrt, vermutlich wolltest du "Seite = sqrt(Seite1)". Du solltest klarere Namen verwenden.


semteX schrieb am 20.09.2008 um 17:51

edit: that hats so schön zerlegt, da brauch ich gar nix mehr sagen

edit2: wie konnte das ding überhaupt compilen? i check das noch immer ned....

edit3: i tipp mal das is typische htl, wir schreiben c++ drauf, bringen den kindern erst mal C bei und am ende kommen eventuell noch ein paar OO konzepte.


EG schrieb am 20.09.2008 um 17:58

Flame on semtex :D

Ich war auch in einer HTL...aber ich hab so Probleme wie mathematische Formelberechnungen durchaus in C gelernt.
Objektorientierung kommt erst im 2. Jahrgang. ;)

Find ich aber durchaus richtig so...NICHT RICHTIG (und ich glaub auch nicht, dass ihm das so beigebracht wurde) find ich wenn cpp auf ein c-Programm gepappt wird.

MMn hat der liebe ass21 hier einfach neu mit OOP angefangen - funktionale Vorbildung - und den Bogen noch nicht ganz raus.
Da helfen ihm gute Tipps mehr als Flame über seine Schule! :)

edit:

Hoffe ich...


semteX schrieb am 20.09.2008 um 18:01

"übungsaufgabe in der schule" => i denk mal er hat sich die scanf und printf mit parametern ned aus den fingern gesaugt... das wird ihm scho wer in der schule so beigebracht haben

und wenn ich mich dran erinner, was bei uns unter c++ und java gelaufn ist in der HTL... brrrr...


EG schrieb am 20.09.2008 um 18:07

JEDENFALLs musst du IM sqrt den Radius und die Höhe quadrieren und addieren. :)

KEINESFALLs irgendwelche Adressen übergeben...




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025