Zum Inhalt springen

Lag

Mitglieder
  • Gesamte Inhalte

    9
  • Benutzer seit

  • Letzter Besuch

  1. Die Lösung sollte duch das umbiegen von Zeigern erfolgen. Ich hab seit gestern abend nun auch eine funktionsfähige Lösung . Danke nochmal für die Hilfe hier im Board.
  2. void SortiereSenderListe(struct sender *s, struct sender **kopf) { struct sender *old, *act; act = *kopf; } Dies ist vorgegeben, den Rest darf ich frei wählen.
  3. Die Idee war, sich durch die Liste zu hangeln, bis die neue Frequenz größer ist als die jeweilige in der Liste. Dann von dem letzten kleineren Eintrag den Pointer auf den einzufügenden Sender zu setzen und von diesem wiederrum auf das nächste zu verweisen. Soweit die Theorie. Das Problem ist nur, dass ich nicht so wirklich weiß, wie das im C++ Code auszusehen hat. Logisch würde ich das so etwa machen. while ( voriger eintrag kleiner als neuer eintrag ) -> gehe Liste durch Wenn entsprechende Stelle gefunden: -> dann Pointer voriges Element auf neues -> Pointer neues Element auf nächstes Nur wie das im C++ Code aussehen muss und wie ich das in den aktuellen Code einfügen muss, versteh ich noch nicht.
  4. Danke. Das hat mir weitergeholfen. Ich bin dadurch nun in der Lage, den neuen Sender sortiert nach Frequenz am Anfang und am Ende einzufügen ( habs in verschiedenen Konstellationen ausgetestet und scheint bugfrei zu arbeiten ). Was mir noch nicht klar ist: Wie muss die Bedingung aussehen, wenn ich ihn in der Mitte eintragen will? Hier mein aktueller Code void SortiereSenderListe(struct sender *s, struct sender **kopf) { struct sender *old, *act; act = *kopf; if (*kopf == NULL ) { s->next = NULL; *kopf = s; printf("Liste leer\n"); return; } old = NULL; while(act) { if (act->frequenz > s->frequenz ) { s->next = *kopf; *kopf = s; return; } if (act->frequenz < s->frequenz ) { while (act->next != NULL) /* letztes Element suchen */ act = act->next; act->next = s; s->next = NULL; return; } } }
  5. Hmm ok das ist für den ersten Bereich, bei mir geht er jedoch nicht in die act-Schleife, diesen Fehler suche ich noch. Hat da jemand ne Idee? P.S: Bei mir im Compiler ist der Code eingerückt. Edit: Mist ich kann den Starteintrag nicht mehr editieren.
  6. Hallo allerseits, ich versuche aus einer Datei eine ungeordnete Liste an Radiosender auszulesen und diese zu sortieren. Ich habe mich dabei an den Programmiervorlagen des Dozenten orintiert, leider bekomme ich die Sortierfunktion noch nicht hin. Diese Sortierfunktion soll die Fälle: Leere Liste, Sender am Anfang / Mitte / Ende einfügen realisieren. Hier die relevanten Codeauszüge: Aufruf aus der Main-Datei while ( !feof(fp) ) { ReadSender(fp, &s); SortiereSenderListe(s, &kopf); printSenderListe(kopf); } Mein Sortierversuch void SortiereSenderListe(struct sender *s, struct sender **kopf) { struct sender *old, *act; act = *kopf; if (*kopf = NULL ) { s->next = NULL; *kopf = s; return; } old = NULL; while(act) { if (act->frequenz < s->frequenz ) { s->next = *kopf; *kopf = s; return; } if ( act->frequenz < s->frequenz ) { while (act->next != NULL) /* letztes Element suchen */ { act = act->next; act->next = s; s->next = NULL; return; } } } } In die while(act) - Schleife scheint er trotz gefüllter Datei gar nicht reinzugehen ( laut Debugger ). Kann mir jemand meinen Fehler sagen?
  7. Funzt nun. Vielen Dank
  8. In Mathe ist das kein Problem. Ich hab für nen voriges Projekt auch 2 3X3 Matrizen miteinander multipliziert. for (i=0; i<3; i++) { for (j=0; j<3; j++) { for (n=0; n<3; n++) { m[j]=m[j] + m1[n]*m2[n][j]; } } } Das funktioniert hier jedoch nicht, wieso genau bin ich nicht sicher. Meines Wissens stehen die Werte jedoch nicht in Zeilen sondern einfach alle am Stück im Speicher. Ich bekomms leider halt nicht hin.
  9. Hallo allerseits, ich hoffe sehr ihr könnt mir weiterhelfen, da ich selbst das Problem trotz mehrere Anläufe nicht in den Griff bekomme. Die Aufgabe: Ziel ist es zwei Matrizen ( aus den Dateien matrix1.dat und matrix2.dat ) auslesen und diese auszugeben. Anschließend sollen die beiden miteinander multipliziert werden und anschließend wieder ausgegeben werden. Das auslesen und ausgeben funktioniert, jedoch finde ich keine Lösung für das multiplizieren zweier beliebiger Matritzen. Ich hoffe da könnt ihr mir weiterhelfen. Es folgt der Code: ( Das in diesem Fall 3 3 am Anfang gibt Zeilen und Spaltenzahl der Matrix an, das Programm soll jedoch auch für beliebe Matrizen funktionieren ) Matrix1.dat 3 3 8 2 1 3 4 2 9 2 5 Matrix2.dat 3 3 3 0 0 0 3 0 0 0 3 Das Programm: #include <stdio.h> #include <stdlib.h> int ReadMatrix(char *datei, struct matrix *); void printMatrix(FILE *fp, struct matrix); int MultiplyMatrix(struct matrix, struct matrix, struct matrix *); double *allocate_matrix(int nrow, int ncol); struct matrix /** Definition der Struktur Matrix ****/ { int nrow; int ncol; double *mat; }; int main(void) { int ret; struct matrix matrix1, matrix2, matrix3; ret = ReadMatrix("matrix1.dat", &matrix1); // Matrix einlesen if (ret < 0) return(ret); else { printf("Matrix 1: \n"); printMatrix(stdout, matrix1); } ret = ReadMatrix("matrix2.dat", &matrix2); // Einlesen der 2. Matrix if (ret < 0) return(ret); else { printf("Matrix 2: \n"); printMatrix(stdout, matrix2); } ret = MultiplyMatrix(matrix1, matrix2, &matrix3); // Matrixmultiplikation // Ausgabe der Multiplikation if (ret == -1) printf("Dimensionierungsfehler bei Zeilen und Spalten! \n\n"); else if (ret == -2) printf("Kann Speicher nicht allokieren ! \n\n"); else { printf("Matrix der Multiplikation: \n"); printMatrix(stdout, matrix3); } free(matrix1.mat); // Freigeben von belegtem Speicherplatz free(matrix2.mat); free(matrix3.mat); return(0); } int ReadMatrix(char *datei, struct matrix *m) { FILE *fp; int row, col; if ( (fp = fopen( datei, "r" )) == NULL ) { printf("\n%s konnte nicht geoeffnet werden.\n", "matrix1.dat"); fclose(fp); } else { fprintf(stdout, "\nKein Fehler beim Oeffnen \n"); fscanf(fp, "%d %d", &m->nrow, &m->ncol); m->mat = allocate_matrix(m->nrow,m->ncol); int x=0,i,j; for(i=1;i<=m->nrow;i++) for(j=0;j<m->ncol;j++) fscanf(fp,"%d",&m->mat[x++]); } return(0); } void printMatrix(FILE *fp, struct matrix m){ int i=0,j=0,x=0; for (i=0; i<m.ncol; i++) for (j=0; j<m.nrow; j++) { fprintf(fp, "%d ", m.mat[x++]); if(!(x % m.ncol)) fprintf(fp, "\n"); } } int MultiplyMatrix(struct matrix m1, struct matrix m2, struct matrix *m) { // Hier fehlt mir der Code zum multiplizieren der Matrix return 0; } double *allocate_matrix(int nrow, int ncol) /* Allokieren von Speicherplatz für eine Matrix mit Komponenten vom Typ double */ { int i, j; double *m; /* Allokiere Zeiger auf Matrixelemente */ m=(double *) malloc(nrow*ncol*sizeof(double)); if (!m) return 0; // Initialisiere als Einheitsmatrix for(i=0; i<nrow; i++) for(j=0; j<ncol; j++) { if (i == j) m[i+nrow*j] = 1.0; else m[i+nrow*j] = 0.0; } /* Return Zeiger auf Feld von Zeigern zu Zeilen */ return m; } Fehlgeschlagene Entwürfe für MultiplyMatrix: if(m1.ncol != m2.ncol || m1.ncol != m2.ncol) return -1; if(!(m->mat = allocate_matrix(m1.nrow,m1.ncol))) return -2; m->ncol = m1.ncol; m->nrow = m1.nrow; int i=1,j=1,x=0; /* int tmat1[m1.nrow][m1.ncol]; int tmat2[m1.nrow][m1.ncol]; for(i=1;i<=m1.nrow;i++){ for(j=1;j<=m1.ncol;j++){ tmat1[i-1][j-1] =m1.mat[((i-1)*m1.nrow +j) -1]; tmat2[i-1][j-1] =m2.mat[((i-1)*m1.nrow +j) -1]; } } printf("\t\t m1.nrow: %i; m1.ncol: %i \n",m1.nrow,m1.ncol); */ const int ix = m1.nrow; int tmat[ix][ix];

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...