Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Praktikumsaufgabe

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
22.04.2008, 17:17 Uhr
HalloWelt



Das Programm soll zwischen zwei Intervallgrenzen einlesen und alle Primzahlen in diesem Intervall berechnen und auf dem Bildschirm ausgeben.
Ich bin jetzt soweit gekommen das ich die Intervallgrenzen einlese und überprüfe welche die Kleinere von beiden ist.
Jetzt habe ich überlegt, das ich eine Funktion schreiben muss die mit der Zahl mit anfängt und versucht ob es einen Teiler zwischen 2 und (min-1) gibt, ist dies der Fall ist min keine Primzahl und soll nicht ausgegeben werden. Gibt es keinen Teiler, soll die Zahl ausgegeben werden und min um 1 erhöht werden. Das ganze soll nun solange gehen bis min = max und alle Zahlen berechnet sind. Kann mir vielleicht jemand bei der Umsetzung helfen?





C++:
#include <iostream>
#include <math.h>
using namespace std;

main ()

{
     int a, b;
     int min, max;
     cout << "Ab welcher Zahl sollen die Primzahlen ausgegeben werden? " << endl;
     cin >> a;
     cout << "Bis zu welcher Zahl sollen die Primzahlen ausgegeben werden? " << endl;
     cin >> b;
    
     if (a<b) // Um zu vermeiden das die erste Zahl des Intervalls größer der zweiten.
     {
          min=a;
          max=b;
          }
      else
      {
          min = b;
          max = a;
          }
    
          cout << "Es sollen also die Primzahlen im Intervall von [ " << min << " , " << max << " ] ausgegeben werden." << endl;
          
          for (min; min<=max; min=min+1)
          {

          }
          
}


Dieser Post wurde am 22.04.2008 um 18:22 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.04.2008, 18:22 Uhr
öni



Da gibt es den Modulo Opertator(%) der gibt dir den Rest herraus.

5%2=1 (Rest 1)
5%4=5 (Rest 5)
5%6=5 (Rest 5)
.....

6%2=0
......
7%2=1
.....

Damit kannst du überprüfen wenn es eine Zahl gibt mit der man teilt sodass kein Rest rauskommt das es dann keine Primzahl ist.


C++:
int Rest = min%2
if(!Rest)
cout<<"Keine Primzahl";


Dieser Post wurde am 22.04.2008 um 18:23 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.04.2008, 06:58 Uhr
HalloWelt



Das mit dem Modulo wußte ich in gewisser Weise, aber ich soll ja nicht rausfinden das keine Primzahl, sondern welche der Zahlen im Intervall Primzahlen sind.

Trotzdem Danke vielleicht hat noch jemand anderes eine Lösungshilfe für mich
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.04.2008, 14:45 Uhr
öni



Ja das ist mir in einer weise schon klar geworden. Ich war gestern aber spät drane hab in der eile gedacht das du mit dem was ich geschrieben habe du selber auf die lösung kommst. Danke Flosoft fürs editieren hatte wie gesagt wenig zeit.

Du nimmst 2 Forschleifen, die eine wie du schon oben stehen hast mit dem min und max. Die andere ist verschachtelt in dieser drinne und die teilt alle zahlen angefangen bei 2 bis zur eig. (zahl-1). Falls nun wirklich jedes mal ein Rest heraus kommt, beim Modulo teilen, dann scheint es doch eine Primzahl zu sein. Somit muss die Forschleife nur solange hochlaufen bis mit Modulo kein Rest heraus kommt(=somit keine Primzahl) oder solange hochlaufen bis man an der eig. (zahl-1) angekommen ist (=somit Primzahl).

Da muss man doch mit ein wenig überlegen drauf kommen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.04.2008, 10:41 Uhr
HalloWelt




C++:
#include <iostream>
#include <math.h>
using namespace std;

main ()

{
     int a, b;
     int min, max;
     int teiler = 2;
     int x=0;
     cout << "Ab welcher Zahl sollen die Primzahlen ausgegeben werden? " << endl;
     cin >> a;
     cout << "Bis zu welcher Zahl sollen die Primzahlen ausgegeben werden? " << endl;
     cin >> b;
    
     if (a<b) // Um zu vermeiden das die erste Zahl des Intervalls größer der zweiten.
     {
          min=a;
          max=b;
          }
      else
      {
          min = b;
          max = a;
          }
    
          cout << "Es sollen also die Primzahlen im Intervall von [ " << min << " , " << max << " ] ausgegeben werden." << endl;
          
          for (min; min<=max;) // Äußere For-Schleife soll solange ausgeführt werden bis vom Wert min - max erreicht wurde
          {
              
              for (teiler; teiler<min;) // Innere For-Schleife soll solange ausgeführt werden bis der Teiler von 2 bis min-1 durchgelaufen ist.
              {
                if (min%teiler==0) //Wenn min/teiler den Rest 0 ergibt soll x auf 1 gesetzt werden somit ist bekannt das es mindestens 1 Teiler gibt und min Primzahl ist.
                {
                x=1;
                teiler++;
                }
               else // Ergibt min/teiler einen Rest wird x nicht erhöht, der teiler wird um 1 erhöht.
               teiler++;
                  } // Ende der Inneren Schleife für den Momentanen min-Wert wurden alle Teiler durchgegangen.
                
               if (x==0) // Hier sollte dann die Ausgabe von min erfolgen in dem Fall das genau gleich 0 ist
                 {
                       cout << min << " ist eine Primzahl im Interall" << endl;
                       }
               else
                   {
                       cout << min << " ist keine Primzahl" << endl;
                       }
                       min++;
                  } // Ende der Äußeren Schleife es wurden Alle Werte im Bereich zwischen min und max durchgegangen
          
}



Jetzt habe ich das Problem das falls x=1 gesetzt werden sollte also es einen Teiler gibt und x keine Primzahl ist es nicht an die äußere Schleife übergeben wird. Wie kann ich des noch lösen????


Bearbeitung:

Codetags verwenden!!!


Dieser Post wurde am 24.04.2008 um 12:30 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.04.2008, 15:21 Uhr
öni



*räusper* ich mach mal alles ein wenig anders...


C++:
#include <iostream>
//math.h brauchst glaub net
using namespace std;

int main () //main funktion muss int sein

{
     int a, b;
     int min, max;
     int teiler = 2;
     bool x=0; // wert kennt nur 0 oder 1 somit bool (statt 1 auch true; false statt 0)
   //bool x=false;
     cout << "Ab welcher Zahl sollen die Primzahlen ausgegeben werden? " << endl;
     cin >> a;
     cout << "Bis zu welcher Zahl sollen die Primzahlen ausgegeben werden? " << endl;
     cin >> b;
    
     if (a<b)
     {
          min=a;
          max=b;
          }
      else
      {
          min = b;
          max = a;
          }
    
          cout << "Es sollen also die Primzahlen im Intervall von [ " << min << " , " << max << " ] ausgegeben werden." << endl;
          
          for (min; min<=max; min++) //min++ gehört hier rein, sonst siehts aus wie ne endlosschleif und ist formunschön
          {
              
              for (teiler; teiler>min; teiler++) // teiler++ hier nicht reinzuschreiben macht das leben doch nur schwerer
              {
                if (min%teiler==0)
                   x=1; //oder auch x=true;
              } // Ende der Inneren Schleife
                
               if (x==0) // oder if(!x) da x=0 sein soll              
                            //die geschweiften klammern kannst du dir bei einer zeile sparen aber nicht bei 2 zeilen in der if bedingung
                       cout << min << " ist eine Primzahl im Interall" << endl;
                      
               else                  
                       cout << min << " ist keine Primzahl" << endl;
                      
                    
                  } // Ende der Äußeren Schleife es wurden Alle Werte im Bereich zwischen min und max durchgegangen

return 0; //muss immer dasein laut Standart        
}


Edit: Ich habe jetzt schon lange gesucht aber irgendwo steckt ein Fehler bei mir und bei dir....scheint der gleiche zu sein....

Was du nun eig. wolltest habe ich nicht verstanden.

Dieser Post wurde am 24.04.2008 um 15:59 Uhr von öni editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.04.2008, 07:17 Uhr
HalloWelt




C++:
               {
                [b]x=1;[/b]
                teiler++;
                }
               else // Ergibt min/teiler einen Rest wird x nicht erhöht, der teiler wird um 1 erhöht.
               teiler++;
                  } // Ende der Inneren Schleife für den Momentanen min-Wert wurden alle Teiler durchgegangen.
                
               if (x==0) // Hier sollte dann die Ausgabe von min erfolgen in dem Fall das genau gleich 0 ist
                 {
                       cout << min << " ist eine Primzahl im Interall" << endl;
                       }
               else
                   {
                       cout << min << " ist keine Primzahl" << endl;
                       }
                       min++;
                  } // Ende der Äußeren Schleife es wurden Alle Werte im Bereich zwischen min und max durchgegangen
          
}


Sorry der Code nur Auszugsweise.

Das Problem bei mir ist das der X-Wert der inneren Schleife nicht nach außen gegeben wird.
Wenn ich x in der äußeren Schleife ausgeben lasse, hat x immer den Startwert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.04.2008, 14:23 Uhr
~Doug_HH
Gast


Versucht das mal so...


C++:
int _max=0, _min=0, _primzahl=0, _divisor=0;
    int _a, _b;//Variablen für die Zwischenspeicherung, wenn erforderlich
    bool _istEinePrimzahl = true;

    cout << "Ab welcher Zahl sollen die Primzahlen ausgegeben werden? ";
    cin >> _min;
    cout << "Bis zu welcher Zahl sollen die Primzahlen ausgegeben werden? ";
    cin >> _max;

    if (_min > _max) // Um zu vermeiden das die erste Zahl des Intervalls größer der zweiten.
    {        
        _a = _min;
        _b = _max;

        _min = _b;
        _max = _a;
    }

    if(_min <2)//Wenn _min kleiner als 1, dann auf 2 setzen
    {
        _min = 2;
    }
    
    
    for (_primzahl=_min; _primzahl <=_max; _primzahl++)
    {
        _istEinePrimzahl = true;
        
        //Ist die Zahl wirklich eine Primzahl?
        for (_divisor=2; _istEinePrimzahl && _divisor < _primzahl; _divisor++)
        {
            //Restlos teilbar?
            if (0 == _primzahl % _divisor)
            {
                //Wenn die Zahl teilbar ist, ist es keine Primzahl!
                _istEinePrimzahl = false;
            }
        }
        
        //Die Zahl ausgeben, wenn es eine Primzahl ist
        if (_istEinePrimzahl == true)
        {
            cout << _primzahl << endl ;
        }
    }
    cout << endl;

    return 0;



Gruß, Doug_HH
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
25.04.2008, 15:04 Uhr
Doug_Hh



Ach ja, noch was...
Schreib einen Vergleich oder eine Schleife immer mit Klammern, egal nur eine Zeile oder mehr Zeilen.
Ich hab das schon so oft gehabt, dass Programme dumme Sachen gemacht haben oder sich durch einen Klammerfehler nicht mehr übersetzt wurden.

Also statt...


C++:
if(y < 20)
  //Anweisung





Lieber so...


C++:
if(y < 20)
{
  //Anweisung
}



oder...


C++:
for(i = 0; i<20;i++)
  //Anweisung



dann doch lieber so...


C++:
for(i = 0; i<20;i++)
{
  //Anweisung
}



Lässt sich auch so besser lesen...

Gruß, Doug_HH
--
______( o o )
==oOOo-(_)-oOOo==
The next time you think you are perfect, try walking on water.

Dieser Post wurde am 25.04.2008 um 15:05 Uhr von Doug_Hh editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
25.04.2008, 16:00 Uhr
Suba Esel



@ öni:
der Fehler liegt hier:

C++:
// x=0; siehe unten
for (teiler; teiler>min; teiler++) // 1.: teiler wird bei einem neuen Aufruf der Forschleife nicht neu initialisiert, dadurch wird teiler immer größer, sodass das sonstwas passiert ||| 2.: teiler >min sorgt dafür, dass irgendwann teiler==min, also min%teiler natürlich gleich 0
{
     if (min%teiler==0)
          x=1; // nach dem ersten Aufruf hiervon ist x immer 1, da es ja nie auf 0 zurückgesetzt wird
}



es müsste also so aussehen:

C++:
for (min; min<=max; min++)
    {
        x = 0;
        for (teiler = 2; teiler<min; teiler++)
        {
            if (min%teiler==0)
                x=1;
        }



Allerdings ist das ganze Programm ziemlich unschön.
--
Simon

Dieser Post wurde am 25.04.2008 um 16:01 Uhr von Suba Esel editiert.
 
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: