Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Übertragung von C++source in C-source

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 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] > 8 < [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ] [ 17 ] [ 18 ] [ 19 ] [ 20 ]
070
05.01.2004, 13:12 Uhr
Lumina



ok, soweit geht alles. soll ich alles hochladen auf den Webspace von meiner HP??
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
071
05.01.2004, 13:13 Uhr
Lumina



Denn wie du ja wahrscheinlich gesehen hast, will ich auch noch die Lösung eines linearen Gleichungssystems implementieren...
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
072
05.01.2004, 13:17 Uhr
Pablo
Supertux
(Operator)


Und gibt es keine Fehler jetzt oder bekommst du immer noch Mist?

Lösung eines Lineares Gleichungssystem ist nicht schwer, vor allem, weil es Linear ist. Du kannst im Prinzip alles wieder in eine Matrix packen und darus eine obere Dreiecksmatrix machen, es gibt bestimmt Algorithmen, die das tun (ich hab selber keinen gemacht). Und das System soll auuch beliebige Anzahl von Variablen haben?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 05.01.2004 um 13:19 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
073
05.01.2004, 13:22 Uhr
Lumina



ja, eigentlich schon...
aber ich versuch mein Glück jetzt noch mal auf die eigene Faust...

aber so schnell werdet ihr mich nicht los!
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
074
05.01.2004, 13:24 Uhr
Pablo
Supertux
(Operator)


und welche Probleme gibt es noch?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
075
05.01.2004, 14:38 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


so ich hab das mal ein wenig verbessert das man nicht immer gleich nen anfall bekommt wenn man eine matrix ständig neu eingeben muss....

das mit der dummen rumallokierererei sieht ein bisschen "sch**se" aus weil du das nicht so machen wolltest wie beefy vorgeschlagen hat (das mit dem struct).... In c gibt es keine Referenzen und die können einem das leben manchmal doch stark vereinfachen....

wenn du schon meine Matrixinvertierlösung kopierst solltest du auch die aktuellste version nehmen und nicht die die buggy war....

C++:
#include "Fkt_Sammlung.h"

int main(){
char wahl=9; //oder was auch immer nur nicht 8
int Rang=3;
double *matrix;
matrix = (double*)malloc (Rang*Rang*sizeof(double));
matrix[0]=-1;matrix[1]=-2;matrix[2]=0;matrix[3]=-2;matrix[4]=3;matrix[5]=-3;matrix[6]=0;matrix[7]=3;matrix[8]=3;//defaultmatrix

while(wahl!='8'){

    system("cls");
    printf("\n Waehlen Sie aus den folgenden Alternativenn"
           "        *********************************************************\n"
           "        *                                                       *\n"
           "        *  1) Matrix eingeben                                  *\n"
           "        *  2) Matrixinvertierung                               *\n"
           "        *  3) Determinantenberechnung                          *\n"
           "        *  4) Loesung eines linearen Gleichungssystems         *\n"
           "        *  5) Aktuelle Matrix ausgeben                         *\n"
           "        *  6) Aktuelle Matrix speichern                        *\n"
           "        *  7) Aktuelle Matrix einlesen                         *\n"
           "        *  8) Abbruch                                          *\n"
           "        *                                                       *\n"
           "        *********************************************************\n\n");


    printf("Ihre Wahl? : ");
    scanf("%c",&wahl);
  
        switch(wahl){
            case '1':  EingabeDerMatrix(&matrix,&Rang);break;
          
            case '2':
                printf(" Matrix wird invertiert....");
                if (Det(matrix,Rang) != 0) MatrInv(matrix, Rang);
                else printf("Determinante ist gleich Null. Matrix kann nicht invertiert werden");
                break;
            
            case '3':  /* Determinantenberechnung */
             printf("\n Die Determinante der Matrix ist: %f", Det(matrix,Rang));
             getch();
             break;
            
            case '4':  /* Loesung eines linearen Gleichungssystems */
             printf(" \"Loesung eines linearen Gleichungssystems\" gewaehlt\n\n");
             LoesLinGS();  
             break;
            
            case '5':    Matrix_ausgeben(matrix,Rang);break;
            case '6':   Matrix_speichern("test.txt",matrix,Rang);break;
            case '7':   Matrix_einlesen("test.txt",&matrix,&Rang);break;
            case '8':  printf(" Abbruch!\n\n");break;
            default: printf("Fehlerhafte Auswahl!\n");  
        } /* Ende des SWITCH */
    }
     free(matrix);
    return 0;
}




C++:
# include <stdio.h>
# include <conio.h>
# include <stdlib.h>
# include <malloc.h>
# include <string.h>

void EingabeDerMatrix(double**mat, int*Rang);
double Det(double *matrix, int Rang);
void MatrInv(double *m, int Rang);
void Matrix_ausgeben(double *m,int Rang);
void Matrix_einlesen(const char* filename,double**m,int*Rang);
void Matrix_speichern(const char* filename,double* m,int Rang);

void LoesLinGS();




C++:
  /*  STUDIENARBEIT TEIL 2 IN SOFTWARE-SYSTEMTECHNIK, WS 2003/2004 */
  /*  Autor:    Sonja Birner        */
  /*  Mat.-Nr.: 025001830122  01ST1 */

# include "Fkt_Sammlung.h"

  /****************************************************************/
  /* Funktion: EingabeDerMatrix                                   */
  /* Zweck:    Eingabe einer Matrix zur späteren Bearbeitung      */
  /*                                                              */
  /****************************************************************/

void EingabeDerMatrix(double**m, int*Rang){
    int i,j;
    printf("Matrix eingeben gewaehlt\n\nBitte Geben sie die Dimension der Matrix an: ");            
    scanf("%d", Rang);
          
    free(*m);
    *m=(double*)malloc((*Rang)*(*Rang)*sizeof(double));

    for (j=0;j<*Rang;++j)
        for (i=0;i<*Rang;++i){
            printf("%d. Zeile, %d. Spalte: ", i+1, j+1);
            scanf("%lf",(*m+i+j*(*Rang)) );
        }
}

  /****************************************************************/
  /* Funktion: Det                                                */
  /* Zweck:    Berechnung der Determinante einer Matrix           */
  /*                                                              */
  /****************************************************************/

double Det(double *matrix, int Rang)
{
    double *h;
    double r = matrix[0] * matrix[3] - matrix[1] * matrix[2];
    int i, j, k, x = Rang-1, b = 1;
        if(Rang-2)
        {
            r = 0;
            for(i = -1; ++i<Rang; b = -b)
            {
                h = (double*)malloc(x*x*sizeof(double));
                for(j = 0; j<x; j++)
                    for(k=0;k<x;k++)
                        h[k+j * Rang-j] = matrix[(k<i?0:1) + Rang + k + j*Rang];
                r+= b * matrix[ i ] * Det(h,x);
                free(h);
            }
        }
    return r;
}

/****************************************************************/
  /* Funktion: MatrInv                                            */
  /* Zweck:    Bildung der Inversen einer Matrix                  */
  /*                                                              */
  /****************************************************************/

void MatrInv(double*m,int n){
int i,j,k;
double h,*mat;
mat = (double*)malloc (n*n*sizeof(double));
    
    for(j=0;j<n;j++)for(i=0;i<n;i++)mat[i+j*n]=i!=j?0:1;

    for(j=0;j<n;j++){
        if(!m[j*n+j])
            for(k=j+1;k<n;++k)
                if(m[k*n+j]){
                    for(i=0;i<n;++i){
                        h=m[j*n+i];m[j*n+i]=m[k*n+i];m[k*n+i]=h;
                        h=mat[j*n+i];mat[j*n+i]=mat[k*n+i];mat[k*n+i]=h;
                    }
                    break;
                }
        h=m[j*n+j];
        for(k=0;k<n;k++){m[k+j*n]/=h;mat[k+j*n]/=h;}
        for(i=0;i<n;i++)
            if(i!=j && m[i*n+j]!=0){
                h=-m[i*n+j];
                for(k=0;k<n;k++){m[k+i*n]+=h*m[k+j*n];mat[k+i*n]+=h*mat[k+j*n];}  
            }

    }
    memcpy(m,mat,n*n*sizeof(double));
    free(mat);
}


/****************************************************************/
  /* Funktion: LoesLinGS                                          */
  /* Zweck:    Loesung eines linearen Gleichungssystems           */
  /*                                                              */
  /****************************************************************/

void LoesLinGS()
{
    printf(" Lineares Gleichungssystem loesen!");
    getch();
}

void Matrix_ausgeben(double *m,int Rang){
    int i,j;
    for(j = 0; j<Rang; j++){
        for(i = 0; i<Rang; i++)
            printf("%0.2f\t", m[i+j*Rang]);
        printf("\n");
    }
    printf("<ENTER>");
    getch();
}

void Matrix_einlesen(const char* filename,double**m,int*Rang){
    int j,i;
    FILE *fp;
    if(!(fp=fopen(filename,"r")))printf("Fehler beim lesen der Datei\n");
    else{
        fscanf(fp,"%d",Rang);
        free(*m);
        *m=(double*)malloc((*Rang)*(*Rang)*sizeof(double));
        for(j=0;j<(*Rang);++j)
            for(i=0;i<(*Rang);++i)
            fscanf(fp,"%lf",(*m+i+j*(*Rang)) );
        fclose(fp);
        printf("Neue Matrix wurde eingelesen....");
        printf("<ENTER>");
        getch();
    }
}


void Matrix_speichern(const char* filename,double* m,int Rang){
    int j,i;
    FILE *fp;
    if(!(fp=fopen(filename,"w")))printf("Fehler beim schreiben der Datei\n");
    else{
        fprintf(fp,"%d\t",Rang);
        for(j=0;j<Rang;j++)
            for(i=0;i<Rang;i++)
                fprintf(fp,"%f\t",m[i+j*Rang]);
    fclose(fp);
    printf("Matrix wurde gespeichert....");
    printf("<ENTER>");
    getch();
    }
}




vermutlich wäre es auch schlauer zum invertieren dies hier zu nehmen....


C++:
bool matrix_inv(double*m,int n){
int i,j,k;
double h,*mat=new double[n*n];
    
    //Array mit Werten einer Einheitsmatrix erzeugen
    for(j=0;j<n;j++)for(i=0;i<n;i++)mat[i+j*n]=i!=j?0:1;

    //für jede Zeile der Matrix
    for(j=0;j<n;j++){
        k=0;
        if(!m[j*n+j])    //wenn das zu normierende element 0 ist zeilentausch
            for(k=j+1;k<n;++k)    //für jede zeile nach der jten
                if(m[k*n+j]){    //wenn element ungleich 0 gefunden zeilen tauschen und schleife abbrechen
                    for(i=0;i<n;++i){
                        h=m[j*n+i];m[j*n+i]=m[k*n+i];m[k*n+i]=h;
                        h=mat[j*n+i];mat[j*n+i]=mat[k*n+i];mat[k*n+i]=h;
                    }
                    break;
                }
    if(k==n){delete [] mat; return false;}

                    
        h=m[j*n+j];//wert des zu normierenden elements
        for(k=0;k<n;k++){m[k+j*n]/=h;mat[k+j*n]/=h;}//die komplette zeile normieren
        for(i=0;i<n;i++)// gauss über die matrix jagen
            if(i!=j && m[i*n+j]!=0){
                h=-m[i*n+j];
                for(k=0;k<n;k++){m[k+i*n]+=h*m[k+j*n];mat[k+i*n]+=h*mat[k+j*n];}  
            }

    }
    memcpy(m,mat,n*n*sizeof(double));//invertierte matrix in übergebenen speicher schreiben
    delete [] mat;
return true;
}



--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
076
05.01.2004, 14:56 Uhr
Pablo
Supertux
(Operator)


Ich jetzt zu faul, um selber zu denken wie sieht deine Standardmatrix aus?
Darf ich fragen wozu, wenn man sowieso eine neue Matrix eingegeben wird oder um das umzugehen?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
077
05.01.2004, 15:06 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Pablo
wie was wo
ich versteh gerade nciht was du wissen willst....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
078
05.01.2004, 15:15 Uhr
Pablo
Supertux
(Operator)


Wie deine Standard Matrix ausshieht, jetzt hab ich sie selber gerechnet

-1 -2 0
-2 3 -3
0 3 3

Naja, das ist was ich wissen wollte ist jetzt auch nicht wichtig, finde schon ne tolle Idee mit EingabeDerMatrix

Nur eine Anmerkung: es wäre besser wenn man nach malloc nach NULL Pointern überprüft.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
079
05.01.2004, 15:19 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Nur eine Anmerkung: es wäre besser wenn man nach malloc nach NULL Pointern überprüft.


Im allgemeinen geb ich dir ja recht...
aber bei dem prototypen werden ja sowieso kaum fehler abgefangen da kommt es auf die Nullpointer bei malloc die wahrscheinlich nie auftreten werden auch nicht mehr an....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] > 8 < [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ] [ 17 ] [ 18 ] [ 19 ] [ 20 ]     [ 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: