Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

0 errors trotzdem Fehlerhaft

matthew76 / 5 Antworten / Baumansicht Nickles

HI, ich muss in c ein Programm mit Hilfe von Funktionen schreiben in dem man sich aussuchen kann ob man die Oberfläche oder das Volumen des Zylinders berrechnen will.


Leider funktioniert das Programm nicht, obwohl ich 0 Errors angezeigt bekomme.


Ich bitte um Hilfe. Danke im Vorraus


//Sonntag 14. Dezember 2003
//Programm zur Berechnung von Volumen & Oberfläsche eines Zylinders
//Oberflaeche = 2*pi*r*(radius+hoehe)
//Volumen = pi * r²*h



#include <stdio.h>
#include <stdlib.h>
#include <conio.h>


#define pi 3.14f


void foberflaeche(void);
void fvolumen(void);


unsigned short radius=0, hoehe=0;


void main(void)
{
 
 int menue=0, r=0;
 
 do{
  system("cls");
  printf("Zylinder!!!\n");
  printf("[1] Oberflaeche berechnen: \n");
  printf("[2] Volumen berechnen: \n");
  printf("[3] Programm beenden: \n\n");
  
  do{
   printf("Ihre Auswahl: ");
   r=scanf("%d", &menue);
  }while(r!=1 || menue<1 || menue >3);
  
  
  
  switch(menue){
   
  case 1:
   do {
    printf("\n\nRadius:");
    r=scanf("%hu", &radius);
   }while(r!=1 || radius>200);
   
   do{
    printf("Hoehe: ");
    r=scanf("%hu", &hoehe);
   }while(r!=1 || hoehe>500);
   
   foberflaeche();
   break;


   
  case 2:
   do{
    printf("\n\nRadius: ");
    r=scanf("%hu", &radius);
   }while(r!=1 || radius>200);
   
   do{
    printf("Hoehe: ");
    r=scanf("%hu", &hoehe);
   }while(r!=1 || hoehe>500);
   
   fvolumen();
   
  }
 }while(menue >0 && menue <3);
 
 
 
 printf("\nTusches und Ende !!!\n\n");
 
}


void foberflaeche(void){
 double ober=0;
 ober=((2*pi)*radius)*(radius+hoehe);
 printf("Die Oberflaeche betraegt %lf cm²", &ober);
 printf("\nTaste druecken fuer weiter:\n");
 getch();
}


void fvolumen(void){
 double volu=0;
 volu=pi*(radius*radius)*hoehe;
 printf("Das Volumen betraegt %lf cm²", &volu);
 printf("\nTaste druecken fuer weiter:\n");
 getch();
}


 

bei Antwort benachrichtigen
mr.escape matthew76 „0 errors trotzdem Fehlerhaft“
Optionen

Also echt brutale fehler finden sich nicht (im switch abschnitt sollte auch für "case 2" ein break verwendet werden).
Sehr irritierend ist aber das durcheinander bei den zahlenformaten. Pi ist als float, radius und höhe als unsigned short(?!?!?) und das volumen/die oberfläche bei der berechnung als double definiert. Also entweder alles als float oder als double.
Um keine negative eingaben zu bekommen ist eben eine zweite abfrage nötig, statt unsigned short dafür zu missbrauchen.

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
T-Rex matthew76 „0 errors trotzdem Fehlerhaft“
Optionen

Hi,

#define pi 3.14f
Mag für private Zwecke ausreichend sein, besser ist das hier:
PI = 4 * atn(1)
Ich weiß aber nicht, wie die ArcusTangens-Funktion korrekt geschrieben wird.

[...] Leider funktioniert das Programm nicht [...]
Das ist sehr schwammig.

Beschreibe bitte, was nicht funktioniert und wie sich dieses Fehlverhalten ausdrückt.

 GrüßeT-Rex 
bei Antwort benachrichtigen
matthew76 Nachtrag zu: „0 errors trotzdem Fehlerhaft“
Optionen

Die Auswahl im Menue lässt sich eingeben und die Werte von Radius und hoehe.
Leider kommt im Ergebnis im 0.00000 raus egal was ich eingegeben habe.

bei Antwort benachrichtigen
Dreamforger matthew76 „0 errors trotzdem Fehlerhaft“
Optionen

Mir fällt da ein Fehler und eine potentielle Fehhlerquelle auf:

Wenn ich printf() nicht seit Jahren falsch verwende musst du nicht &ober bzw &volu sondern nur ober und volu übergeben. So wie ich das sehe ist 0.00000 die float Interpretation der Adresse der lokalen Variablen.

Wie mr.escape schon sagte sind deine Datentypen total daneben. Nimm einfach für's erste für alles float, das bietet hinreichende Genauigkeit und ist korrekter als ein double, int und unsigned short Mischmasch. "2" ist im übrigen ein int. 2.0f ist der korrekte float-Wert

Noch ein paar Worte zum Programmaufbau: In einer ruhigen Minute kannst du dir mal überlegen ob es wirklich sinnvoll ist die Eingabe von höhe und radius innerhalb jedes Switch-Zweiges zu machen. Wäre es nicht sinniger die Eingabe an einer Stelle zu haben und dann nurnoch die jeweiligen Berechnungen in den Switches aufzurufen? Über die Globalen Variablen sag ich mal nichts- vielleicht waren Funktionen mit Parametern ja noch nicht dran.

bei Antwort benachrichtigen
matthew76 Nachtrag zu: „0 errors trotzdem Fehlerhaft“
Optionen

an den Datentypen lag es nicht sondern an der Fehlerhaften printf() Ausgabe.
Danke für den Tipp.

Mit freundlichen Grüßen matthew76

bei Antwort benachrichtigen