Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

eTTPOx

Frischling

  • »eTTPOx« ist der Autor dieses Themas

Beiträge: 3

Beruf: Student

  • Private Nachricht senden

1

16.07.2014, 12:11

Problem mit verschachtelten Schleifen

Hallo Leute,
Habe mir vor kurzem das Buch C++ für Spieleprogrammierer ausgeliehen habe die ersten 3 Kapitel nun komplett durchgearbeitet und habe mir zum Üben ein paar Aufgaben rausgesucht, die eigentlich mit dem Wissen der ersten 3 Kapitel zu schaffen sein sollten.
Aufgabe: Man soll eine Zahl eingeben und alle Primzahlen bis zu dieser Zahl sollten ausgegeben werden.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
using namespace std;


int main ()
 {
     // Variablen 
     int nLimit;
     int nCounter=0;

     cout << "Obergrenze: \n";
     cin >> nLimit;

     /*Die Erste Zahl ist die 2, die geprüft wird, danach sollen
     alle Zahlen bis zu dem eingegebenen Limit geprüft werden*/
     for(int i=2;i<=nLimit;i++)
     {

         /* Nun Soll diejenige Zahl durch Alle Zahlen von 1 bis sich selbst 
         geteilt werden, also z.B. wenn i=5 ist, 5/1,...,5/5 */
          for(int j=1;j<=i;j++)
          {
            /* Primzahl: Nur durch sich selbst und 1 teilbar, also meine Idee:
              Wenn einer dieser Fälle eintritt, erhöhe den Counter um 1!
              Aber ebenso, wenn kein Rest übrig bleibt. */
            if(i/j==i)||(i/j==1)
              nCounter++;
            if(i%j==0)
              nCounter++;
          }

    // Wenn der Counter genau auf 2 steht, hat die Zahl nur sich selbst und 1 als Teiler. Also Primzahl.
      
       if(nCounter==2){
         cout << i << endl;  
       }

       // Setze Counter wieder auf 0;
       nCounter*=0;
      
     }
     
     return 0;

 }


Das ist jetzt mein Quelltext dazu. Die Idee sollte eigtl. auf Grund der Kommentare verständlich sein.
Aber ich habe leider ein Problem auf Grund des ODER, da mir folgende Fehlermeldungen bzw. Warnungen angezeigt werden und ich weiß nicht, wo ein Semikolon hinkommen sollte.

Fehler 1 error C2143: Syntaxfehler: Es fehlt ';' vor '||' d:\studium\informatik\projekte\ms visual studio\testnumerouno\listing1.cpp 25 1 TestNumeroUno

Warnung 2 warning C4390: ';': Leere kontrollierte Anweisung aufgetreten; ist dies beabsichtigt? d:\studium\informatik\projekte\ms visual studio\testnumerouno\listing1.cpp 25 1 TestNumeroUno

3 IntelliSense: Es wurde ein Ausdruck erwartet. d:\Studium\Informatik\Projekte\MS Visual Studio\TestNumeroUno\listing1.cpp 26 14 TestNumeroUno




Ich hoffe ihr könnt mir helfen :)

Mit freundlichen Grüßen

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

16.07.2014, 12:23

Das hat nichts mit der Verschachtelung der Schleifen zutun.
Die Bedingung muss komplett im ersten Klammerpaar nach dem if stehen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

eTTPOx

Frischling

  • »eTTPOx« ist der Autor dieses Themas

Beiträge: 3

Beruf: Student

  • Private Nachricht senden

3

16.07.2014, 12:26

Danke, habe ich geändert, allerdings funktioniert das Ganze noch nicht so wie ich mir das vorstelle, denn jetzt werden keine Zahlen ausgegeben. :(

AlexK

1x Rätselkönig

Beiträge: 30

Wohnort: Bielefeld

Beruf: Software-Entwickler

  • Private Nachricht senden

4

16.07.2014, 14:15

Wie sieht denn dein Programm nach der Änderung aus? Hast du nur den Compilefehler behoben oder die Bedingungen komplett in eine if-Abfrage gepackt?
Falls es immer noch zwei if-Abfragen sind: 7/1 == 7 -> Counter erhöht, nächste Zeile: 7%1 -> Rest 0, Counter erneut erhöht...


Ansonsten ist in solchen Fällen der Debugger der beste Freund des Entwicklers, um zu sehen, was da eigentlich schief läuft... ;)

5

16.07.2014, 18:07

Statt nCounter*=0 kannstdu auch einfach nCounter=0 schreiben ;) Und außerden kannst auch eine bool Variable statt einem Counter nehmen, die signalisiert, dass die zahl eine Primzahl ist oder auch nicht. In Zeile 26 kannst du auch einfach prüfen, ob i == j ist oder j == 1

eTTPOx

Frischling

  • »eTTPOx« ist der Autor dieses Themas

Beiträge: 3

Beruf: Student

  • Private Nachricht senden

6

16.07.2014, 18:31

Danke schonmal für die Antworten! :)



Wie sieht denn dein Programm nach der Änderung aus? Hast du nur den Compilefehler behoben oder die Bedingungen komplett in eine if-Abfrage gepackt?
Falls es immer noch zwei if-Abfragen sind: 7/1 == 7 -> Counter erhöht, nächste Zeile: 7%1 -> Rest 0, Counter erneut erhöht...


Ansonsten ist in solchen Fällen der Debugger der beste Freund des Entwicklers, um zu sehen, was da eigentlich schief läuft... ;)


Der Compilefehler ist jetzt behoben, aber habe jetzt das Problem, welches du ansprichst.



Statt nCounter*=0 kannstdu auch einfach nCounter=0 schreiben ;) Und außerden kannst auch eine bool Variable statt einem Counter nehmen, die signalisiert, dass die zahl eine Primzahl ist oder auch nicht. In Zeile 26 kannst du auch einfach prüfen, ob i == j ist oder j == 1


Ah, so Kleinigkeiten mache ich anscheinend noch relativ oft umständlich. Danke, dass du das ansprichst.
Inwiefern meinst du das mit einer bool Variable? Was sollte ich da auf wahr bzw. falsch prüfen?

Tut mir leid, habe eben gerade erst angefangen mit dem programmieren ?(

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

16.07.2014, 18:38

Genau genommen ist auch 3/2 == 1 bei Integer-Division. Es ist also logisch sogar falsch das so zu schreiben, wenn man eigentlich i==j meint.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

16.07.2014, 18:38

Eine Boolvariable ermöglicht es dir z.B. das Ergebnis einer Bedingung abzuspeichern und später weiter zu verwenden. Im Grunde ist es nichts anderes als ein byte, das entweder auf 0 oder 1, falsch oder wahr, steht.
Beispiel:

C-/C++-Quelltext

1
2
3
bool foo = blub == 2;
if(foo)
...
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige