Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Kann mir jemadn helfen dieses Programm zu schrieben?

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 < [ 3 ]
010
20.11.2004, 16:16 Uhr
0xdeadbeef
Gott
(Operator)


Ich würd wohl sowas in der Art machen:

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

class fox_population {
private:
  unsigned m_size, m_initial_size;

public:
  fox_population(unsigned num) : m_size(num), m_initial_size(num) { }

  inline unsigned size        () const { return m_size        ; }
  inline unsigned initial_size() const { return m_initial_size; }

  void hunt_foxes(unsigned foxes) {
    if(m_size > foxes) m_size -= foxes;
    else m_size = 0U;
  }

  void reproduce(double percentage) {
    m_size = unsigned(m_size * (1.0 + percentage / 100.0));
  }
};

template<typename t>
t read_from_stdin(std::string const &line, t min, t max) {
  t ret;
  std::string line_buffer;

  do {
    std::cout << line << std::flush;
    std::getline(std::cin, line_buffer);
    std::stringstream sstr(line_buffer);
    sstr >> ret;
    if(!sstr) continue;
  } while(ret < min || ret > max);

  return ret;
}

int main() {
  unsigned foxes = read_from_stdin("Anzahl Füchse (2 - 1000): ", 2U, 1000U),
    huntable_foxes = read_from_stdin("Zum Abschuss freigegeben (0 - 100): ", 0U, 100U);
  double productivity = read_from_stdin("Vermehrungsrate in Prozent (-10 - 20): ", -10.0, 20.0);

  fox_population fp(foxes);

  std::cout << "0:\t" << foxes << std::endl;

  for(int i = 1;
      fp.size() > 0U && fp.size() < fp.initial_size() * 2U && i <= 20;
      ++i) {
    fp.hunt_foxes(huntable_foxes);
    fp.reproduce(productivity);

    std::cout << i << ":\t" << fp.size() << std::endl;
  }
}



Bearbeitung:

int <-> unsigned-Vergleiche in unsigned<->unsigned-Vergleiche umgewandelt.


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

Dieser Post wurde am 20.11.2004 um 16:46 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
20.11.2004, 16:38 Uhr
(un)wissender
Niveauwart


Jo, das sieht schon besser aus.
Ich würde jetzt noch folgendes tun:
-die "Magic Numbers" durch Konstanten ersetzen,
-die inlines rausnehmen, weil redundant
-den c-cast durch static_cast ersetzen
-den int<->unsigned-Vergleich in unsigned<->unsigned umwandeln
-Eine Ausgabe bei fehlgeschlagener Eingabe einführen.
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 20.11.2004 um 16:39 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
20.11.2004, 16:43 Uhr
0xdeadbeef
Gott
(Operator)


Die Konstanten werden nur an einer Stelle benutzt, von daher halte ich es für überflüssig, sie zu benamsen. Die inlines sind Empfehlungen für den Compiler, die schon ihren Sinn haben und nicht redundant sind - weak linkage ist was anderes als inline-Funktionen. Einen C-Cast sehe ich nicht, und die Eingabe schlägt nicht fehl - wenn der User wirklich, wirklich dumm ist, kommt er halt nur in ne Endlosschleife, aber man kann die Leute nicht immer vor sich selbst beschützen.

Was int <-> unsigned-Vergleiche angeht, ok, das könnte man noch machen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
20.11.2004, 16:45 Uhr
Spacelord
Hoffnungsloser Fall


Wenn die Lösung noch besser wird nimmt dem Fragesteller ohnehin keiner mehr ab dass sie von ihm ist .

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
20.11.2004, 16:52 Uhr
~Pler
Gast


@(un)wissender
Ja da hast du wohl recht:
Ich weis wo du meinst: bei den Eingaben, bei ...zwischen ..und ...!
Da muessen noch die Defines als Argumente hin!
Sowas kann ja wohl mal passieren, ich wollte doch blos helfen, also geh bitte nicht so hart ins Gericht mit mir!

Mit dieser Aussage meine ich, dass bei solchen Programmen ja die Logik beim Programmieren geschult werden soll, also nicht unnötig kompliziert sein soll!
So wird meiner Meinung nach bei dem obrigen C++- Prog. unnötig lompliziert, weil da, meiner Meinung nach, vollig unnötig eine Klasse verwendet wird.

Im übrigen waere mir dieser fehler vom gcc ( unter Linux ) agezeigt worden, hier habe ich leider blos das Visual Studio zu Verfügung, das (zumindest im voreingestellten Waring-Level ) diesen Fehler nicht erkennt!

aber danke fuer den Hinweis.

Ich wollte ja keine Grundsatzdiskussion ausloesen, und bleibe bei meiner Meinung, dass hier Standart C einfach einfacher ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
20.11.2004, 18:08 Uhr
(un)wissender
Niveauwart


@beefy
Konstanten:
Ich glaube nicht, dass ich dir erklären muss, dass Konstanten die Lesbarbeit von Programmen erhöhen, auch wenn sie nur einmal verwendet werden, oder? Stellt die vor du verwendet zigmal die Ziffer 20, diese hat aber immer eine andere Bedeutung. Jetzt willst du eine davon ändern, da freust du dich aber über Konstenten.
Gut in diesem Kinderbeispiel ist es egal, ich meine ja nur.

inline:
Durch die Definition im Header hast du quasi schon implizit inline drin. Soweit habe ich das öfter gelesen und verstanden, ich lasse mich aber gerne aufklären.

c.cast:
Was ist dann das, wenn kein C-Cast? Eine seltsame Kurzform eines static_cast?

C++:
m_size = unsigned(m_size * (1.0 + percentage / 100.0));


Eingabe:
Mit fehlgeschlagen meine ich, dass der User was falsches eingegeben hat. Du benachrichtigst ihn aber nicht davon, sondern startes einfach neu (das Einlesen).
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
20.11.2004, 18:14 Uhr
(un)wissender
Niveauwart


@Pler

Zitat von Pler:

Sowas kann ja wohl mal passieren, ich wollte doch blos helfen, also geh bitte nicht so hart ins Gericht mit mir!



Klar kann das passieren, und in C+ ist es nicht tragisch, mit printf/scanf aber schon, hier liegt der Hund begraben. Gesagt habe ich das nur, weil du diese seltsame C-Statement abgegeben hast.

Ob C einfacher ist, ich weiß es nicht.
Von den Syntax sicherlich, aber ich z.B. kann sowahl C als auch C++ und beefys Beispiel kann ich wesentlich schneller nachvollziehen als deines. (Ich vergleiche Äpfel mit Birnen, ich weiß).

Der Compiler kann die Formatstrings checken, aber er muss nicht. In C++ gibt es das Problem nicht, hier checkt der Compiler immer.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
20.11.2004, 18:20 Uhr
0xdeadbeef
Gott
(Operator)



C++:
m_size = unsigned(m_size * (1.0 + percentage / 100.0));


ist ein Konstruktor-Aufruf, nicht mal wirklich ein cast. Ich konstruiere einen unsigned aus einem double. Übrigens sähe ein C-Style-cast so aus:

C++:
m_size = (unsigned) (m_size * (1.0 + percentage / 100.0));


Was die Konstanten angeht, in diesem Fall steht direkt daneben, was sie bedeuten. Und wenn ich das mit const unsigneds machen würde, müsste ich mir sinnigerweise, ums dynamisch zu halten, ne stringstream-Konstruktion basteln, und das frisst Laufzeit. Oder ich komm mit dem Präprozessor und schreibe

C++:
#define MAX 1000
#define MIN 2

// ...

int foxes = read_from_stdin("Anzahl Füchse (" #MIN " - " #MAX "): ", MIN, MAX);


...und ob das so viel lesbarer ist, ist mindestens streitbar, ganz ab von den generellen Nachteilen, die der PP so mit sich bringt. Ganz abgesehen davon, dass es dann mit den unsigneds nicht mehr hinhaut, denn mit

C++:
#define MAX 1000U
#define MIN 2U


sieht der String nachher ziemlich scheiße aus.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 20.11.2004 um 18:28 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
20.11.2004, 18:44 Uhr
(un)wissender
Niveauwart


Stimmt ist ein Konstuktor, habe ich nicht erkannt.
Ich wußte nicht, dass man einen int aus einem double konstruieren kann, naja was eigentlich geschieht ist aber ein cast und ich finde den sollte man dann auch so hin schreiben.

const unsigneds oder ähnliches sind gut, die gehen auch.
Außer in den einen Fall wo int und unsigned vorkommen.
Das könnte man einen zweiten tempalte Paraemter einführen.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
20.11.2004, 18:51 Uhr
0xdeadbeef
Gott
(Operator)


Eigentlich schreibe ich in einer High-Level-Sprache, damit ich mich nicht immer darum kümmern muss, was die Maschine jetzt konkretes macht. Nach der Argumentation dürfte man eigentlich nur noch Assembly schreiben.

const unsigneds bringen es in diesem Fall halt nicht, weil ich die zur Laufzeit in den String einsetzen müsste, um die Grenzen anzuzeigen. Ich sehe schon ein, dass es meistens Sinn macht, Konstanten zu benennen, aber in diesem Fall wäre es m.E. überflüssig und würde die Lesbarkeit des Programms nicht verbessern.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ 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: