Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » (While-Schleife) Thema: Umsätze für 3 Unternehmen

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 <
000
04.04.2007, 10:12 Uhr
~Tray
Gast


Schönen Guten Tag! Ich bin total verzweifelt! Kann mir bitte jemand weiterhelfen?
Meine Aufgabenstellung lautet, In jedem Quartal für Unternehmen A, B und C jeweils in jedem der 3 inbegriffenen Monate einen Umsatz eingeben zu können. Das funktioniert auch. Ich hab hierzu eine while Schleife in eine while Schleife in eine while Schleife verpackt.
Nun soll das Programm aber beendet werden, wenn der Benutzer eine 0 eingibt.
??????????????
Ich habe es mit if else, switch case und anderen Anweisungen in der Schleife versucht, jedoch erfolglos. Bitte helft mir.

Hier mein Quellcode:


C++:
#include<iostream.h>

void main()

{

    int monat;
    int quart;

    float umsatz;
    float gesamt;

    char unter;


    const char ENDE[] = "( Bei Eingabe von 0.0 wird das Programm beendet )";
    

        //        if ( umsatz = '0' ) goto ende;

    
quart = 0;
    while ( quart < 4 )

    {
        quart = quart + 1;

        cout << quart << ". " << "Quartal" << endl;

        
    unter = '@';
        while ( unter < 'C' )
                    
        {

            unter = unter + 1 ;

            cout << "Unternehmen " << unter << endl;
    
            
        monat = 0;
            while ( monat < 3 )

            {
                monat = monat + 1;

                cout << "Umsatz Monat " << monat << ":" << endl;

                cout << ENDE << endl;

                    cin >> umsatz;

                        cout << endl;
            }
        
gesamt = umsatz + umsatz + umsatz;
    
    cout << "Gesamtumsatz Unternehmen " << unter << ": " << gesamt;
    
        cout << endl << endl << endl << endl << endl;
        
        }

//ende:

        cout << endl;

}


}


Dieser Post wurde am 04.04.2007 um 10:26 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.04.2007, 12:19 Uhr
Suba Esel



Mmh, ich glaube, dass dein Problem genau da liegt:

Zitat von Tray:


C++:
if ( umsatz = '0' ) goto ende;





Erstens ist umsatz ein Float, also nicht umsatz = '0' sonder umsatz = 0.0, und zweitens ist = nicht das selbe wie ==. Mit umsatz = 0.0 würdest du in umsatz 0.0 packen, nicht testen, ob umsatz 0.0 ist. Deshalb musst du if(umsatz == 0.0) goto ende; schreiben - oder schöner if(umsatz == 0.0) return; oder if(umsatz == 0.0) exit(0);.
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.04.2007, 13:00 Uhr
Reyx
IT-fetischistischer Wurstsalat mit rostigem Berghorn
(Operator)


Das Programm scheint mir schon an sich eine doch recht merkwürdige Programmlogik aufzuweisen?

Mal davon abgesehen, mach mal aus
C++:
#include<iostream.h>
ein
C++:
#include <iostream>


, aus
C++:
void main()
ein
C++:
int main()


und aus
C++:
return;
ein
C++:
return 0;


Das wird dir noch Ärger ersparen

Dieser Post wurde am 04.04.2007 um 13:01 Uhr von Reyx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.04.2007, 14:58 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von Suba Esel:
Mmh, ich glaube, dass dein Problem genau da liegt:

Zitat:


C++:
if ( umsatz = '0' ) goto ende;





Erstens ist umsatz ein Float, also nicht umsatz = '0' sonder umsatz = 0.0, und zweitens ist = nicht das selbe wie ==. Mit umsatz = 0.0 würdest du in umsatz 0.0 packen, nicht testen, ob umsatz 0.0 ist. Deshalb musst du if(umsatz == 0.0) goto ende; schreiben - oder schöner if(umsatz == 0.0) return; oder if(umsatz == 0.0) exit(0);.


dann darf man floats nicht auf einen festen wert prüfen, das geht schief, z.B so:

C++:
if ( fabs(umsatz) < 0.000001)


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.04.2007, 16:56 Uhr
0xdeadbeef
Gott
(Operator)


In diesem Fall geht das schon. 0 kann exakt dargestellt werden (die IEEE verlangt das so), und hier wird direkt der eingebene Wert genommen, und nicht erst damit rumgerechnet.

Allerdings - goto ist in C++ höchst gefährlich, spätestens dann, wenn man komplexe Datentypen benutzt und aus Blöcken hinaus oder hineinspringt. Besser wäre

C++:
if(umsatz == 0.0) return 0;


...den restlichen kram hat reyx schon angemerkt; allerdings wird es da

C++:
#include <iostream>

using namespace std;


brauchen, sonst findet der Compiler cin, cout etc nicht mehr.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.04.2007, 17:13 Uhr
0xdeadbeef
Gott
(Operator)


Ne ganz andere Methode, nur so zum Spaß mal erwähnt, wär die Verwendung von Exceptions. Das kann hilfreich sein, wenn nach dem Ende der Schleife noch viel kommt - sieht dann etwa so aus:

C++:
#include <iostream>
#include <exception>

struct loop_exit : public std::exception {
  virtual char const *what() const throw() { return "Uncaught loop exit!"; }
};

int main() {
  int monat;
  int quart;

  float umsatz;
  float gesamt;

  char unter;

  char const *const ENDE = "( Bei Eingabe von 0.0 wird das Programm beendet )";

  try {
    for(quart = 1; quart <= 4; ++quart) {
      std::cout << quart << ". " << "Quartal" << std::endl;

      for(unter = 'A'; unter <= 'C'; ++unter) {
        std::cout << "Unternehmen " << unter << std::endl;

        for(monat = 1, gesamt = 0.0; monat <= 3; ++monat) {
          std::cout << "Umsatz Monat " << monat << ":" << std::endl;
          std::cout << ENDE << std::endl;

          std::cin >> umsatz;

          if(umsatz == 0.0) {
            throw loop_exit();
          } else {
            gesamt += umsatz;
          }

          std::cout << std::endl;
        }

        std::cout << "Gesamtumsatz Unternehmen " << unter << ": " << gesamt << std::endl;
      }
    }
  } catch(loop_exit &e) {
  }
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 04.04.2007 um 17:14 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.04.2007, 01:40 Uhr
öni



Also da ich bei euch einfach nirgends einen Lösungsansatz gesehen hab sondern nur Verbesserungsvorschläge (ist ja auch wichtig):


C++:
while ( monat < 3     &&  umsatz != 0)

            {
                monat = monat + 1;

                cout << "Umsatz Monat " << monat << ":" << endl;

                cout << ENDE << endl;

                    cin >> umsatz;

                        cout << endl;
               gesamt = gesamt + umsatz;

            }



allerdings solltes du dann noch dem umsatz und gesamt (gesamt = 0 als Anfangswert) einen Anfangswert geben der dann später wieder abgezogen werden sollte. Und auserdem hat dein Progrämmchen den letzten Umsatz des Monates mal 3 multipliziert und nicht die 3 verschiedenene Umsätze zusammelngezählt. Weiß gar nicht ob das beabsichtig oder übersehen wurde.


Bearbeitung:
Wieso funktioniert bei mir nicht die Fettschreibweise?? Liegt das an der Code Formatierung?? Lsg: in Codetags doppelte [[]] benutzen

Dieser Post wurde am 05.04.2007 um 08:57 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: