1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

integer zusammenfügen

  • lilly1
  • 9. Mai 2007 um 22:35
  • Unerledigt
  • lilly1
    2
    lilly1
    Mitglied
    Punkte
    25
    Beiträge
    4
    • 9. Mai 2007 um 22:35
    • #1

    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

  • Paulchen
    1
    Paulchen
    Gast
    • 9. Mai 2007 um 22:58
    • #2

    Das geht mit sprintf. Ein einfaches Beispiel sieht so aus:

    C
    #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;
    }
    Alles anzeigen

    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. :)

  • lilly1
    2
    lilly1
    Mitglied
    Punkte
    25
    Beiträge
    4
    • 9. Mai 2007 um 23:25
    • #3

    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!

  • Paulchen
    1
    Paulchen
    Gast
    • 9. Mai 2007 um 23:45
    • #4

    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?

  • sauzachn
    17
    sauzachn
    Mitglied
    Reaktionen
    51
    Punkte
    3.101
    Beiträge
    606
    • 10. Mai 2007 um 10:37
    • #5
    Zitat von lilly1

    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.

    Dipper dipper dii dipper dii dipper dii duuu

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 10. Mai 2007 um 13:05
    • #6

    Wie wärs mit einer zweidimensionalen Liste? Ständig zwischen Zahl und String herumkonvertieren wär etwas umständlich.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • lilly1
    2
    lilly1
    Mitglied
    Punkte
    25
    Beiträge
    4
    • 20. Mai 2007 um 19:47
    • #7

    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
    [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]
    Alles anzeigen



    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!!!!!!!!!!

  • lilly1
    2
    lilly1
    Mitglied
    Punkte
    25
    Beiträge
    4
    • 21. Mai 2007 um 00:16
    • #8

    Hab endlich eine Lösung gefunden. Absolut unelegant, aber das Programm läuft.:D

    Danke nochmal für eure Hilfe!!

  • Maximilian Rupp 27. Dezember 2024 um 12:05

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung