Hallo,
hab gerade begonnen C zu lernen und auch schon das erste Problem:Ich habe zwei Integers x und y
x = visited[number_of_nodes - 2];
y = visited[number_of_nodes - 1];
Bei visited[number_of_nodes - 2] kommt zum Beispiel 2 heraus und bei visited[number_of_nodes - 1] der Integer 5.
Als Ergebnis will ich die Verbindung 2, 5 haben.
Hab strncat() gefunden. Weiss aber nicht, wie ich das hier anwenden soll.
Ich hoffe ihr versteht meine Frage. Weiss nicht genau wie ich mein Problem beschreiben. Bin dankbar für jeden Hinweis.:)
lg
lilly
integer zusammenfügen
-
-
Das geht mit sprintf. Ein einfaches Beispiel sieht so aus:
C
Alles anzeigen#include <stdio.h> #include <stdlib.h> #define MAX_STRING_SIZE 20 int main(int argc, char **arvv) { int a=5; int b=6; char *dest=(char *)malloc(sizeof(char)*MAX_STRING_SIZE); (void)snprintf(dest,MAX_STRING_SIZE,"%i, %i",a,b); printf("%s\n",dest); return 0; }
Ein wenig zur Erklärung:
- MAX_STRING_SIZE gibt an, wie viele Zeichen die Zeichenkette, die erzeugt werden soll, maximal haben darf.
- In der Zeile mit malloc wird Speicher für die Zeichenkette, in welche die Ausgabe erfolgen soll, reserviert. Und zwar genauso viele Zeichen, wie MAX_STRING_SIZE es angibt.
- In der Zeile mit snprintf wird in dest eine Ausgabe geschrieben, und zwar maximal MAX_STRING_SIZE Zeichen. Weiters steht ein Formatargument "%i, %i", das angibt, wie die Ausgabe, die in dest geschrieben wird, aussehen soll. Statt %i werden ints eingesetzt, und zwar jene, die durch die weiteren Argumente angegeben werden, hier sind das a und b.
- Schließlich geben wir in der Zeile mit printf das Ergebnis aus.
Ich hoffe, das hilft ein wenig.
-
Hallo Paulchen,
danke für deine schnelle Antwort.
Ich will die Zeichenkette nicht auf dem Bildschirm ausgeben, sondern an die main Fumktion übergeben.
Mein Vektor visited besteht aus n Zeichen. Ich durchlaufe eine Schleife. zu Beginn der Schleife sind die Werte für visited noch
visited[0] = 0;
visited[1] = 1;
.
.
.
visited[n] = n;
Beim nächsten Durchlauf erhalte ich für visited[h] = x; und für visited[k] = y;
Ich will jetzt den Vektor so verändern, dass auf visited[h] vor dem nächsten Schleifendurchlauf visited[h] = x,y steht.
Das ganze brauche ich unter anderem zur Berechnung eines minimalen Schnittes.
Nach n maligem Durchlauf der Schleife übergebe ich den Wert visited[h] an die main Funktion.
Hab auch schon alles bis auf diese "Zusammenlegung".
Daaanke! -
Hm, irgendwie check ich nicht, was du machen willst. Du hast n Integer n[t]1[/t], n[t]2[/t], ... n[t]n[/t], und die willst du durch Kommata getrennt in einem String aneinander hängen und als Returnwert zurückliefern?
Also du hast zum Beispiel die Werte 1, 5, 6, 3, 2 und willst als Ergebnis die Zeichenkette "1, 5, 6, 3, 2" haben?
-
Ich will jetzt den Vektor so verändern, dass auf visited[h] vor dem nächsten Schleifendurchlauf visited[h] = x,y steht.
Du kannst in einer Zelle des Arrays immer nur einen Wert speichern, nicht zwei. -
Wie wärs mit einer zweidimensionalen Liste? Ständig zwischen Zahl und String herumkonvertieren wär etwas umständlich.
-
Erstmal danke für eure Antworten !!
Hatte bis jetzt keine Zeit mich mit dem Programm weiter zu beschäftigen.
Das mit der zweidimensionalen Liste klingt ganz gut. Ist damit die doppelt verkettete Liste gemeint.
Ich weiss aber nicht wie ich das machen soll.
Hier mein Programm bis jetzt:Code
Alles anzeigen[size=10][COLOR=#0000ff]#include[/COLOR][/SIZE][size=10][COLOR=#800000]<stdio.h>[/COLOR][/SIZE] [size=10][COLOR=#0000ff]#include[/COLOR][/SIZE][size=10][COLOR=#800000]<stdlib.h>[/COLOR][/SIZE] [size=10][COLOR=#0000ff]#include[/COLOR][/SIZE][size=10][COLOR=#800000]<conio.h>[/COLOR][/SIZE] [size=10][COLOR=#0000ff]float[/COLOR][/SIZE][size=10] **weight;[/SIZE] [size=10][COLOR=#0000ff]struct[/COLOR][/SIZE][size=10] result {[/SIZE] [size=10][COLOR=#0000ff]int[/COLOR][/SIZE][size=10] actmincut;[/SIZE] [size=10][COLOR=#0000ff]float[/COLOR][/SIZE][size=10] cut_weight;[/SIZE] [size=10]}[/SIZE] [size=10]main(){ [/SIZE] [size=10][COLOR=#0000ff]int[/COLOR][/SIZE][size=10] number_of_nodes, number_of_kanten;[/SIZE] [size=10][COLOR=#0000ff]int[/COLOR][/SIZE][size=10] u, l, i, j, h, node1, node2;[/SIZE] [size=10][COLOR=#0000ff]float[/COLOR][/SIZE][size=10] gew;[/SIZE] [size=10][COLOR=#0000ff]int[/COLOR][/SIZE][size=10] mincut;[/SIZE] [size=10][COLOR=#0000ff]float[/COLOR][/SIZE][size=10] mincut_weight;[/SIZE] [size=10][COLOR=#0000ff]struct[/COLOR][/SIZE][size=10] result ergebnis;[/SIZE] [size=10][COLOR=#0000ff]struct[/COLOR][/SIZE][size=10] result acmincut();[/SIZE] [size=10]FILE *daten;[/SIZE] [size=10]daten = fopen([/SIZE][size=10][COLOR=#800000]"Daten.txt"[/COLOR][/SIZE][size=10], [/SIZE][size=10][COLOR=#800000]"r"[/COLOR][/SIZE][size=10]);[/SIZE] [size=10][COLOR=#0000ff]if[/COLOR][/SIZE][size=10] (daten == NULL)[/SIZE] [size=10]fprintf(stderr, [/SIZE][size=10][COLOR=#800000]"Kann Datei nicht oeffnen\n"[/COLOR][/SIZE][size=10]);[/SIZE] [size=10][COLOR=#0000ff]else[/COLOR][/SIZE] [size=10]fscanf(daten, [/SIZE][size=10][COLOR=#800000]"%i %i"[/COLOR][/SIZE][size=10],&number_of_nodes, &number_of_kanten);[/SIZE] [size=10][COLOR=#008000]/*mincut = (int*)malloc(number_of_nodes*sizeof(int));*/[/COLOR][/SIZE] [size=10]weight = ([/SIZE][size=10][COLOR=#0000ff]float[/COLOR][/SIZE][size=10]**)malloc(number_of_nodes*[/SIZE][size=10][COLOR=#0000ff]sizeof[/COLOR][/SIZE][size=10]([/SIZE][size=10][COLOR=#0000ff]float[/COLOR][/SIZE][size=10]*));[/SIZE] [size=10][COLOR=#0000ff]for[/COLOR][/SIZE][size=10] (l = 0; l < number_of_nodes; l++){[/SIZE] [size=10]weight[l] = ([/SIZE][size=10][COLOR=#0000ff]float[/COLOR][/SIZE][size=10]*)malloc(number_of_nodes*[/SIZE][size=10][COLOR=#0000ff]sizeof[/COLOR][/SIZE][size=10]([/SIZE][size=10][COLOR=#0000ff]float[/COLOR][/SIZE][size=10]));[/SIZE] [size=10]}[/SIZE] [size=10][COLOR=#0000ff]for[/COLOR][/SIZE][size=10] (i = 0; i < number_of_nodes; i++){ [/SIZE][size=10][COLOR=#008000]/*setze Gewichtsmatrix auf null*/[/COLOR][/SIZE] [size=10][COLOR=#0000ff]for[/COLOR][/SIZE][size=10] (j = 0; j < number_of_nodes; j++){[/SIZE] [size=10]weight[i][j] = 0.0;[/SIZE] [size=10]}[/SIZE] [size=10]}[/SIZE] [size=10][COLOR=#0000ff]for[/COLOR][/SIZE][size=10] (h = 0; h < number_of_kanten; h++){ [/SIZE][size=10][COLOR=#008000]/*Gewicht einlesen*/[/COLOR][/SIZE] [size=10]fscanf(daten, [/SIZE][size=10][COLOR=#800000]"%d %d %f"[/COLOR][/SIZE][size=10], &node1, &node2, &gew);[/SIZE] [size=10]weight[node2][node1] = weight[node1][node2] = gew;[/SIZE] [size=10]}[/SIZE] [size=10][COLOR=#008000]/*for (u = 0; u < number_of_nodes; ++u){[/COLOR][/SIZE] [size=10][COLOR=#008000]for (h = 0; h < number_of_nodes; ++h){[/COLOR][/SIZE] [size=10][COLOR=#008000]printf("%f",weight[u][h]);[/COLOR][/SIZE] [size=10][COLOR=#008000]getch();[/COLOR][/SIZE] [size=10][COLOR=#008000]}[/COLOR][/SIZE] [size=10][COLOR=#008000]}*/[/COLOR][/SIZE] [size=10]ergebnis = acmincut (number_of_nodes);[/SIZE] [size=10]mincut_weight = ergebnis.cut_weight;[/SIZE] [size=10]mincut = ergebnis.actmincut;[/SIZE] [size=10][COLOR=#008000]/*printf ("erster: %f\n",mincut_weight);[/COLOR][/SIZE] [size=10][COLOR=#008000]getch();[/COLOR][/SIZE] [size=10][COLOR=#008000]ergebnis = acmincut (number_of_nodes - 1);[/COLOR][/SIZE] [size=10][COLOR=#008000]mincut_weight = ergebnis.cut_weight;[/COLOR][/SIZE] [size=10][COLOR=#008000]mincut = ergebnis.actmincut;[/COLOR][/SIZE] [size=10][COLOR=#008000]printf ("zweiter: %f\n",mincut_weight);[/COLOR][/SIZE] [size=10][COLOR=#008000]getch();[/COLOR][/SIZE] [size=10][COLOR=#008000]ergebnis = acmincut (number_of_nodes - 2);[/COLOR][/SIZE] [size=10][COLOR=#008000]mincut_weight = ergebnis.cut_weight;[/COLOR][/SIZE] [size=10][COLOR=#008000]mincut = ergebnis.actmincut;[/COLOR][/SIZE] [size=10][COLOR=#008000]printf ("dritter: %f\n",mincut_weight);[/COLOR][/SIZE] [size=10][COLOR=#008000]getch();*/[/COLOR][/SIZE] [size=10]number_of_nodes = number_of_nodes - 1;[/SIZE] [size=10][COLOR=#0000ff]while[/COLOR][/SIZE][size=10] (number_of_nodes > 1){[/SIZE] [size=10]ergebnis = acmincut (number_of_nodes);[/SIZE] [size=10][COLOR=#0000ff]if[/COLOR][/SIZE][size=10] (ergebnis.cut_weight < mincut_weight){ [/SIZE] [size=10]mincut_weight = ergebnis.cut_weight; [/SIZE] [size=10]mincut = ergebnis.actmincut;[/SIZE] [size=10]}[/SIZE] [size=10]printf([/SIZE][size=10][COLOR=#800000]"schn: %f\n"[/COLOR][/SIZE][size=10],mincut_weight);[/SIZE] [size=10]getch();[/SIZE] [size=10]number_of_nodes = number_of_nodes - 1; [/SIZE] [size=10]}[/SIZE] [size=10]printf([/SIZE][size=10][COLOR=#800000]"Schnitt: %d\n Gewicht: %f\n"[/COLOR][/SIZE][size=10], mincut, mincut_weight);[/SIZE] [size=10]getch();[/SIZE] [size=10]}[/SIZE] [size=10][COLOR=#0000ff]struct[/COLOR][/SIZE][size=10] result acmincut([/SIZE][size=10][COLOR=#0000ff]int[/COLOR][/SIZE][size=10] nodes){ [/SIZE] [size=10][COLOR=#0000ff]int[/COLOR][/SIZE][size=10] x, y, l, i, j, k, u, h;[/SIZE] [size=10][COLOR=#0000ff]int[/COLOR][/SIZE][size=10] v, counter;[/SIZE] [size=10][COLOR=#0000ff]int[/COLOR][/SIZE][size=10] *visited;[/SIZE] [size=10][COLOR=#0000ff]float[/COLOR][/SIZE][size=10] *V;[/SIZE] [size=10][COLOR=#0000ff]struct[/COLOR][/SIZE][size=10] result ergeb;[/SIZE] [size=10][COLOR=#008000]/*actmincut = (int*)malloc(nodes*sizeof(int));*/[/COLOR][/SIZE] [size=10]visited = ([/SIZE][size=10][COLOR=#0000ff]int[/COLOR][/SIZE][size=10]*)malloc(nodes*[/SIZE][size=10][COLOR=#0000ff]sizeof[/COLOR][/SIZE][size=10]([/SIZE][size=10][COLOR=#0000ff]int[/COLOR][/SIZE][size=10]));[/SIZE] [size=10]V = ([/SIZE][size=10][COLOR=#0000ff]float[/COLOR][/SIZE][size=10]*)malloc(nodes*[/SIZE][size=10][COLOR=#0000ff]sizeof[/COLOR][/SIZE][size=10]([/SIZE][size=10][COLOR=#0000ff]float[/COLOR][/SIZE][size=10]));[/SIZE] [size=10][COLOR=#0000ff]for[/COLOR][/SIZE][size=10] (v = 0; v < nodes; ++v){[/SIZE] [size=10]V[v] = 0.0;[/SIZE] [size=10]visited[v] = -1;[/SIZE] [size=10]}[/SIZE] [size=10]ergeb.cut_weight = 0.0;[/SIZE] [size=10]k = 0;[/SIZE] [size=10]counter = 0;[/SIZE] [size=10]visited[0] = 0;[/SIZE] [size=10][COLOR=#0000ff]while[/COLOR][/SIZE][size=10] (counter < (nodes-1) ) {[/SIZE] [size=10]ergeb.cut_weight = 0.0;[/SIZE] [size=10][COLOR=#0000ff]for[/COLOR][/SIZE][size=10] (i = 0; i < nodes; ++i) {[/SIZE] [size=10]V[i] = V[i] + weight[k][i];[/SIZE] [size=10]}[/SIZE] [size=10][COLOR=#0000ff]for[/COLOR][/SIZE][size=10] (j = 0; j <= counter; ++j) {[/SIZE] [size=10][COLOR=#0000ff]if[/COLOR][/SIZE][size=10] (visited[j] != -1) [/SIZE] [size=10]V[visited[j]] = 0.0; [/SIZE] [size=10]}[/SIZE] [size=10][COLOR=#0000ff]for[/COLOR][/SIZE][size=10] (l = 0; l < nodes; ++l) {[/SIZE] [size=10][COLOR=#0000ff]if[/COLOR][/SIZE][size=10] (V[l] > ergeb.cut_weight) {[/SIZE] [size=10]ergeb.cut_weight = V[l];[/SIZE] [size=10]k = l;[/SIZE] [size=10]}[/SIZE] [size=10]}[/SIZE] [size=10]visited[counter+1] = k; [/SIZE] [size=10]counter = counter + 1;[/SIZE] [size=10]}[/SIZE] [size=10]x = visited[nodes - 2]; [/SIZE] [size=10]y = visited[nodes - 1]; [/SIZE][size=10][COLOR=#008000]/* = k , letztes besuchtes Element*/[/COLOR][/SIZE] [size=10][COLOR=#0000ff]if[/COLOR][/SIZE][size=10] (x < y){[/SIZE] [size=10][COLOR=#0000ff]for[/COLOR][/SIZE][size=10] (i = 0; i < nodes; ++i){[/SIZE] [size=10]weight[x][i] = weight[x][i] + weight[y][i]; [/SIZE][size=10][COLOR=#008000]/* addiere in Gewichtsmatrix Zeile x und y und Spalte x und y*/[/COLOR][/SIZE] [size=10]weight[i][x] = weight[i][x] + weight[i][y];[/SIZE] [size=10]}[/SIZE] [size=10][COLOR=#0000ff]for[/COLOR][/SIZE][size=10] (i = 0; i < nodes; ++i){[/SIZE] [size=10]weight[y][i] = weight[nodes - 1][i]; [/SIZE][size=10][COLOR=#008000]/* überschreibe Spalte und Zeile y mit letzte Zeile*/[/COLOR][/SIZE] [size=10]weight[i][y] = weight[i][nodes - 1]; [/SIZE] [size=10]weight[x][x] = 0.0; [/SIZE][size=10][COLOR=#008000]/* Gewicht zwischen den Knoten x und y und falls Schleifen bei x oder y 0 setzen*/[/COLOR][/SIZE] [size=10]}[/SIZE] [size=10]}[/SIZE] [size=10][COLOR=#0000ff]if[/COLOR][/SIZE][size=10] (y < x){[/SIZE] [size=10][COLOR=#0000ff]for[/COLOR][/SIZE][size=10] (i = 0; i < nodes; ++i){[/SIZE] [size=10]weight[y][i] = weight[y][i] + weight[x][i]; [/SIZE][size=10][COLOR=#008000]/* addiere in Gewichtsmatrix Zeile x und y und Spalte x und y*/[/COLOR][/SIZE] [size=10]weight[i][y] = weight[i][y] + weight[i][x];[/SIZE] [size=10]}[/SIZE] [size=10][COLOR=#0000ff]for[/COLOR][/SIZE][size=10] (i = 0; i < nodes; ++i){[/SIZE] [size=10]weight[x][i] = weight[nodes - 1][i]; [/SIZE][size=10][COLOR=#008000]/* überschreibe Spalte und Zeile y mit letzte Zeile*/[/COLOR][/SIZE] [size=10]weight[i][x] = weight[i][nodes - 1]; [/SIZE] [size=10]weight[y][y] = 0.0; [/SIZE][size=10][COLOR=#008000]/* Gewicht zwischen den Knoten x und y und falls Schleifen bei x oder y 0 setzen*/[/COLOR][/SIZE] [size=10]}[/SIZE] [size=10]}[/SIZE] [size=10][COLOR=red]ergeb.actmincut = k;[/COLOR][/SIZE] [size=10][COLOR=#0000ff]return[/COLOR][/SIZE][size=10] (ergeb);[/SIZE] [size=10]}[/SIZE]
Das programm soll mir den minimalen Schnitt in einem Graphen berechnen.
Hab dazu einen link mit einer guten Erklärung gefunden:
http://www.informatik.uni-frankfurt.de/~erps/seminar/theoseminar.pdf
mein Programm arbeitet (ungefähr) nach dem Algorithmus MINIMUMCUT.
Ich erhalte den richtigen Wert für das Schnittgewicht. Mein Problem ist der Schnitt.
Im ersten Durchlauf stimmt er ja noch, weil nur ein Knoten übrig bleibt. Danach nicht mehr.
Bin dankbar für jede Hilfe.
Ich weiss, das Programm ist sehr dilletantisch, aber ich hab ja erst begonnen :o.
Danke!!!!!!!!!! -
Hab endlich eine Lösung gefunden. Absolut unelegant, aber das Programm läuft.:D
Danke nochmal für eure Hilfe!!
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!