"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

C++-Frage

ass21 20.09.2008 - 16:13 3344 33
Posts

ass21

Big d00d
Avatar
Registered: Mar 2006
Location: Deutschland
Posts: 339
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
Bearbeitet von that am 20.09.2008, 17:52

Bodominjaervi

OC Addicted
Registered: Jul 2002
Location: AT
Posts: 7813
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

Big d00d
Avatar
Registered: Mar 2006
Location: Deutschland
Posts: 339
Hab das & weggegeben, hat leider nichts gebracht. Sonst noch Vorschläge?

muene

Addicted
Avatar
Registered: Jan 2004
Location: @Home
Posts: 430
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

Big d00d
Avatar
Registered: Mar 2006
Location: Deutschland
Posts: 339
hat leider auch nichts genützt :(

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14592
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

Addicted
Avatar
Registered: Jan 2004
Location: @Home
Posts: 430
Ü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

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14592
das ist das nächste

ass21

Big d00d
Avatar
Registered: Mar 2006
Location: Deutschland
Posts: 339
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

thinking with portals
Avatar
Registered: May 2004
Location: 11**
Posts: 3918
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

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
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.
Bearbeitet von that am 20.09.2008, 17:56

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14592
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.
Bearbeitet von semteX am 20.09.2008, 17:55

EG

thinking with portals
Avatar
Registered: May 2004
Location: 11**
Posts: 3918
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

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14592
"ü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...

ass21

Big d00d
Avatar
Registered: Mar 2006
Location: Deutschland
Posts: 339
Zitat von that
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?)

Wie ich sehe habe ich viel Unsinn hier verzapft :eek:

zu 1: Das pragma hdrstop macht das Programm von selbst
zu 2: Ja, ist wohl C
zu 3: Kann sein ja
zu 4: So wurde es mit gestern noch ausdrücklich (!) im Unterricht erklärt
:confused:
zu 5: double ist was? wie gesagt lerne das seit 2 wochen und bisher 6 wochenstunden gehabt
zu 6+7: siehe 2
zu 8: das mit dem double hab ich in google gefunden, hier wen es interresiert


Ich sollte den Titel ändern, that hat immerhin erörtert dass es sicher kein c++ ist, nur normales c :P

Bin übrigens auf einem beruflichen Gymnasium mit dem Profilfach IT :fresserettich:

EDIT: habs jetzt mal mit evils vorschlag versucht und seinen code mit meinen variablen umgeschrieben - jedoch will der compiler ein ² nicht annehmen - muss man das dann als ^2 schreiben?

Edit2: @ Evil: Doch, ich war bis vor ein paar Minuten der festen Meinung es seie cpp o.O
Bearbeitet von ass21 am 20.09.2008, 18:14
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz