C++ Gesellschaftsspiel

ArcticFrezzer

Cadet 4th Year
Registriert
Feb. 2011
Beiträge
108
Liebe CB'ler

Ich soll ein Programm programmieren das einen Wertebereich bis 1000 untersuchen soll. (Den Wertebereich kann man selber eingeben) Weiter soll eine einstellige Ziffer eingegeben werden nach der geprüft werden soll.

Es sollen alle Zahlen innerhalb des Wertebereichs ausgegeben werden, die durch die eingegebene Ziffer teilbar sind oder die Ziffer enthalten.

Ich hab schon einen Quelltext geschrieben aber der Funktioniert nicht immer so wie er soll. Er gibt also ab und an gar keine Zahlen aus.

Könnt ihr irgendwo nen Fehler sehn? Ich muss noch dazu sagen das ich erst seit ca nen halben Jahr programmier. Also hab gerade mal nen Array im Unterricht kennengelernt.

//Funktion von Spiel


//Funktionsaufruf von Spiel//
void spiel ()

// Variablen von Spiel

{

int links =0;
int rechts =0;
int ziffer =0;
int Einer =0;
int Zehner =0;
int Hunderter =0;
int Tausender =0;
int vergleich =0;
int exit =0;



//Überschrift von Spiel
system("cls");
printf("Gesellschaftsspiel\n------------------------\n");

//Wert Eingabe von Spiel

//Linke Grenze
//---------------------------------------------------------------------//

printf("Geben sie die linke Grenze ein: ");
scanf("%d",&links);


if(links<1)
{
system("cls");
printf("!!!der Wert darf nicht kleiner als 1 sein\n\n");
printf("\n");
spiel();
}

if(links>=1000)
{
system("cls");
printf("!!der Wert darf nicht Groesser als 1000 sein\n");
printf("\n");
spiel();
}
//rechte Grenze
//-----------------------------------------------------------------------//
printf("Linke Zahlengrenze: (%d)\n",links);
printf("Geben sie die rechte Grenze ein (max. 1000): ");
scanf("%d",&rechts);

if(rechts<=links)
{
system("cls");
printf("der Wert darf nicht kleiner oder gleich wie (%d) sein\n",links);
printf("\n");
spiel();
}

if(rechts>1000)
{
system("cls");
printf("der Wert darf nicht Groesser als 1000 sein\n");
printf("\n");
spiel();
}
//Teiler
//---------------------------------------------------------------------//
printf("Linke Zahlengrenze: (%d)\n",links);
printf("Rechte Zahlengrenze: (%d)\n",rechts);
printf("Geben sie denn Teiler von (1) bis (9) ein:");
scanf("%d",&ziffer);

if(ziffer>9)
{
system("cls");
printf("der Wert muss einstellig und groesser 0 sein\n",links);
printf("\n");
spiel();
}




//---------------------------------------------------------------------//
printf("Gesellschaftsspiel\n------------------------\n");
printf("Linke Zahlengrenze: (%d)\n",links);
printf("Rechte Zahlengrenze: (%d)\n",rechts);
printf("Teiler: (%d)\n",ziffer);
printf("Ergebnisse:\n-------------------------------------------------------------\n");




//Prüft die vorhandenheit der ziffer in den Zahlen und teilt die zahl in Einer,Zehner,Hunderter,Tausender//


for (links;links<=rechts;links++)

{

Einer = links-Tausender-Hunderter-Zehner;
Zehner = (links-Tausender-Hunderter)/10;
Hunderter = (links-Tausender)/100;
Tausender = links/1000;
//Prüft die vorhandenheit der Ziffer in den einzelnen Zahl Sigmenten.//



if (Einer == ziffer||Zehner == ziffer||Hunderter == ziffer || Tausender == ziffer)
{
printf ("\n<%d>",links);
}

//Prüft die Zahl ob sie durch die ziffer Teilbar ist

else
{
vergleich=links/ziffer;

if(vergleich==0)
{
printf("\n%d",links);
}
}

}
printf("\n------------------------------------------------------------------------------\n");
printf("\n Was wollen Sie tun?\n\n");
printf("\n\n\nwiederholen(1)\nzurueck zum Hauptmenue(2)?\n\n");
printf("Waehlen sie:");
scanf("%d",&exit);

if(exit==2)
{
system("cls"); main();
}
if(exit==1)
{
system("cls"); spiel();
}
else
{
system("cls");
printf("\n!Falsche Eingabe\n");
main();
}


}
 
Darfst es dir selber in C++ code "übersetzen" aber das logische Grundgerüst hast mal hier:


int eingabe = ....;
for (int cnt = linkeGrenze; cnt < rechteGrenze; cnt++) {
if ( cnt%eingabe == 0 )
gib zahl aus;
else if ( (String)cnt.contains((String)eingabe))
gib zahl aus;

}

Edit:
Die Zahl kannst du mit "string to_string( int value );" in nen String umwandeln.
 
Zuletzt bearbeitet:
Hallo,

ich weiß nicht ob ich falsch liege, aber um die Teilbarkeit zu testen, solltest du es mal mit Modulo ( % ) versuchen, das dir den Rest des Teilergebnisses liefert. Wenn dieser 0 ist, dann ist die Zahl ohne Rest teilbar. Ich würde also die Stelle umschreiben, falls du deinen Code so behalten möchtest, so dass sie heißt:


//Prüft die Zahl ob sie durch die ziffer Teilbar ist

else
{
vergleich=links % ziffer;

if(vergleich==0)


Denn wenn nach deinem aktuellen Quelltext deine Zahl ("links") zB. 49 lautet und die "ziffer" 7, dann ist das Ergebnis der Teilung in "vergleich" auch wieder 7 und nicht 0.

Korrigiert mich wenn ich Müll labere :)
 
Genau, schau dir mal Modulo an.
Das ganze sieht schon nach viel zu kompliziert gedacht aus.

Im Prinzip reicht eine Schleife in einer if-Abfrage. Ähnlich zu dem was SharenZ gepostet hat.
 
Generell sollte man Programmieren mit Java erlernen. Ist einfach die einsteigerfreundlichste moderne Sprache.
 
Hmm ich würds so machen:
size_t z(1); // Die Zahl durch die geteilt werden soll. kannste mit cin einlesen lassen.
size_t j(1000); //wertebereich


for (size_t i(1); i<=j; ++i) {
if (!(i%z)) { //wenn i durch z keinen Rest gibt isses teilbar
cout << i << endl;// i ausgeben
}
}

Das ist die aller einrfachste Variante, natürlich gehts mit nem Stack schöner und damit kann man auch mehrere aufrufe auf einmal machen.
Du könntest auch n array mit dim=1000 erstellen und da die Ergebnisse rein schreiben...


Ps: hab grade mal geändert das z auf 1initialisiert wird...durch 0teilen suckt^^
 
Zuletzt bearbeitet:
@antred

Natürlich ist das meine persönliche Meinung. Ich muss zugeben ich hab das oben schlecht formuliert.
Aber auch im Informatikstudium wird heute mit Java begonnen.
 
Hab den Fehler gefunden :)
DANKE für die schnellen Antworten und vor allem an der-graph hat mir viel sucherei erspart. DANKE!!!!

@der-graph hab nur das eine % Zeichen eingefügt und es funktioniert ohne probleme!

@SharenZ Ich lern selber nebenbei Java aber hier im Hörsaal mit den Dozenten lernen wir nun mal C++ als Einsteiger und da kann ich es mir nicht aussuchen wie ich den Quelltext schreib bzw. das ich mit Java daher komm wenn ich als Aufgabe ein C++ Quelltext hab... Leider....

@Almeida wir sollen es nur ausführlich schreiben und keinen kleinen "3-Zeiler" wie es der Dozent sagt. Er will unseren Gedankengang im Programm verfolgen können und das is das Problem bei dem Dozenten. Glaub mir wir würden es auch kürzer hinbekommen dürfen aber nicht. Schule halt.
 
Nich unbedingt, das hängt komplett vom Prof ab, einer quält mit pointer aritmetik in c++ und der andre lässt hübsche einfache Java programme schreiben:)
So oder so, das Spiel ist in Java wie in C++ doch genau das selbe^^

@Almeida wir sollen es nur ausführlich schreiben und keinen kleinen "3-Zeiler" wie es der Dozent sagt. Er will unseren Gedankengang im Programm verfolgen können und das is das Problem bei dem Dozenten. Glaub mir wir würden es auch kürzer hinbekommen dürfen aber nicht. Schule halt.
Kommentare sind wichtig...schreib mal was mit naja 40zeilen (dauert nich lange) und versuch das ohne kommentare n halbes Jahr später zu verstehen:p
 
du machst es dir einfacher, wenn du etwas mehr Struktur in das Programm bringst. Du könntest z.B. ob eine Zahl die Bedingungen erfüllt in eine eigene Routine auslagern:

Code:
bool zahl_erfuellt_bedingungen(int zahl, int ziffer) {
   if(zahl%ziffer == 0)
      return true;

   // einzelne Ziffern der Zahl pruefen
   while(zahl > 0) {
      if(zahl % 10 == ziffer)
          return true;
      zahl /= 10; // eine Stelle nach Rechts schieben
   }
   return false;
}


Das Gleiche gilt auch für das Einlesen einer Zahl aus einem bestimmten Bereich

Code:
int lese_zahl_im_bereich(int von, int bis) {
     while(true) {
         std::cout << " Bitte Zahl aus Bereich " << von << " - " << bis << " eingeben:";
         int zahl;
         if(std::cin >> zahl) {
             if(zahl >= von && zahl <= bis)
                return zahl;
         }
     }
}

Durch das Auslagern wird das Programm einfacher verständlich, weniger fehleranfällig und es macht dir bestimmt mehr Freude.
 
Zurück
Oben