Elementi comuni

di il
8 risposte

Elementi comuni

Salve, devo realizzare un programma in c che mi trova gli elementi comuni tra due insiemi ,gli elementi possono essere numeri o parole.
Io imposterei il programma dichiarando prima di tutto un tipo di struttura che contiene i numeri ,i caratteri e la dimensione dell' insieme.

typedef struct {
int numero;
char caratteri;
int dim;
}elementi;

Però dopo non so come dovrei impostare il programma, devo usare due vettori , uno per le stringhe e uno per i numeri ?

TRACCIA:
Dati 2 insiemi di elementi I1 e I2, di cardinalità n ed m rispettivamente, scrivere un algoritmo in grado di individuare gli elementi comuni ai 2 insiemi
ESEMPIO:
I1 = {pietra, 15, Fabio, 10.5, astrazione, voto} con n = 6
I2 = {4, Fabio, pietre, 15, T, voto, domani} con m = 7
Gli elementi in comune sono 15, Fabio, voto

8 Risposte

  • Re: Elementi comuni

    E' meglio usare solo delle stringhe in cui inserirai i valori numerici (come sequenza di caratteri). Quindi
    
    #define LENW 30
    #define N 6
    #define M 7
    
    e
    
    	char I1[N][LENW] = { "pietra", "15", "Fabio", "10.5", "astrazione", "voto" };
    	char I2[M][LENW] = { "4", "Fabio", "pietre", "15", "T", "voto", "domani" };
    
    poi ragiona sul codice per realizzare l'algoritmo ..
  • Re: Elementi comuni

    Considera anche l’esistenza dell’header string.h per funzioni per manipolazione di stringhe, tra cui strcmp…
  • Re: Elementi comuni

    Ho realizzato il programma, funziona però oltre a stampare quello che dovrebbe stampare mi stampa anche caratteri ascii come ad esempio @ |+
    questo è il codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define n 5
    #define d 10
    
    void TrovaElementiUguali(char V1[n][d],char V2[n][d],char V3[n][d]);
    
    int main()
    {
        char V1[n][d];
        char V2[n][d];
        char V3[n][d]; //vettore di stringhe in cui andare a inserire gli elementi presenti sia in V1 che in V2
    
        int i;
        for (i=0;i<n;i++){
            printf("inserisci la %d-esima stringa nel primo vettore: ",i);
            scanf("%s",V1[i]);
        }
        printf("\n");
        for (i=0;i<n;i++){
            printf("inserisci la %d-esima stringa nel secondo vettore: ",i);
            scanf("%s",V2[i]);
        }
        TrovaElementiUguali(V1,V2,V3);
        printf("Gli elementi comuni ai due vettori sono: ");
        for (i=0;i<n;i++){
            printf("%s\t",V3[i]);
        }
        return 0;
    }
    
    void TrovaElementiUguali(char V1[n][d],char V2[n][d],char V3[n][d]){
        int i,j;
        for (i=0;i<n;i++){
                for (j=0;j<n;j++){
                        if (strcmp(V1[i],V2[j])==0){
                            (strcpy(V3[i],V1[i]));
                        }
                }
        }
    }
    questo è un esempio di cosa mi stampa:
    inserisci la 0-esima stringa nel primo vettore: prova
    inserisci la 1-esima stringa nel primo vettore: uno
    inserisci la 2-esima stringa nel primo vettore: due
    inserisci la 3-esima stringa nel primo vettore: tre
    inserisci la 4-esima stringa nel primo vettore: quattro
    
    inserisci la 0-esima stringa nel secondo vettore: quattro
    inserisci la 1-esima stringa nel secondo vettore: due
    inserisci la 2-esima stringa nel secondo vettore: tre
    inserisci la 3-esima stringa nel secondo vettore: cinque
    inserisci la 4-esima stringa nel secondo vettore: sei
    Gli elementi comuni ai due vettori sono:  L¦` due tre quattro
    Process returned 0 (0x0)   execution time : 23.995 s
    Press any key to continue.
    
  • Re: Elementi comuni

    thomas99 ha scritto:


    ... funziona però ...
    O funziona o non funziona.

    E poi la traccia parlava di due vettori con cardinalità m e n. E tu non l'hai fatto, eppure te lo avevo indicato.
  • Re: Elementi comuni

    Si, per adesso gli ho fatti di cardinalità uguale, non ci metto niente a inserire un nuovo define, il problema è che ora stampa caratteri che non dovrebbe stampare.
  • Re: Elementi comuni

    ... li ho fatti ...

    Non è solo un define che devi aggiungere attenzione ...

    Comunque

    1) Il codice della funzione è sbagliato quando esegui la strcpy ... l'indice che usi con V3 non deve essere i (rifletti)

    2) quando visualizzi gli elementi comuni all'uscita, chi ti dice che siano n ? Non sai quanti sono perché non li conti ...
  • Re: Elementi comuni

    Ok grazie, ora funziona.
    Ho modificato il codice nel modo seguente:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N 6
    #define M 7
    #define D 6 //ci possono essere massimo 6 elementi in comune tra i due vettori di stringhe
    #define LENW 20
    
    int TrovaElementiUguali(char V1[N][LENW],char V2[M][LENW],char V3[N][LENW]);
    
    int main()
    {
    
        char V1[N][LENW];
        char V2[M][LENW];
        char V3[D][LENW]; //vettore di stringhe in cui andare a inserire gli elementi presenti sia in V1 che in V2
    
        int i;
        for (i=0;i<N;i++){
            printf("inserisci la %d-esima stringa nel primo vettore: ",i);
            scanf("%s",V1[i]);
        }
        printf("\n");
        for (i=0;i<M;i++){
            printf("inserisci la %d-esima stringa nel secondo vettore: ",i);
            scanf("%s",V2[i]);
        }
        int dim;
        dim = TrovaElementiUguali(V1,V2,V3);
        printf("Gli elementi comuni ai due vettori sono: ");
        for (i=0;i<dim;i++){
            printf("%s  ",V3[i]);
        }
        return 0;
    }
    
    int TrovaElementiUguali(char V1[N][LENW],char V2[M][LENW],char V3[N][LENW]){
        int i,j,cont;
        cont = 0;
        for (i=0;i<N;i++){
                for (j=0;j<M;j++){
                        if (strcmp(V1[i],V2[j])==0){
                            (strcpy(V3[cont],V1[i]));
                            cont++;
                        }
                }
        }
       return cont;
    }
    quindi ho capito che quando si lavora con le stringhe bisogna:
    1. utilizzare le funzioni apposite , ad esempio se voglio confrontare gli elementi di due vettori di stringhe non posso fare if(V1[0]==V2[0]) ma devo usare la funzione strcmp
    2.se un vettore non viene scritto interamente non lo posso leggere per intero , ma devo leggere solo le caselle che sono state scritte
    Giusto?
  • Re: Elementi comuni

    La 1) sì, ma le funzioni stringa sono una comodità, puoi riscriverle anche tu confrontando carattere per carattere. Altra storia è fare == che è *sbagliato* perché confronti puntatori

    Per la 2), è ovvio. Se hai un insieme di cassetti e non li riempi tutti, perché dopo controlli il contenuto di *tutti* i cassetti?
Devi accedere o registrarti per scrivere nel forum
8 risposte