C++ gleitender Mittelwert mittels Array weitergabe berechnen

meph!sto

Vice Admiral
Registriert
Nov. 2003
Beiträge
6.287
Hi,
Ich muss für die FH ein Programm schreiben. Dieses Programm muss folgendes machen:
- Messwerte in einem Array1 speichern, welche der User selbst eingibt
- dieses Array1 als Parameter an eine Funktion übergeben
- die Funktion soll dann den gleitenden Mittelwert berechnen und in einem Array2 zurückgeben

Das Prinzip versteh' ich, nur krieg ich die Syntax einfach nicht hin.
Ich habe in Visual Studio dazu 2. *.cpp Dateien angelegt, einmal die main.cpp und einmal die funktion.cpp

main.cpp (nicht wundern, ich habe eine Begrenzung auf 20 Messwerte eingebaut):
Code:
#include <iostream>
#include <iomanip>
using namespace std;
void mittelwert (int a, double w[], double x[]);


int main()
{
	//int const max=20;
	double messwerte[20]={0};
	int anzahl;
	char wiederholen;

	do
	{
	cout<<" Wieviele Messwerte liegen vor ?";
	cin>>anzahl;
	if (anzahl>20)  // Abfragen ob >20
		{
			cout<<" Begrenzung auf 20 Messwerte!\n ";
			anzahl=20;
		}
	else
		cout<<" Messwerte eingeben "; // Werteingabe
			for (int i=0;i<anzahl;i++)
				cin>>messwerte[i];
				for (int i=0;i<anzahl;i++) // Werteausgabe
					cout<<setw(2)<<messwerte[i]<<" ";
					cout<<endl;
		mittelwert(anzahl,messwerte,0);
		cout<<"Die gleitenden Mittelwerte lauten: ";
			for (int i=0;i<anzahl;i++) // Werteausgabe
						cout<<setw(2)<<messwerte[i]<<" ";
			cout<<" Wiederholen ? (j)a, (n)ein ?";
			cin>>wiederholen;
	}while(wiederholen=='j');
}

funktion.cpp:
Code:
#include <cmath>
using namespace std;

void mittelwert (int n, double w[], double x[])
{
	w[0] = x[0];
	w[n-1] = x[n-1];
	
	for (int i=1;i<(n-2);i++)
		w[i]=(x[i-1]+x[i]+x[i+1])/3;
}

Irgendwas fehlt da, nur komm' ich einfach nicht drauf.

Ich möchte nicht dass mir jmd. einfach den Code hinklatscht, denn das bringt mir 0.
Ich such nach einer Hilfe, die mir das verständlich erklärt (bin eine absolute Niete, was Programmieren angeht).

Danke !

Edit: nun schmiert mir das Programm ab, mit einer Meldung von irgendwelchen Zugriffverletzungen....
 
Zuletzt bearbeitet:
Das sieht doch gar nicht mal schlecht aus.
Zu deinem Fehler: Du musst einfach "mittelwert(messwerte[], anzahl);" in "mittelwert(messwerte, anzahl);" umschreiben. "messwerte" ist der Arrayname und der reicht.
Deine Funktion versteh ich aber nicht. Ein arithmetisches Mittel ist das nicht.
 
Ein arithmetisches soll auch gar nicht gebildet werden ;)

Ausschnitt aus der Aufgabenstellung:

...
Der erste und der letzte Messwert bleiben unverändert, d.h.
w[0]=x[0] und w[n-1]=x[n-1].

Alle anderen Werte w (1<=i<=n-2) werden dann gemäß folgender Formel
berechnet:
w=(x[i-1]+x+x[i+1])/3.
...


Deinen Vorschlag habe ich auch eben abgeändert, doch das Programm stürzt weiterhin ab.
Ich muss ja aus meiner main 3 Parameter übergeben, da die funktion 3 erwartet.
Diese sind ja dann

- n (Anzahl an Messwerten)
- x (Messwerte)
- ???

Welchen 3. Parameter muss ich denn übergeben ?
 
den gleitenden Mittelwert berechnen
Hab ich überlesen...

Code:
mittelwert(anzahl,messwerte,0);
passt nicht zu der Funktionssignatur
Code:
mittelwert (int, double [], double [])

Du kannst die gemittelten Werte doch einfach in einem Funktions-lokalen Array speichern, das du dann zurückgibst.
 
moagnus schrieb:
Du kannst die gemittelten Werte doch einfach in einem Funktions-lokalen Array speichern, das du dann zurückgibst.
Ich bin mir ziemlich sicher, dass das nicht funktionieren wird. Bei einfachen Datentypen klappt das, bei einem Array dürfte das jedoch schiefgehen.
Daher entweder mit Zeigern (Pointern) arbeiten oder den Methodenrumpf direkt in die main() einbetten.

/edit: Ich habe soeben festgestellt, dass es doch möglich ist. Also sind Zeiger hier unangebracht.
 
Zuletzt bearbeitet:
1. Die Funktion braucht nur 2 Parameter, int anzahl und double *w.
2. In der Fkt musst du das Array w[] kopieren in ein zweites Array x[].
3. Dann kannst du deinen eigenlichen Algorithmus anwenden.

Ich hoffe das hilft dir.
 
Mein code für die Fuinktion sieht nun so aus:
Code:
void mittelwert (int n, double w[], double x[])
{
	w[n] = x[n];
	w[0] = x[0];
	w[n-1] = x[n-1];
	
	for (int i=1;i<(n-2);i++)
		w[i]=(x[i-1]+x[i]+x[i+1])/3;

muss das double x[] weg ?
Das Programm stürzt mir nämlich weiterhin ab.
 
Ja, das muss weg.
In der Funktion musst du noch ergänzen:

double *x = new double[anzahl];
for(i=0; i < n; ++i)
x=w;

und am ende delete[] x;

Ich hoffe das stimmt alles.
 
Kannst du mir evtl. erklären warum ?
Ich versteh' nicht, was das bewirken soll ?
Was ist dieses *x ?

Mein Code sieht nun so aus:
Ich krieg nun auch Ergebnisse zurückgeliefert,
aber die sind vollkommen falsch.

So sieht meine Funktion im Moment aus, wobei das double x[20] nur ein Workaround ist...

Code:
#include <cmath>
using namespace std;

void mittelwert (int n, double w[])
{
	double x[20];
	w[n] = x[n];
	w[0] = x[0];
	w[n-1] = x[n-1];
	
	for (int i=1;i<(n-2);i++)
		w[i]=(x[i-1]+x[i]+x[i+1])/3;
	return;
}

Und wie geb ich dann das geänderte Array wieder aus bzw. an die main zurück, sodass dieses es ausgeben kann ?
 
Zuletzt bearbeitet:
Hast du meinen Code mal ausprobiert? Geht dieser?

Mit double x[20] legst du ein Array aus 20 double-Werten an, die allesamt undefiniert sind (können alles möglichen Werte haben). w[] sind ja die Messwerte die der Nutzer eingegeben hat. Mit w[n] = x[n] überschreibst du also diese schönen Werte mit blanken unsinn (da x[] undefiniert). Das erklärt also auch, warum du nicht vernünftiges zurück bekommst.
Du musst also erst einmal die Messwerte in x[] kopieren und dann die berechneten wieder in w[] speichern (zumindest wenn sie dann nicht weiter wichtig sind, sonst solltest du sie woanders speichern).
Zu meinem *x. Das ist ein Zeiger und das new ist dynamische Speicherverwaltung. Wenn ihr das noch nicht gelernt habt mach es halt mit x[20].
 
Jetzt spuckt er mir einfach die eingegebenen Werte wieder aus.
Meine Funktion sieht so aus:

Code:
#include <cmath>
using namespace std;

void mittelwert (int n, double w[])
{
	double x[20];
	x[n] = w[n];
	x[0] = w[0];
	x[n-1] = w[n-1];
	
	for (int i=1;i<(n-2);i++)
		x[i]=(w[i-1]+w[i]+w[i+1])/3;
	return;
}

und meine "Main" aus der, die Funktion aufgerufen wird schaut so aus:

Code:
#include <iostream>
#include <iomanip>
using namespace std;
void mittelwert (int n, double w[]);


int main()
{
	//int const max=20;
	double messwerte[20]={0};
	int anzahl;
	char wiederholen;

	do
	{
	system("cls");
	cout<<" Wieviele Messwerte liegen vor ?";
	cin>>anzahl;
	if (anzahl>20)  // Abfragen ob >20
		{
			cout<<" Begrenzung auf 20 Messwerte!\n ";
			anzahl=20;
		}
	else
		cout<<" Messwerte eingeben "; // Werteingabe
			for (int i=0;i<anzahl;i++)
				cin>>messwerte[i];
				for (int i=0;i<anzahl;i++) // Werteausgabe
					cout<<setw(2)<<messwerte[i]<<" ";
					cout<<endl;
		mittelwert(anzahl,messwerte);
		cout<<"Die gleitenden Mittelwerte lauten: ";
			for (int i=0;i<anzahl;i++) // Werteausgabe
						cout<<setw(2)<<messwerte[i]<<" ";
			cout<<" Wiederholen ? (j)a, (n)ein ?";
			cin>>wiederholen;
	}while(wiederholen=='j');
	return 0;
}

Ich habe deinen Code nicht ausprobiert, weil ich gar nich weiß wo ich den einfügen soll :rolleyes:
 
Zurück
Oben