Array an eine Funktion übergeben // Berechnung von Verktorelementen
-
Ich bräuchte da mal ein wenig Hilfe.
Hab das Internet jetzt schon Stunden durchsucht und schon etwas an diesem eigentlich simplen Programm gearbeitet, aber leider finde ich keine Antwort auf mein Problem... Ich hoffe hier kann mir geholfen werden.Also es geht darum, dass der Nutzer einen beliebigen Vektor eingeben kann und das Programm die Summe und das Produkt der Vektorelemente ausgibt.
Die Berechnung soll in einer Funktion erfolgen und die Eingabe und wenn möglich auch die Ausgabe in der main-Funktion, deswegen wird auch ein return benötigt.
Mein Code lautet:#include <cstdlib> #include <iostream> using namespace std; float summe=0,produkt=1,vektor[100]; int anz, i; float prosumo(int, float); int main() { cout<<"Mit diesem Programm können sie einen Vektor eingeben und das Programm gibt die Summe und das Produkt der Verktorelemente zurück."<<endl<<endl<<endl; cout<<"Bitte geben sie nun die Anzahl der Vektorelemente ein:"<<endl; cin>>anz; cout<<"Nun geben sie bitte die einzeln die Vektorelemente ein."<<endl; for (i=0;i<=(anz-1);i++) {cout<<"Bitte geben sie das "<<i+1<<"te Element ein:"<<endl; cin>>vektor[i]; } prosumo(anz, vektor[i]); cout<<"Die Summe der Elemente lautet:"<<summe<<endl;; cout<<"Das Produkt der Elemente lautet:"<<produkt; system("PAUSE"); return EXIT_SUCCESS; } float prosumo(int anz,float vektor[i]) {for (i=0;i<=(anz-1);i++) { summe=summe+vektor[i]; produkt=produkt+vektor[i]; } return summe,produkt;}Ich habe jetzt schon endlos viele Möglichkeiten probiert, aber die richtige war noch nicht dabei, deswegen stell ich mal die rein, mit den wenigsten Fehlermeldungen

also es kommt, dass in Zeile 26: "variable-size type declared outside of any function"Ich hoffe jemand kann mir helfen.
-
Vorweg mal: Das was du "Vektor" nennst, wird hier im Forum "Array" genannt. Der Begriff Vektor dafür ist zwar nicht falsch, aber er würde zu Verwirrung führen (siehe unten).
Das mit der Übergabe von Arrays funktioniert völlig anders. Außerdem wäre die Übergabe hier gar nicht nötig, da das Array ja ohnehin global ist. Dieses andererseits ist (aus guten Gründen, die hier aber nicht so wichtig sind) sehr schlechter Stil und du solltest es dir gleich abgewöhnen.
Bevor ich aber nun zu einer Verbesserung mitsamt Erklärung aushole: Willst du das wirklich lernen? Es gibt in der Standardbibliothek eine recht einfach benutzbare Klasse namens std::vector (was ein Zufall, der Name
), die genau das macht, was du hier willst, dabei aber intuitiv benutzbar ist. Das ist daher eher für Anfänger geeignet. Willst du lieber eine Erklärung mit std::vector oder mit Arrays.
-
Danke erst einmal für die Antwort

Dass man ein Array Array nennt, ist mir schon klar ... sonst wäre C++ wohl nicht das richtige für mich
... das mit dem Vektor kommt nur daher, dass man mit dem kleinen Programm eben mathematische Vektoren eingeben kann und diese berechnet werden ... wie ein Zusatzprogramm für einen Taschenrechner.Also mein Array habe ich oben global definiert, ja stimmt und dann bräuchte ich es nicht mehr von der main an die Funktion übergeben, also nur die Anzahl der Elemente?
Schlechter Stil, ja stimmt schon ... bin noch in den ersten Lernphasen und hab gedacht, dass man bei den doch wenig überschaubaren Variablen diese auch global definieren könnte.Wenn du so nett wärst und mir das mit dem Array ein wenig näher bringen könntest, wäre ich dir sehr dankbar, denn dies soll ja nicht einfach ein Programm sein, was ich mal schreibe und fertig, sondern ich würde mich dadurch schon etwas näher an dieses Arrayproblem heran wagen. Vielleicht würde mir auch einfach ein Link helfen, wenn du hier nicht zuviel schreiben willst.
Danke erstmal
-
#include <cstdlib> #include <iostream> using namespace std; // Die ganzen globalen Variablen kommen erstmal weg. Das können wir besser. Es gibt keinen Grund sich schlechten Stil anzugewöhnen void prosumo(unsigned int, double[], double&, double&); // Ich nehme lieber double statt float. Das in auf aktuellen Systemen genauso schnell (oder gar schneller) als float, dabei aber genauer. int main() { cout<<"Mit diesem Programm können sie einen Vektor eingeben und das Programm gibt die Summe und das Produkt der Verktorelemente zurück."<<endl<<endl<<endl; const unsigned int maximum_anz = 100; unsigned int anz; // War doch gar nicht so schlimm, die Variable dort zu definieren wo sie benutzt wird ;-) do { cout<<"Bitte geben sie nun die Anzahl der Vektorelemente zwischen 1 und " << maximum_anz << " ein:"<<endl; cin>>anz; } while (anz<1 || anz > maximum_anz); cout<<"Nun geben sie bitte die einzeln die Vektorelemente ein."<<endl; double vektor[maximum_anz]; // Dies ist eigentlich auch ganz schlechter Stil, aber als Anfänger kennst du wahrscheinlich die Technik noch nicht, um die Arraygröße anzupassen for (unsigned int i=1;i<=anz;++i) // Wieder: War das so schwer, i nicht global zu machen? { cout<<"Bitte geben sie das "<<i<<"te Element ein:"<<endl; cin>>vektor[i-1]; } double produkt, summe; prosumo(anz, vektor, produkt, summe); // Und so übergibt man Arrays. Das Array wird dabei automatisch in einen Zeiger auf das erste Element umgewandelt. Ist unintuitiv, ist aber so. cout<<"Die Summe der Elemente lautet:"<<summe<<endl; cout<<"Das Produkt der Elemente lautet:"<<produkt<<endl; } void prosumo(unsigned int anz, double vektor[], double& produkt, double &summe) // Da du zwei Rückgabewerte hast, ich dir jetzt aber nicht auch noch Klassen beibringen möchte, mache ich die Rückgabe erstmal per Referenz. { summe=0; produkt=1; for (unsigned int i=0;i<anz;++i) { summe += vektor[i]; // Operator +=. warum mehr schreiben als nötig? produkt *= vektor[i]; } }
-
Und da ich gerade noch Lust hatte, hier das gleiche mit std::vector. Dafür aber ohne Kommentare.
#include <vector> #include <iostream> using namespace std; void prosumo(vector <double>, double&, double&); int main() { cout<<"Mit diesem Programm können sie einen Vektor eingeben und das Programm gibt die Summe und das Produkt der Verktorelemente zurück."<<endl<<endl<<endl; unsigned int anz; do { cout<<"Bitte geben sie nun die Anzahl der Vektorelemente zwischen >1 ein:"<<endl; cin>>anz; } while (anz < 1); cout<<"Nun geben sie bitte die einzeln die Vektorelemente ein."<<endl; vector<double> vektor(anz); for (unsigned int i=1;i<=anz;++i) { cout<<"Bitte geben sie das "<<i<<"te Element ein:"<<endl; cin >> vektor[i-1]; } double produkt, summe; prosumo(vektor, produkt, summe); cout<<"Die Summe der Elemente lautet:"<<summe<<endl; cout<<"Das Produkt der Elemente lautet:"<<produkt<<endl; } void prosumo(vector<double> vektor, double& produkt, double &summe) { summe=0; produkt=1; for (unsigned int i=0;i<vektor.size();++i) { summe += vektor[i]; produkt *= vektor[i]; } }
-
Vielen herzlichen Dank, damit hast du mir sehr weiter geholfen.
Ich werd mir dann mal Klassen und Array Größen anpassen angucken ... denke mal man muss dann den Wert maximum_anz manipulieren. Werd ich dann sehen.
Jetzt hab ich das mit den Referenzen auch endlich vollständig verstanden
Auch wie man die Berechnungen mit += verkürzen kann ... sehr interessant
und der Unterschied zwischen der ersten Methode und der zweiten ist wohl hauptsächlich dass die anz durch vektor.size() entfällt, bzw. die Info durch vector<double> vektor(anz) ja irgendwie enthalten ist. Das muss ich mir nochmal genauer angucken, auch weil aus dem double vector[] was ich schreiben würde jetzt nen vector<double> vektor geworden ist.
das schau ich mir nochmal genauer an
Also nochmals vielen Dank