Supportnet Computer
Planet of Tech

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...!

Antwort 2 von semi

Hier ein einfaches Beispiel, wie Du Zahlenreihen formatiert ausgeben kannst

#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

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"



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!
:-))

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*

// 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;)
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

}