MAX und MIN Wert ermitteln
-
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.7356Die 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.
-
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?