Strukturen mit Vektoren / Mehrfachausgabe eines Programmes



  • Hi! (ein bischen viel ich weiß..sorry...!)
    1)
    Ich fange gerade an mit class/struct zu arbeiten und möchte jetzt eine struktur, die jeweils einen vektor und zwei Integer hat.
    diese drei elemente will ich dann mit Zahlen aus Vektoren/Matritzen die ich bereits habe füllen.

    Allerdings weiß ich nicht genau wie ich den Vektor definieren soll.
    Und bei Füllen bin ich mir auch nich ganz sicher.
    Ich hab schon ganz viel gesucht aber nicht so richtig gefunden was ich brauche...
    Wäre super wenn jemand von euch ne idee hätte!!!

    und dann habe ich noch ein 2. problem, deshalb habe ich die funktion copy mit reingestellt!

    ich muss das program N mal durchlaufen lassen aber wenn ich eine for schleife einbaue wird das programm nur einmal richtig durchgeführt, danach ergibt es immer null.... ich schätze das hat mit timestep=0 zu tun finde den fehler aber einfach nicht!!!

    vielen vielen dank für jeden der sich die mühe macht.. !!
    lg

    #include <iostream>
    #include<vector>
    #include<cmath>
    #include <stdio.h>
    #include<cstdlib>
    #include <time.h>
    #include<errno.h>
    #include <string>

    #define MAX 10000

    using namespace std;

    //deklaration globale variablen

    int neighbours[MAX][MAX];
    int AktiveLinks[MAX][MAX];
    int l;

    void getneighbour(int elementi,int elementj ,int nc,int nn);
    void getNextSetNeighbours(int elementg,int elementh ,int nc,int nn);
    void copy(int n,int m,int nccc,int nnnn);

    vector<int>state;
    vector<int>activeLinks1stSet;

    //das wäre dann der anfang meiner klasse/struktur
    class NODES
    {
    public:
    int stateNODES;
    int numNeighbNODES;
    std::vector<int>activeNODES;
    };

    // im hauptprogramm erzeuge ich eine matrix und ein paar vektoren

    int main()

    {
    //deklaration lokale variablen
    int i,j;
    int numc;
    int numn;

    //erzeugt wirkliche zufallszahlen
    srand(time(NULL));

    //setze Anfangsbedingungen
    cout<<"type in number of nodes"<<endl;
    cin>>numn;
    cout<<"type in number of connections"<<endl;
    cin>>numc;

    //erzeuge Vektor mit status 0/1
    for(i=0;i<numn;i++)
    {
    state.push_back(rand()%2+0);
    }

    //erzeuge vektor aktive links 1tes set
    for(i=0;i<numn;i++)
    activeLinks1stSet.push_back(0);

    //flle matrix mit zahlen
    getneighbour(j,i,numc, numn);

    //hier möchte ich jetzt für (i=0 bis numn)
    //die vektoren activeNODES mit den spalten der matrix [j][i]füllen
    // und die integer stateNODES und numNeighbNODES mit der i ten
    //komponente der vektoren state bzw activeLinks1stSet
    //könnte das zb für den Vektor so ähnlich aussehen??

    for(i=0;i<numn;i++)
    {
    NODES i;
    for(j=0; j<numc;j++)
    {
    i.active.push_back(neighbours);
    std::printf("|%d|\t",i.active);
    }
    }printf("\n");

    //COPY_DYNAMIK
    int MC=0;
    int sum;
    int timeStep=0;
    l=0;
    do
    {
    for(int t=0;t<(numn);t++)
    {
    //printf("\n------%d",t);
    copy(i,j,numc,numn);
    ++timeStep;
    }

    sum=0;
    //printf("\n");
    //printf("status in MC ");
    for( i=0;i<numn;i++)
    {
    //printf("%d",state[i]);
    sum=sum+state[i];
    }
    //printf("\n");
    //printf("summe in MC ");
    // printf("\n");
    // printf("%d",sum);
    // printf("\n");
    ++MC;
    }while(sum!=0&&sum!=numn);

    //printf("final sum %d\n",sum);
    //printf("monte carlo steps in total %d\n",MC);
    printf("||%d||\n",timeStep-l);
    //printf("minus%d",l-1);

    for(i=0;i<numn;i++)
    {
    NODES i;
    i.stateNODES=state;
    i.numNeighbNODES=activeLinks1stSet;
    printf("<%d\t%d\n<",i.stateNODES,i.numNeighbNODES);
    }

    return 0;
    }

    //funktionen---------------------------------------------------------------------------------------

    //erzeuge ausgangsmatrix///////////////////////////
    void getneighbour(int elementi,int elementj,int nc,int nn)
    {
    //hier erzeuge ich die ausgangsmatrix
    }

    //COPY//////////////////////////////////////////
    void copy(int n,int m,int nccc,int nnnn)
    {
    int x1;
    int y1;
    int nbs;
    int countakt;
    x1=rand()%(nccc)+0;
    y1=rand()%(nnnn)+0;
    //printf("(%d)(%d)",x1,y1);
    //printf("\n");
    nbs=neighbours[x1][y1];
    //printf("n%dn",nbs);
    //printf("\n");
    if(state[y1]!=state[nbs])
    {
    state[y1]=state[nbs];
    int numakt=activeLinks1stSet[y1];
    activeLinks1stSet[y1]=nccc-numakt;
    for(m=0;m<nccc;m++)
    {
    int v=neighbours[m][y1];
    if(state[v]!=state[y1])
    ++activeLinks1stSet[v];
    if(state[v]==state[y1])
    --activeLinks1stSet[v];
    }
    }
    //printf("\n");
    countakt=0;
    for(n=0;n<nnnn;n++)
    {
    //printf("|%d|",activeLinks1stSet[n]);

    countakt=countakt+activeLinks1stSet[n];
    }
    //printf("\n");
    ///printf("CA%dCA",countakt);
    if (countakt==0)
    {
    ++l;
    }
    }



  • LOUb schrieb:

    Hi! (ein bischen viel ich weiß..sorry...!)

    Vor allem aber unleserlich (Die C/C++ Tags unterhalb des Editorfensters sind nicht zum Spaß da), wenn du zusätzlich auch noch dein Code sauber formatierst, wird sich das vielleicht einer antun.

    Aber grundsätzliches:
    - Der Code ist im wesentlichen C, nicht C++
    - Konstanten per Makro zu definieren ist eine Unsitte (dazu gibt es const)
    - Globale Variablen sollte man ganz dringend meiden
    - Variablennamen sind sprechend zu bezeichnen, zumindestens wenn du willst, das dir jemand weiterhilft.
    - Die GROSSSCHREIBUNG ist eigentlich etwas, das man nur bei Makrobezeichnungen, nicht klassennamen macht, zudem sind Membervariablen ohnehin der Klasse/Struktur zugeordnet, so das man sie nicht explizit um den Namen ergänzen sollte.
    - Für klassische Stukturen wäre dein Ansatz der Klasse an sich okay, Klassen im OO-Sinne enthalten aber auch Methoden, und eigentlich Kapselt man Membervariablen damit auf diesen nicht direkte Änderungen möglich sind.

    Vielleicht solltest du dir mal ein Buch wie C++ Primer zulegen...

    cu André


Anmelden zum Antworten