Urgentissimo!! Programma per esame universitario!!

di il
24 risposte

Urgentissimo!! Programma per esame universitario!!

Ciao a tutti sono nuovo.. Mi ha passato il link del forum un mio amico..
Sono nei guai.. Tra poco devo consegnare il progetto di Programmazione I e mi manca ancora un casino..

Mi sono bloccato su questo programma che proprio non riesco a fare:

Si vuole sviluppare un programma per la classificazione di costellazioni.
Si suppone di osservare una parte del cielo in un certo istante di tempo (generazione
casuale di stelle). L’osservazione ha dimensioni nxm e una stella può essere
presente (1) o assente (0). Ad esempio un’osservazione può essere
1 0 0 0 1
0 1 0 1 0
1 0 0 0 1
0 1 0 1 1
0 1 1 0 1
L’utente inserisce una costellazione nota di dimensioni cxr con c < n e r < m e
vuole cercare la posizione della costellazione all’interno dell’osservazione che
meglio la rappresenta (match migliore).
Ad esempio possiamo avere
0 1
1 1
0 1
L’algoritmo deve ritornare la posizione iniziale da dove inizia la costellazione con il
match migliore. Ad esempio nel nostro caso la posizione è colonna 3 e riga 3.


Grazie per eventuali risposte!! Aiutate un povero studente xD

24 Risposte

  • Re: Urgentissimo!! Programma per esame universitario!!

    Da quanto ho capito l'utente da una costellazione che è un sottoinsieme della matrice n x m.
    Non mi è ben chiaro in base a quale criterio si sceglie il match migliore ?

    Se provi a chiarire magari ti posso are una mano
  • Re: Urgentissimo!! Programma per esame universitario!!

    Il problema è semplicemente risolvibile con il bitwise per uguaglianza o similitudine

    ~Max
  • Re: Urgentissimo!! Programma per esame universitario!!

    In pratica devo usare il best matching per trovare la posizione migliore della mia costellazione nella matrice più grande..

    La matrice grande e simulata quella piccola e definita nel main stesso.. devo fare il best matching tra le 2..
  • Re: Urgentissimo!! Programma per esame universitario!!

    Capito. Non ti aspetterai che ti scriviamo tutto il codice spero
    Prova ad impostare parte del codice e da li si può dare una mano.
    Posta il codice
  • Re: Urgentissimo!! Programma per esame universitario!!

    Ecco quello che ho fatto:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    int matching_migliore (int *a[], int *b[], int c1, int c2);
    int punteggio_migliore (int *a[], int *b[], int n);
    void main ()
    {
         int cielo [10][10]={0};
                           
         int coste[3][3]={{1,0,1},
    						{0,1,0},
    						{1,0,1}};
                               
         int x,y;
         int i,j;
         int indice;
         
    	 srand(time(0));
         
         for (i=0;i<=25;i++)
         {
             x=rand()%11;
             y=rand()%11;
    
    		 if (cielo[x][y]==1)
    			i=i-1;
    		 else
    			cielo[x][y]=1;
          }
         
         for (i=0;i<10;i++)
    	 {
             for (j=0;j<10;j++)
                 printf("%d ",cielo[i][j]);
                 printf("\n");
    	 }
         
          printf("\n\n");
         
         for (i=0;i<3;i++)
    	 {
             for (j=0;j<3;j++)
                 printf("%d ",coste[i][j]); 
                 printf("\n"); 
    	 }
                 
         indice=matching_migliore (coste,cielo,10,3); 
    	 
    	 printf("\nL'indice e': %d - %d\n",indice,indice);
    	 	 
    	 getch();
         
    }
    
    int matching_migliore (int *a[], int *b[], int c1, int c2)
    {
        int i, punteggio_max, punteggio, indice=0;
        
        punteggio_max=0;
        
        for (i=0;i<c1-c2;i++)
        {       
    		punteggio=punteggio_migliore (a,&b[i],c1);
            if (punteggio>punteggio_max)
            {
               punteggio_max=punteggio;
               indice=i;
            }
        }
        return indice;
    }
    
    int punteggio_migliore (int *a[], int *b[], int n)
    {
        int i, n_caratteri_uguali;
        n_caratteri_uguali=0;
        for (i=0;i<n;i++)
            if (a[i] == b[i])
               n_caratteri_uguali++;
        return n_caratteri_uguali;
    }
    
    
    Questo e' il best matching come lo abbiamo fatto ma è sbagliato anche se mi parte il programma.. Il prof lo aveva applicato su un array 1D non su una matrice... E' qui che rimango fregato..
  • Re: Urgentissimo!! Programma per esame universitario!!

    Bisogna che tu passi alla funzione matching migliore i valori sia della colonna che delle righe della matrice costellazione , perche se tu hai una cost [3 ,1] o [3,2] o [4 ,2] ?
    e poi dai alle variabili dei nome che hanno senso cosi non si capisce niente
    io chiamo : c => il numero di righe e colonne della matrice cielo
    NB : Se la matrice cielo è quadrata basta passare solo la c altrimenti
    dovresti passare alla funzione due valori come sto facendo di seguito
    per la matrice costellazione

    col_cost => numero di colonne della matrice costellazione
    row_cost => numero di righe della matrice costellazione

    Adesso non ricodo in C come si passano le matrici . Io assumo che tu lo sappia fare.
    Prendo per buono che int *a[] sia l'intera matrice cielo e che int *b[] sia l'intera matrice costellazione. Anche se mi pare che come le hai dichiarate no sia giusto. Poi quste cose le aggiusti tu.
    Io ti do la logica di come fare


    Quindi io farei così :
    
    void matching_migliore (int *a[] , int *b[] , int c , int col_cost , int row_cost)
    {
        int iCol , iRow , punteggio_max, punteggio, indiceRow , indiceCol;
        // setta tutti i valori a zero prima come hai fatto con punteggio_max
        punteggio_max=0;
        
        for (iRow=0 ; iRow < (c - row_cost)  ; iRow++)
        {   
             for (iCol=0 ; iCol < (c - col_cost) ; icol++)
             {      
                     punteggio=punteggio_migliore (a , b , c , col_cost , row_cost , iCol , iRow );
                     if (punteggio>punteggio_max)
                     {
                        punteggio_max=punteggio;
                        indiceRow=iRow;
                        indiceCol=iCol
                     }
              }
         }
         StampaRisultato(indiceCol , indiceRow) ; // ti fai sta funzione che stamapa i valori della matrice cielo     con   i   valori  idiceCol , indiceRow che sono il punto in cui parte la matrice bestmatch
     }
    
    La funzione punteggio migliore si trasforma cosi ;
    
    int punteggio_migliore (int *a[] , int *b[] , int c , int col_cost , int row_cost , int iCol , int iRow)
    {
        int iC, iR ,  n_caratteri_uguali;
        n_caratteri_uguali=0;
        for (iR=iRow ; iRow < row_cost  ; iR++)
        {   
             for (iC=iRow ; iCol <  col_cost ; iC++)
             { 
               if (a[iR][iC] == b[iR][iC])
               n_caratteri_uguali++;
             }
        }
        return n_caratteri_uguali;
    }
    
    NB . ci saranno sicuramente errori di sintassi perchè non uco piu il C quindi non l'ho provato.
    volevo solo darti solo un consiglio su come fare dal punto di vista della logica dle programma
    poi l sintassi te la vedi tu
  • Re: Urgentissimo!! Programma per esame universitario!!

    Ecco come ho fatto.. Non mi da errori parte ma si stoppa una volta arrivato al collegamento con la funzione del best matching
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    void matching_migliore (int *a[] , int *b[] , int c , int col_cost , int row_cost , int indiceRow , int indiceCol);
    int punteggio_migliore (int *a[] , int *b[] , int c , int col_cost , int row_cost , int iCol , int iRow);
    void main ()
    {
         int cielo [10][10]={0};
                           
         int coste[4][3]={{1,0,1},
    						{0,1,0},
    						{1,0,1},
                            {1,0,1}};
                               
         int x,y;
         int i,j;
         int indiceRow=0,indiceCol=0;
         
    	 srand(time(0));
         
         for (i=0;i<=25;i++)
         {
             x=rand()%11;
             y=rand()%11;
    
    		 if (cielo[x][y]==1)
    			i=i-1;
    		 else
    			cielo[x][y]=1;
          }
         
         for (i=0;i<10;i++)
    	 {
             for (j=0;j<10;j++)
                 printf("%d ",cielo[i][j]);
                 printf("\n");
    	 }
         
          printf("\n\n");
         
         for (i=0;i<4;i++)
    	 {
             for (j=0;j<3;j++)
                 printf("%d ",coste[i][j]); 
                 printf("\n"); 
    	 }
                 
         matching_migliore (coste,cielo,10,3,4,indiceRow,indiceCol); 
    	 
    	 printf("\nL'indice e': %d - %d\n",indiceRow,indiceCol);
    	 	 
    	 getch();
         
    }
    
    void matching_migliore (int *a[] , int *b[] , int c , int col_cost , int row_cost , int indiceRow , int indiceCol)
    {
        int iCol=0 , iRow=0 , punteggio_max=0, punteggio=0; 
       
        for (iRow=0 ; iRow < (c - row_cost)  ; iRow++)
        {   
             for (iCol=0 ; iCol < (c - col_cost) ; iCol++)
             {     
                     punteggio=punteggio_migliore (a , b , c , col_cost , row_cost , iCol , iRow );
                     if (punteggio>punteggio_max)
                     {
                        punteggio_max=punteggio;
                        indiceRow=iRow;
                        indiceCol=iCol;
                     }
              }
         }
         }
    
    int punteggio_migliore (int *a[] , int *b[] , int c , int col_cost , int row_cost , int iCol , int iRow)
    {
        int iC, iR ,  n_caratteri_uguali;
        n_caratteri_uguali=0;
        for (iR=iRow ; iRow < row_cost  ; iR++)
        {   
             for (iC=iRow ; iCol <  col_cost ; iC++)
             {
               if (&a[iR][iC] == &b[iR][iC])
               n_caratteri_uguali++;
             }
        }
        return n_caratteri_uguali;
    }
    
    
    
  • Re: Urgentissimo!! Programma per esame universitario!!

    Prova a definire le matrici in questo modo :
    int cielo[10][10]
    int cost[x][y] metti tu i valori

    e prova a passarli nelle funzioni così :
    funzione (int a[][10] , int b[][y] ............... )

    Prova a fare così e magari fai delle prove intermedie : prova a fare una funzione che stampi i valori delle matrice cosi la poui anche usare nel tuo programma
  • Re: Urgentissimo!! Programma per esame universitario!!

    Fzannino ha ragione, sbagli a dichiarare la funzione -dovrebbe segnalartelo il compilatore-
    Ti faccio una piccola nota per il passaggio di matrici bidimensionali,
    sia per valore (funz1), sia per riferimento (funz2)
    
    #include <stdio.h>
    
    void funzione2 (int *arg)
    {
      int elem=0;
      printf ("Primo elemento=%d\n",*(arg+elem));
    }
    
    void funzione1 (int arg[][10])
    {
      printf ("Primo elemento=%d\n",arg[0][0]);
    }
    
    int main (void)
    {
      int cielo[10][10];
      
      funzione1 (cielo);
      funzione2 (&cielo[0][0]);
      
      return 0;
    }
    
    ~Max~
  • Re: Urgentissimo!! Programma per esame universitario!!

    Questo pezzo di codice l'ho abbozzato in 10min... Funziona SOLO sulle aree quadrate
    
    ...
    int punteggio_migliore (int *frame_cielo, int *coste, int size)
    {
      int i, n_caratteri_uguali=0;
      
      for (i=0;i<size;i++)
      {
        if (frame_cielo[i]==coste[i])
          n_caratteri_uguali++;
      }
      return n_caratteri_uguali;
    }
    
    int matching_migliore (int *cielo, int *coste, int lcielo, int lcoste)
    {
      int frame_cielo[lcoste*lcoste];
      int pos, stop, p, i;
      int punteggio, punteggio_max, indice;
      
      punteggio_max=-1;
      
      pos=0; 
      stop=(lcielo*lcielo)-(lcielo*(lcoste-1))-(lcoste);
      
      while (pos <= stop)
      {
        for (p=pos,i=0;i<(lcoste*lcoste);i++)
        {
          frame_cielo[i]=cielo[p++];
          if ((i+1)%lcoste==0)
            p+=(lcielo-lcoste);
        }
        punteggio=punteggio_migliore (&frame_cielo[0], coste, lcoste*lcoste);
        if (punteggio>punteggio_max)
        {
               punteggio_max=punteggio;
               indice=pos;
        }
      
        pos+= (pos && pos % (lcielo-lcoste)==0) ? lcoste : 1;
      }
      
      return indice;
    }
    ...
    
    
  • Re: Urgentissimo!! Programma per esame universitario!!

    Io faccio cosi..
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    void matching_migliore (int *a[][10] , int *b[][3] , int c , int col_cost , int row_cost, int indiceRow, int indiceCol);
    int punteggio_migliore (int *a[][10] , int *b[][3] , int c , int col_cost , int row_cost , int iCol , int iRow);
    void main ()
    {
         int cielo [10][10]={0};
                           
         int coste[4][3]={{1,0,1},
    						{0,1,0},
    						{1,0,1},
    						{1,0,1}};
                               
         int x,y;
         int i,j;
         int indice=0,indiceRow,indiceCol;
         
    	 srand(time(0));
         
         for (i=0;i<=25;i++)
         {
             x=rand()%11;
             y=rand()%11;
    
    		 if (cielo[x][y]==1)
    			i=i-1;
    		 else
    			cielo[x][y]=1;
          }
         
         for (i=0;i<10;i++)
    	 {
             for (j=0;j<10;j++)
                 printf("%d ",cielo[i][j]);
                 printf("\n");
    	 }
         
          printf("\n\n");
         
         for (i=0;i<4;i++)
    	 {
             for (j=0;j<3;j++)
                 printf("%d ",coste[i][j]); 
                 printf("\n"); 
    	 }
                 
         matching_migliore (coste,cielo,10,3,4,&indiceRow,&indiceCol); 
    	 
    	 printf("\nL'indice e': %d - %d\n",indiceRow,indiceCol);
    	 	 
    	 getch();
         
    }
    
    int punteggio_migliore (int *a[][10] , int *b[][3] , int c , int col_cost , int row_cost , int iCol , int iRow)
    {
        int iC, iR ,  n_caratteri_uguali;
        n_caratteri_uguali=0;
        for (iR=iRow ; iRow < row_cost  ; iR++)
        {   
             for (iC=iRow ; iCol <  col_cost ; iC++)
             {
               if (a[iR][iC] == b[iR][iC])
               n_caratteri_uguali++;
             }
        }
        return n_caratteri_uguali;
    }
    
    void matching_migliore (int *a[][10] , int *b[][3] , int c , int col_cost , int row_cost, int indiceRow, int indiceCol)
    {
        int iCol , iRow , punteggio_max, punteggio;
    
        punteggio_max=0;
       
        for (iRow=0 ; iRow < (c - row_cost)  ; iRow++)
        {   
             for (iCol=0 ; iCol < (c - col_cost) ; iCol++)
             {     
                     punteggio=punteggio_migliore (a , b , c , col_cost , row_cost , iCol , iRow );
                     if (punteggio>punteggio_max)
                     {
                        punteggio_max=punteggio;
                        indiceRow=iRow;
                        indiceCol=iCol;
                     }
              }
         }
    }
    
  • Re: Urgentissimo!! Programma per esame universitario!!

    Hai sbagliato la dichiarazione delle matrici nelle funziona
    prova così e dimmi che fa
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    void matching_migliore (int a[][10] , int b[][3] , int c , int col_cost , int row_cost, int indiceRow, int indiceCol);
    int punteggio_migliore (int a[][10] , int b[][3] , int c , int col_cost , int row_cost , int iCol , int iRow);
    void main ()
    {
         int cielo [10][10]={0};
                           
         int coste[4][3]={{1,0,1},
                      {0,1,0},
                      {1,0,1},
                      {1,0,1}};
                               
         int x,y;
         int i,j;
         int indice=0,indiceRow,indiceCol;
         
        srand(time(0));
         
         for (i=0;i<=25;i++)
         {
             x=rand()%11;
             y=rand()%11;
    
           if (cielo[x][y]==1)
             i=i-1;
           else
             cielo[x][y]=1;
          }
         
         for (i=0;i<10;i++)
        {
             for (j=0;j<10;j++)
                 printf("%d ",cielo[i][j]);
                 printf("\n");
        }
         
          printf("\n\n");
         
         for (i=0;i<4;i++)
        {
             for (j=0;j<3;j++)
                 printf("%d ",coste[i][j]); 
                 printf("\n"); 
        }
                 
         matching_migliore (coste,cielo,10,3,4,&indiceRow,&indiceCol); 
        
        printf("\nL'indice e': %d - %d\n",indiceRow,indiceCol);
            
        getch();
         
    }
    
    int punteggio_migliore (int a[][10] , int b[][3] , int c , int col_cost , int row_cost , int iCol , int iRow)
    {
        int iC, iR ,  n_caratteri_uguali;
        n_caratteri_uguali=0;
        for (iR=iRow ; iRow < row_cost  ; iR++)
        {   
             for (iC=iRow ; iCol <  col_cost ; iC++)
             {
               if (a[iR][iC] == b[iR][iC])
               n_caratteri_uguali++;
             }
        }
        return n_caratteri_uguali;
    }
    
    void matching_migliore (int a[][10] , int b[][3] , int c , int col_cost , int row_cost, int indiceRow, int indiceCol)
    {
        int iCol , iRow , punteggio_max, punteggio;
    
        punteggio_max=0;
       
        for (iRow=0 ; iRow < (c - row_cost)  ; iRow++)
        {   
             for (iCol=0 ; iCol < (c - col_cost) ; iCol++)
             {     
                     punteggio=punteggio_migliore (a , b , c , col_cost , row_cost , iCol , iRow );
                     if (punteggio>punteggio_max)
                     {
                        punteggio_max=punteggio;
                        indiceRow=iRow;
                        indiceCol=iCol;
                     }
              }
         }
    }
    
    
  • Re: Urgentissimo!! Programma per esame universitario!!

    Stessa cosa..
  • Re: Urgentissimo!! Programma per esame universitario!!

    Cioè
Devi accedere o registrarti per scrivere nel forum
24 risposte