Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Gauß Algorithmus Programmieren - Studium

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
22.12.2008, 15:03 Uhr
~JAY123
Gast


Hallo,
ich studier Maschinenbau im ersten Semester und bin mit Informatik total überfordert. Ist für jemanden der erst 5 Vorlesungen und 4 Seminare C++ hatte einfach nicht lösbar.

Unser Professor hat uns ein Rahmenprogramm vorgelegt. Was nach unserer Erweiterung ein Lineares Gleichungssystem mit dem Gauß-Algorithmus lösen soll.
Die Beschreibung und das Rahmenprogramm von unserem Professor findet ihr in der PDF.

Ich hoff es findet sich jemand. Da die Sache doch Recht anspruchsvoll ist.
Wichtig wäre das, dass Rahmenprogramm weitgehend unangetastet bleibt und nur an den von unserem Prof mit dem vielsagenden Wort "Aufgabe" markierten Stellen erweitert wird.

Bräuchte das Programm bis zum 5.1.2009.

Kontakt ist über ICQ 468062448 oder Skype "Hans Maulwurf" möglich.

Ciao Martin


C++:
// LGS.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include "stdafx.h"
#include <stdio.h>
#include <math.h>

/* Dieses Programm soll nur als Uebung dienen.
   Ein wesentliches Problem ist das anlegen von Speicher (new) ohne
   dass dieses wieder glöscht wird.
   Damit der Code aber einigermaßen übersichtlich bleibt und dennoch
   LGS variabler Größe gelöst werden können, wurden diese Mängel in Kauf genommen.
*/


int n;
/* Hier darf ausnahmsweise eine globale Variable stehen.
   In objektorientierter Programmierung kann (und solte) diese
   beseitigt werden */


struct vector {
    float *elems;
};
struct matrix {
    float **elems;
};
void MatEin(matrix &A){
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            printf("A[%d][%d] = ",i,j);
            scanf("%f",&A.elems[i][j]);
        }
}
vector InitVector(int n) {
    vector v;
    v.elems = new float[n];
    return v;
}
matrix InitMatrix(int n) {
    matrix m;
    m.elems = new float*[n];
    for (int i = n; i--; ) {
        m.elems[i] = new float[n];
    }
    return m;
}
void MatAus(const matrix A){
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            printf("%8.4f\t",A.elems[i][j]);
        printf("\n");
    }
    printf("\n");
}
void VecEin(vector &v){
    for (int i = 0; i < n; i++) {
        printf("b[%d] = ",i);
        scanf("%f",&v.elems[i]);
    }
}
void VecAus(const vector v){
    for (int i = 0; i < n; i++)
        printf("%8.4f\n",v.elems[i]);
}
void LGSAus(const matrix A, const vector b) {
    printf("\332");
    for (int i = 0; i < n; i++) printf("          ");
    printf("\277       \332          \277\n");
    for (int i = 0; i < n; i++) {
        printf("\263");
        for (int j = 0; j < n; j++)
            printf("%9.4f " ,A.elems[i][j]);
        if (i == (n/2))
            printf("\263 \372 x = \263%9.4f \263\n",b.elems[i]);
        else
            printf("\263       \263%9.4f \263\n",b.elems[i]);
    }
    printf("\300");
    for (int i = 0; i < n; i++) printf("          ");
    printf("\331       \300          \331\n");
}
int Pivot(const matrix A,int i, int j){
// liefert die Zeile des Pivt-Elements ab der i-ten Zeile in der j-ten Spalte
// Aufgabe
}
matrix P(int i, int j) {
// Permutationsmatrix welche die i-te und j-te Zeile vertauscht
    matrix H = InitMatrix(n);
    // Aufgabe
    return H;
}
matrix G(matrix A, int j) {
    matrix H = InitMatrix(n);
    //Aufgabe
    return H;
}
matrix L(matrix A, int j) {
    matrix H = InitMatrix(n);
    //Aufgabe
    return H;
}
// Überladene Operatoren
matrix operator*(const matrix A, const matrix B) {
    matrix C = InitMatrix(n);
    // Aufgabe
    return C;
}
vector operator*(const matrix A, const vector b) {
    vector c = InitVector(n);
    // Aufgabe
    return c;
}

int _tmain(int argc, _TCHAR* argv[])
{
    printf("Größe des Gleichungssystems > ");
    scanf("%d",&n);
    matrix A = InitMatrix(n), AProbe = InitMatrix(n);
    vector b = InitVector(n), bProbe = InitVector(n);
    MatEin(A);
    AProbe = A;
    VecEin(b);
    LGSAus(A,b);
    system("PAUSE");
    // Obere Dreicksmatrix
    for(int j = 0; j < n; j++) {
        int i = Pivot(A,j,j);
        A = P(j,i)*A;
        MatAus(P(j,i));
        MatAus(A);
        b = P(j,i)*b;
        b = G(A,j)*b;
        MatAus(G(A,j));
        A = G(A,j)*A;
        MatAus(A);    
        system("PAUSE");
    }
    // Diagonalisierung
    for(j = n; j--;) {
        b = L(A,j)*b;
        A = L(A,j)*A;
        MatAus(A);
        system("PAUSE");
    }
    LGSAus(A,b);
    printf("Jetzt noch die Probe A \372 x = \n");
    bProbe = AProbe*b;
    VecAus(bProbe);
    system("PAUSE");
    return 0;
}




 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.12.2008, 15:05 Uhr
~JAY123
Gast


Achso...sollt das natürlich nicht kostenlos machen. Mehr als 50 € kannsch leider zur Zeit nicht bieten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.12.2008, 15:12 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Soviel zu "C++"-Programm...

Wieder ein Prof der keinen Plan vom sch*** hat ...
Das ist C was der da schreibt, und das nich mal richtig.
Ich hasse so nen Mischmasch ... Grausam... Kannste deinem Prof gern mal vorbeischicken... So ein Mischmasch, ekelhaft...

Ansonsten, hast du da schon was reingeschrieben? Weil so ist das Rahmenprogramm der totale Nonsense. Die operatoren usw geben überhaupt keinen Sinn, die Funktionen ebenfalls nicht (z.b "P")

oder das tolle Kommentar am Anfang:


Zitat:

Ein wesentliches Problem ist das anlegen von Speicher (new) ohne
dass dieses wieder glöscht wird.
Damit der Code aber einigermaßen übersichtlich bleibt und dennoch
LGS variabler Größe gelöst werden können, wurden diese Mängel in Kauf genommen.


Da sieht man das der Prof selbst den Zweck von Objektorientiertem Programmieren net verstanden hat. Notfalls nimmt man halt dann Auto-Pointer oder so, aber naja ...

Am Besten du probierst es selbst: Aber lass das schwachsinnige Rahmenprogramm weg, und implementier es selbst von vorne und in Ruhe.
--
class God : public ChuckNorris { };

Dieser Post wurde am 22.12.2008 um 15:14 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.12.2008, 20:28 Uhr
0xdeadbeef
Gott
(Operator)


Schon peinlich, wenn ein Professor sowas vorlegt. Speicherlecks werden in Kauf genommen? Eine globale Variable ist ausnahmsweise erlaubt? C-I/O-Funktionen in C++-Code? So ein Schwachsinn. Und scheinbar hat er weder von Kon- noch Destruktoren, noch Methoden etwas gehört.

Wenn er euch auf die Art was beibringen will, erweist er euch einen Bärendienst - das wirst du dir später alles mühsam wieder abgewöhnen müssen.

@FloSoft: Ein Auto-Pointer bringt's in diesem Zusammenhang nicht, weil der Kram mit new[] angelegt wird. Boost könnte sowas haben, hier gehört das aber, denke ich, stumpf in Kon- und Destruktor:

C++:
#include <cstddef> // für size_t

struct matrix {
  float **elems;
  std::size_t dim;

  matrix(std::size_t n);
  ~matrix();
};

matrix::matrix(std::size_t n) : dim(n) {
  elems = new float*[dim];
  for(std::size_t i = 0; i < dim; ++i) {
    elems[i] = new float[dim];
  }
}

matrix::~matrix() {
  for(std::size_t i = 0; i < dim; ++i) {
    delete[] elems[i];
  }
  delete[] elems;
}

// ...

matrix m(3); // m ist eine 3x3-Matrix


Man könnte sich noch ein sinnvolleres Interface überlegen, dass die Rohdaten nicht aller Welt für alle Zwecke zugänglich macht, aber dafür habe ich grad nicht die Motivation.

Was die Funktionsnamen angeht, ich vermute, dass damit eigentlich L und R für eine LR-Zerlegung gemeint sind. P ist zwar üblicherweise die Sammlung aller Zeilenvertauschungen, die dafür vorgenommen werden, aber da klärt's ja wenigstens der Kommentar auf.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: