Array mit double-Wertebereich füllen


  • Mod

    Du hast zwar das (scheinbar) richtige Ergebnis, aber deine Vorgehensweise wird in Zukunft keinen Erfolg haben. Kompliziertere Probleme kann man nur durch verstehen lösen, nicht indem man zufällige Faktoren +1/-1 im Code verteilt, bis das Ergebnis für einen Testfall passt.

    Auch hier passt deine Lösung schon nicht, denn du berechnest ja gar nicht DIM Werte, sondern DIM-1 Werte. Dein Programm gibt derzeit 99 Wertepaare aus. Probier mal N=3, oder gar N=2 oder N=1.

    Probier mal, den Algorithmus an einfachen Beispielen zu formulieren, etwa 1 Wert, 2 Werte, 3 Werte, bis 5. Und statt 0 bis 2 Pi nimm 0 bis 1 als Wertebereich. Da solltest du in der Lage sein, die Lösungen im Kopf (oder auf Papier, sehr nützliches Hilfsmittel) zu formulieren und kannst so das Muster dahinter verstehen.

    PS: Mir fällt dabei übrigens auf, dass die Aufgabe unterdefiniert ist. Man hat die Freiheit, einen beliebigen Abstand zu den Intervallgrenzen zu wählen. Naheliegend wäre natürlich 0 auf beiden Seiten (geht aber im Fall DIM=1 nicht) oder der gleiche Abstand wie zwischen den berechneten Punkten (dann geht es auch konsistent mit DIM=1), aber prinzipiell könnte man den beliebig wählen und trotzdem die Anforderung erfüllen. Es steht ja schließlich nirgends, dass x_min und x_max selber Teil der Wertemenge sein müssen. Wenn man den Lehrer ärgern will, wählt man als linken Abstand 0 und als rechten Abstand 2*Pi und man gibt dann DIM Male 0 aus. Die haben dann alle gleichmäßigen Abstand, nämlich auch 0.



  • @Th69 wegen dieser differenz die quiche lorraine wenn ich das nicht mache und es ausgebe kommt als letzer wert eine ungeheure große zahl raus wenn ich die nur bis n-1 laufen lasse dann hab ich das problem nicht also die Differenz x[i+1]-x[i]



  • @SeppJ wenn ich das mit kleinen zahlen mache von 0-1 und das dann durch x_delta jagen würde hätte ich ja als Ergebnis 0.1 für n=10 und wen nicht bei x_delta halt nicht -1 mache dann fehlt mir der Wert 1 am ende... wenn ich <=N mache in der schleife habe ich einen Pufferbereichsfehler. also geht das ja auch nicht wenn ich i=1 einsetze damit er mit dem ersten Wert anfängt statt 0 fehlt mir immer noch der letzte Wert und zwar die 1. sobald ich nämlich ein <=N in die schleife reinhaue ist es verloren, aber ich bekomme ja sonst nie den Wert1 als ausgabe



  • Dieser Beitrag wurde gelöscht!


  • @SeppJ

    #include <cmath>
    #include <iostream>
    #include <iomanip>
    
    #define _USE_MATH_DEFINES
    #include <math.h>
    
    using namespace std;
    
    int main() {
    	
    	const int N = 100;
    	double x[N] = {};
    	double y[N] = {};
    	double x_min = 0;
    	double x_max = 2*M_PI;
    	double x_delta = (x_max - x_min) / N;
    
    	for (int i = 0; i < N; i++) {
    		x[i] = x_min + x_delta + i * x_delta;
    		y[i] = (sin((x[i])) * sin((x[i])));
    
    		cout << fixed;
    		cout << setprecision(2);
    		cout << i;
    		cout << " Xwerte: " << x[i] << endl;
    		cout << "Ywerte: " << y[i] << endl;
    		//cout << "test: " << x[i + 1] - x[i]<< endl; <= hierfuer immernoch keine Lösung
    		
    	}
    
    
    }
    

    hatte es jetzt wie du sagst oft mit den kleinen Werten probiert jetzt hab ich alle ergebnisse ich habe ein x_delta noch addiert in der schleife. Jetzt sollte es aber stimmen, oder?



  • @Ricky sagte in Array mit double-Wertebereich füllen:

    for (int i = 0; i < N; i++) {
    x[i] = x_min + x_delta + i * x_delta;

    Jetzt sollte es aber stimmen, oder?

    Nein. Du fängst ja nicht bei x_min an, sondern bei x_min + x_delta.

    Auch das hier:

    double x_delta = (x_max - x_min) / N;

    Ob das wohl richtig ist? Angenommen du hast N=2. Also zwei Punkte, bei denen du das berechnen willst. Dann solltest du bei x_min und bei x_max einen Punkt haben, würde ich denken (ok, ist unterdefiniert, aber das wäre meine Annahne). Ob da dann nicht vielleicht ein -1 fehlt?

    Wie @SeppJ sagte: spiel dir das für kleine Zahlen selbst durch und überlege, was rauskommen soll.



  • @wob wenn ich doch n- 1 rechne dann berechne ich doch nicht mehr N sondern nur noch /99 statt 100, dass ist doch das was @SeppJ meinte, oder nicht? aber selbst mit dem -1 habe ich es versucht, es klappt nicht. ich weiß einfach wirklich nicht mehr weiter Leute, ich habe es mit kleinen Zahlen probiert... von 0-1 und nur 10 zahlen dann kommt als Ergebnis 0.1 raus schön und gut, aber trotzdem kriege ich den Maximalwert nicht raus wenn ich den minimalwert noch einbeziehen möchte, egal wie ich es mache, aber ist ja auch logisch da ich ja nicht bis zum N in der schleife gehe, sondern nur kleiner N bleibe, aber sobald ich da ein = mache kriege ich Bereichsüberschreitung. also in der schleife habe ich es probiert for(int i = 0; i<=N;i++) funktioniert nicht for(int i = 1 ; <= N ;i++) funktioniert nicht. ich habe jetzt wirklich viel probiert, aber ich komme nicht auf die Lösung. Egal was ich mache ich kriege entweder den minimalenwert, oder den max. wert raus. Jedesmal wenn ich denke jetzt müsste es logisch sein, wieder was anderes... ich habe mit der Aufgabe am Samstag angefangen. Das ist für mich sehr demotivierend wenn ich weiß das ich nichtmal die ersten zwei Aufgaben hinbekomme.



  • @Ricky Wenn du einen 10 m langen Zaun aufstellen sollst und die Pfosten 1 m Abstand haben. Wieviel Pfosten brauchst du?

    Wenn du nur 6 Pfosten hast, wie lang ist dann der Abstand?



  • @Ricky: Ich habe mal deinen Code genommen und entsprechend angepaßt: Ideone-Code - funktioniert und läuft von 0.00 bis 6.28.



  • @Ricky sagte in Array mit double-Wertebereich füllen:

    0-1 und nur 10 zahlen dann kommt als Ergebnis 0.1 raus

    nö:
    min = 0
    max = 1
    anzahl = 10
    abstand = (max - min) / (anzahl - 1) != 0.1



  • @Ricky sagte in Array mit double-Wertebereich füllen:

    #include <cmath>
    #include <iostream>
    #include <iomanip>
    
    #define _USE_MATH_DEFINES
    #include <math.h>
    
    using namespace std;
    
    int main() {
    	
    	const int N = 100;
    	double x[N] = {};
    	double y[N] = {};
    	double x_min = 0;
    	double x_max = 2;
    	double x_ges = (x_max - x_min) / N;
    
    	for (int i = 0; i < N; i++) {
    		x[i] = x_min + i * x_ges * M_PI;
    
    		y[i] = (sin((x[i])) * sin((x[i])));
    		cout << fixed;
    		cout << setprecision(2);
    		cout << "Xwerte: " << x[i] << endl;
    		cout << "Ywerte: " << y[i] << endl;
    		
    	}
    
    
    }
    

    @Th69 Also hatte hier nur das -1 an der stelle gefehlt... Danke dir auf jeden Fall.
    @DirkB kommt drauf an der Zaun brauch ja noch an den Enden jeweils Pfosten also insgesamt 11 bei 0m-1er Pfosten bei 1m - 2er Pfosten, bei 2m- 3er Pfosten usw. bis zur zehn und zehn hat auch einen Pfosten also 10m - 11er Pfosten

    auf alle Fälle vielen Dank für die zahlreichen Antworten... ich bin euch sehr dankbar... ich werde euch allen in diesem Forum aber bestimmt noch des Öfteren auf die nerven gehen... der Studiengang ist noch lang...



  • Dieser Beitrag wurde gelöscht!

  • Mod

    Verschieb noch das M_PI aus Zeile 20 in die Zeile 16. Sonst musst du deine Obergrenzen immer in Einheiten von Pi angeben, was recht unpraktisch klingt.

    Ansonsten bin ich nicht sicher, ob das wirklich das ist, was du möchtest. Ich habe zwar oben erklärt, wie du technisch gesehen die Seitenabstände wählen kannst, wie du möchtest. Und das tust du auch, und es erfüllt technisch gesehen die Aufgabe. Aber du hast eine recht komische Wahl getroffen, und ich habe den Verdacht, dass du das nicht bewusst durch Verständnis des Problems getan hast, sondern weil du einfach nur herumprobiert hast. Ob das so im Sinne des Aufgabenstellers ist?

    Angenommen x_min wäre 1, x_max wäre 4, und N wäre auch 4. Du sollst also 4 Werte zwischen 1 und 4 erzeugen mit gleichem Abstand. Die meisten Leute würden hier doch intuitiv 1, 2 ,3, 4 antworten. Andere nach längerem Nachdenken vielleicht 1.6, 2.2, 2.8, 3.4 (alles hat Abstand 0.6, und der Abstand zum Rand ist auch 0.6). Du sagst aber 1, 1.75, 2.5, 3.25. Technisch gesehen richtig, aber eine interessante Wahl.

    Wenn dein Prof nun sagt, "Entschuldigung, so habe ich die Aufgabe nicht gemeint, können Sie das schnell ändern zu 1,2,3,4 (oder 1.6, 2.2, 2.8, 3.4)?", kannst du das dann? Ich habe das Gefühl, du könntest es nicht, und ich empfehle dir dringend, das Problem so zu durchdringen, bis du es kannst. An solch einfachen Problemen zu üben ist wichtig, weil es dir die Bausteine gibt, um später komplexe Probleme zu lösen, und dich lehrt, gängige Fehler zu vermeiden.



  • @SeppJ sagte in Array mit double-Wertebereich füllen:

    Andere nach längerem Nachdenken vielleicht 1.6, 2.2, 2.8, 4.4

    3.4 am Ende?


  • Mod

    @wob sagte in Array mit double-Wertebereich füllen:

    @SeppJ sagte in Array mit double-Wertebereich füllen:

    Andere nach längerem Nachdenken vielleicht 1.6, 2.2, 2.8, 4.4

    3.4 am Ende?

    Ups, Tippfehler. Korrigiert. Danke!