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

  • »the_last_unicorn« ist der Autor dieses Themas

Beiträge: 1

Wohnort: Österreich

  • Private Nachricht senden

1

02.05.2006, 22:56

Hilfe bei Übung mit verketteten Listen ?!?

Ein ganz herzliches Hallo erstmals! (das ist mein 1.Beitrag)
Ich arbeite schon seit längerer zeit mit dem Buch C++ für Spieleprogrammierer. Als ich eine Übung zu der STL machen wollte, kam ich bei einem Problem nicht weiter; hier mal der code:
// Mein 1. Primzahlenberechner!
# include <iostream>
# include <list>

using namespace std;
// Prototyp (en)
bool prime_generator (int tester, bool isprim); // Errechnet Primzahlen
// Variablen
list < int>lZahlen; //enthält anfänglich alle Primzahlenkandidaten, später werden alle falschen gelöscht
list < int>::iterator k;
int test;
int Anzahl =0;
bool isprim; // gibt zurück ob Primzahl
//Hauptprogramm
int main ()
{

cout << "Bis zu welcher Zahl sollen die Primzahlen ermittelt werden? (höchstens bis 999999) ";
cin >> Anzahl;
for ( int i=0; i<= Anzahl; i++)
{
lZahlen.push_back (i);
}
cout << "Primzahlen werden ermittelt.....";
for ( test=lZahlen.begin; test <lZahlen.end +1; test++ )
{
bool prime_generator (test);
if (isprim )
{
int *ptest = &test;
lZahlen.erase[ptest];
break;
}

}
cout <<"Fertig!"<< endl;
cout << "Folgende Zahlen von 1 bis" << Anzahl;
cout << "sind Primzahlen:"<< endl;
for ( k=lZahlen.begin (); k!=lZahlen.end (); ++k)
{
cout << *k << ",";
}
cout <<endl<< "Es sind insgesamt genau " << static_cast <int> (lZahlen.size());
cout << " Primzahlen"<< endl;


return 0;
}
// prime_generator
//
bool prime_generator (int tester, bool isprim = true)
{
for(int i=tester; ; )
{
for(int j=2; j<i/2; ++j)
{
if(i%j == 0) { isprim= false; break; }
}
}
return isprim;
}

Das soll(te) ein Primzahlengenerator sein, bei dem die Anzahl an Zahlen in einer verketteten Liste gespeichert wird und aööe nichtprimzahlen im nachhinein gelöscht werden- fehlermeldung: 0Fehler, 0Warnungen; Wenn ich das Prog allerdings starte kommt heraus, das alle Zahlen Primzahlen sind...wo ist der (bzw. sind die) Fehler?
In einer irrsinigen Welt vernünftig sein zu wollen,
ist ein Widerspruch an sich -Voltaire

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

2

03.05.2006, 17:38

Jetzt muss ich erstmal bisschen mechern, bevor ich mir die Mühe mache, den Code genau zu analysieren (mach ich aber auch noch)

Du solltest idealerweise deinen Code mit [cpp ][/cpp ] (ohne Leerzeichen) einrahmen. Außerdem solltest du mit Einrückungen arbeiten, um zu verdeutlichen, welcher Code wo hingehört.

Einige inhaltliche Fehler hab ich schon, aber das poste ich dann lieber insgesamt^^

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

3

03.05.2006, 18:12

Hier ein wenig abgewandelt das ganze.
Bitte schau dir genau an, was rechnerisch und codemäßig anders ist!
Außerdem solltest du nochmal überlegen, ob es auch einfacher geht. Um dir einen Tipp zu geben: Jede Zahl die durch keine andere Primzahl teilbar ist ist eine Primzahl - damit kannst du eine Menge Prüfungen sparen, wenn du dein Programm optimieren willst. Es ist auch sinnlos, erst eine Liste voll zu hauen und dann wieder zu reduzieren, wo man doch auch gleich nur Primzahlen einspeisen kann.

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <list>
// für Sleep()

#include <windows.h>

using namespace std;
// Prototyp (en)


// wozu ein bool als 2. Parameter?

bool prime_generator (int tester);

// Variablen

list <int>lZahlen; //enthält anfänglich alle Primzahlenkandidaten, später werden alle falschen gelöscht

list <int>::iterator k;
int test;
int Anzahl =0;
// bool isprim; auskommentiert, in main() neu erstellt


// Hauptprogramm


int main ()
    {
    // keine unnötigen globalen Variablem

    bool isprim = false;
    cout << "Bis zu welcher Zahl sollen die Primzahlen ermittelt werden? (höchstens bis 999999) ";
    cin >> Anzahl;
    // 0 ist keine Primzahl

    for (int i=1; i<= Anzahl; i++)
        {
        lZahlen.push_back (i);
        }
    cout << "Primzahlen werden ermittelt.....";
    // lZahlen.begin() und .end() gibt einen Iterator zurück! Funktionsaufrufe sollten mit Klammern () versehen werden

    for ( k=lZahlen.begin(); k != lZahlen.end(); k++ )
        {
        // der Rückgabewert der Funktion wird in isprim gespeichert

        isprim = prime_generator (*k);
        // was keine Primzahl ist kommt raus

        if (!isprim)
            {
            // .erase() erwartet einen Iterator und gibt einen neuen Iterator zurück

            k = lZahlen.erase(k);
            // k ist leider einen Schritt zu weit...

            k--;
            // break; wenn du gleich abbrichst is klar, dass es nix wird

            }

        }
    cout <<"Fertig!"<< endl;
    cout << "Folgende Zahlen von 1 bis" << Anzahl;
    cout << "sind Primzahlen:"<< endl;
    for ( k=lZahlen.begin (); k!=lZahlen.end (); k++)
        {
        cout << *k << ",";
        }
    cout <<endl<< "Es sind insgesamt genau " << static_cast <int> (lZahlen.size());
    cout << " Primzahlen"<< endl;
    // auf Enter warten

    Sleep(100);
    fflush(stdin);
    cin.get();
    return 0;
    }
// prime_generator

//

bool prime_generator (int tester)
    {
    // wozu eine for-Schleife hier?

    //for(int i=tester; ; )

    // j<= statt j<

    for(int j=2; j<=tester/2; ++j)
        {
        // direkt false zurückgeben... falls tester keine Primzahl ist

        if(tester%j == 0) { return false; }
        }
    // true, wenn tester eine Primzahl ist.

    return true;
    } 

Werbeanzeige