Simulazione di un sistema disordinato c

roger21

Nuovo Utente
21
3
Salve a tutti,sto realizzando un codice per simulare un fenomeno di infiltrazione,con apposite funzioni da implementare,le ho realizzate tutte meno che una,la funzione che determina l'inflitrazione d'acqua per step successivi,che ho composto mediante 3 funzioni,una che corrisponde sostanzialmente a un algoritmo di ricerca,dentro la quale vi è una che determina lo spostamento dentro la matrice,un'altra che determina la direzione di incremento decremento della posizione (annidata nella seconda) e un'ultima,allo stesso livello della prima "sub-funzione" che lascia un segno sulla matrice corrispondente alla traccia d'acqua,vi allego il codice per intero,è molto lungo ma l'unica cosa che da problemi(il programma loopa) è step (che si compone di cerca_min,next,ruota e disegna)
Codice:
 #include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <float.h>
#include <time.h>
#define orario -1 //Per convenzione le macro si scrivono maiuscole
#define antiorario 1

double** new_matrix (unsigned n, unsigned m) ;

void print_matrix (FILE * f, double ** a, unsigned n, unsigned m);

int init_percolation (double ** mat, unsigned n, unsigned m, double a, double b);
    

void prettyprint_matrix (FILE * f, double ** a, unsigned n, unsigned m);
void free_matrix (double *** pm, unsigned n);

int load_matrix (FILE * f, double ** a, unsigned n, unsigned m);

int first_step (double ** mat, unsigned n, unsigned m);

int ruota(char senso, int*i, int*j, int x, int y);

//dovete decidere un punto di inizio di coordinate (i,j) poi una direzione in cui incrementare ( che può essere (-1,0) , (1,0), (0,-1),(0,1) ; risp sinistra destra su giù)
//la funzione ruota deve far cambiare la direzione, non le coordinate del cieco.

void next(int *i, int *j);

int cerca_min (double ** mat, unsigned n, unsigned m);

int disegna(double ** mat, unsigned n, unsigned m, int l, int k);

int step (double ** mat, unsigned n, unsigned m, double a, double b);
int main(){
    unsigned int i, N, M,k,p;
    
    printf("Inserisci N: ");
    scanf("%d", &N);
    printf("Inserisci M: ");
    scanf("%d", &M);
    char sense;
    double**A;
    double e, h;
    FILE *f;
    
    A = new_matrix(N, M);
    f = fopen("./matrice","w");
    
    if (f==NULL) {
        perror("fopen: 0");
        return EXIT_FAILURE;
    }
    srand(time(NULL));
    e = (double)(rand())/((double)RAND_MAX + 0.0)*(1.0);
    h = (double)(rand())/((double)RAND_MAX + e)*(9.9);
    init_percolation(A, N, M, e, h);
    print_matrix(f, A, N, M);
    load_matrix(f, A, N, M);
    first_step(A, N, M);
    print_matrix(stdout, A, N, M);
    step(A, N, M, e, h);
    print_matrix(stdout, A, N, M);
    prettyprint_matrix(f, A, N, M);
    free_matrix(&A, N);
    fclose(f);
    return 0;
}
double** new_matrix (unsigned n, unsigned m)  {
    double ** a;
    int i;
    if (n == 0 || m == 0) {
        errno = EINVAL;
        return NULL;
    }
    /* allocazione vettore puntatori alle righe */
    if ((a=malloc(n * sizeof(double *)))==NULL)  {
        return NULL;
    }
    /* inizializzo */
    for (i=0; i<n; i++)
        a[i]=NULL;
    /* allocazione righe*/
    for (i=0; i<n; i++)
        if ((a[i]=malloc(m * sizeof(double)))==NULL)  {
            /* rollback */
            int j;
            for(j=0; j<i; j++)
                free(a[i]);
            free(a);
            errno=ENOMEM;
            return NULL;
        }
    return a;
}
void print_matrix (FILE * f, double ** a, unsigned n, unsigned m) {
    int i, j;
    /* file non utilizzabile */
    if (f == NULL ) {
        fprintf(stderr,"print_matrix: File NULL.\n");
        return;
    }
    /* valori inconsistenti */
    if (n == 0 || m == 0) {
        fprintf(stderr,"print_matrix: 0 colonne o righe.\n");
        return;
    }
    /* matrice vuota */
    if (a == NULL) {
        fprintf(f,"Martice vuota.\n");
        return;
    }
    /* stampa matrice */
    for (i=0; i<n; i++) {
        for (j=0; j<m; j++)
            if (a[i][j] == -1) fprintf(f, "****\t" );
            else if (a[i][j] == -2) fprintf(f, "++++\t" );
            else     fprintf(f, "%.2f\t", a[i][j] );
        fprintf(f, "\n" );
    }
    fprintf(f, "\n" );
}
int init_percolation (double ** mat, unsigned n, unsigned m, double a, double b){
    int i, j;
    if(b<a || a<0 || b<0){
        return -1;
    }
    for(i=0; i<n; i++){
        for(j=0; j<m; j++)
            mat[i][j] = (double)(rand())/((double)RAND_MAX + a)*(b);
    }
    return 0;
}

void prettyprint_matrix (FILE * f, double ** a, unsigned n, unsigned m){
    int i, j;
    char c, t, u;
    c = '~';
    t = '^';
    u = '#';
    for(i=0; i<n; i++){
        printf("\t\t");
        for(j=0; j<m; j++){
            if(a[i][j]==-1) printf("%c", c);
            else if(a[i][j]==-2) printf("%c", t);
            else if(a[i][j]!=-1 && a[i][j]!=-2) printf("%c", u);
        }
        printf("\n");
    }
    printf("\n");
}

void free_matrix (double *** pm, unsigned n){
    int i;
    for(i=0; i<n; i++){
        free((*pm)[i]);
    }
    free(*pm);
    *pm = NULL;
}

int load_matrix (FILE * f, double ** a, unsigned n, unsigned m){
    int i, j;
    for(i=0; i<n; i++){
        for(j=0; j<m; j++){
            fscanf(f, "%lf", &a[i][j]);
        }
    }
    return 0;}

int first_step (double ** mat, unsigned n, unsigned m){
    int c=n/2, d=m/2;
    mat[c][d]=-1;
    return 0;}

int ruota(char senso, int*i, int*j, int x, int y){
    int use;
    
    if(x!=0)
        x=x*-1;
    use=x;
    x=y;
    y=use;
    
    (*i) = x*senso;
    (*j) = y*senso;
    return 0;}

//dovete decidere un punto di inizio di coordinate (i,j) poi una direzione in cui incrementare ( che può essere (-1,0) , (1,0), (0,-1),(0,1) ; risp sinistra destra su giù)
//la funzione ruota deve far cambiare la direzione, non le coordinate del cieco.

void next(int *i, int *j){  //la funzione next non deve ritornare un intero: deve modificare le coordinate : conviene una cosa del tipo void next(int *i,int *j)
    int sx, up;

    if(sx==-1) {
        while(up!=-1 && up!=-2)       //';' dopo un while --> sono cazzi
        ruota(orario, i, j, *i, *j);}    // dovete usare le coordinate dell'incremento (direzione in cui il cieco fa un passo)
    else ruota(antiorario, i, j, *i, *j);       // Non ha senso che modifichiate le coordinate del cieco con la funzione ruota.
}
int disegna(double ** mat, unsigned n, unsigned m, int l, int k){
    mat[l][k] = -1;
    return 0;}

int cerca_min (double ** mat, unsigned n, unsigned m){
    int i, j, imin = 0, jmin, c=n/2, d=m/2;
    double val=10.0;
    do{             // do{}while(condizioni);
        if(mat[c][d] < val){                  //ricorda qua di aggiustare inizializzazione
            val = mat[c][d];
            imin = c;
            jmin = d;
            next(&i, &j);
        }}
    while((i!=imin) && (j!=jmin));
    disegna(mat, n, m, imin, jmin);
    return 0;}

int step (double ** mat, unsigned n, unsigned m, double a, double b){
    int c=n/2, d=m/2;
    cerca_min(mat, n, m);
    return 0;}
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili