Esercizio Combinazioni

di il
10 risposte

Esercizio Combinazioni

Ciao ragazzi, devo creare un programma che, acquisiti dall'utente il numero di array e in numero di elementi che ciascuno deve contenere, mi stampi tutte le combinazioni possibili visualizzando in ordine (elemento primo array, elemento secondo array, elemento n array);
Acquisisco tutti i dati allocando dinamicamente gli array, ma non riesco a stampare tutte le combinazioni. Sapete aiutarmi?

Esempio: array1 = {1, 2, 3} array2 = {a, b}

-----> 1a, 1b, 2a, 2b, 3a, 3 b

10 Risposte

  • Re: Esercizio Combinazioni

    Basta semplicemente utilizzare n cicli annidati, dove n è il numero di array considerati.
    Nel caso di n=2 array il tutto si riduce a qualcosa di molto simile alla stampa di una matrice.
  • Re: Esercizio Combinazioni

    Si, ma come faccio a stabilire n cicli non sapendo il numero di insiemi e le dimensioni di ciascuno di questi?
  • Re: Esercizio Combinazioni

    Inizia a postare il codice scritto finora, altrimenti diventa difficile aiutarti.
  • Re: Esercizio Combinazioni

    
    typedef struct insieme {
    
    	int*	elem;
    
    }TInsieme;
    
    typedef TInsieme* Arr;
    
    
    int main(void) {
    
    	int		ninsiemi, maxcombinazioni = 1;
            Arr		totale;
    	int*	        diminsiemi;
    	
    
    	
    	printf("Numero di insiemi: ");
    	scanf("%d", &ninsiemi);
    
    	totale = (Arr*)malloc(ninsiemi * sizeof(TInsieme));
    	
    	if (totale == NULL)
    	{
    		system("CLS");
    		printf("\aErrore!\n");
    		exit(0);
    	}
    
    	diminsiemi = (int*)malloc(ninsiemi * sizeof(int));
    
    	if (diminsiemi == NULL)
    	{
    		system("CLS");
    		printf("\aErrore!\n");
    		exit(0);
    	}
    
    	//dimensioni insieme
    	for (int i = 0; i < ninsiemi; i++)
    	{
    		system("CLS");
    		printf("Dimensione insieme %d: ", i + 1);
    		scanf("%d", &diminsiemi[i]);
    
    		totale[i].elem = (int*)malloc(sizeof(int) * diminsiemi[i]);
    
    	}
    
    	//riempimento insime
    	for (int i = 0; i < ninsiemi; i++)
    	{
    		system("CLS");
    
    		for (int h = 0; h < diminsiemi[i]; h++)
    		{
    			printf("Elemento insieme [%d], numero [%d]: ", i + 1, h + 1);
    			scanf("%d", &totale[i].elem[h]);
    
    		}
    	}
    
    
    
    	
    	system("CLS");
    
    	printf("Tutte le combinazioni disponibili sono: \n\n");
    
    	//Assumo quanti valori saranno stampati in totale
    	for (int i = 0; i < ninsiemi; i++)
    	{
    		maxcombinazioni = maxcombinazioni * diminsiemi[i];
    	}
    
    
    	//Calcolo combinazioni
          
           ???
    
    [code]
  • Re: Esercizio Combinazioni

    Perchè complicarsi la vita utilizzando una struct costituita da un solo membro?
    Secondo me o ricorri a qualcosa del genere:
    typedef struct vettore_
    {
        int dim;
        int *element;
    }   vettore;
    oppure semplicemente ad un puntatore doppio a int, chiamiamolo v, oltre ovviamente ad un array dinamico, chiamiamolo dim, in cui andrai a salvare le dimensioni degli n array a lunghezza variabile.

    Per quanto riguarda la parte sulle combinazioni, credo che la cosa più semplice sia quella di ricorrere ad un array, chiamiamolo u, costituito da n interi inizializzati a 0 che andranno a rappresentare gli indici della singola combinazione da stampare.

    Esempio:
    n = 3
    dim = [2, 3, 4]

    u:
    0 0 0
    0 0 1
    0 0 2
    0 0 3
    0 1 0
    0 1 1
    0 1 2
    0 1 3
    0 2 0
    0 2 1
    0 2 2
    0 2 3
    1 0 0
    1 0 1
    1 0 2
    1 0 3
    1 1 0
    1 1 1
    1 1 2
    1 1 3
    1 2 0
    1 2 1
    1 2 2
    1 2 3

    e sono esattamente 2*3*4=24 combinazioni.

    Implementare un algoritmo che consente una cosa del genere non è affatto difficile.
    A quel punto l'array u potrà essere utilizzato per stampare la generica combinazione ricorrendo ad una funzione del tipo:
    void stampa_combinazione(int **v, int *u, int n)
    {
        for(int i = 0; i < n; ++i)
        {
            printf("%d ", v[i][u[i]]);
        }
        printf("\n");
    }
    Se hai qualche dubbio chiedi pure.
  • Re: Esercizio Combinazioni

    Da quel che ho capito mi consigliavi di salvare i pedici in una matrice U. Dopo averla allocata ho provato ad eseguire un ciclo (l'algoritmo esatto non l'ho ancora implementato, si trattava solo di una prova) ma segnala un errore di violazione di accesso quando attribuisco il valore alla matrice. Puoi dirmi dove ho sbagliato?
    
    
    int** a;
    
    	//Assumo quantità valore da stampare
    	for (int i = 0; i < ninsiemi; i++)
    	{
    		*maxcombinazioni = *maxcombinazioni * diminsiemi[i];
    	}
    
    
    
    	a = (int**)malloc(sizeof(int*) * (*maxcombinazioni));
    
    	assert(a != NULL);
    
    	for (int i = 0; i < ninsiemi; i++)
    	{
    
    		a[i] = (int*)malloc(sizeof(int) * diminsiemi[i]);
    		
    
    	}
    
    	
    
    	//Alla matrice attribuisco i pedici delle combinazioni
        for (int i = 0; i < ninsiemi; i++)
    	{
    
    		for (int h = 0; h < *maxcombinazioni; h++)
    		{
    			
    			
    			for (int j = 0; j < diminsiemi[i]; j++)
    			{
    				a[h][i] = j;   !!!!ERRORE!!!!
    			}
    
    		}
    
    	}
    
    [code]
  • Re: Esercizio Combinazioni

    Mi spiegheresti cos'è
    *maxcombinazioni
    Ma voglio una spiegazione esauriente
  • Re: Esercizio Combinazioni

    È il numero di combinazioni totali ( -> righe matrice) che saranno stampati alla fine. Il codice che ho postato fa parte di una funzione fuori dal main ma avevo bisogno di modificare il valore della variabile in quanto lo avrei usato anche nel main stesso, per questo lo trovi puntato.
  • Re: Esercizio Combinazioni

    Allora:
    - a volte postare solo un frammento del codice può essere sufficiente, ma non è questo il caso;
    - presta maggiore attenzione alla spaziatura e all'indentazione e cerca di ridurre tutti quegli spazi vuoti, altrimenti si fa fatica a leggere il codice;
    - ovviamente le variabili ognuno le chiama come vuole, ma visto che nel mio precedente post ho usato dei nomi specifici, non sarebbe stato meglio usare quelli? Almeno non devo sforzarmi a capire cosa rappresentano;
    - da un'occhiata veloce al codice mi sorge qualche dubbio... sei sicuro di aver capito bene qual è l'idea che ho cercato di spiegare nel mio precedente post? Cosa rappresenta di preciso il vettore u?
  • Re: Esercizio Combinazioni

    leo12 ha scritto:


    puntato.
    Errore: non si dice puntato.
    Il compilatore pretende la precisione assoluta, a buona ragione: impegnati per essere preciso anche tu nell'uso dell'italiano, altrimenti non riuscirai mai a tradurre decentemente da un linguaggio (umano) all'altro (informatico).

    Concordo pienamente su quanto rileva @Nippolo: segui i suoi consigli e posta il codice completo.
Devi accedere o registrarti per scrivere nel forum
10 risposte