Brauche Hilfe zu diesem Programm..



  • Aufgabe 3.2 20 Punkte
    Die Daten (Grad und Koeffizienten) eines reellen Polynoms p(x) = a0 + a1x + a2x
    2 + . . . + anx
    n vom Grad
    n ≥ 0 (d.h. an 6= 0) seien in einer zweizeiligen Datei mit dem Namen “p.txt“ wie folgt abgespeichert:
    n
    a0 a1 a2 . . . an
    (erste Zeile: ganzzahliger Grad ≥ 0, zweite Zeile: (n + 1) reelle Koeffizienten,
    jeweils durch ein Leerzeichen getrennt).
    Ein zweites Polynom q(x) = b0 + b1x + b2x
    2 + . . . + bmx
    m vom Grad m ≥ 0 (d.h. bm 6= 0) sei analog in der
    Datei “q.txt“ gespeichert.
    Das Produkt r(x) = p(x)· q(x) = c0 + c1x + c2x
    2 + . . . cn+mx
    n+m der beiden Polynome p(x) und q(x) ist ein
    Polynom vom Grad n + m, dessen Koeffizienten c0, c1, . . . , cn+m sich wie folgt aus den Koeffizienten von
    p(x) und q(x) berechnen lassen:
    k = 0, 1, 2, . . . ,(n + m)
    ck = 0
    i = 0, 1, 2, . . . , n
    j = 0, 1, 2, . . . , m
    ci+j = ci+j + ai
    · bj
    Schreiben Sie ein C++–Programm, welches die Daten der Polynome p(x) und q(x) aus den beiden Dateien
    “p.txt“ und “q.txt“ liest, das Polynomprodukt r(x) = p(x)· q(x) berechnet und das Ergebnis (im oben
    beschriebenen Format) in eine Datei “r.txt“ schreibt.

    a.) Im C++–Programm konnen Polynome in einer ganzzahligen Variablen f ¨ ur den Grad und einem ¨
    double–Feld fur die Koeffizienten abgespeichert werden. ¨
    b.) Da der Grad der Polynome im Voraus nicht feststeht, mussen die Felder f ¨ ur die Koeffizienten ¨ dynamisch allokiert (und auch wieder freigegeben) werden.
    c.) Es brauchen keine Fehlerabfragen programmiert zu werden (d.h. es kann davon ausgegangen werden,
    dass das Offnen der Dateien klappt, die Inhalte der Eingabedateien k ¨ orrekt sind und die Lesevorgange ¨
    funktionieren sowie die dynamischen Speicheranforderungen erfullt werden k ¨ onnen).

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main(void)
    {	ifstream pol1("p.txt");
    	int n;
    	pol1 >> n;								//Grad von p
    	double *a = new double[n+1];				//Koeffizienten von p
    	for (int i = 0; i <= n; ++i)
    	{	pol1 >> a[i];
    	}
    	
    	ifstream pol2("q.txt");
    	int m;
    	pol2 >> m;								//Grad von q
    	double *b = new double[m+1];			//Koeffizienten von q
    	for (int i = 0; i<= m; ++i)
    	{	pol2 >> b[i];
    	}
    	
    	int k = n+m;							//Grad des Produktes
    	double *c = new double[k+1];
    	{	c[1] = 0.0;
    	}
    	for (int i = 0; i <= n; i++)
    	{	for (int j = 0; j <= m; j++)
    		{	c[i+j] += a[i] * b[j];
    		}
    	}
    	
    	ofstream erg("r.txt");
    	erg << k << endl;
    	for ( int i = 0; i <= k; ++i)
    	{	erg << c[i] << " ";
    	}
    	erg << endl;
    	
    	delete[] a;
    	delete[] b;
    	delete[] c;
    	
    	return 0;
    }
    

    kann mir einer erklären, was mein prof da gemacht hat?
    z.b. mit dem pol1 >> n;
    ich verstehe es einfach nicht



  • >> und << sind die (mittels Operatorüberladung) bereitgestellten Ein- und Ausgabeoperatoren für Streams, s.a. Input/output with files sowie Basic Input/Output.

    In deinem Code werden damit also die Koeffizienten aus einer Datei gelesen bzw. die berechneten Werte in eine Datei geschrieben.



  • @Th69
    Kennst du dich Sehr gut aus?
    Wenn ja hätte ich da noch ein paar Fragen, ich komme nämlich aktuell echt nicht weiter



  • @Minato15 Stelle konkrete Fragen Es wird sich kaum jemand hinsetzen und dir den Code Zeichen für Zeichen erklären.

    Schreibe bitte ``` in eine Zeile vor und in eine Zeile nach Deinem Code. Alternativ markiere Deinen Code und klicke auf das </> in der Symbolleiste über dem Eingabefenster.

    Du kannst Deinen beitrag mit dem Code auch noch im Nachhinein bearbeiten. Den Menüpunkt "Bearbeiten" findest Du hinter dem Drei-Punkte-Menü rechts unter Deinem Beitrag.



  • was heißt das hier?
    double *a = new double[n+1]



  • @Minato15 Das heißt "definiere die Variable a als pointer to double und initialisiere sie mit dem Ergebnis von new[]". new double[n + 1] reserviert Platz für n + 1 doubles im Freispeicher (free-store, umgangssprachlich: heap) und das Ergebnis davon ist ein Pointer zum Beginn des Speicherbereichs für diese n + 1 doubles.

    Siehe new expression.

    Aber so macht man das eigentlich nicht sondern nimmt einen std::vector<double>. Der kümmert sich selbst um das besorgen und wieder freigeben von Speicher.

    Siehe std::vector.



  • @Th69 und in dem Fall musste ich ja die Sachen alle in die Datei schreiben und nichts in den Programm



  • @Minato15 keine Ahnung was Dein letzter Post bedeuten soll.



  • ich meine damit dass ich es in die mit ifstream geöffnete datei p.txt und q.txt schreibe und nicht in den programm selber also exe datei



  • @Minato15 sagte in Brauche Hilfe zu diesem Programm..:

    und nicht in den programm selber also exe datei

    ja, was soll das bedeuten? Ich wette Du hättest nichmal einen Plan wie Du dort überhaupt reinschreiben solltest, ganz davon abgesehen, daß die Executable während ihrer Ausführung sowieso von allen gängigen Betriebssystemen gelockt ist und dahin schreiben garnicht geht. Geht es Doch, würde man es trotzdem mit file streams machen.

    Was anderes: Habt ihr in eurem Kurs kein Lehrbuch!?


  • Gesperrt

    Dieser Beitrag wurde gelöscht!


  • es war einfach c&p. ich weiß nicht warum es nur ein teil ist.



  • @titan99_ sagte in Brauche Hilfe zu diesem Programm..:

    @Minato15 Kannst Du mal erklären weshalb man nur einen Teil mit Code-Tags versieht?

    Hat er nicht. War indented (der Teil vom Code der jetzt dargestellt wird als wäre er in ```). Alles was indented ist erkennt das Forum als Code.

    @Minato15 sagte in Brauche Hilfe zu diesem Programm..:

    es war einfach c&p. ich weiß nicht warum es nur ein teil ist.

    Ich hab' Dir oben gesagt was Du tun sollst.



  • okay hab es gemacht



  • @Minato15 brav.

    @Swordfish sagte in Brauche Hilfe zu diesem Programm..:

    Was anderes: Habt ihr in eurem Kurs kein Lehrbuch!?


  • Gesperrt

    @Swordfish sagte in Brauche Hilfe zu diesem Programm..:

    Hat er nicht. War indented (der Teil vom Code der jetzt dargestellt wird als wäre er in ```). Alles was indented ist erkennt das Forum als Code.

    Ah, habe ich nicht gewusst. Dann wäre diese Frage beantwortet.



  • wir haben jetzt kein lehrbuch davon bekommen.
    also ich habe mir jetzt ein buch ausgeliehen von c++, aber es ist halt wirklich das allgemeine zeug. ich finde nicht wirklich was ich brauche. zudem muss ich sagen, dass ich kein normal Informationstechnik habe sondern eher speziell für maschinenbau, wenn ich ihr versteht was ich meine.



  • @Minato15 sagte in Brauche Hilfe zu diesem Programm..:

    wir haben jetzt kein lehrbuch davon bekommen.

    Dann besorg' Dir eins. Der C++-Programmierer.



  • @Minato15 sagte in Brauche Hilfe zu diesem Programm..:

    ifstream pol1("p.txt");
    int n;
    pol1 >> n; //Grad von p
    double *a = new double[n+1]; //Koeffizienten von p
    for (int i = 0; i <= n; ++i)
    { pol1 >> a[i];
    }

    ifstream öffnet die datei, dass weiß ich. aber was ist pol1? benennt es die datei?


  • Gesperrt

    @Minato15 pol1 ist ein Objekt der Klasse ifstream. Man könnte auch

    ifstream pol1;
    pol1.open("p.txt");
    

    schreiben, das würde das gleiche bewirken.



  • Ich denke du versuchst dich hier gerade dran etwas zu verstehen, wovon die lieber erstmal noch die Finger lassen solltest, bis du weit genug bist.

    ifstream(std::ifstream) ist eine Klasse. pol1 ist ein Objekt der Klasse ifstream. Danach kommt der Konstruktor von ifstream, bei welchem hier die Datei angegeben wird (als const char*). Eigentlich nichts ungewöhnliches.
    Das ist ähnlich wie wenn du bei

    int a;
    

    sagst: "int verstehe ich, aber was ist a?" Es ist einfach nur der Name.


Anmelden zum Antworten