Supportnet / Forum / Anwendungen(Java,C++...)
C++ Praktikumsaufgabe ARRAYS - Wer kann mir helfen?
Frage
Hallo,
ich muss für mein EDV-Praktikum an der FH ein Programm schreiben das Primzahlen in einem angegebenen Zahlenbereich berechnet, den Mittelwert und die Summe bildet und die Zwillingsprimzahlen ermittelt. Das ganze soll dann formatiert ausgegeben werden.
Die genaue Aufgabenstellung steht hier:
[url]http://www.fbi.fh-darmstadt.de/~berthold/cub_ueb03_4.doc[/url]
Was C++ betrifft bin ich blutiger Anfänger und gerade mit den Arrays hab ich noch so meine Schwierigkeiten und auch die formatierte Ausgabe fällt mir nicht gerade leicht.
Bis jetzt habe ich folgendes vollbracht:
[code]
// primzahlen.cpp
#include <iostream.h>
#include <math.h>
#include <iomanip.h>
#include <stdlib.h>
void main ()
{ int prim_feld[200], i, j, min, max;
prim:boolean; //für wahr-falsch-aussage
system("CLS");
cout<<"\n";
cout<<"\n";
cout<<"Programm zur Berechnung von Primzahlen!"<<endl;
cout<<"\n";
cout<<"Bitte geben Sie einen Zahlenbereich ein in dem die Primzahlen"<<endl;
cout<<"berechnet werden sollen. Es werden maximal 200 Zahlen ausgegeben!";
cout<<"\n";
cout<<"Zahlenbereich von: ";
cin>>min;
cout<<" bis: ";
cin>>max;
cout<<"\n";
cout<<min<<" "<<max;
for (i=min;i<=max;i++)
{ prim=true;
for (j=2;j<i-1;j++)
{ if (i%j=0)
{ prim=false;
j=i-1;
}
if (prim=true)
{ //Zahl i zu prim_feld addieren
}
}
}
cout<<setw(5)<<prim_feld<<;
}
[/code]
Wo ich jetzt nicht weiterkomme ist eben die sache mit dem array. Wie speichere ich die daten ins array und wie gebe ich sie wieder aus mit max 10 Zahlen pro Zeile? Und wie veranlasse ich C++ dazu die einzelnen Zahlen im Array zu addieren bzw den Mittelwert zu bilden? Und dann ist da ja auch noch die Sache mit den Zwillingsprimzahlen...
Wär echt super wenn mir jemand ein paar Tipps geben könnte.
Es handelt sich übrigens nur um eine EVD-[b]Grundlagen[/b]-Vorlesung, also haltet mich bitte nicht für doof wenns etwas länger dauert bis ich's schnalle ;-)
Gruss,
Ralf
Antwort 1 von Habichnet
Ich will eine Editfunktion! ;-)
*schäm*
Man verzeihe mir die zahlreichen Fehler...!
*schäm*
Man verzeihe mir die zahlreichen Fehler...!
Antwort 2 von semi
Hier ein einfaches Beispiel, wie Du Zahlenreihen formatiert ausgeben kannst
Viel Spaß beim Lernen.
Gruß,
Michael
#include <iostream.h>
#include <iomanip.h> // hier ist setw definiert
int main()
{
// Paar Zahlen für den Test
int arr[] = {
1, 87, 156, 123, 456, 4444,
678, 33, 1245, 658, 987, 8,
789, 65, 9
};
for(int i=0, j=1; i<15; i++, j++)
{
cout << setw(6) << arr << "|";
if(j%5==0) // 5 Einträge pro Zeile
cout << endl;
}
return 0;
}Das mit den Primzahlen ist geht dann ähnlich
BOOL isPrimzahl(int zahl)
{
// hier prüfen, ob die gegebene Zahl
// eine Primzahl ist.
// true oder false zurückgeben
}
int main(...)
{
int primzahlen[200];
int min = ...; // Min. zu prüfende Zahl
int max = ...; // Max. zu prüfende Zahl
int index = 0; // Index/Zähler gefundener Primzahlen
// von n=min bis max-1, und gefunden <= 200
for(int n=min; index<200 && n<max; n++)
{
// Wenn Primzahl, dann ins Array damit
// und index inkrementieren (index++)
// index zeigt damit auf die nächste
// freie Position im Array und ist auch
// ein Zähler gefundener Primzahlen
if(isPrimzahl(n))
primzahlen[index++] = n;
}
// "index" enthält jetzt die Anzahl gefundener
// Primzahlen
// index kann auch 0 sein, dann läuft die
// folgende Schleife nicht durch
// da i=0 < index nicht erfüllt
for(int i=0, j=1; i<index; i++, j++)
{
cout << setw(8) << primzahlen << "|";
if(j%10==0) // 10 pro Zeile
cout << endl;
}
usw.
}Viel Spaß beim Lernen.
Gruß,
Michael
Antwort 3 von Habichnet
Hey das ist schonmal ein klasse Beispiel, das hilft mir weiter! Die Bsp die ich im Netz gefunden habe waren alle derart komplex dass ich daraus nicht schlau geworden bin und unser skript ist auch nicht so das wahre.
Dickes Danke an Dich, semi!
jetzt hängts halt noch an der aufsummierung der im array enthaltenen zahlen und der ermittlung der zwillingsprimzahlen.
kennst du da villeicht ein gutes einsteigertutorial im netz?
gruss,
Ralf
Dickes Danke an Dich, semi!
jetzt hängts halt noch an der aufsummierung der im array enthaltenen zahlen und der ermittlung der zwillingsprimzahlen.
kennst du da villeicht ein gutes einsteigertutorial im netz?
gruss,
Ralf
Antwort 4 von semi
Schau mal bei www.dokuwelt.de nach.
Die Anzahl der Primzahlen hast Du nach dem ersten Druchlauf (siehe index)
Wie du die Paare ermittelst möchte ich nicht verraten (Es sei dann, dass es dringend ist) :-)
Die Bedingung ist "Differenz <= 2", der letzte Eintrag bzw. die letzte eingelesene Primzahl ist garantiert "Solo"
Die Anzahl der Primzahlen hast Du nach dem ersten Druchlauf (siehe index)
Wie du die Paare ermittelst möchte ich nicht verraten (Es sei dann, dass es dringend ist) :-)
Die Bedingung ist "Differenz <= 2", der letzte Eintrag bzw. die letzte eingelesene Primzahl ist garantiert "Solo"
Antwort 5 von Habichnet
*patschandiestirn*
na klar doch! okok!
ich glaub ich sitz heute einfach schon zu lange am computer.
nene so dringend ists nicht, ich muss es am freitag haben.
es ging mir ürigens nicht um die anzahl der primzahlen sondern um deren summe! (und auch deren mittelwert) daher wollte ich wissen wie ich mit den im array enthaltenen zahlen rechne!
aber das werd ich auch noch rausbekommen.
also nochmals 1000 dank und gute n8!
:-))
na klar doch! okok!
ich glaub ich sitz heute einfach schon zu lange am computer.
nene so dringend ists nicht, ich muss es am freitag haben.
es ging mir ürigens nicht um die anzahl der primzahlen sondern um deren summe! (und auch deren mittelwert) daher wollte ich wissen wie ich mit den im array enthaltenen zahlen rechne!
aber das werd ich auch noch rausbekommen.
also nochmals 1000 dank und gute n8!
:-))
Antwort 6 von Habichnet
Soo, bin jetzt ein gehöriges Stück weitergekommen. Eigentlich sollte das Programm so funktionieren... eigentlich! Es ist zwar problemlos ausführbar allerdings treten bei der Berechnung Fehler auf:
- der eingegebene Minimalwert wird zT einfach missachtet (man gibt zB 80 als Minimum ein, das Programm spuckt aber 53 als kleinste Primzahl im Bereich aus) :-/
- es werden Zahlen als Zwillingsprimzahlen ausgegeben die garkeine Zwillingsprimzahlen sind.
Kann mir villeicht nochmal jemand auf die Sprünge helfen und mir sagen wo meine Denkfehler liegen?
Ich find den Fehler einfach nicht, in meinen Augen müsste das doch eigentlich fehlerfrei funktionieren... *hmpf*
- der eingegebene Minimalwert wird zT einfach missachtet (man gibt zB 80 als Minimum ein, das Programm spuckt aber 53 als kleinste Primzahl im Bereich aus) :-/
- es werden Zahlen als Zwillingsprimzahlen ausgegeben die garkeine Zwillingsprimzahlen sind.
Kann mir villeicht nochmal jemand auf die Sprünge helfen und mir sagen wo meine Denkfehler liegen?
Ich find den Fehler einfach nicht, in meinen Augen müsste das doch eigentlich fehlerfrei funktionieren... *hmpf*
// primzahlen.cpp
#include <iostream.h>
#include <math.h>
#include <iomanip.h>
#include <stdlib.h>
void main ()
{ int prim_feld[200], zwillinge[200], abbruch=0, summe=0, mittelwert=0;
int prim, anzahl=0, zanzahl=0, i, j, min, max;
char janein;
while (abbruch==0)
{ system("CLS");
cout<<"\n";
cout<<"\n";
cout<<"Programm zur Berechnung von Primzahlen!"<<endl;
cout<<"\n";
cout<<"Bitte geben Sie einen Zahlenbereich ein in dem die Primzahlen"<<endl;
cout<<"berechnet werden sollen. Es werden maximal 200 Zahlen ausgegeben!";
cout<<"\n";
cout<<"Zahlenbereich von: ";
cin>>min;
cout<<" bis: ";
cin>>max;
cout<<"\n";
for (i=min;i<max && anzahl<200;i++)
{ prim=1;
for (j=2;j<i-1;j++)
{ if (i%j==0)
{ prim=0;
j=i-1;
}
}
if (prim==1)
prim_feld[anzahl++]=i;
}
cout<<"Folgende Primzahlen wurden ermittelt:"<<endl;
cout<<"\n";
cout<<"|";
for (i=0,j=1;i<anzahl;i++,j++)
{ cout<<setw(5)<<prim_feld<<" |";
if (j%10==0)
{ cout<<endl;
cout<<"|";
}
}
cout<<"\n";
cout<<"\n";
for (i=0;i<anzahl;i++)
summe=summe+prim_feld;
mittelwert=summe/anzahl;
cout<<"Die Summe aller Primzahlen lautet: "<<summe<<endl;
cout<<"\n";
cout<<"Der Mittelwert der Primzahlen ist: "<<mittelwert;
cout<<"\n";
cout<<"\n";
cout<<"\n";
cout<<"Die ermittelten Primzahlen enthalten folgende Zwillingsprimzahlen:"<<endl;
cout<<"\n";
for (i=0,j=1;j<anzahl;i++,j++)
{ if (prim_feld[j]-prim_feld<=2)
{ zwillinge[zanzahl]=prim_feld;
zanzahl++;
zwillinge[zanzahl]=prim_feld[j];
}
}
for (i=0,j=1;i<zanzahl;i++,j++)
{ cout<<setw(5)<<zwillinge;
if (j%2==0)
cout<<" |";
if (j%10==0)
cout<<endl;
}
cout<<"\n";
cout<<"\n";
cout<<"\n";
cout<<"Moechten Sie eine erneute Berechnung durchfuehren?"<<endl;
cout<<"Beliebige Taste zum Fortfahren, 'N' bricht Programm ab!";
cin>>janein;
if ((janein=='N') || (janein=='n'))
{ cout<<"\n";
cout<<"\n";
cout<<" Vielen Dank, auf Wiedersehen! ";
cout<<"\n";
cout<<"\n";
abbruch=1;
}
}
}
Antwort 7 von Habichnet
semi, bist du nicht zufällig noch da ;-)
Antwort 8 von semi
anzahl und summe bei jedem Schleifendurchgang auf 0 setzen.
Deine Primzahlberechnung ist falsch.
Wenn die Schleife nicht ausgeführt wird, dann trägst Du eine falsche Primzahl ein.
(z.B. min = 0; max = 2;)
Wir gehen zuerst mal davon aus, dass eine gegebene Zahl eine Primzahl ist und suchen nach einem Divisor, um dies zu verneinen.
1) Eine Primzahl ist immer eine ungerade Zahl, (da nicht durch 2 teilbar) und sie ist größer als 2.
Da die Zahl ungerade ist, spielen gerade Divisoren "keine Rolle" (Wir suchen keine Bestätigung; Ungerade Zahl / Gerade Zahl ergibt immer einen Rest. Klartext: Primzahl)
2) Genauso ist es mit allen Zahlen n: ( n>Zahl/2 AND n<Zahl)
In diesem Bereich sind nur Divisoren dabei, die entweder gerade sind (uninteressant; siehe oben) oder in 1 mit Rest>0 resultieren (Primzahl bestätigt; wir brauchen aber eine Verneinung)
Klartext: Alle ungeraden Zahlen < Zahl/2 sind potentielle Divisoren, um eine Zahl als Primzahl auszuschliessen.
Mathematiker unter Euch mögen mir verzeihen. :)
Ich möchte hier nicht einen kompletten Beweis liefern.
Gruß,
Michael
Deine Primzahlberechnung ist falsch.
Wenn die Schleife nicht ausgeführt wird, dann trägst Du eine falsche Primzahl ein.
(z.B. min = 0; max = 2;)
prim=1; !!!!
for (j=2;j<i-1;j++)
{
...
}
if (prim==1)
prim_feld[anzahl++]=i;
Wir gehen zuerst mal davon aus, dass eine gegebene Zahl eine Primzahl ist und suchen nach einem Divisor, um dies zu verneinen.
1) Eine Primzahl ist immer eine ungerade Zahl, (da nicht durch 2 teilbar) und sie ist größer als 2.
Da die Zahl ungerade ist, spielen gerade Divisoren "keine Rolle" (Wir suchen keine Bestätigung; Ungerade Zahl / Gerade Zahl ergibt immer einen Rest. Klartext: Primzahl)
2) Genauso ist es mit allen Zahlen n: ( n>Zahl/2 AND n<Zahl)
In diesem Bereich sind nur Divisoren dabei, die entweder gerade sind (uninteressant; siehe oben) oder in 1 mit Rest>0 resultieren (Primzahl bestätigt; wir brauchen aber eine Verneinung)
Klartext: Alle ungeraden Zahlen < Zahl/2 sind potentielle Divisoren, um eine Zahl als Primzahl auszuschliessen.
Mathematiker unter Euch mögen mir verzeihen. :)
Ich möchte hier nicht einen kompletten Beweis liefern.
Gruß,
Michael
Antwort 9 von Klabauter
4. Übung Array
//***Primzahlen**
#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h> // Umwandlung von stringgrößen in double größen
int prim_zahlen[300] ; // 301 Speicherplätze reserviert
int prim_zwilling[200] ;
char jn ; // Fortsetzen der Berechnung
char szahlu[1],szahlo[1]; // String untere Grenze,obere Grenze
double eingabe_a, eingabe_b;
int zwischen; // Zwischenspeicher für das Verdrehen von Anfangs- und Endwert
int summe;// Ausgabevariable der Summe von den Primzahlen
float mittelw;
void main()
{
while (jn!=´n´)
{
int a=0;// Anfangswert
int b=0;// Endwert
int x=0;// Zaehler(Max)
int i=0;// Index
int j=0;// Index
int k=0;// Übergabe
int y=0;// Index
do
{
cout<<´ Bitte den Anfangswert eingeben : ´;
cin>>szahlu;
eingabe_a=atof(szahlu); // Umwandlung string ->float
cout<<´ ´;
cout <<´ Bitte den Endwert eingeben : ´;
cin>>szahlo;
eingabe_b=atof(szahlo);
cout<<´ ´;
a=(int)eingabe_a; // Konvertierung um gebrochene Zahlen auszuschließen!
b=(int)eingabe_b;
if( a<2 || b<2 || eingabe_a!=a || eingabe_b!=b)
cout<<´Falsche Eingabe!´;
}
while( a<2 || b<2 || eingabe_a!=a || eingabe_b!=b );
if (a>b)
{
zwischen=b;
b=a;
a=zwischen; // kein else!
}
for (i=a;(i<=b)&&(x<=300);i++) // in der Schleife werden max 301 Primzahlen gezählt
{
prim_zahlen[x]=i ; //Primzahlen werden i zugewiesen
x++ ; // Indexerhöhung
for (j=2; j<=i/2; j++) // For Schleife für die Berechnung
{
if (i%j==0) //Vergleich ob die Zahl teilbar ist.
{
x--; //Wenn Zahl teilbar ist index reduzieren
j=(i/2)+1; // Schleifenzähler auf max Wert um Schleife zu verlassen. Nächste Zahl
} // If close
} // for 2 close
} //for 1 close
if ( x>=300 ) // Zahlenbereich zu gross
{
cout<<´aaaEs gibt mehr als 300 Primzahlen in dem angegebenen Bereich !!! ´ ;
cout<<´ Bitte Wertebereich reduzieren ´ ;
x--; // Damit nur 300 Werte ausgegeben werden
}
cout<<´ Die Primzahlen:´;cout<<endl;
cout<<´ ´;
for (i=0; i<x; i++) // Ausgabe aller Primzahlen im geforderten Modus
{
cout<<setw(6)<<prim_zahlen<< ´´;
if ((i+1)%10==0)
cout<<endl ;
}
cout<<´ Anzahl der Primzahlen=´<<i; // Ausgabe der Anzahl der Primzahlen
cout<<´ ´;
summe=0;
for (i=0; i<x; i++)// Aufsummierung der Primzahlen
{
summe=summe+prim_zahlen;
}
cout<<´ Die Summe der ´;
cout<<i;
cout<<´ Primzahlen ist =´;cout<<setw(17);cout<<summe;cout<<endl;// Ausgabe der Summe
// Mittelwert der Primzahlen
// dazu einfügen einer float zahl um den Mittelwert als float ausgeben zu können!
float u;
u=(float)i;
mittelw=summe/u;
cout<<´ Der Mittelwert der ´;
cout<<i;
cout<<´ Primzahlen ist =´;cout<<setw(14);cout<<mittelw;cout<<endl;
// Bestimmen der Zwillinge
for (i=0; i<x; i++)
{
if(prim_zahlen[i+1]-prim_zahlen<=2)
{
prim_zwilling[k]=prim_zahlen; // Ubergabe in anderes Array von k nach i
prim_zwilling[k+1]=prim_zahlen[i+1];
k=k+2;
}
}
cout<<´ Anzahl der Zwillinge=´<<(k-2)/2<<endl; //
cout<<´ Die Zwillinge:´<<endl;cout<<´ ´;
cout<<setw(8)<<´Primzwilling1´<<setw(14)<<´Primzwilling2´
<<setw(18)<<´Primzwilling1´<<setw(14)<<´Primzwilling2´ << endl;
for (y=0; y<k-2; y=y+4)
{
cout<<setw(8)<< prim_zwilling[y]<<setw(14)<< prim_zwilling[y+1]
<<setw(18)<<prim_zwilling[y+2]<<setw(14)<< prim_zwilling[y+3] << endl;
} // for close
cout<<´ Fortsetzen j/n? ´ <<endl ; //Wiederholung der Bestimmung
cin>> jn;
} // while close
}
//***Primzahlen**
#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h> // Umwandlung von stringgrößen in double größen
int prim_zahlen[300] ; // 301 Speicherplätze reserviert
int prim_zwilling[200] ;
char jn ; // Fortsetzen der Berechnung
char szahlu[1],szahlo[1]; // String untere Grenze,obere Grenze
double eingabe_a, eingabe_b;
int zwischen; // Zwischenspeicher für das Verdrehen von Anfangs- und Endwert
int summe;// Ausgabevariable der Summe von den Primzahlen
float mittelw;
void main()
{
while (jn!=´n´)
{
int a=0;// Anfangswert
int b=0;// Endwert
int x=0;// Zaehler(Max)
int i=0;// Index
int j=0;// Index
int k=0;// Übergabe
int y=0;// Index
do
{
cout<<´ Bitte den Anfangswert eingeben : ´;
cin>>szahlu;
eingabe_a=atof(szahlu); // Umwandlung string ->float
cout<<´ ´;
cout <<´ Bitte den Endwert eingeben : ´;
cin>>szahlo;
eingabe_b=atof(szahlo);
cout<<´ ´;
a=(int)eingabe_a; // Konvertierung um gebrochene Zahlen auszuschließen!
b=(int)eingabe_b;
if( a<2 || b<2 || eingabe_a!=a || eingabe_b!=b)
cout<<´Falsche Eingabe!´;
}
while( a<2 || b<2 || eingabe_a!=a || eingabe_b!=b );
if (a>b)
{
zwischen=b;
b=a;
a=zwischen; // kein else!
}
for (i=a;(i<=b)&&(x<=300);i++) // in der Schleife werden max 301 Primzahlen gezählt
{
prim_zahlen[x]=i ; //Primzahlen werden i zugewiesen
x++ ; // Indexerhöhung
for (j=2; j<=i/2; j++) // For Schleife für die Berechnung
{
if (i%j==0) //Vergleich ob die Zahl teilbar ist.
{
x--; //Wenn Zahl teilbar ist index reduzieren
j=(i/2)+1; // Schleifenzähler auf max Wert um Schleife zu verlassen. Nächste Zahl
} // If close
} // for 2 close
} //for 1 close
if ( x>=300 ) // Zahlenbereich zu gross
{
cout<<´aaaEs gibt mehr als 300 Primzahlen in dem angegebenen Bereich !!! ´ ;
cout<<´ Bitte Wertebereich reduzieren ´ ;
x--; // Damit nur 300 Werte ausgegeben werden
}
cout<<´ Die Primzahlen:´;cout<<endl;
cout<<´ ´;
for (i=0; i<x; i++) // Ausgabe aller Primzahlen im geforderten Modus
{
cout<<setw(6)<<prim_zahlen<< ´´;
if ((i+1)%10==0)
cout<<endl ;
}
cout<<´ Anzahl der Primzahlen=´<<i; // Ausgabe der Anzahl der Primzahlen
cout<<´ ´;
summe=0;
for (i=0; i<x; i++)// Aufsummierung der Primzahlen
{
summe=summe+prim_zahlen;
}
cout<<´ Die Summe der ´;
cout<<i;
cout<<´ Primzahlen ist =´;cout<<setw(17);cout<<summe;cout<<endl;// Ausgabe der Summe
// Mittelwert der Primzahlen
// dazu einfügen einer float zahl um den Mittelwert als float ausgeben zu können!
float u;
u=(float)i;
mittelw=summe/u;
cout<<´ Der Mittelwert der ´;
cout<<i;
cout<<´ Primzahlen ist =´;cout<<setw(14);cout<<mittelw;cout<<endl;
// Bestimmen der Zwillinge
for (i=0; i<x; i++)
{
if(prim_zahlen[i+1]-prim_zahlen<=2)
{
prim_zwilling[k]=prim_zahlen; // Ubergabe in anderes Array von k nach i
prim_zwilling[k+1]=prim_zahlen[i+1];
k=k+2;
}
}
cout<<´ Anzahl der Zwillinge=´<<(k-2)/2<<endl; //
cout<<´ Die Zwillinge:´<<endl;cout<<´ ´;
cout<<setw(8)<<´Primzwilling1´<<setw(14)<<´Primzwilling2´
<<setw(18)<<´Primzwilling1´<<setw(14)<<´Primzwilling2´ << endl;
for (y=0; y<k-2; y=y+4)
{
cout<<setw(8)<< prim_zwilling[y]<<setw(14)<< prim_zwilling[y+1]
<<setw(18)<<prim_zwilling[y+2]<<setw(14)<< prim_zwilling[y+3] << endl;
} // for close
cout<<´ Fortsetzen j/n? ´ <<endl ; //Wiederholung der Bestimmung
cin>> jn;
} // while close
}

