Untitled

mail@pastecode.io avatar
unknown
c_cpp
18 days ago
2.5 kB
2
Indexable
Never
/*
Scrivere un sottoprogramma in C che riceve come parametri un array
di interi a e qualsiasi altro parametro ritenuto strettamente
necessario. Il sottoprogramma copia in un secondo array b, allocato
dinamicamente delle dimensioni strettamente necessarie, i numeri
pari contenuti in a. Infine il sottoprogramma trasmette al chiamante
b e la sua dimensione. Gestire opportunamente gli eventuali errori
di allocazione della memoria trasmettendo una dimensione dell'array
allocato pari a -1.
Scrivere un programma in C che chiede all'utente 10 valori interi da
salvare in un array. Il programma invoca il sottoprogramma sopra
definito e ne visualizza il risultato. Infine il programma libera la
memoria allocata. Gestire opportunamente gli eventuali errori di
allocazione della memoria.
*/


#include <stdio.h>
#include <stdlib.h>

// 1) La funzione ritorna void, e passi array b e size di b come riferimento
// 2) La funzione ritorna int, e ritorni la dimensione di b, e l'array b lo passi come riferimento
// 3) La funzione ritorna int*, e ritorno l'array b e la sua dimensione la passi come riferimento

// a --> [3] [8] [9] [12] [9]
int* copia_pari(int a[], int n, int *size)
{
    int i;
    int count =0;
    for(i=0; i<n; i++)
    {
        if(a[i] % 2 == 0)
        {
            count++;
        }
    }
    
    if(count == 0)
    {
        *size = 0;
        return NULL;
    }
    
    int *b = (int *)malloc(count * sizeof(int));
    
    if(b != NULL)
    {
        // a --> [3] [8] [9] [12] [9]
        // b --> [8] [12]
        int j=0;
        for(i=0; i<n; i++) // i = 3
        {
            if(a[i] % 2 == 0)
            {
                b[j] = a[i];
                j++;
            }
        }
        
        *size = count;
        return b;
        
    }
    else
    {
        printf("Errore allocazione");
        *size=-1;
        return NULL;
    }

}

int main() {
    
    int a[10];
    
    for(int i=0; i<10; i++)
    {
        printf("Valore %d: ", i + 1);
        scanf("%d", &a[i]);
    }
    
    int *b;
    int size;
    
    b = copia_pari(a, 10, &size);
    
    if(size == 0)
    {
        printf("Non ci sono numeri pari nell'array");
    }else if (size == -1){
        printf("Errore allocazione dinamica");
    }
    if(b != NULL){
        for(int i=0; i<size; i++)
        {
            printf("%d", b[i]);
        }
        printf("%d", size);
    
        free(b);
        
    }
        
    return 0;
}
Leave a Comment