MAX und MIN Wert ermitteln



  • Hallo viande!

    Also es lag wirklich nur an die Intialisierungen der Variablen. endl; ist doch nur nächste Zeile oder sollte man anstatt endl nur \n benutzen ? Ich lasse mich gern weiterbelehren. 🙂 Testen kann ich den Programm erst am Abend.
    Mit Vektoren habe ich mich noch nie beschäftigt, aber ich werde sicherlich das zunächst tun. Vielen Dank an allen Mitbeteiligten.

    lg und schönen tag noch



  • Naja, std::endl erzeugt eine neue Zeile durch ein "\n" und flusht gleichzeitig den ostream (d.h. es wird direkt in die Ausgabe geschrieben). Letzteres kostet natürlich ein wenig Zeit, daher sollte man das Steuerzeichen "\n" bevorzugen, wenn eine prompte Ausgabe nicht unbedingt benötigt wird. Ohne eine explizites flushen wird die Ausgabe eventuell verzögert angezeigt.



  • Danke für die Erklärung 🙂 Man lernt nie aus.

    lg



  • viande schrieb:

    Letzteres kostet natürlich ein wenig Zeit, daher sollte man das Steuerzeichen "\n" bevorzugen, wenn eine prompte Ausgabe nicht unbedingt benötigt wird.

    Ach Quark. Wann spielt diese minimale Verzögerung bei der Ausgabe denn mal eine Rolle?



  • Welche Verzögerung meinst du? Die Leitungseinbußen werden natürlich in häufigen Ausgaben spürbar. zB in den Schleifen bei dem Programm dort oben, wenn große Frequenzen gegeben sind. Wenn ich nur eine Zeile ausgebe ist es natürlich wurscht 😉 Außerdem ist es weniger Schreibarbeit.



  • Hi viande,

    leider liegt das Problem noch immer dort 😞
    Er zeigt mir noch immer nur die Werte für die erste Sinuswelle und die gesamten Sinuswellen, aber nicht die anderen Wellen, falls ich mehrere Wellen zur Auswahl wähle.

    #include "stdafx.h"
    #include <iostream>
    #include <cmath>
    #include <fstream>
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
        const double PI = acos(0.0) * 2;
    
        cout << "Wie viele Sinuswellen moechten Sie es haben?\n" << endl;
    
        int welle;
        cin >> welle;
    
        if ( ! cin.good() ) // Wenn Fehler bei der Eingabe
        {
            cout << "Fehler bei der Eingabe. Programm wird beendet!!" << endl;
            return 0;
        }
    
        double freqe[50000];
        double ampli[50000];
        for (int s = 0; s < welle; s++)
        {
            cout << "Bitte geben Sie ein Wert f\x81r die " << s + 1 << ". Frequenz ein: ";
            cin >> freqe[s];
            if ( ! cin.good() ) // Wenn Fehler in der Eingabe
            {
                cout << "Fehler bei der Eingabe. Programm wird beendet!!" << endl;
                return 0;
            }
            cout << "Bitte geben Sie ein Wert f\x81r die " << s+1 << ". Amplitude ein: ";
            cin >> ampli[s];
            if ( ! cin.good() ) // Wenn Fehler in der Eingabe
            {
                cout << "Fehler bei der Eingabe. Programm wird beendet!!" << endl;
                return 0;
            }
    
        }
    
        cout << "\n";
    
        for (s = 0; s < welle; s++)
        {
            cout << s+1 << ". Frequenz betraegt: " << freqe[s] << endl;
            cout << s+1 << ". Amplitude betraegt: " << ampli[s] << "\n" << endl;
        }
    
    	double freqsum = 0;
        double freqmax = freqe[0];
        double freqmin = freqe[0];
        for(int i = 0; i < welle; i++)
        {
            if(freqe[i] > freqmax)
            {
                freqmax =  freqe[i];
            }
            else if(freqe[i] < freqmin)
            {
                freqmin =  freqe[i];
            }
    
    		freqsum = freqsum + freqe[i];
        }
    
        cout << "Max. Freq.: " << freqmax <<endl;
        cout << "Min. Freq.: " << freqmin <<endl;
        cout << "Summe aller Frequenzen: " << freqsum << "\n\n";
    
        double teiler1 = freqmin * 2;
    
        ofstream output;
        output.open("Ergebnis.txt",ios_base::trunc);  //Ergebnis in Textdatei speichern
    
        double r = 0;
        double welleSum = 0;
        double welle1;
        do
        {
            r = r + 1;
            for(int s = 0; s < welle; s++)
            {
                welle1 = ampli[s] * sin(PI * r * (freqe[s] / freqmin) /freqmax);
    
                // Addition drei wellen
                welleSum = welle1 + welleSum; //Summe von allen Kurven
                output << r << ";" << welle1 <<";" << welleSum << endl;
            }
        }
        while (r <= teiler1);
    
        output.close();
    
        cout<<"Datei im Zielverzeichnis ausgegeben: Ergebnis.txt";
    
        return 0;
    }
    

    lg



  • Ich weiß ehrlich gesagt nicht so genau, was du meinst. Bei mir scheint das alles zu funktionieren, wie es soll. Siehe hier:
    http://img413.imageshack.us/my.php?image=testcppew6.jpg



  • Nein, leider nicht.

    Siehe den jetztigen Programm, in dem ich 3 Wellen wähle:

    http://www.imgbox.de/?img=x30909j37.jpg

    Und so hätte es sein sollen:

    http://www.imgbox.de/?img=g23628s37.jpg

    Er zeigt die Werte nur für die erste Welle und die anderen lässt er aus, ausserdem zeigt er die welleSum auch falsch. Habe auch versucht beide Variablen (welle1, welleSum) in eine weitere Schleife einzubauen, aber es bleibt einfach gleich.
    Ich hoffe, dass es jetzt verständlich war. 🙂

    lg



  • Ich sag mal so: du solltest schon verstehen, was du da tust 🙂
    Dummerweise war mir gestern langweilig und ich wollte mal gucken wie man dein Programm aufräumen kann, aber so wirst du da nicht mehr viel verstehen 😕
    Also pass auf. Deine Schleife hier wird niemals das leisten, was du von ihr verlangst:

    do
        {
            r = r + 1;
            for(int s = 0; s < welle; s++)
            {
                welle1 = ampli[s] * sin(PI * r * (freqe[s] / freqmin) /freqmax);
    
                // Addition drei wellen
                welleSum = welle1 + welleSum; //Summe von allen Kurven
                output << r << ";" << welle1 <<";" << welleSum << endl;
            }
        }
        while (r <= teiler1);
    

    Denn du führst eine Addition aller Wellen durch, brichst bei jedem inneren Schleifendurchlauf die Zeile um und gibst pro Zeile auch nur eine Welle aus.
    Richtig müsste das so sein:

    do
    {
        ++r;
        output << r << ";";
        for(unsigned int s = 0; s < welle; ++s)
        {
            welle1 = ampli[s] * sin(PI * r * (freqe[s] / freqmin) /freqmax);
    
            // Addition drei wellen
            welleSum = welle1 + welleSum; //Summe von allen Kurven
            output << welle1 << ";";
        }
        output << welleSum << endl;
        welleSum = 0;
    }
    while (r <= teiler1);
    

    Zumindest bekomme ich damit die gleiche Ausgabe, wie auf deinem Screenshot. Ob das nun richtig ist, weiß ich natürlich nicht 😉



  • WOW, du bist ein Genie. Aber ich verstehe es nicht, wieso du am Ende wellenSum auf 0 gesetzt hast ??

    lg



  • Naja, das mit dem Genie weise ich mal von mir ... :p
    Nach dem Screenshot zu urteilen wurde am Ende immer nur die Summe aus einem Schritt aus allen Wellen gebildet. Ein Schritt bedeutet dabei der Durchlauf durch die äußere Schleife.
    Da wir mit dem op+= arbeiten, muss nach jedem Schritt welleSum wieder "zurückgesetzt" werden.
    Du könntest dir das auch so vorstellen:

    double welleSum[teiler1+1];
    for(unsigned int i = 0; i < teiler1+1; ++i)
        welleSum[i] = 0;
    
    do
    {
        ++r;
        output << r << ";";
        for(unsigned int s = 0; s < welle; ++s)
        {
            welle1 = ampli[s] * sin(PI * r * (freqe[s] / freqmin) /freqmax);
    
            // Addition drei wellen
            welleSum[r] = welle1 + welleSum[r]; //Summe von allen Kurven
            output << welle1 << ";";
        }
        output << welleSum[r] << endl;
    }
    while (r <= teiler1);
    

    Davon dass das erste Element des Arrays für die Katz' ist, reden wir hier mal nicht 🙂

    Da die Werte aber nicht weiter genutzt werden, ist dieses Array überflüssig und es reicht eine Variable, die immer wieder auf 0 gesetzt wird.



  • Ahh jetzt kappiere ich es wegen der Null. Darauf bin ich gar nicht gekommen, dass Werte jeder Zeile aller Wellen addiert werden. Danke nochmals für die Erklärung und Hilfe 🙂

    lg


Anmelden zum Antworten