MAX und MIN Wert ermitteln



  • Hallo Boardies!

    Ich versuche es schon seit ein paar Stunden eine Lösung zu finden, aber kommen nicht drauf, wie ich es lösen könnte Sad
    Bitte um Hilfe!!!

    Ich möchte die maximale und minimale Frequenz ermitteln. Besten Dank!

    #include "stdafx.h"
    #include "iostream"
    #include "cmath"
    #include "fstream"
    using namespace std;
    #include  "math.h"
    
    int main(int argc, char* argv[])
    {
            double ampl=0;                            //Variablen
            double freq=0;
            double welle=0;
            double freqmin;
            double freqmax;
            double teiler1;
            double periode;
            int i=0;
            int wellenanzahl = 0;
            const double PI = acos(0.0)*2;
    
            cout << "Wie viele Wellen möchten Sie haben?";
            cin >> wellenanzahl;
            i = wellenanzahl;
    
            while(wellenanzahl>0){
                    //system("cls");
                    wellenanzahl --;
    
                    cout << "Geben Sie die Werte für die " << wellenanzahl << ". Kurve ein:\n\n";
                    cout<<"Amplitude der " << i << ". Kurve: ";                                             //Eingabe
                    cin>>ampl;
                    cout<<"Frequenz der " << i <<". Kurve: ";
                    cin>>freq;
    
            }
    
            teiler1 = freqmin * 2;
            periode = (1/freqmin);
    
      //for(int i=0; i<3; i++)
    
            ofstream output;
            output.open("Ergebnis.txt",ios_base::trunc);                            //Ergebnis in Textdatei speichern
    
     /* do
      {
      i=i+1; // (periode/teiler1); alt !!
      welle1=ampl1*sin(PI*i*(freq/freqmax)/freq);
    
      // Addition drei wellen
            welleSum = welle1 + 1;                      //Summe von drei Kurven
            output<<i << ";"<< welle1<<";"<<welle2<<";"<<welle3<<";"<<welleSum<<endl;
      }
      while (i <= teiler1/1);
    
    */     
    
      output.close();
    
            cout<<"Datei im Zielverzeichnis ausgegeben: Ergebnis.txt"<<endl<<endl<<endl<<endl<<endl;
    
      return 0;
    
    }
    

    lg



  • Hallo !
    Möchtest du Fouriersynthese machen ?

    Du musst die Amplituden und die Frequenzen in einem Feld speichern und dann auf Minima- Maximawerte prüfen.

    In deiner Schleife wird freq und ampl bei jedem neuen Durlauf überschreiben.

    Gruß,
    p.



  • Hallo proggingmania!

    Ich weiß zwar nicht, was Fouriersynthese macht, aber was das Programm machen soll beschreibe ich nun hier:
    1. User darf die Anzahl der Sinuswellen wählen.
    2. Die Daten werden im Ergebnis.txt gespeichert.
    3. Ergebnis.txt wird im Excel geöffnet.
    4. Daten markieren und ein Diagramm zeichnen lassen.

    Für 3 Wellen habe ich schon eine Lösung:

    #include "stdafx.h"
    #include "iostream"
    #include "cmath"
    #include "fstream"
    using namespace std;
    #include  "math.h"
    
    int main(int argc, char* argv[])
    {
    	double ampl1=0;														//Variablen
    	double freq1=0;
    	double welle1=0;
    
    	double ampl2=0;
    	double freq2=0;
    	double welle2=0;
    
      // 3. frequenz
    
      double ampl3=0;
    	double freq3=0;
    	double welle3=0;
      //double atr; // atr Abtastrate
    
      //double minf;
      //double min;
      double freqmin;
      //double max;
      int i=0;
    
    	double zaehler1=1;
    	double teiler1;
    
      //double schrittweite;  // Schrittweite von T (Periode)
      double periode;       // Periode T
    
    	double freqMulti=0;
    	double welleSum=0;
    	const double PI = acos(0.0)*2;
    
     do{
      system("cls");
      cout << "Gib die Werte für die Frequenzen nach der größten Frequenz: \n\n";
    	cout<<"---------Kurve mit der größten Frequenz--------"<<endl;
    	cout<<"Amplitude der 1. Kurve: ";									//Eingabe
    	cin>>ampl1;
    	cout<<"Frequenz der 1. Kurve: ";
    	cin>>freq1;
    	cout<<"---------Kurve mit der zweitgrößten Frequenz--"<<endl;
    	cout<<"Amplitude der 2. Kurve: ";
    	cin>>ampl2;
    	cout<<"Frequenz der 2. Kurve: ";
    	cin>>freq2;
    
      // 3. Frequenz
      cout<<"----------Kurve mit der kleinsten Frequenz----"<<endl;
    	cout<<"Amplitude der 3. Kurve: ";
    	cin>>ampl3;
    	cout<<"Frequenz der 3. Kurve: ";
    	cin>>freq3;
    
     }while(freq1 <= freq2 || freq2 <= freq3 || freq1 < freq3);
      // Maximum frequenz
      //maxf(freq1,freq2,freq3,max);
      teiler1 = freq1 * 2;
    
     /*cout << "\n\nSortiere Frequenzen";
    
     if (freq1 >= freq2)
     if (freq2 >= freq3)
    
     {
     cout << "\nfreq1 = " << freq1 ;
     cout << "\nfreq2 = " << freq2 ;
     cout << "\nfreq3 = " << freq3 ;
     }
    
     else 
     {
     cout << "\nFrequenzen falsch herum eingegeben";
     cout << "\nBitte geben sie zu erst die GROESSTE Frequenz ein, dann die zweit\n";
     cout << "kleinste und die kleinste Frequenz eingeben";
     }*/
    
      // Minimum frequenz
      //minf(freq1,freq2,freq3,min);
      freqmin = freq3;
      // cout <<"Stop";
    
      // T rechnen (Periode)
      // T = 1/f
      periode = (1/freqmin);
    
      //for(int i=0; i<3; i++)
    
    	ofstream output;
    	output.open("Ergebnis.txt",ios_base::trunc);							//Ergebnis in Textdatei speichern
    
      // freqMulti = 1;   //Frequenz multi ist gleich 1
      // freqMulti=freq2/freq1;												//Frequenz Multiplikator
      // for (int i=0; i<=teiler1; i=i+(periode/teiler1))
    
      // Neuer Teil !!!
      do 
      {
      i=i+1; // (periode/teiler1); alt !!
      welle1=ampl1*sin(PI*i*(freq1/freq3)/freq1);
      welle2=ampl2*sin(PI*i*(freq2/freq3)/freq1);
      welle3=ampl3*sin(PI*i*(freq3/freq3)/freq1);
    
      //welle2=ampl2*sin(2*PI*freq2*(freq1/(freq1*freq3)));
      //welle3=ampl3*sin(2*PI*freq3*(freq1/(freq1*freq3)));
    
      // Addition drei wellen 
    	welleSum=welle1+welle2+welle3;											//Summe von drei Kurven
    	output<<i << ";"<< welle1<<";"<<welle2<<";"<<welle3<<";"<<welleSum<<endl;
      }
      while (i <= teiler1/1);
    
      /*for(int i=0; i<teiler1; i++)
    	{
    		zaehler1=i;
    		if (freqMulti>1.0)												//Wenn Multiplikator größer als 1 dann..												
    		{
    		welle1=ampl1*sin(2*PI*zaehler1/teiler1);						//Formel wenn erste Frequenz größer 
    		welle2=ampl2*sin(2*PI*zaehler1*freqMulti/teiler1);
    		}
    		else															//oder..
    		{
    		welle1=ampl1*sin(2*PI*zaehler1/freqMulti/teiler1);				//Formel wenn erste Freuquenz kleiner
    		welle2=ampl2*sin(2*PI*zaehler1/teiler1);
    		}
    
        // Addition drei wellen 
    		welleSum=welle1+welle2+welle3;											//Summe von drei Kurven
    		output<<welle1<<";"<<welle2<<";"<<welle 3<<";"<<welleSum<<endl;
    	}
    	*/
    
      output.close();
    
    	cout<<"Datei im Zielverzeichnis ausgegeben: Ergebnis.txt"<<endl<<endl<<endl<<endl<<endl;
    
      return 0;
    
    }
    

    lg



  • Hallo Composer!

    Fouriersynthese bastelt dir aus vielen Sinus- und Cosinusfunktionen eine neue Funktion.

    Speicher doch die Werte erst in ein Struktur-Array, bevor du mit den Werten weiter rechnest.

    Du könntest dir auch eine eigene Klasse, z.B. class Welle programmieren, je nach Lust, Zeit
    und Laune und so und je nachdem wie umfangreich das Programm werden soll.

    Wenn du in Sachen Programmierung noch nicht so die Erfahrung hast, dann würde ich dir empfehlen,
    erstmal kleine Versuche in C zu starten, bevor du mit C++ beginnst, in diesem Fall wäre doch vorerst
    eine Struktur angebracht.
    Du könnest natürlich auch, was auch viele machen, C und C++ kombinieren. Das hat auch seine Vor-
    und Nachteile.

    Ich schreib dir mal ein Beispiel, wie du die Werte in ein Struktur-Array schreiben kannst,
    um mit denen weiter arbeiten zu können.

    #include <iostream>
    using namespace std;
    
    struct Welle
    {
    	double frequenz;
    	double amplitude;
    };
    
    void main()
    {
    // Definition und Initialisierung
    	struct Welle welle		= {0,0};
    // Zeiger für dynamische Reservierung von Arbeitsspeicher
    	struct Welle* p_welle	= NULL;
    	int n = 0, i = 0;
    	double freq=0, ampl=0;
    
    	cout << "Wie viele Wellen moechten Sie haben ? ";
        cin >> n;
    
    	if ( ! cin.good() ) // Wenn Fehler in der Eingabe
    	{ 
    			cout << "Fehler in der Eingabe." << endl;
    			return;
    	}
    
    	p_welle = (struct Welle*) malloc( n * sizeof( Welle ) );
    
    	if ( !p_welle ) // Wenn kein Arbeitsspeicher reserviert werden konnte.
    	{
    		puts("Out of memory!"); return;
    	}
    
    	for ( i = 0; i<n; i++ ) // Eingabe
    	{
    		cout << endl << "Geben Sie die Werte fuer die " << i+1 << ". Kurve ein:\n\n";
    
    		cout<<"Amplitude der " << i+1<< ". Kurve: ";  
    		cin >>  p_welle[i].amplitude;
    
    		if ( ! cin.good() ) // Wenn Fehler in der Eingabe
    		{ 
    			cout << "Fehler in der Eingabe." << endl;
    			free( p_welle ); // Speicher freigeben
    			return;
    		}
    
    		cout<<"Frequenz der " << i+1 <<". Kurve: ";
    		cin >> p_welle[i].frequenz;
    
    		if ( ! cin.good() ) // Wenn Fehler in der Eingabe
    		{	
    			cout << "Fehler in der Eingabe." << endl;
    			free( p_welle ); // Speicher freigeben
    			return;
    		}
    
    	}  // Eingabe
    
    	// Kontrollausgabe der Eingabe.
    	cout << endl << endl << "Eingegebene Werte: " << endl;
    	for ( i = 0; i<n; i++ )
    	{
    		printf("Welle %i Amplitude %.3f Frequenz %.3f\n", 
    				i+1, p_welle[i].amplitude, p_welle[i].frequenz );
    	}
    
    	for ( i = 0; i<n; i++ )
    	{
    		// Mach was mit den Wellen.
    	}
    
    	// Speicher freigeben
    	free( p_welle );
    }
    

    Für das Sortieren kann man dann auch noch eine kleine Funktion extra schreiben.
    Zum Speichern weiss ich nicht, wie soll das Format der Ergebnis.txt Datei aussehen ?

    Gruß,
    p.



  • Hallo!

    Danke erstmals für die Antworten. 🙂 Ich möchte nicht von C++ auf C umsteigen, da wir auch in die Schule alles mit C++ machen. Mit Klassen habe ich mich noch nicht beschäftigt, aber ich werde es versuchen irgendwie das Beispiel durchzubringen.

    So sieht dann Ergebnis.txt aus:

    1;15.6434;11.7537;7.84591;35.2431
    2;30.9017;23.3445;15.6434;69.8897
    3;45.399;34.6117;23.3445;103.355
    4;58.7785;45.399;30.9017;135.079
    5;70.7107;55.557;38.2683;164.536
    6;80.9017;64.9448;45.399;191.246
    7;89.1007;73.4323;52.2499;214.783
    8;95.1057;80.9017;58.7785;234.786
    9;98.7688;87.2496;64.9448;250.963
    10;100;92.388;70.7107;263.099
    11;98.7688;96.2455;76.0406;271.055
    12;95.1057;98.7688;80.9017;274.776
    13;89.1007;99.9229;85.264;274.288
    14;80.9017;99.6917;89.1007;269.694
    15;70.7107;98.0785;92.388;261.177
    16;58.7785;95.1057;95.1057;248.99
    17;45.399;90.8143;97.237;233.45
    18;30.9017;85.264;98.7688;214.935
    19;15.6434;78.5317;99.6917;193.867
    20;1.22461e-014;70.7107;100;170.711
    21;-15.6434;61.9094;99.6917;145.958
    22;-30.9017;52.2499;98.7688;120.117
    23;-45.399;41.866;97.237;93.7039
    24;-58.7785;30.9017;95.1057;67.2288
    25;-70.7107;19.509;92.388;41.1863
    26;-80.9017;7.84591;89.1007;16.0449
    27;-89.1007;-3.92598;85.264;-7.76262
    28;-95.1057;-15.6434;80.9017;-29.8474
    29;-98.7688;-27.144;76.0406;-49.8723
    30;-100;-38.2683;70.7107;-67.5577
    31;-98.7688;-48.8621;64.9448;-82.6862
    32;-95.1057;-58.7785;58.7785;-95.1057
    33;-89.1007;-67.8801;52.2499;-104.731
    34;-80.9017;-76.0406;45.399;-111.543
    35;-70.7107;-83.147;38.2683;-115.589
    36;-58.7785;-89.1007;30.9017;-116.977
    37;-45.399;-93.8191;23.3445;-115.874
    38;-30.9017;-97.237;15.6434;-112.495
    39;-15.6434;-99.3068;7.84591;-107.104
    40;-2.44921e-014;-100;1.22461e-014;-100
    41;15.6434;-99.3068;-7.84591;-91.5093
    42;30.9017;-97.237;-15.6434;-81.9787
    43;45.399;-93.8191;-23.3445;-71.7646
    44;58.7785;-89.1007;-30.9017;-61.2238
    45;70.7107;-83.147;-38.2683;-50.7046
    46;80.9017;-76.0406;-45.399;-40.5379
    47;89.1007;-67.8801;-52.2499;-31.0293
    48;95.1057;-58.7785;-58.7785;-22.4514
    49;98.7688;-48.8621;-64.9448;-15.0381
    50;100;-38.2683;-70.7107;-8.97902
    51;98.7688;-27.144;-76.0406;-4.41581
    52;95.1057;-15.6434;-80.9017;-1.43949
    53;89.1007;-3.92598;-85.264;-0.0893456
    54;80.9017;7.84591;-89.1007;-0.353043
    55;70.7107;19.509;-92.388;-2.16824
    56;58.7785;30.9017;-95.1057;-5.42543
    57;45.399;41.866;-97.237;-9.97197
    58;30.9017;52.2499;-98.7688;-15.6173
    59;15.6434;61.9094;-99.6917;-22.1389
    60;3.67382e-014;70.7107;-100;-29.2893
    61;-15.6434;78.5317;-99.6917;-36.8035
    62;-30.9017;85.264;-98.7688;-44.4065
    63;-45.399;90.8143;-97.237;-51.8217
    64;-58.7785;95.1057;-95.1057;-58.7785
    65;-70.7107;98.0785;-92.388;-65.0201
    66;-80.9017;99.6917;-89.1007;-70.3106
    67;-89.1007;99.9229;-85.264;-74.4418
    68;-95.1057;98.7688;-80.9017;-77.2385
    69;-98.7688;96.2455;-76.0406;-78.5639
    70;-100;92.388;-70.7107;-78.3227
    71;-98.7688;87.2496;-64.9448;-76.464
    72;-95.1057;80.9017;-58.7785;-72.9825
    73;-89.1007;73.4323;-52.2499;-67.9183
    74;-80.9017;64.9448;-45.399;-61.3559
    75;-70.7107;55.557;-38.2683;-53.422
    76;-58.7785;45.399;-30.9017;-44.2812
    77;-45.399;34.6117;-23.3445;-34.1319
    78;-30.9017;23.3445;-15.6434;-23.2006
    79;-15.6434;11.7537;-7.84591;-11.7356
    80;-4.89843e-014;3.67382e-014;-2.44921e-014;-3.67382e-014
    81;15.6434;-11.7537;7.84591;11.7356
    

    Die werte werden im Excel geöffnet und Punkt zu Beistrich bzw. umgekehrt eingestellt. Danach zeichnet man das Diagramm.

    lg



  • Hi,

    wenn du mit meinem obigen Beispiel etwas anfangen kannst und deine Werte berechnet hast, dann ist das Speichern auch nicht mehr so wild.

    Gruß,
    p.



  • Naja ich verstehe den Code gar nicht ganz 😞
    Mit Klassen und Zeigern hatte ich bisher noch nie was zu tun gehabt. Bin halt noch ein Noob :(. Hast du vielleicht eine ICQ Nummer ?
    Ich weiss es, dass ich mit deinem Code was anfangen kann, aber es macht kein Sinn wenn ich mich bei den Klassen nicht auskenne. Vielleicht will unser Professor, dass wir ohne Zeigern und Klassen das Programm programmieren.

    Na gut, ich vertschüsse mich jetzt ins Bett 🙂

    Gute Nacht



  • Ja, ok, dann horch erstmal deinen Prof ab was er sich so vorstellt, eine ICQ Nummer habe ich nicht.

    Gute Nacht,
    p.



  • Hi,

    habe einen Schulkollegen angerufen und er meinte, dass es ok wäre wenn ich auch mit Klassen und Zeigern weiterarbeiten würde.

    #include "stdafx.h"
    #include "iostream"
    #include "cmath"
    #include "fstream"
    #include  "math.h"
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    	double freqmin;
    	double freqmax;
    	double teiler1;
    	double periode;
    	double welle1;
    	double welleSum;
    	double freqe[50000];
    	double ampli[50000];
     	double r;
    	int welle;
    	int s;
    	const double PI = acos(0.0)*2;
    
    	cout << "Wie viele Wellen möchten Sie haben?";
    	cin >> welle;
    
    	if ( ! cin.good() ) // Wenn Fehler in der Eingabe 
        { 
                cout << "Fehler bei der Eingabe. Programm wird beendet!!" << endl;
    			return 0;
        } 
    
    	for (s = 0; s < welle; s++)
    	{
    		cout << "frequenz eingeben: ";
    		cin >> freqe[s];
    		if ( ! cin.good() ) // Wenn Fehler in der Eingabe 
    		{ 
                cout << "Fehler bei der Eingabe. Programm wird beendet!!" << endl;
    			return 0;
    		} 
    		cout << "amplitude eingeben: ";
    		cin >> ampli[s];
    		if ( ! cin.good() ) // Wenn Fehler in der Eingabe 
    		{ 
                cout << "Fehler bei der Eingabe. Programm wird beendet!!" << endl;
    			return 0;
    		} 		
    	}
    
    	for (s = 0; s < welle; s++)
    	{
    		cout << s+1 << ". Frequenz betraegt: " << freqe[s] << endl;
    		cout << s+1 << ". Amplitzde betraegt: " << ampli[s] << endl;	
    	}
    
    	for(int i = 0; i < welle; i++)
    	{
    	  if(freqmin < freqe[i])
    	  {
    		  freqmin =  freqe[i];
    	  }
    	  if (freqmin >  freqe[i])
    	  {
    		  freqmax =  freqe[i];
    	  }
    	}
    
    	cout << "Max. Freq.: " << freqmax <<endl;
    	cout << "Min. Freq.: " << freqmin <<endl;
    
    	//freqmin = 20;
    	//freqmax = 100;
    
    	teiler1 = freqmin * 2;
    	periode = (1/freqmin);
    
      	ofstream output;
    	output.open("Ergebnis.txt",ios_base::trunc);							//Ergebnis in Textdatei speichern
    
      do 
      {
      r=r+1;
      for(s = 0; s < welle; s++)
      {
    	  welle1=ampli[s]*sin(PI*r*(freqe[s]/freqmin)/freqmax);
      }
    	// Addition drei wellen 
    	welleSum = welle1 + 1;											//Summe von drei Kurven
    	output<<r << ";"<< welle1<<";" <<welleSum <<endl;
      }
      while (r <= teiler1/1);
    
      output.close();
    
    	cout<<"Datei im Zielverzeichnis ausgegeben: Ergebnis.txt"<<endl<<endl<<endl<<endl<<endl;
    
    return 0;
    }
    

    EDIT:

    Habe es jetzt bisschen verändert und nun zeigt er die Werte von freqmin und freqmax falsch. Danach erstellt er eine riesige Datei, wahrscheinlich eine Unendliche und das Programm bleibt offen.

    lg Composer



  • Yuhoooo, habe nun Minimal- und Maximalwerte ermitteln können, aber hänge noch immer und zwar beim Schreiben der Datei. Kann mir vielleicht jemand helfen ? Oder gibts es auf dem ganzen Board wirklich nur ein einziger Profi-Programmierer, der momentan nicht Online ist. 😞

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

    lg



  • Composer schrieb:

    #include "stdafx.h"
    #include "iostream"
    #include "cmath"
    #include "fstream"
    #include  "math.h"
    

    Zwei Dinge:

    - "math.h" ist überflüssig, wenn Du schon "cmath" hast.
    - So sollte der die Dateien gar nicht finden. Standardheader werden nicht in Anführungszeichen sondern in "<...>" angegeben, weil sie sich in einem Standard-Suchpfad für Include-Dateien befinden. Also: "iostream" wird zu <iostream> etc. (bis auf "stdafx.h" natürlich, das ist ja nicht im Standard-Suchpfad sondern im gleichen Verzeichnis wie die main.cpp).



  • Hi,
    du hast eine Endlosschleife gebastelt.
    Man sollte Variabeln grundsätzlich vor ihrem Einsatz initialisieren, also mit Startwerten belegen.

    Schreibe in deiner Deklaration double r=0;

    Gruß,
    p.



  • @ Konrad Rudolph: Ist für mich ziemlich neu.

    @ proggingmania: Du hattest recht. Jetzt erzeugt er keine Schleife mehr.
    Komischerweise speichert er die Werte nur für 2 Wellen, obwohl es in die for Schleife ist (for(s = 0; s < welle; s++)).
    Ausserdem habe ich es bemerkt, dass er die Werte für die Summen aller Frequenzen falsch ausgibt, obwohl der Befehl stimmt.

    Besten Dank euch beiden 🙂

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

    lg Composer



  • Ja, so ist das beim Programmieren, das Programm tut nicht das was man denkt, sondern was man eintippt.

    Stichwort: Debugger.
    Zeilenweise Quellcode debuggen und Zwischenwerte kontrollieren, schlage ich vor.

    Gruß, p.



  • Konrad Rudolph schrieb:

    [...]
    - So sollte der die Dateien gar nicht finden.
    [...]

    Doch, finden wird er sie. Die doppelten Anführungszeichen sorgen doch dafür, dass der Compiler sowohl im Aktuellen Verzeichnis, als auch in den Standard-Include-Verzeichnissen sucht 😉 .



  • proggingmania schrieb:

    Ja, so ist das beim Programmieren, das Programm tut nicht das was man denkt, sondern was man eintippt.

    Stichwort: Debugger.
    Zeilenweise Quellcode debuggen und Zwischenwerte kontrollieren, schlage ich vor.

    Gruß, p.

    Genau das wollte ich schon die ganze Zeit machen, aber ich verstehe es nicht wie man das genauer macht. Vom VBA weiß ich noch, dass man es mit F8 alles kontrollieren kann. Könntest du mir vielleicht dasd verraten wie das hier gehen würde ?

    lg



  • Da hat wohl jeder Compiler seine eigene Taste, der VC hat die F10 usw...
    kommt wohl drauf an, welchen du benutzst.



  • Composer schrieb:

    Ausserdem habe ich es bemerkt, dass er die Werte für die Summen aller Frequenzen falsch ausgibt, obwohl der Befehl stimmt.

    int main(int argc, char* argv[])
    {
    	double freqsum;
    
    	for (s = 0; s < welle; s++)
    	{
    		freqsum = freqsum + freqe[s];
    	}
    }
    

    Fällt dir was auf? 😉 Gleicher Fehler wie oben schon.

    Zu der ersten Frage: wenn du also als Anzahl der Wellen eine Zahl größer 1 eingibst, kommt trotzdem nur eine Anfrage für Frequenzen?



  • Hallo Leute!

    @ proggingmania: Also ich benutze Visual Studio C++ 6.0.

    @ viande: D.h. ich muss auch noch freqsum auf 0 setzen ? Ich dachte es wäre egal, weil sowieso die Summen aller Frequenzen angenommen wird.
    Meinst du nun bei der Auswahl, dass der User mehr als eine Welle auswählt.
    Also für ihn ist es uninteressant, ob ich nun 4, 5 oder noch mehr Wellen wähle.
    Er gibt mir nur die Werte für 2 Wellen. Für die erste Welle stimmt noch halbwegs, aber die zweite kann man eh vergessen. Die liegen im unendlich negativen Bereich.

    Hier folgt die Ausgabe der Werte, die in eine for-Schleife liegt.

    output<<r << ";"<< welle1<<";" <<welleSum <<endl;

    Normalerweise sollte er automatisch so schreiben:

    output<<r << ";"<< welle1<<";" << welle2<<";" << welle3<<";" << welleUSW...<<";" <<welleSum <<endl;

    lg



  • Gewöhn dir mal an, Variablen dort zu deklarieren, wo du sie brauchst und außerdem sie ordnungsgemäß zu initialisieren.
    Bei mir funktioniert das soweit. Ach und noch was: du missbrauchst std::endl ja geradezu 😉

    #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 in 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 fuer 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 fuer 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 (int s = 0; s < welle; s++)
        {
            cout << s+1 << ". Frequenz betraegt: " << freqe[s] << endl;
            cout << s+1 << ". Amplitude betraegt: " << ampli[s] << "\n" << endl;
        }
    
        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];
            }
        }
    
        double freqsum = 0;
        for (int s = 0; s < welle; s++)
        {
            freqsum = freqsum + freqe[s];
        }
    
        cout << "Max. Freq.: " << freqmax <<endl;
        cout << "Min. Freq.: " << freqmin <<endl;
        cout << "Summe aller Frequenzen: " << freqsum << "\n\n";
    
        double teiler1 = freqmin * 2;
        double periode = (1/freqmin); //ungenutzt?
    
        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 drei Kurven
                output << r << ";" << welle1 <<";" << welleSum << endl;
            }
        }
        while (r <= teiler1/1); //division durch 1?
    
        output.close();
    
        cout<<"Datei im Zielverzeichnis ausgegeben: Ergebnis.txt";
    
        return 0;
    }
    

    Edit: Eine Sache noch: falls du sie schon kennengelernt haben solltest, nimm Vektoren für die Frequenzen, dann musst du nicht auf gut Glück irgendwelche wilden Arraygrenzen definieren, die du nichtmal überprüfst.


Anmelden zum Antworten