Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Flächeninhaltsrechner

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
06.11.2009, 20:17 Uhr
der_evo



Flächeninhaltsrechner - Code und Fragen

Ich habe vor 2-3 Tagen angefangen C++ zu lernen und habe einen
kleinen Flächeninhaltsrechner geschrieben, um ein besseres Verständnis zum Thema
Variablen und der if-else Problematik zu bekommen.

Hier ersteinmal der komplette Code:


C++:
#include <string>
    #include <iostream>
    using namespace std;
    
    namespace Umlaut
    {
    const unsigned char AE = static_cast<unsigned char>(142);
    const unsigned char ae = static_cast<unsigned char>(132);
    const unsigned char OE = static_cast<unsigned char>(153);
    const unsigned char oe = static_cast<unsigned char>(148);
    const unsigned char UE = static_cast<unsigned char>(154);
    const unsigned char ue = static_cast<unsigned char>(129);
    const unsigned char ss = static_cast<unsigned char>(225);
    }
    
    float Add(float, float);
    
    int main()
    {
    int strart;
    int streinheit;
    double pi;
    float a;
    float b;
    float c;
    float r;
    float r2;
    float umfang;
    double inhalt;
    char dummy;
    
    
    cout<<" \\\\\\\\-Willkommen beim Fl"<<Umlaut::ae<<"cheninhaltrechner 2009!-//////// \n";
    cout<<"
\n";
    cout<<"
\n";
    cout<<"
\n";
    cout<<"
Bitte w"<<Umlaut::ae<<"hlen Sie die Art der Fl"<<Umlaut::ae<<"che aus: 1 = Quadrat, 2 = Rechteck,\n3 = gleichseitige Dreieck oder 4 = Kreis\n\n";
    cin>>strart;

    if (strart == 1)

    {
    cout<<"
\nBitte w"<<Umlaut::ae<<"hlen Sie die Einheit aus: 1 = mm, 2 = cm, 3 = m oder 4 = km\n\n";
    cin>>streinheit;
    cout<<"
\nBitte geben Sie Seitenl"<<Umlaut::ae<<"nge von a: ein\n\n";
    cin>>a;
        
        if (streinheit == 1)
        {
        inhalt=a*a;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratmillimeter\n";    
        }    
        
        else if (streinheit == 2)
        {
        inhalt=a*a;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratzentimeter\n";
        }  
        
        else if (streinheit == 3)
        {
        inhalt=a*a;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratmeter\n";
        }  
        
        else if (streinheit == 4)
        {
        inhalt=a*a;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratkilometer\n";    
        }      
    }

    else if (strart == 2)

    {
        cout<<"
\nBitte w"<<Umlaut::ae<<"hlen Sie die Einheit aus: 1 = mm, 2 = cm, 3 = m oder 4 = km\n\n";
        cin>>streinheit;
        cout<<"
Bitte geben Sie die erste Zahl ein\n\n";
        cin>>a;
        cout<<"
\nBitte geben Sie die zweite Zahl ein\n\n";
        cin>>b;
        
        if (streinheit == 1)
        {
        inhalt=a*b;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratmillimeter\n";    
        }    
        
        else if (streinheit == 2)
        {
        inhalt=a*b;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratzentimeter\n";
        }  
        
        else if (streinheit == 3)
        {
        inhalt=a*b;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratmeter\n";
        }  
        
        else if (streinheit == 4)
        {
        inhalt=a*b;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratkilometer\n";    
        }
    }

    else if (strart == 3)

    {
        cout<<"
\nBitte w"<<Umlaut::ae<<"hlen Sie die Einheit aus: 1 = mm, 2 = cm, 3 = m oder 4 = km\n\n";
        cin>>streinheit;
        cout<<"
Bitte geben Sie die erste Seitenlänge ein\n\n";
        cin>>a;
        cout<<"
\nBitte geben Sie die zweite Seitenlänge ein\n\n";
        cin>>b;
        cout<<"
\nBitte geben Sie die dritte Seitenlänge ein\n\n";
        cin>>c;
        umfang=a+b+c;
        
        if (streinheit == 1)
        {
        inhalt=umfang/2;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratmillimeter\n";    
        }    
        
        else if (streinheit == 2)
        {
        inhalt=umfang/2;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratzentimeter\n";
        }  
        
        else if (streinheit == 3)
        {
        inhalt=umfang/2;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratmeter\n";
        }  
        
        else if (streinheit == 4)
        {
        inhalt=umfang/2;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratkilometer\n";    
        }
    }
    
        else if (strart == 4)
        {
        cout<<"
\nBitte w"<<Umlaut::ae<<"hlen Sie die Einheit aus: 1 = mm, 2 = cm, 3 = m oder 4 = km\n\n";
        cin>>streinheit;
        cout<<"
\nBitte geben Sie den Radius ein\n\n";
        cin>>r;
        r2=r*2;
        pi==3,14159265;
        
        
        if (streinheit == 1)
        {
        inhalt=pi*r2;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratmillimeter\n";    
        }    
        
        else if (streinheit == 2)
        {
        inhalt=pi*r2;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratzentimeter\n";
        }  
        
        else if (streinheit == 3)
        {
        inhalt=pi*r2;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratmeter\n";
        }  
        
        else if (streinheit == 4)
        {
        inhalt=pi*r2;
        cout<<"
\n\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt<<" Quadratkilometer\n";    
        }
    }  
    
        else
        {
        cout<<"
\a";
        cout<<"
\n\nSie haben eine falsche Fl"<<Umlaut::ae<<"che oder Einheit ausgew"<<Umlaut::ae<<"hlt!\n";
        }
        
        
        cout<<"
\n";
        cout<<"
\n";
        cout<<"
Um das Programm zu beenden, klicken Sie aufs Kreuzchen! :)\n";
        cin>>dummy;
    }


Nun zu meinen Fragen:
1. Wie bekomme ich es hin, dass sich das Programm durch drücken der Enter-Taste
schließt?
2. Gibt es vllt. eine übersichtlichere Lösung für das ganze?


Schonmal vielen Dank im Vorraus!
mfg der_evo

Dieser Post wurde am 06.11.2009 um 20:18 Uhr von der_evo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.11.2009, 22:03 Uhr
0xdeadbeef
Gott
(Operator)


Naja, Übersichtlichkeit hängt ein bisschen vom Wissensstand des Benutzers ab. Mit komplexeren Werkzeugen kann man das ganze jedenfalls kürzer fassen - ich ginge das ganze etwa so an:

C++:
#include <cmath>
#include <cstddef>
#include <iostream>
#include <sstream>
#include <string>

double const pi = 3.141592653589;

template<typename t> t read_type(std::string const &prompt) {
  t x;
  std::string line;
  std::istringstream in;

  do {
    std::cout << prompt << std::flush;
    std::getline(std::cin, line);

    in.clear();
    in.str(line);
    in >> x;
  } while(!in);

  return x;
}

template<typename t, std::size_t n> std::size_t array_size(t(&)[n]) {
  return n;
}

unsigned auswahl(std::string const &subject, char const *const choices[], std::size_t n) {
  unsigned choice;

  std::cout << "\n" << subject << " auswählen:\n";
  for(std::size_t i = 1; i <= n; ++i) {
    std::cout << i << ": " << choices[i - 1] << "\n";
  }

  do {
    choice = read_type<unsigned>("Auswahl: ");
  } while(choice == 0 || choice > n);

  return choice - 1;
}

typedef double (*flaeche_func_t)(double);

double fl_quadrat   (double a) { return a * a; }
double fl_glsdreieck(double a) { return a * a * std::sqrt(3) / 4.0; }
double fl_kreis     (double r) { return pi * r * r; }

flaeche_func_t const fl_funcs[] =
  { fl_quadrat   , fl_glsdreieck           , fl_kreis };
char const *const formen     [] =
  { "Quadrat"    , "gleichseitiges Dreieck", "Kreis"  };
char const *const varnames   [] =
  { "Seitenlänge", "Seitenlänge"           , "Radius" };

char const *const units[] =
  { "Millimeter", "Zentimeter", "Meter", "Kilometer" };

int main() {
  unsigned form, unit;
  double x;

  form = auswahl("Form"      , formen, array_size(formen));
  unit = auswahl("Maßeinheit", units , array_size(units  ));

  x = read_type<double>(std::string(varnames[form]) + ": ");
  std::cout << "Fläche ist " << fl_funcs[form](x)
            << " Quadrat-" << units[unit] << "." << std::endl;
}


...aber ich gehe davon aus, dass ich dafür einiges erklären muss. Also, der Reihe nach:

C++:
// Das ganze ist eine Funktionsvorlage, damit es einfach für verschiedene
// Typen benutzt werden kann, a la
//
// unsigned x = read_type<unsigned>("Vorzeichenlose Ganzzahl eingeben: ");
// double x = read_type<double>("Dezimalzahl eingeben: ");
template<typename t> t read_type(std::string const &prompt) {
  t x;
  std::string line;
  std::istringstream in;

  do {
    std::cout << prompt << std::flush;
    // Eine Zeile von der Konsole einlesen
    std::getline(std::cin, line);

    // Einen Stream aus der Zeile bauen
    in.clear();
    in.str(line);

    // Dann aus dem Stream die Zahl parsen
    in >> x;

    // Und solange wiederholen, bis das gelingt.
  } while(!in);

  return x;
}


Zweitens

C++:
template<typename t, std::size_t n> std::size_t array_size(t(&)[n]) {
  return n;
}


gibt einfach nur die Länge eines Arrays zurück.

C++:
typedef double (*flaeche_func_t)(double);


definiert einen Zeigertyp flaeche_func_t, der auf eine Funktion mit der Signatur double(double) zeigt. Das macht später die dynamische Auswahl der Funktion aus einem Array möglich.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 06.11.2009 um 22:12 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.11.2009, 22:37 Uhr
Hans
Library Walker
(Operator)


Hi,

ist ein bisschen viel Code, nicht!? - Aber egal.
Fangen wir mal mit Frage 2 an: Ja, es geht übersichtlicher, zumindest ein bisschen. Indem Du die Abfrage nach der Einheit, also mm, cm, usw. auch an den Anfang des Programms setzt, und erst danach anfängst, die Eingaben auszuwerten. Man kann sich auch die vielen Ausgaben einsparen, die sich nur darin unterscheiden, das sie für eine andere Einheit benutzt werden, also beispielsweise cm² statt mm². Das könnte dann etwa so aussehen:

C++:
    cout<<" \\\\\\\\-Willkommen beim Fl"<<Umlaut::ae<<"cheninhaltrechner 2009!-//////// \n";
    cout<<"
\n\n\n";
    cout<<"
Bitte w"<<Umlaut::ae<<"hlen Sie die Art der Fl"<<Umlaut::ae<<"che aus: 1 = Quadrat, 2 = Rechteck,\n3 = gleichseitige Dreieck oder 4 = Kreis\n\n";
    cin>>strart;

    cout<<"
\nBitte w"<<Umlaut::ae<<"hlen Sie die Einheit aus: 1 = mm, 2 = cm, 3 = m oder 4 = km";
    cin>>streinheit;
    cout<<"
\nBitte geben Sie Seitenl"<<Umlaut::ae<<"nge von a: ein";
    cin>>a;

    if (strart == 1)  // Kurzfassung von Hans
    {
       inhalt=a*a;        
       cout<<"
\nDer Fl"<<Umlaut::ae<<"cheninhalt betr"<<Umlaut::ae<<"gt: --> "<<inhalt;

       if (streinheit == 1)
          cout << "
Quadratmillimeter\n";    
       else if (streinheit == 2)
          cout << "
Quadratzentimeter\n";
       else if (streinheit == 3)
          cout << "
Quadratmeter\n";
       else if (streinheit == 4)
          cout << "
Quadratkilometer\n";    
    }


Wobei ich mich jetzt auf den wesentlichen Teil beschränkt habe.

Ansonsten hast du noch diesen Ausdruck in Deinem Code, den mein Compiler als Sinnlos angemeckert hat:

C++:
  pi==3,14159265;


Abgesehen davon, das es wahrscheinlich auf Tippfehler beruht, sind da gleich zwei Fehler in der Zeile: der Erste ist das Komma, das durch einen Punkt ersetzt werden muss. Und da das ja eine Zuweisung sein soll, reicht auch ein Gleichheitszeichen aus.
Übrigens ist es eine gute Idee, solche Konstanten gleich am Anfang des Programms einmal zu definieren, und danach nie wieder. Denn wenn man mehrmals die gleiche Konstante an verschiedenen Stellen definiert, kann es leicht vorkommen, das man sich einmal vertippt, und das Programm deshalb irgendwo falsch rechnet. Das sind solche Fehler, die nicht unbedingt sofort auffallen, nach denen man später aber u.U. stundenlang sucht.
Speziell zu pi wäre auch noch zu sagen, das man es bei einigen Compilern bereits als vordefinierte Konstante in der Mathebibliothek math mitgeliefert bekommt. Wenn nicht, es aber auf Genauigkeit ankommt, kann man es auch am Programmanfang kurz ausrechnen:

C++:
  pi=4.*atan(1);


Dann hat man es in der höchsten Genauigkeit, die mit double möglich ist. Den mathematischen Hintergrund spar ich mir jetzt mal, weil das etwas lang würde, aber wer schon mal mit Winkelfunktionen und Bogenmaße zu tun hatte, kann auch von alleine drauf kommen.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 07.11.2009 um 03:41 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.11.2009, 22:44 Uhr
Hans
Library Walker
(Operator)


Oh Beefy, Du bist ja mal wieder Genial!!! - Wie soll das einer verstehen, der sich erst seit zwei oder drei Tagen damit beschäftigt???


Zitat von 0xdeadbeef:
Übersichtlichkeit hängt ein bisschen vom Wissensstand des Benutzers ab.

Das ist aber ein grosses Bisschen.

Ansonsten war ich mal wieder zu lahm...
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.11.2009, 00:43 Uhr
0xdeadbeef
Gott
(Operator)


Ups. Äh, das hab ich wohl überlesen...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.11.2009, 11:43 Uhr
der_evo



Vielen Dank ersteinmal!
Nur sehe ich durch die Möglichkeit von 0xdeadbeef wirklich überhaupt nicht durch.
Weder weiß ich was ein Stream, noch was ein Array ist. Die Begriffe sind mir aber
bekannt, nur weiß ich eben nichts damit anzufangen.

Der Tipp von Hans hilft mir da schon eher. Vielen Dank dafür

Fehlt nurnoch die 1. Frage, da es mich ein wenig stört, immer auf Kreuzchen klicken zu müssen. Einen Buchstaben eintippen und dann Enter zu drücken, wie es im Moment ist, ist auch i-wie bisschen blöd. Naja, vllt. hat jmd. eine Idee wie man das lösen könnte.

Greetz der_evo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.11.2009, 17:45 Uhr
0xdeadbeef
Gott
(Operator)


Für mein Verständnis die sauberste Lösung: Schreib ne Batch-Datei drumherum, etwa

Code:
@echo off

programm.exe
pause


, speicher das als programm.bat und ruf die statt der .exe auf.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.11.2009, 21:25 Uhr
Hans
Library Walker
(Operator)


Hi,

@Beefy: war da nicht auch noch irgendwas mit cin.get(), das man am Ende schreiben konnte?
Ich meine, das wurde mal vorgeschlagen, wenn es um die Frage ging, wie man das Konsolenfenster am Ende des Programms offen hält. In diesem Fall erst, nachdem eine Taste gedrückt wurde (ohne das ein abschliessendes CR nötig ist). Hab das gestern nur nicht gefunden...

@evo: Wenn das, was ich hier meine funktioniert, dann würde das Programm etwa so aussehen:

C++:
/* Datei: was_weis_ich.cpp
    Kurze Erklärung, was dieses Programm macht (bzw. machen soll. ;-) )
*/


#include <iostream>

int main()
{

   // tue irgendwas...

  cout << "Zum beenden bitte eine Taste drücken.";
  cin.get(); // bzw. auch  std::cin.get();
  return 0;
}



Hans


Bearbeitung:
Habe es inzwischen selbst heraus gefunden... - nämlich so:

C++:
int main()
{
  char c;
   // tue irgendwas...

  cout << "Zum beenden bitte eine Taste drücken.";
  cin.get(c); // Also eine char Variable in der Klammer
  return 0;
}


Die genaue Erklärung dafür heben wie uns für später auf, weil dazu nämlich die streams ins Spiel kommen.


--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 07.11.2009 um 21:57 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.11.2009, 22:13 Uhr
der_evo



Nochmals danke an euch beide!

@Hans:
Deine Methode funktioniert bei mir i-wie nicht. Habe selbst noch ein wenig probiert, nichts hat geholfen.

@0xdeadbeef:
Es funktioniert einwandfrei. Nur habe ich ein Problem. Nun muss ich das Programm ja über die .bat öffnen, nur ist das doof für einen anderen Benutzer, der das nicht weiß. Also für andere Projekte. Den Rechner benutze ja nur ich^^

Danke und greetz! evo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
07.11.2009, 23:00 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von der_evo:
Nochmals danke an euch beide!

bitte sehr.


Zitat:
@Hans:

Deine Methode funktioniert bei mir i-wie nicht. Habe selbst noch ein wenig probiert, nichts hat geholfen.


Was hat denn der Compiler zu mosern? - Oder mosert er nicht, aber es klappt trotzdem nicht so, wie es soll?

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: