Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Ein Aufgabe die mich etwas zum verzweifeln bringt

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
02.05.2005, 20:45 Uhr
~flashbrain
Gast


Schon wieder muß ich ein Problem lösen das mich etwas überfordert... Die Aufgabe lautet folgendermaßen:

Zahlen raten:
Erstellen Sie ein C++-Programm, in welchem eine vom Computer erzeugte Zufallszahl erraten werden soll. Für das Erzeugen der Zufallszahl sind in Ihrem Programm zunächst die Bibliotheken time.h und stdlib.h mittels #include einzubinden. Initialisieren Sie dann in Ihrem Hauptprogramm den Zufallsgenerator mittels des Befehls srand((unsigned int) time(NULL)); Eine positive, ganzzahlige Zufallszahl p aus der Menge f1; 2; : : : ; qg kann dann durch den Befehl int p=1+rand()%q erzeugt werden. Erzeugen Sie eine Zufallszahl zwischen 1 und 1000. Fragen Sie den Benutzer, in wievielen Versuchen er die gesuchte Zahl erraten will. Lesen Sie diesen Wert in eine Variable int versuche ein. Lesen Sie dann weiter in einer for-Schleife für i = 1; : : : ;versuche die geratenen Zahlen ein und vergleichen Sie die geratene Zahl in jedem Durchlauf mit der zu erratenen Zahl. Geben Sie auf dem Bildschirm eine Meldung aus, ob die geratene Zahl zu klein oder zu gro¼ ist. Informieren Sie den Rater, falls er die richtige Zahl erraten hat. Setzen Sie in diesem Fall die Variable versuche auf Null, um den Schleifendurchlauf abzubrechen. Erteilen Sie dem Rater ein entsprechendes Lob. Wird die gesuchte Zahl innerhalb der vorgegebenen Anzahl von Versuchen nicht erraten, so ist dem Benutzer mitzuteilen, welche Zahl gesucht war. Sprechen Sie Mut für ein erneutes Spiel zu.

Die Aufgabe soll denk ich dazu dienen for Schleifen zu üben... und mein Programm, das leider nicht funktionniert sieht folgendermaßen aus:


C++:
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main ()
{
int p = 1 + rand () % 1000, n, i, a;
cout << "Geben Sie ein wieviele Versuche Sie haben wollen, um eine Zufallszahl zwischen 1 und 1000 zu erraten!" <<endl;}
cin >> n;
for ( i = 1; i = n; i++)
{
cout << "Geben Sie eine Zahl zwischen 1 und 1000 ein!" << endl;
cin >> a;
if (a > p) {cout << "Die gesuchte Zahl ist kleiner" << endl;}
if (a < p) {cout << "Die gesuchte Zahl ist größer" << endl;}
if (a = p) {cout << "Herzlichen Glückwunsch! Sie haben die Zahl erraten"; n=0;}
if (i > n) {cout << " Sie haben die maximale Anzahl an Versuchen erreicht. Die gesuchte Zahl lautet: " << p << "! Versuchen Sie es doch gleich noch einmal." << endl;}
}
return 0;
}



Kann mir jemand sagen was ich da falsch gemacht hab?

mod edit: benutze CPP Tags selber

Dieser Post wurde am 02.05.2005 um 20:55 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.05.2005, 21:02 Uhr
0xdeadbeef
Gott
(Operator)


= ist Zuweisung. Zum Vergleichen musst du == benutzen:

C++:
if (a == p) // ...


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.05.2005, 21:09 Uhr
Manuelito



Ich hab den Programmcode mal verbessert, sodass er läuft:


C++:
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main()
{
int p = 1 + rand () % 1000, n, i, a;
cout << "Geben Sie ein wieviele Versuche Sie haben wollen, um eine Zufallszahl zwischen 1 und 1000 zu erraten!" <<endl;    // 1.
cin >> n;
for ( i = 0; i < n; i++)  // 2.
{
  cout << "Geben Sie eine Zahl zwischen 1 und 1000 ein!" << endl;
  cin >> a;
  if (a > p) {cout << "Die gesuchte Zahl ist kleiner" << endl;}
  if (a < p) {cout << "Die gesuchte Zahl ist größer" << endl;}
  if ((i+1 == n) && (a != p)) {cout << "Sie haben die maximale Anzahl an Versuchen erreicht. Die gesuchte Zahl lautet: " << p << "! Versuchen Sie es doch gleich noch einmal." << endl;}  //3.
  if (a == p) {cout << "Herzlichen Glückwunsch! Sie haben die Zahl erraten"; n=0;}  //4.
}
return 0;
}



Zu 1: War die geschweite Klammer hinter cout ein Tippfehler???
Zu 2: Da muss stehen, unter welcher Bedingung die Schleife durchgeführt und nicht wann sie abgebrochen werden soll.
Zu 3: Das funktioniert dann auch nicht mehr, weil die Schleife nur durchgeführt wird, wenn i < n ist, und dann ist eine if-Bedingung, ob i > n ist, in der Schleife sinnlos.
Zu 4: In deinem Programm hätte diese Anweisung hinter die "maximale-anzahl"-Anweisung gehört, da du in dieser Anweisung n auf 0 gesetzt hast und somit die if-Bedingung in der "maximale-anzahl"-Anweisung die Bedingung immer erfüllt wäre. Ausserdem ist der Vergleichsoperator == und nicht =.

EDIT: Da schreib ich mal was, und da ist einer schneller.
@Oxdeadbeef: Da waren aber noch mehr Fehler
--
Verstand ist das, was am gerechtesten unter den Menschen verteilt ist.
Jeder glaubt, er hätte genug davon.
-- unbekannt

Dieser Post wurde am 02.05.2005 um 21:28 Uhr von Manuelito editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.05.2005, 21:18 Uhr
Pablo
Supertux
(Operator)



Zitat von Manuelito:

@Oxdeadbeef: Da waren aber noch mehr Fehler


tja, bevor du beefy zur Schnecke machst, solltest du auch keine Fehler haben.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.05.2005, 21:19 Uhr
Manuelito



was is denn daran falsch???
bei mir läuft das, ausser vllt dass das größer en bisschen seltsam aussieht

EDIT: Jetzt aber, oder??
--
Verstand ist das, was am gerechtesten unter den Menschen verteilt ist.
Jeder glaubt, er hätte genug davon.
-- unbekannt

Dieser Post wurde am 02.05.2005 um 21:28 Uhr von Manuelito editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.05.2005, 21:40 Uhr
Pablo
Supertux
(Operator)


cstdio, ctime sollen includiert werden, außerdem fehlt ein srand.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.05.2005, 22:09 Uhr
0xdeadbeef
Gott
(Operator)


Soll ich ihm wirklich die gesamte Aufgabe abnehmen? Na, meinetwegen. Wenn ers nicht blickt, rasselt er nachher eh durch die Klausur, also kann ich auch ne Lernhilfe anbieten:

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

template<typename t>
t read_type(std::string  const &prompt = "",
            std::istream       &in     = std::cin,
            std::ostream       &out    = std::cout) {
  std::string zeile;
  std::stringstream sstr;
  t ret;

  do {
    sstr.clear();

    out << prompt << std::flush;

    std::getline(in, zeile);
    sstr.str(zeile);
    sstr >> ret;
  } while(!sstr);

  return ret;
}

int main() {
  std::srand(unsigned(time(0)));

  do {
    unsigned n = read_type<unsigned>("Anzahl Versuche: "),
             x = unsigned(rand()) % 1000U + 1U,
             y;

    for(int i = 1; ; ++i) {
      y = read_type<unsigned>("Zahl raten: ");

      if(i == n) {
        std::cout << "Versuche aufgebraucht." << std::endl;
        break;
      } else if(y < x) {
        std::cout << "Zu klein." << std::endl;
      } else if(x < y) {
        std::cout << "Zu groß." << std::endl;
      } else if(x == y) {
        std::cout << "Treffer!" << std::endl;
        break;
      }
    }
  } while(std::tolower(read_type<char>("Nochmal (J/N)? ")) == 'j');
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.05.2005, 22:27 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ah dein read_type-template mal wieder, nett
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
02.05.2005, 22:34 Uhr
0xdeadbeef
Gott
(Operator)


Ich mag das Ding, und ich habs hier rumfliegen. Das ist allerdings der Einfachheit halber ne alte Version.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
03.05.2005, 09:12 Uhr
ao

(Operator)



Zitat von ~flashbrain:
Informieren Sie den Rater, falls er die richtige Zahl erraten hat. Setzen Sie in diesem Fall die Variable versuche auf Null, um den Schleifendurchlauf abzubrechen.

Bloß mal so ne Anmerkung: Solche Ideen wie Schleifenabbrüche durch die Hintertür finde ich extrem krank.

C++:
versuche = 100;
for (i = 1; i <= versuche; i++)
{
    // ganz viel Code

   if (irgendwas) versuche = 0; // bei nächster Gelegenheit raus aus der Schleife

   // womöglich noch mehr Code
}


Meinst du, das schnallst du noch, wenn du das in sechs Monaten noch mal liest? Wenn ich die ersten beiden Zeilen sehe, denke ich, ganz klar, 100 Schleifendurchläufe. Dass es auch viel weniger sein können, merkt man erst weiter unten, und je nachdem, wieviel Code dazwischen steckt, übersieht man es auch ganz und wundert sich dann zur Laufzeit.

Nur, um eine popelige bool-Variable zu sparen, wird Code produziert, der ein hohes Risiko hat, missverstanden zu werden.

Das klingt vielleicht nach Haarespalten, aber wenn du mal ein bisschen weiter fortgeschritten bist und Programmieren als Werkzeug einsetzt, um ganz andere Aufgaben zu lösen, dann kannst du hausgemachte Probleme auf Code-Ebene absolut nicht gebrauchen, und dann wirst du verstehen, wie wichtig es ist, klar formulierten und leicht verständlichen Programmcode zu haben.

Ich finde es schlimm, dass euer Lehrer euch durch solche unsinnigen Vorgaben dazu bringt, Kuddelmuddel-Code zu produzieren.

Ich finde, das ist überhaupt keine Anwendung für eine for-Schleife. Die "primäre" Abbruchbedingung ist, dass der Benutzer die Zahl errät, also wäre das meiner Ansicht nach ein typischer Fall für do-while:

C++:
int max_versuche = 100;
bool found;
do
{
    // hier geratene Zahl abfragen und mit der gesuchten vergleichen

    versuche++;
    found = (zahl == gesuchte_zahl);
}
while (!found && (versuche < max_versuche));



ao
 
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: