Esame programmazione

di
Anonimizzato6941
il
16 risposte

Esame programmazione

Ciao a tutti sono nuovo ed ho un esame di programmazione a breve...

il progetto consinte in questo:
Scrivere una libreria ANSI C che gestisce insiemi di numeri interi esportando le seguenti cinque funzioni. La prima funzione restituisce un insieme acquisito da tastiera. La seconda funzione ha come parametro di ingresso un insieme e lo stampa a video. La terza funzione ha come parametri di ingresso due insiemi e restituisce la loro unione. La quarta funzione ha come parametri di ingresso due insiemi e restituisce la loro intersezione. La quinta funzione ha come parametri di ingresso due insiemi e restituisce la loro differenza.

io ho fatto gli insiemi come array, avete idee migliori?

e volevo postarvi la funzione unione per sapere dove sbaglio!(non commentata)

una puntualizzazione, lo spazio [0] di ogni array, è la dimensione di quell'insieme!!!
void unione (int insieme_1[], int insieme_2[], int *risultato)
	{
    
     int j=1,i,k,dim;
    
     dim=insieme_1[0]+insieme_2[0];

     risultato= (int *)calloc(dim, sizeof (int));
     for (i=1;
         i<=insieme_1[0];
          i++)
     {   
          for (k=1;
              k<=insieme_2[0] && insieme_1[i]!=insieme_2[k];
               k++) 
          {    
               if(insieme_1[i]==insieme_2[k])
               { }
               else
               {
                risultato[j]=insieme_1[i];
                j++;
               }
          }
     }           
     for (k=1;
         k<=insieme_2[0];
          k++)
     {
        risultato[j]=insieme_2[k];
        j++;  
     }
	risultato[0]=j-1;
}
		
grazie mille!!!

16 Risposte

  • Re: Esame programmazione

    Scusate potreste anche dare un'occhiata alla funzione di acquisizione?
    void acquisizione (int *insieme)
    	{
    	     int a,i,dim;
    	a=0;
    	printf("quanti elementi contiene l'insieme?");
    	scanf(" %d",
    		&dim);
    	insieme = (int *)calloc(dim, sizeof (int));
    	insieme[0]=dim;	
    	for(i=1;i<dim+1;i++)
    		{
    		printf("Inserisci il valore della %d° posizione",i);
    		scanf(" %d", &insieme[i]);
    		
    		}
    	}
    Grazie ciao!
  • Re: Esame programmazione

    io ho fatto gli insiemi come array, avete idee migliori?
    Va benissimo
    una puntualizzazione, lo spazio [0] di ogni array, è la dimensione di quell'insieme!!!
    bene, ma attenzione a non confondersi...
    
    void unione (int insieme_1[], int insieme_2[], int *risultato)
    
    Attenzione! La variazione dell'indirizzo puntato (risultato) si gestisce con puntatori di puntatori.
    Consiglio, nel tuo caso, di usare return col puntatore allocato... *non dimenticare la free nel main*
    molto piu semplice e pulito:
    
    int *unione (int insieme_1[], int insieme_2[])
    
    Poi, per controllare se vi è un duplicato negli insiemi usa un flag
    
      ...
      for (i=1;i<=insieme_1[0];i++)
      {   
        found=0;
        for (k=1;k<=insieme_2[0];k++) 
        {    
          if(insieme_1[i]==insieme_2[k])
          {
            found=1;
            break;
          }
        }
        if (!found)     
          risultato[j++]=insieme_1[i];
      }
      ...
    

    e restituisci il puntatore:
    
      ...
      return (risultato);
      ...
    
    Saluti,
    Max
  • Re: Esame programmazione

    Grazie mille Max,

    ancora una cosa non ho capito bene la free su quale array la devo fare, e poi ancora quando richiamo le funzioni unione e acquisizione va bene fatto in questo modo sulla main?
    char op;
    	int  *insieme_1, *insieme_2, dim,dim1,dim2, *risultato;
    	acquisizione(insieme_1);
    	acquisizione(insieme_2);
    	printf("Che operazione desideri fare?\n");
    	scanf(" %c", & op);
    
    	
            switch (op)
    		{
    		case 'u':
    		*unione(insieme_1 ,insieme_2);
    		stampa_insieme(risultato);
    		break; 
    
    		case 'i':
    		intersezione(insieme_1, insieme_2, dim1, dim2, risultato);
    		stampa_insieme(risultato);
    		break;
    
    		case 'd':
    		differenza(insieme_1, insieme_2, dim1, dim2, risultato);
    		stampa_insieme(risultato);
    		break;
    		}
    return(0);	
    }

    Ciao grazie ancora!
  • Re: Esame programmazione

    Prego.
    ancora una cosa non ho capito bene la free su quale array la devo fare
    su tutti gli array che allochi dinamicamente

    Secondo la logica della funzione precedente, tutte le tue funzioni che fanno allocazioni, dovrebbero restituire il puntatore allocato. Anche acquisizione, dovrebbe essere:
    
    int *acquisizione ()
    {
      int a,i,dim;
      int *insieme;
      a=0;
      printf("quanti elementi contiene l'insieme?");
      scanf(" %d", &dim);
      insieme = (int *)calloc(dim+1, sizeof (int));
      insieme[0]=dim; 
      for(i=1;i<dim+1;i++)
      {
        printf("Inserisci il valore della %d^ posizione",i);
        scanf(" %d", &insieme[i]);
      }
      return (insieme);
    }
    
    ... e nel main:
    
       int *insieme_1, *insieme_2. *risultato;
       insieme_1=acquisizione ();
       insieme_2=acquisizione ();
       ...
       risultato=unione (insieme_1, insieme_2);
       ...
       free (risultato);
       free (insieme_2);
       free (insieme_1);
       ...
    
    poi ho notato un errore sulle allocazioni. le allocazioni (acquisizione e unione) devo essere di 1 elemento in più; infatti tu usi una posizione dell'array per memorizzare le lunghezze...

    Saluti,
    Max
  • Re: Esame programmazione

    Ok grazie mille!

    Ho modificato la funzione di unione in questo modo:
    int *unione (int insieme_1[], int insieme_2[])
    	{
        
         int j=1,i,k,found,dim;
         int *risultato;
        
         dim=insieme_1[0]+insieme_2[0];
    
         risultato = (int *)calloc(dim, sizeof (int));
         for (i=1;
             i<=insieme_1[0];
              i++)
         {   
             found=0;
              for (k=1;
                   k<=insieme_2[0] && insieme_1[i]!=insieme_2[k];
                   k++) 
              {    
                   if (insieme_1[i]==insieme_2[k])
                   {
                   found=1;
                   break;
                   }
                   if (!found)
                   {
                    risultato[j++]=insieme_1[i];
                    
                 break;
                   }
              }
         }           
         for (k=1;
             k<=insieme_2[0];
              k++)
         {
            risultato[j]=insieme_2[k];
            j++;  
         }
    	risultato[0]=j-1;
    	return(risultato);
    }

    ma in alcuni casi il risultato è sbagliato, mi sfugge qualcosa?
    per esempio:insieme 1 =1,2,3,4,5 insieme 2=3,4,5,6,7, risultato=1,2,4,5,3,4,5,6,7 invece di 1,2,3,4,5,6,7,
    dove sbaglio?

    grazie ancora per l'aiuto

    ciao
  • Re: Esame programmazione

    
    ...
             dim=insieme_1[0]+insieme_2[0]+1; // <----- Added  1 (anche funzione acquisizione)
    ...
             for (k=1;
                  k<=insieme_2[0] /* && insieme_1[i]!=insieme_2[k] */;     //<------ togliere AND
                   k++) 
    ...
    
  • Re: Esame programmazione

    Mi da lo stesso il problema, mi stampa sempre l'ultimo o gli ultimi due elementi del primo insieme anche se non devono comparire nel risultato!

    sto impazzendo e vi sto facendo impazzire mi dispiace
  • Re: Esame programmazione

    Non ti preoccupare....posta tutto il codice che te lo debuggo subito



    ~max~
  • Re: Esame programmazione

    #include <stdio.h>
    #include <stdlib.h>
    
    int *acquisizione ();
    void stampa_insieme (int *);
    int *unione (int *, int *);
    int *differenza (int *, int *);
    int *intersezione (int *, int *);
    
    
    int main (void)
    {
    	
     
    
    	char op;
    	int  *insieme_1, *insieme_2,*risultato;
    	insieme_1=acquisizione();
    	insieme_2=acquisizione();
    	printf("Che operazione desideri fare?\n");
    	scanf(" %c", & op);
    
    	
            switch (op)
    		{
    		case 'u':
    		risultato = unione(insieme_1 ,insieme_2);
    		stampa_insieme(risultato);
    		break; 
    
    		case 'i':
    		risultato = intersezione(insieme_1, insieme_2);
    		stampa_insieme(risultato);
    		break;
    
    		case 'd':
    		risultato = differenza(insieme_1, insieme_2);
    		stampa_insieme(risultato);
    		break;
    		}
    
       free (risultato);
       free (insieme_2);
       free (insieme_1);
       system("PAUSE");
    return(0);	
    }
    int *acquisizione ()
    {
      int a,i,dim;
      int *insieme;
      a=0;
      printf("quanti elementi contiene l'insieme?");
      scanf(" %d", &dim);
      insieme = (int *)calloc(dim+1, sizeof (int));
      insieme[0]=dim;
      for(i=1;i<dim+1;i++)
      {
        printf("Inserisci il valore della %d^ posizione",i);
        scanf(" %d", &insieme[i]);
    		
       }
    return(insieme);
    	}
    
    void stampa_insieme (int *insieme)
    	{
    	int i;
    	
    		for(i=1;
    		   i<=insieme[0];
    		    i++)
    		{
    			printf("%d\n", insieme[i]);
    	
    		}
    	}
    
    int *unione (int insieme_1[], int insieme_2[])
    	{
        
         int j=1,i,k,found,dim;
         int *risultato;
        
         dim=insieme_1[0]+insieme_2[0]+1;
    
         risultato = (int *)calloc(dim, sizeof (int));
         for (i=1;
             i<=insieme_1[0];
              i++)
         {   
             found=0;
              for (k=1;
                   k<=insieme_2[0]+1;
                   k++) 
              {    
                   if (insieme_1[i]==insieme_2[k])
                   {
                   found=1;
                   k++;
                   break;
                   }
                   if (found!=1)
                   {
                    risultato[j]=insieme_1[i];
                   j++;
                 break;
                
                   }
                   
              }
         }           
         for (k=1;
             k<=insieme_2[0];
              k++)
         {
            risultato[j]=insieme_2[k];
            j++;  
         }
    	risultato[0]=j-1;
    	return(risultato);
    }
    		
    int *differenza (int insieme_1[], int insieme_2[])
    {
    	      int j=1,k,i,*risultato,found,dim;
    	          dim=insieme_1[0]+insieme_2[0];
         	      risultato = (int *)calloc(dim, sizeof (int));
                  
         for (i=1;
             i<=insieme_1[0];
              i++)
         {   
             found=0;
              for (k=1;
                  k<=insieme_2[0] && insieme_1[i]!=insieme_2[k];
                   k++) 
                   {    
                   if(insieme_1[i]==insieme_2[k])
                   {
                   found=1;
                   break;
                   }
                   if(!found)
                   {
                    risultato[j]=insieme_1[i];
                    j++;
                   }
                   
                   }
         }
         risultato[0]=j-1;           
    return (risultato);
    }
    
    
    
    int *intersezione (int insieme_1[], int insieme_2[])
    { 
    	int j,k,i,*risultato,dim;
    	dim=insieme_1[0]+insieme_2[0];
        risultato = (int *)calloc(dim, sizeof (int));
         
        j=1;
        for (i=1;
             i<=insieme_1[0];
             i++)
        {
             for (k=1;
                 k<=insieme_2[0] && insieme_1[i]!=insieme_2[k];
                  k++) 
             {    
                   if(insieme_1[i]==insieme_2[k])
                   {
                       risultato[j]=insieme_1[i];
                       j++;
                   }
             
             }
        }
     risultato[0]=j-1;
    return(risultato);
    }	
    
    
    questo è il programma che sto facendo come prova, poi dovrò dividerlo in piu file per fare la libreria!

    aspetto tue notizie,
    grazie mille!!!
  • Re: Esame programmazione

    Caspita ... ma non hai copiato bene il pezzo di codice della funz unione!!!

    1) if (!found) è diventata if (found!=1)
    ...poi La condizione deve stare fuori dal secondo ciclo non dentro!
    
    int *unione (int insieme_1[], int insieme_2[])
    {
        
      int j=1,i,k,dim;
      int found;
      int *risultato;
      
      dim=insieme_1[0]+insieme_2[0]+1;
    
      risultato= (int *)calloc(dim, sizeof (int));
      for (i=1;i<=insieme_1[0];i++)
      {   
        found=0;
        for (k=1;k<=insieme_2[0];k++) 
        {    
          if(insieme_1[i]==insieme_2[k])
          {
            found=1;
            break;
          }
        }
        if (!found)     
          risultato[j++]=insieme_1[i];
              
      }
      for (k=1;k<=insieme_2[0];k++)
        risultato[j++]=insieme_2[k];
      risultato[0]=j-1;
    
      
      return (risultato);
    }
    
  • Re: Esame programmazione

    Grazie mille di tutto!!
    scusami se ti ho fatto perdere tempo, ma le modifiche alla condizione del found le ho fatte dopo per provare quello ceh non avevo notato era la posizione dell'if fuori dal secondo ciclo!!



    Grazie ancora!

    saluti!

    Mattia
  • Re: Esame programmazione

    Comunque non è problema dell' IF ma della condizione insita nella seconda iterazione!

    Il problema dell'IF è logico ma non di funzionalità...
    Cioè FALSO == 0 , NOT FALSO DIVERSO da 0 ... DIVERSO da 1 per logica può essere VERO ma anche FALSO


    Non preoccuparti, non mi hai fatto perdere tempo e l'ho fatto con piacere


    Tanti Saluti
    Max
  • Re: Esame programmazione

    Ok ora il programma funziona e lo devo riscrivere come una libreria ansi C
    quindi vado ad implementare i seguenti file:

    progetto.h:
    /*intestazione della libreria per le operazioni tra insiemi*/
    
    /*dichiarazione delle fuzioni esportate*/
    
    extern int *acquisizione ();
    
    extern void stampa_insieme (int *);
    
    extern int *unione (int *, int *);
    
    extern int *differenza (int *, int *);
    
    extern int *intersezione (int *, int *);
    
    progetto.c:
    #include <stdio.h>
    #include <stdlib.h>
    
    int *acquisizione ();
    void stampa_insieme (int *);
    int *unione (int *, int *);
    int *differenza (int *, int *);
    int *intersezione (int *, int *);
    
    
    int *acquisizione ()
    {
      int a,i,dim;
      int *insieme;
      a=0;
      printf("quanti elementi contiene l'insieme?");
      scanf(" %d", &dim);
      insieme = (int *)calloc(dim+1, sizeof (int));
      insieme[0]=dim;
      for(i=1;i<dim+1;i++)
      {
        printf("Inserisci il valore della %d^ posizione",i);
        scanf(" %d", &insieme[i]);
    		
       }
    return(insieme);
    	}
    
    void stampa_insieme (int *insieme)
    	{
    	int i;
    	
    		for(i=1;
    		   i<=insieme[0];
    		    i++)
    		{
    			printf("%d\n", insieme[i]);
    	
    		}
    	}
    
    int *unione (int insieme_1[], int insieme_2[])
    {
       
      int j=1,i,k,dim;
      int found;
      int *risultato;
     
      dim=insieme_1[0]+insieme_2[0]+1;
    
      risultato= (int *)calloc(dim, sizeof (int));
      for (i=1;i<=insieme_1[0];i++)
      {   
        found=0;
        for (k=1;k<=insieme_2[0];k++)
        {   
          if(insieme_1[i]==insieme_2[k])
          {
            found=1;
            break;
          }
        }
        if (!found)     
          risultato[j++]=insieme_1[i];
             
      }
      for (k=1;k<=insieme_2[0];k++)
        risultato[j++]=insieme_2[k];
      risultato[0]=j-1;
    
     
      return (risultato);
    }
    		
    int *differenza (int insieme_1[], int insieme_2[])
    {
       
      int j=1,i,k,dim;
      int found;
      int *risultato;
     
      dim=insieme_1[0]+insieme_2[0]+1;
    
      risultato= (int *)calloc(dim, sizeof (int));
      for (i=1;i<=insieme_1[0];i++)
      {   
        found=0;
        for (k=1;k<=insieme_2[0];k++)
        {   
          if(insieme_1[i]==insieme_2[k])
          {
            found=1;
            break;
          }
        }
        if (!found)     
          risultato[j++]=insieme_1[i];
         risultato[0]=j-1;
         }           
    return (risultato);
    }
    
    
    
    int *intersezione (int insieme_1[], int insieme_2[])
    { 
    	int j,k,i,*risultato,dim,flag;
    	dim=insieme_1[0]+insieme_2[0];
        risultato = (int *)calloc(dim, sizeof (int));
         
        j=1;
        for (i=1;
             i<=insieme_1[0];
             i++)
        {
             flag=0;
             for (k=1;
                 k<=insieme_2[0];
                  k++) 
             {    
                   if(insieme_1[i]==insieme_2[k])
                   {
                       flag=1;
                   }
             
             }
             if (flag==1)
             {
             risultato[j++]=insieme_1[i];
             }
        }
     risultato[0]=j-1;
    return(risultato);
    }	
    e la main.c:
    #include "progetto.h"
    #include <stdio.h>
    
    
    int main (void)
    {
    	char op;
    	int  *insieme_1, *insieme_2,*risultato;
    	insieme_1=acquisizione();
    	stampa_insieme(insieme_1);
    	insieme_2=acquisizione();
    	printf("Che operazione desideri fare?\n");
    	scanf(" %c", & op);
    
    	
            switch (op)
    		{
    		case 'u':
    		risultato = unione(insieme_1 ,insieme_2);
    		stampa_insieme(risultato);
    		break; 
    
    		case 'i':
    		risultato = intersezione(insieme_1, insieme_2);
    		stampa_insieme(risultato);
    		break;
    
    		case 'd':
    		risultato = differenza(insieme_1, insieme_2);
    		stampa_insieme(risultato);
    		break;
    		}
    
       free (risultato);
       free (insieme_2);
       free (insieme_1);
       system("PAUSE");
    return(0);	
    }

    ma quando compilo la main mi dice che non trova le funzioni, quindi non trova la libreria che ho fatto?perchè come la devo richamare?

    ciao grazie
  • Re: Esame programmazione

    Devi linkarla con il main
Devi accedere o registrarti per scrivere nel forum
16 risposte