Fusione..?(anche di cervello)

di il
9 risposte

Fusione..?(anche di cervello)

Devo fondere utente con utente2.
mi date una mano?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUMERO 5
//dichiaro una struct di nome elenco dentro la quale specifico il tipo dei dati costituenti gli utenti
struct elenco {
       char *cognome;
       char *nome;
       char *domicilio;
       char *numero_telefonico;
       };
typedef struct elenco Elenco;
main()
{

    int i;
 Elenco utenti[] =    {{"Rossi","Ugo","Via Scala", "081/4617899"},
                      {"Della Morte","Angelo","Via Mare", "081/5058963"},
                      {"La Vespa","Guido","Via lunga", "081/3652596"},
                      {"Baccano","Massimo","Via micia", "081/5037514"},
                      {"Matri","Luciano","Via dei ladri", "081/2569632"},
                        };
    Elenco utenti2[]={{"Triste","Felice","Via della gioia", "081/5094563"},
                      {"Caio","Felice","Via della liberazione", "081/5236218"},
                      {"Marzullo","Giuseppe","Via notturna", "081/4587269"},
                      {"Caccia","Giulio","Via sparo", "081/74611528"},
                      {"Lungo","Mattia","Via stretta", "081/4398222"}};
    Elenco utenti3[];
// printf("%s\n",utenti[0].cognome);
//printf("%s\n",utenti2[0].cognome);
ord_sel_max (utenti,5);
ord_sel_max (utenti2,5);
for(i=0;i<5;i++)
{
printf("%s %s %s %s\n",utenti[i].cognome,utenti[i].nome,utenti[i].domicilio,utenti[i].numero_telefonico);
}


}

void ord_sel_max (Elenco array[],int n)
{
     int i, indice_max;//ho dichiarato le variabili i per il ciclo for e indice_max per l'indice del massimo della struct
     char *max_array;// è una varibile dove verrà memorizzato la stringa di ordine alfabetico maggiore
     for(i=0;i<n-1;i++)// inizia il ciclo for
     {
         max_val_ind(&array[i], n-i, max_array, &indice_max);//richiama la function max_val_int dove vengono passati l'array n-i max array e indice max

         scambiare_c(&array[i], &array[indice_max+i]);//viene richiamata nell function scambiare C dove vengono passati l'array e l'array con l'indice masssimo
     }
}
void max_val_ind (Elenco a[], int n, char *max_array, int *i_max)

{
     int i;
     max_array = a[0].cognome;//Inizializzo max_array cn il il primo cognome dell'elenco
     *i_max = 0;//inizializzo i_max a 0
     for (i=1;i<n;i++)//inizio il ciclo for
     if( strcmp(max_array,  a[i].cognome)> 0)//applico il costrutto di controllo if per trovare il massimo dell'array
      {
             max_array = a[i].cognome;
             *i_max =i;
      }
}
void scambiare_c( Elenco s1[], Elenco s2[])
{

     char *temp_cognome;//dichiaro una variabile temporanea di puntatore a char
     char *temp_nome;//dichiaro una variabile temporanea di puntatore a char
     char *temp_domicilio;//dichiaro una variabile temporanea di puntatore a char
     char *temp_numero_telefonico;//dichiaro una variabile temporanea di puntatore a char

         temp_cognome=s1->cognome;//copio il valore della stringa contenuta nella struct nella variabile temporanea
         temp_nome=s1->nome;// copio il valore della stringa contenuta nella struct nella variabile temporanea
         temp_domicilio=s1->domicilio;//copio il valore della stringa contenuta nella struct nella variabile temporanea
         temp_numero_telefonico=s1->numero_telefonico;//  copio il valore della stringa contenuta nella struct nella variabile temporanea

         s1->cognome=s2->cognome; // copio il valore della stringa contenuta nella struct s2 alla struct s1
         s1->nome=s2->nome;//copio il valore della stringa contenuta nella struct s2 alla struct s1
         s1->domicilio=s2->domicilio;//copio il valore della stringa contenuta nella struct s2 alla struct s1
         s1->numero_telefonico=s2->numero_telefonico;//copio il valore della stringa contenuta nella struct s2 alla struct s1

         s2->cognome=temp_cognome;//copio il valore della stringa contenuta nella variabile temporanea alla struct s1
         s2->nome=temp_nome;//copio il valore della stringa contenuta nella variabile temporanea alla struct s1
         s2->domicilio=temp_domicilio;//copio il valore della stringa contenuta nella variabile temporanea alla struct s1
         s2->numero_telefonico=temp_numero_telefonico;//copio il valore della stringa contenuta nella variabile temporanea alla struct s1
}


void fusione(Elenco a[],int na,Elenco b[],int nb,Elenco c[])
{
    int ia=0,ib=0,ic=0;
    for (ic=0;ic<na+nb;ic++)
{
    if(ia<na && ib<nb)
    {
    if (a[ia].cognome<b[ib].cognome)
        {
        strcpy(c[ic].nome,a[ia].nome);
        strcpy(c[ic].domicilio,a[ia].domicilio);
        strcpy(c[ic].numero_telefonico,a[ia].numero_telefonico);
        c[ic].cognome=a[ia].cognome;
        ia++;
        }
    else
        {
          strcpy(c[ic].nome,b[ib].nome);
          strcpy(c[ic].domicilio,b[ib].domicilio);
          strcpy(c[ic].numero_telefonico,b[ib].numero_telefonico);
         c[ic].cognome=b[ib].cognome;
           ib++;
           }
    }
    else if  (ib>=nb)
    {   strcpy(c[ic].nome,a[ia].nome);
        strcpy(c[ic].domicilio,a[ia].domicilio);
        strcpy(c[ic].numero_telefonico,a[ia].numero_telefonico);
        c[ic].cognome=a[ia].cognome;
        ia++;
    }

    else
    {   strcpy(c[ic].nome,b[ib].nome);
        strcpy(c[ic].domicilio,b[ib].domicilio);
        strcpy(c[ic].numero_telefonico,b[ib].numero_telefonico);
        c[ic].cognome=b[ib].cognome;
        ib++;
    }
}
}


   

9 Risposte

  • Re: Fusione..?(anche di cervello)

    Per aumentare le probabilità di ricevere una risposta, ti consiglio di spiegare meglio:
    - quello che stai cercando di fare;
    - l'algoritmo adottato;
    - i problemi riscontrati.
  • Re: Fusione..?(anche di cervello)

    Grazie nippolo.
    mi sto esercitando
    Devo praticamente fare il merge tra quegli elenchi
    il problema è che dopo aver chiamato la function si blocca e crash
  • Re: Fusione..?(anche di cervello)

    A me quel codice non compila:
    - le funzioni vengono richiamate prima di essere dichiarate;
    - manca la dimensione dell'array utenti3;
    - la funzione main() dovrebbe tornare un int.

    Posta un codice compilabile e poi parliamo degli eventuali problemi riscontrati.
  • Re: Fusione..?(anche di cervello)

    A me compila
    sisi dopo modifico
    La dimensione di utenti 3 dovrebbe essere uguale al size di utenti + utenti 2( se utenti è di 5 e utente 2 è 5
    Utenti3 è 10)
  • Re: Fusione..?(anche di cervello)

    Nippolo ha scritto:


    A me quel codice non compila:
    - le funzioni vengono richiamate prima di essere dichiarate;
    - manca la dimensione dell'array utenti3;
    - la funzione main() dovrebbe tornare un int.

    Posta un codice compilabile e poi parliamo degli eventuali problemi riscontrati.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define NUMERO 5
    
    //dichiaro una struct di nome elenco dentro la quale specifico il tipo dei dati costituenti gli utenti
    struct elenco {
           char *cognome;
           char *nome;
           char *domicilio;
           char *numero_telefonico;
           };
    typedef struct elenco Elenco;
    
    void fusione(Elenco a[],int na,Elenco b[],int nb,Elenco c[]);
    void ord_sel_max (Elenco array[],int n);
    void max_val_ind (Elenco a[], int n, char *max_array, int *i_max);
    void scambiare_c( Elenco s1[], Elenco s2[]);
     int main()
    {
    
        int i;
        Elenco utenti[]={{"Rossi","Ugo","Via Scala", "081/4617899"},
                          {"Della Morte","Angelo","Via Mare", "081/5058963"},
                          {"La Vespa","Guido","Via lunga", "081/3652596"},
                          {"Baccano","Massimo","Via micia", "081/5037514"},
                          {"Matri","Luciano","Via dei ladri", "081/2569632"},
                            };
        Elenco utenti2[]={{"Triste","Felice","Via della gioia", "081/5094563"},
                          {"Caio","Felice","Via della liberazione", "081/5236218"},
                          {"Marzullo","Giuseppe","Via notturna", "081/4587269"},
                          {"Caccia","Giulio","Via sparo", "081/74611528"},
                          {"Lungo","Mattia","Via stretta", "081/4398222"}};
        Elenco utenti3[100];
    ord_sel_max (utenti,5);
    ord_sel_max (utenti2,5);
    for(i=0;i<5;i++)
    printf("\n%s %s %s %s",utenti[i].cognome,utenti[i].nome,utenti[i].domicilio,utenti[i].numero_telefonico);
    
    /*fusione(utenti,na,utenti2,nb,utenti3);*/
    return 0;
    }
    
    void ord_sel_max (Elenco array[],int n)
    {
         int i, indice_max;//ho dichiarato le variabili i per il ciclo for e indice_max per l'indice del massimo della struct
         char *max_array;// è una varibile dove verrà memorizzato la stringa di ordine alfabetico maggiore
         for(i=0;i<n-1;i++)// inizia il ciclo for
         {
             max_val_ind(&array[i], n-i, max_array, &indice_max);//richiama la function max_val_int dove vengono passati l'array n-i max array e indice max
    
             scambiare_c(&array[i], &array[indice_max+i]);//viene richiamata nell function scambiare C dove vengono passati l'array e l'array con l'indice masssimo
         }
    }
    void max_val_ind (Elenco a[], int n, char *max_array, int *i_max)
    
    {
         int i;
         max_array = a[0].cognome;//Inizializzo max_array cn il il primo cognome dell'elenco
         *i_max = 0;//inizializzo i_max a 0
         for (i=1;i<n;i++)//inizio il ciclo for
         if( strcmp(max_array,  a[i].cognome)> 0)//applico il costrutto di controllo if per trovare il massimo dell'array
          {
                 max_array = a[i].cognome;
                 *i_max =i;
          }
    }
    void scambiare_c( Elenco s1[], Elenco s2[])
    {
    
         char *temp_cognome;//dichiaro una variabile temporanea di puntatore a char
         char *temp_nome;//dichiaro una variabile temporanea di puntatore a char
         char *temp_domicilio;//dichiaro una variabile temporanea di puntatore a char
         char *temp_numero_telefonico;//dichiaro una variabile temporanea di puntatore a char
    
             temp_cognome=s1->cognome;//copio il valore della stringa contenuta nella struct nella variabile temporanea
             temp_nome=s1->nome;// copio il valore della stringa contenuta nella struct nella variabile temporanea
             temp_domicilio=s1->domicilio;//copio il valore della stringa contenuta nella struct nella variabile temporanea
             temp_numero_telefonico=s1->numero_telefonico;//  copio il valore della stringa contenuta nella struct nella variabile temporanea
    
             s1->cognome=s2->cognome; // copio il valore della stringa contenuta nella struct s2 alla struct s1
             s1->nome=s2->nome;//copio il valore della stringa contenuta nella struct s2 alla struct s1
             s1->domicilio=s2->domicilio;//copio il valore della stringa contenuta nella struct s2 alla struct s1
             s1->numero_telefonico=s2->numero_telefonico;//copio il valore della stringa contenuta nella struct s2 alla struct s1
    
             s2->cognome=temp_cognome;//copio il valore della stringa contenuta nella variabile temporanea alla struct s1
             s2->nome=temp_nome;//copio il valore della stringa contenuta nella variabile temporanea alla struct s1
             s2->domicilio=temp_domicilio;//copio il valore della stringa contenuta nella variabile temporanea alla struct s1
             s2->numero_telefonico=temp_numero_telefonico;//copio il valore della stringa contenuta nella variabile temporanea alla struct s1
    }
    
    
    void fusione(Elenco a[],int na,Elenco b[],int nb,Elenco c[])
    {
        int ia=0,ib=0,ic=0;
    
        for (ic=0;ic<10;ic++)
    {
        if(ia<5 && ib<5)
        {
        if (a[ia].cognome<b[ib].cognome)
            {
            strcpy(c[ic].nome,a[ia].nome);
            strcpy(c[ic].domicilio,a[ia].domicilio);
            strcpy(c[ic].numero_telefonico,a[ia].numero_telefonico);
            c[ic].cognome=a[ia].cognome;
            ia++;
            }
        else
            {
              strcpy(c[ic].nome,b[ib].nome);
              strcpy(c[ic].domicilio,b[ib].domicilio);
              strcpy(c[ic].numero_telefonico,b[ib].numero_telefonico);
             c[ic].cognome=b[ib].cognome;
               ib++;
               }
        }
        else if  (ib>=5)
        {   strcpy(c[ic].nome,a[ia].nome);
            strcpy(c[ic].domicilio,a[ia].domicilio);
            strcpy(c[ic].numero_telefonico,a[ia].numero_telefonico);
            c[ic].cognome=a[ia].cognome;
            ia++;
        }
    
        else
        {   strcpy(c[ic].nome,b[ib].nome);
            strcpy(c[ic].domicilio,b[ib].domicilio);
            strcpy(c[ic].numero_telefonico,b[ib].numero_telefonico);
            c[ic].cognome=b[ib].cognome;
            ib++;
        }
    }
    }
    
    
    a me compila ora ho messo la function fusione come commento avrei bisogno di una mano a far funzionare quella function
  • Re: Fusione..?(anche di cervello)

    Nessuno?
  • Re: Fusione..?(anche di cervello)

    Nel main nella riga
    fusione(utenti,na,utenti2,nb,utenti3);
    passi na e nb senza dichiararli, cosa dovrebbero rappresentare?
    Mi spieghi semplicemente cosa dovrebbe fare il programma? Passi due liste di utenti e fusione li mette insieme evitando le ripetizioni?

    nella riga 97:
    a[ia].cognome<b[ib].cognome)
    sei sicuro tu voglia fare questo tipo di confronto? perché il confronto tra stringhe si fa con la funzione strlen()
    idem qua
    c[ic].cognome=a[ia].cognome;
    cortesemente spiegami cosa fanno tutte le funzioni in poche parole
  • Re: Fusione..?(anche di cervello)

    enricoscarsissimo ha scritto:


    Nel main nella riga
    fusione(utenti,na,utenti2,nb,utenti3);
    passi na e nb senza dichiararli, cosa dovrebbero rappresentare?
    Mi spieghi semplicemente cosa dovrebbe fare il programma? Passi due liste di utenti e fusione li mette insieme evitando le ripetizioni?

    nella riga 97:
    a[ia].cognome<b[ib].cognome)
    sei sicuro tu voglia fare questo tipo di confronto? perché il confronto tra stringhe si fa con la funzione strlen()
    idem qua
    c[ic].cognome=a[ia].cognome;
    cortesemente spiegami cosa fanno tutte le funzioni in poche parole
    Allora si scusa na e nb dovrebbero rappresentare il size della prima lista e nb il size della 2 lista
    a[ia].cognome<b[ib].cognome)
    non deve fare il confronto (Numerico ) ma dovrebbe confrontare se il cognome sia più grande o più piccolo
    ragionando in termini numerici
    esempio a[2],b[2]

    a[0]=1
    a[1]=5

    b[0]=2
    b[1]=6
    il vettore c sarà di quattro elementi e sarà
    c[0]=1
    c[1]=2
    c[2]=5
    c[3]=6
    a[ia].cognome<b[ib].cognome)
    in questo casa va a vedere se l'elemento di a è più piccolo di b se A è più piccolo lo andiamo a mettere in c e incremento gli indici.
    ti allego l'algoritmo completo
    
    void fusioneC(char a[],int n_a,char b[],int n_b,char c[])
    {
    int i_a=0,i_b=0,i_c;
    for (i_c=0; i_c < n_a+n_b; i_c++)
    {
    if(i_a<n_a && i_b<n_b)
    {
    if(a[i_a] < b[i_b]){
    c[i_c] = a[i_a];
    ia++;}
    else {
    c[i_c] = b[i_b];
    ib++;}
    }
    else if(i_b >= n_b) {
    c[i_c] = a[i_a];
    ia++;}
    else {
    c[i_c] = b[i_b];
    ib++;}
    }
    }
    
  • Re: Fusione..?(anche di cervello)

    0
Devi accedere o registrarti per scrivere nel forum
9 risposte