Dubbi sui vettori (Linguaggio C) [creare un terzo vettori con i valori in comune]

di il
8 risposte

Dubbi sui vettori (Linguaggio C) [creare un terzo vettori con i valori in comune]

Buon giorno e buon lunedì. Devo eseguire un esercizio molto basilare, ma per quanto possa essere banale non riesco a venirne fuori.
Andiamo al punto...Devo creare un programma dove l'utente definisce la grandezza di due VETTORI e inserisce anche i valori.
Dopo aver dato i valori ai due vettori il programma deve creare un TERZO VETTORE che acquisirà i valori in comune dei due vettori.
ES:
Vett1[4] -2,3,6,1;
Vett2[6] 9,6,2,5,-2,3;
Vett3[n] -2, 3, 6;
Riesco ad acquisire i due vettori:

int size1, size2, vett1[10], vett2[10], vett3[10], i, j, k;
printf("Inserisci il numero di valori del PRIMO vettore --> ");
scanf("%d", & size1);
printf("\n");
printf("Inserisci il numero di valori del SECONDO vettore --> ");
scanf("%d", & size2);
printf("\n");
printf("Il PRIMO vettore avra' %d celle, mentre il SECONDO vettore ne avra' %d", size1, size2);
printf("\n\n");
for (i=0; i<size1; i++)
{
printf("Inserisci il valore che avra' la cella numero %d del PRIMO vetore: ", i);
scanf("%d", &vett1);
printf("\n");
}
for (j=0; j<size2; j++)
{
printf("Inserisci il valore che avra' la cella numero %d del SECONDO vetore: ", j);
scanf("%d", &vett2[j]);
printf("\n");
}


L'unico problema è che non so come trovare Vett[3]. Pensavo di fare 2 ciclii for annidati e un if, come il seguente:

for (i=0; i<size1; i++)
{
for (j=0; j <size2; j++)

if (vett1 = vett2[j])
{
vett3[k] = vett1;

}
non posso fare3 ciclii for perché non ho idea di quanto è grande il TERZO VETTORE, inoltre non saprei come stamparlo per lo stesso motivo.
Grazie mille in anticipo e scusatemi per la mia ignoranza.

8 Risposte

  • Re: Dubbi sui vettori (Linguaggio C) [creare un terzo vettori con i valori in comune]

    Può andare ma k deve cominciare da 0 ed essere incrementato ogni volta che assegni un valore a vett3.

    Alla fine i valori da visualizzare da vett3 saranno k-1

    P.S. Utilizza i tag CODE per il codice
  • Re: Dubbi sui vettori (Linguaggio C) [creare un terzo vettori con i valori in comune]

    oregon ha scritto:


    Può andare ma k deve cominciare da 0 ed essere incrementato ogni volta che assegni un valore a vett3.

    Alla fine i valori da visualizzare da vett3 saranno k-1

    P.S. Utilizza i tag CODE per il codice

    Ho provato a fare così.

    for (i=0; i<size1; i++)
    {
    for (j=0; j <size2; j++)
    {
    for (k=0; k<size1; k++)
    {
    if (vett1 = vett2[j])
    {
    vett3[k] = vett1;
    }

    }

    }

    }
    printf("Questi sono i valori in comune tra il PRIMO vettore e il SECONDO vettore\n");
    printf("\n");
    for (k=0; k<size1; k++)
    {
    printf("Ecco il valore della cella numero %d --> %d",k,vett3[k]);
    printf("\n");
    }
    return 0;
    }[/b][/b]


    Il problema è che sovrascrive i valori quindi alla fine il vett3 sarà composto solo da valori uguali.
  • Re: Dubbi sui vettori (Linguaggio C) [creare un terzo vettori con i valori in comune]

    Ma hai letto bene quello che ti ho suggerito prima?
  • Re: Dubbi sui vettori (Linguaggio C) [creare un terzo vettori con i valori in comune]

    oregon ha scritto:


    Ma hai letto bene quello che ti ho suggerito prima?
    Si ho letto il messaggio, adesso ho messo k=0, ma il programma continua a fare il birbante. Mi stampa i valori della secondo vettore senza motivo. Ora sto chiedendo consigli in giro.
  • Re: Dubbi sui vettori (Linguaggio C) [creare un terzo vettori con i valori in comune]

    Provo ad aiutarti modificando leggermente il tuo codice...
    Innanzitutto dovresti far meglio uso dei \n all'interno delle printf... per pulizia del codice...
    Non conosci quindi a priori la dimensione del vettore, perche' presupponi che sia di dieci elementi? Addirittura il terzo lo metti anch'esso a 10 elementi? Qualora il vettore A contenga 10 elementi uguali al vettore B, come minimo dovrebbe avere una dimensione pari a quella di A e B altrimenti rischi seriamente un segmentation fault...

    
    int size1, size2, i, j, k = 0;
    int *vett1, *vett2, *vett3 = NULL;
    
    printf("Inserisci il numero di valori del PRIMO vettore --> ");
    scanf("%d", &size1);
    if(size1 <= 0){
    	printf("Valore non congruo\nUscita\n);
    	exit(EXIT_FAILURE);
    } 
    vett1 = (int*)malloc(size1*sizeof(int));
    
    printf("\nInserisci il numero di valori del SECONDO vettore --> ");
    scanf("%d", &size2);
    if(size2 <= 0){
    	printf("Valore non congruo\nUscita\n);
    	exit(EXIT_FAILURE);
    }
    vett2 = (int*)malloc(size2*sizeof(int));
    
    printf("\nIl PRIMO vettore avra' %d celle, mentre il SECONDO vettore ne avra' %d\n\n", size1, size2);
    
    for (i=0; i<size1; i++){
    	printf("Inserisci il valore che avra' la cella numero %d del PRIMO vetore: ", i);
    	scanf("%d", &vett1[i]);
    	printf("\n");
    }
    
    for (j=0; j<size2; j++){
    	printf("Inserisci il valore che avra' la cella numero %d del SECONDO vetore: ", j);
    	scanf("%d", &vett2[j]);
    	printf("\n");
    }
    
    vett3 =  = (int*)malloc((size1+size2)*sizeof(int)); //Qui avremmo potuto fare altre ottimizzazioni ma approssimiamo al caso peggiore in cui gli elementi sia tutti uguali!
    
    for (i=0; i<size1; i++){
    	for (j=0; j <size2; j++)
    		if (vett1[i] = vett2[j]) vett3[k++] = vett1[i]; //Qui non incrementavi il k!
    }
    
    return;
    
  • Re: Dubbi sui vettori (Linguaggio C) [creare un terzo vettori con i valori in comune]

    kcris22 ha scritto:


    Provo ad aiutarti modificando leggermente il tuo codice...
    Innanzitutto dovresti far meglio uso dei \n all'interno delle printf... per pulizia del codice...
    Non conosci quindi a priori la dimensione del vettore, perche' presupponi che sia di dieci elementi? Addirittura il terzo lo metti anch'esso a 10 elementi? Qualora il vettore A contenga 10 elementi uguali al vettore B, come minimo dovrebbe avere una dimensione pari a quella di A e B altrimenti rischi seriamente un segmentation fault...

    
    int size1, size2, i, j, k = 0;
    int *vett1, *vett2, *vett3 = NULL;
    
    printf("Inserisci il numero di valori del PRIMO vettore --> ");
    scanf("%d", &size1);
    if(size1 <= 0){
    	printf("Valore non congruo\nUscita\n);
    	exit(EXIT_FAILURE);
    } 
    vett1 = (int*)malloc(size1*sizeof(int));
    
    printf("\nInserisci il numero di valori del SECONDO vettore --> ");
    scanf("%d", &size2);
    if(size2 <= 0){
    	printf("Valore non congruo\nUscita\n);
    	exit(EXIT_FAILURE);
    }
    vett2 = (int*)malloc(size2*sizeof(int));
    
    printf("\nIl PRIMO vettore avra' %d celle, mentre il SECONDO vettore ne avra' %d\n\n", size1, size2);
    
    for (i=0; i<size1; i++){
    	printf("Inserisci il valore che avra' la cella numero %d del PRIMO vetore: ", i);
    	scanf("%d", &vett1[i]);
    	printf("\n");
    }
    
    for (j=0; j<size2; j++){
    	printf("Inserisci il valore che avra' la cella numero %d del SECONDO vetore: ", j);
    	scanf("%d", &vett2[j]);
    	printf("\n");
    }
    
    vett3 =  = (int*)malloc((size1+size2)*sizeof(int)); //Qui avremmo potuto fare altre ottimizzazioni ma approssimiamo al caso peggiore in cui gli elementi sia tutti uguali!
    
    for (i=0; i<size1; i++){
    	for (j=0; j <size2; j++)
    		if (vett1[i] = vett2[j]) vett3[k++] = vett1[i]; //Qui non incrementavi il k!
    }
    
    return;
    


    Ho messo i vettori a 10 elementi perché nel linguaggio c non si possono creare vettori variabili, correggimi se sbaglio.
  • Re: Dubbi sui vettori (Linguaggio C) [creare un terzo vettori con i valori in comune]

    RobertoInfo ha scritto:


    kcris22 ha scritto:


    Provo ad aiutarti modificando leggermente il tuo codice...
    Innanzitutto dovresti far meglio uso dei \n all'interno delle printf... per pulizia del codice...
    Non conosci quindi a priori la dimensione del vettore, perche' presupponi che sia di dieci elementi? Addirittura il terzo lo metti anch'esso a 10 elementi? Qualora il vettore A contenga 10 elementi uguali al vettore B, come minimo dovrebbe avere una dimensione pari a quella di A e B altrimenti rischi seriamente un segmentation fault...

    
    int size1, size2, i, j, k = 0;
    int *vett1, *vett2, *vett3 = NULL;
    
    printf("Inserisci il numero di valori del PRIMO vettore --> ");
    scanf("%d", &size1);
    if(size1 <= 0){
    	printf("Valore non congruo\nUscita\n);
    	exit(EXIT_FAILURE);
    } 
    vett1 = (int*)malloc(size1*sizeof(int));
    
    printf("\nInserisci il numero di valori del SECONDO vettore --> ");
    scanf("%d", &size2);
    if(size2 <= 0){
    	printf("Valore non congruo\nUscita\n);
    	exit(EXIT_FAILURE);
    }
    vett2 = (int*)malloc(size2*sizeof(int));
    
    printf("\nIl PRIMO vettore avra' %d celle, mentre il SECONDO vettore ne avra' %d\n\n", size1, size2);
    
    for (i=0; i<size1; i++){
    	printf("Inserisci il valore che avra' la cella numero %d del PRIMO vetore: ", i);
    	scanf("%d", &vett1[i]);
    	printf("\n");
    }
    
    for (j=0; j<size2; j++){
    	printf("Inserisci il valore che avra' la cella numero %d del SECONDO vetore: ", j);
    	scanf("%d", &vett2[j]);
    	printf("\n");
    }
    
    vett3 =  = (int*)malloc((size1+size2)*sizeof(int)); //Qui avremmo potuto fare altre ottimizzazioni ma approssimiamo al caso peggiore in cui gli elementi sia tutti uguali!
    
    for (i=0; i<size1; i++){
    	for (j=0; j <size2; j++)
    		if (vett1[i] = vett2[j]) vett3[k++] = vett1[i]; //Qui non incrementavi il k!
    }
    
    return;
    


    Ho messo i vettori a 10 elementi perché nel linguaggio c non si possono creare vettori variabili, correggimi se sbaglio.
    Se leggi il mio codice, ti ho fatto vedere un metodo veloce per farlo... Usa la malloc per l'allocazione dinamica... Tuttavia puoi farli anche da 10 elementi ma mi sembra una limitazione...
  • Re: Dubbi sui vettori (Linguaggio C) [creare un terzo vettori con i valori in comune]

    Ho rivisto il codice con maggiore calma ed effettivamente c'era qualche errore... Ora l'ho compilato e testato... Ci sono poche funzioni e concetti che credo ti serva imparare... puntatori, malloc, realloc e sizeof....
    Avremmo potuto renderla molto piu' facile allocando con delle dimensioni fisse gli array ma non avremmo ottenuto la flessibilita' di realizzare un programma che vada bene per un qualsiasi set di input...
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(){
    
    int size1, size2, size3, i, j, k = 0;
    int *vett1, *vett2, *vett3 = NULL; //NULL e' una parola chiave per indicare che un puntatore non punta a nulla
    
    printf("Inserisci il numero di valori del PRIMO vettore -->\n");
    scanf("%d", &size1);
    
    if(size1 <= 0){
    	printf("Valore non congruo\nUscita\n");
    	exit(EXIT_FAILURE); //"EXIT FAILURE" e' una costante definita nella stdlib.h per indicare al programma di uscire con errore
    }
    vett1 = (int*)malloc(size1*sizeof(int)); //malloc e' una funzione definita in stdlib.h e sizeof e' un operatore unario del C che restituisce il numero di byte di un dato tipo?
    
    printf("Inserisci il numero di valori del SECONDO vettore -->\n");
    scanf("%d", &size2);
    
    if(size2 <= 0){
    	printf("Valore non congruo\nUscita\n");//è una verifica?
    	exit(EXIT_FAILURE);
    }
    
    vett2 = (int*)malloc(size2*sizeof(int));
    
    printf("\nIl PRIMO vettore avra' %d celle, mentre il SECONDO vettore ne avra' %d\n\n", size1, size2);
    
    for (i=0; i<size1; i++){
    	printf("Inserisci il valore che avra' la cella numero %d del PRIMO vetore: ", i);
    	scanf("%d", &vett1[i]);
    	printf("\n");
    }
    
    for (j=0; j<size2; j++){
    	printf("Inserisci il valore che avra' la cella numero %d del SECONDO vetore: ", j);
    	scanf("%d", &vett2[j]);
    	printf("\n");
    }
    
    for (i=0; i<size1; i++){
    	for (j=0; j <size2; j++){
    		if (vett1[i] == vett2[j]){
    			if(k == 0) vett3 = (int*)malloc(sizeof(int)); 
    			else vett3 = (int*)realloc(vett3,(sizeof(vett3)/sizeof(int))+sizeof(int));
    			vett3[k] = vett1[i]; 
    			k++;
    		}
    	}
    }
    
    size3 = sizeof(vett3)/sizeof(int);
    
    printf("Ecco i valori del terzo vettore:\n");
    for (k=0; k<size3; k++){
    	printf("Il valore del TERZO vettore nella cella %d equivale ad --> %d\n", k, vett3[k]);
    }
    
    return 0;
    
    }
    
Devi accedere o registrarti per scrivere nel forum
8 risposte