Divisione tra elementi array.

di il
13 risposte

Divisione tra elementi array.

Ciao a tutti vi faccio vedere cosa deve fare il programma in C++:

Ho due array, a[], b[]

a[2,45,37,21,6,34,35];
b[2,3];

Deve stampare gli elementi che non sono divisibili per 2 e 3.

Quindi l'output sarà:

37,35

Vi faccio vedere come ho provato a farlo io:

http://pastebin.com/zn5seM0

Ripeto la domanda:
Perchè stampa anche il numero 21 che è divisibile per 3?
E perchè stampa il 37 e il 35 ripetuto?

Grazie per le eventuali risposte.

13 Risposte

  • Re: Divisione tra elementi array.

    Le condizioni dei for sono sbagliate.
    
    for(int i = 0; i <= dimA; i++) // i < dimA , non i<= dimA
    
    for(int j = 0; j <= dimB; j++) // j < dimB , non j<= dimB
    
  • Re: Divisione tra elementi array.

    Allora ho risolto così:
    Avevi ragione sulle condizioni del for ma come dici tu mi stampava due volte il 37 e due volte il 35.
    Così ho risolto:
    
    for (int i = 0; i < dimA, i++)
    for (int j = 0; j < dimB-1; j++)   
    
    Ora stampa:
    
    37
    35
    
    Volevo chiederti due questioni:
    0 - Come hai capito che era sbagliato proprio quello? Deo capire perchè quel <= fa sballare il tutto.
    1 - Come copio ora questi risultati dentro un altro array?

    Grazie delle risposte.
  • Re: Divisione tra elementi array.

    Ciao Escher,
    Ma il programma deve prevedere che b possa diventare esempio b[2, 3, 5]? e quindi cercare i divisori per 2, 3, 5?
  • Re: Divisione tra elementi array.

    Il programma deve sostanzialmente togliere dall'array a tutti gli elementi che sono divisibili per almeno uno degli elementi di b.
    Si cmq deve prevedere anche che ci siano anche più elementi in B rispetto a quelli che ho messo.
    Ora l'esercizio era questo con due array dati.

    Rimangono due problemi:
    0 - La dimensione deve essere sempre specificata quindi devo cambiarla ogni volta che vado ad aumentare gli elementi degli array.

    1 - Copiare gli elementi che NON sono divisibili per 2 e 3 nell'array C.
  • Re: Divisione tra elementi array.

    Per ora il problema principale mi sembra il doppio loop, che non funzionerebbe quando DimB è maggiuore di due.
    
    const int dimA = 7;
    const int dimB = 3;
    const int dimC = 2;
    
    int divisione(int a[dimA], int b[dimB])
    {
    	for(int i = 0; i < dimA; i++)
    	{
    		for(int j = 0; j < dimB - 1; j++)
    		{
    			if(a[i] % b[j] != 0 && a[i] % b[j+1] != 0)
    			{
    				cout << a[i] <<"\n";
    			}
    		}      
    	}
    
    	return 0;
    }
    
    int main()
    {
    	int a[dimA] = {2,45,37,21,6,34,35};
    	int b[dimB] = {2,3, 5};
    
    	divisione(a,b);
    
    	return 0;
    }
    
    prova e vedrai che non funziona.
  • Re: Divisione tra elementi array.

    Stampa:
    
    2
    37
    37
    34
    35
    
    Credo che hai ragione non funziona ho messo 3 elementi in b.
    b[3] = {2,3,5};
  • Re: Divisione tra elementi array.

    Il problema è:
    
    	if(a[i] % b[j] != 0 && a[i] % b[j+1] != 0)
    
    è stata pensata per un array di due elementi
  • Re: Divisione tra elementi array.

    Si lo so..infatti hai ragione !
    Però non so come risolvere, ci penso un po'.
  • Re: Divisione tra elementi array.

    Beh, visto che sono qua ti do una possibile soluzione, potresti usare una funzione di questo tipo:
    
    bool Divisibile(int n, int divisori[dimB])
    {
    	for(int i = 0; i < dimB; i++)
    	{
    		if(n % divisori[i] == 0)
    			return true;
    	}      
    
    	return false;
    }
    
    Continuo a usare dimB, a quello ci pensiamo dopo.

    a questo punto il ciclo potrebbe essere scritto:
    
    	for(int i = 0; i < sizeA; i++)
    	{
    		if (!Divisibile(a[i], b))
    		{
    			cout << a[i] <<"\n";
    		}
    	}
    
  • Re: Divisione tra elementi array.

    Come fai tu però non prendi un array b. prendi dei numeri o mi sbaglio?
    Io avevo anche pensato a questo ma mi sono accorto che non posso fare delle cose:
    Lo posto:
    
    #include <iostream>
    
    using namespace std;
    
    const int dimA = 7;
    const int dimB = 3;
    const int dimC = 7;
    
    
    int divisione(int a[dimA], int b[dimB], int c[dimC])
    {
            int k = 0;
            int i = a[0];
            int j = b[0];
    
            bool trovato = false;
    
                    while (trovato = false)
                    {
                            if(a[i] % b[j] != 0)
                            {
                                    j++;
                                    k++;
                                            if(k == 3)
                                            trovato = true;
                            }
    
                            else
                            {
                               i++;
                               j = b[0];
                               k = 0;
                            }
                    }
    
    
    if(k == 3)
    {
    cout <<"ok\n";
    }
    
            else
            cout <<"no\n";
    return 0;
    }
    
    int main()
    {
            int a[dimA] = {2,45,37,21,6,34,35};
            int b[dimB] = {2,3,5};
            int c[dimC];
    
    divisione(a,b,c);
    
    return 0;
    }
    
    Non posso andare all'elemento successivo di un array con i++ vero?
    Devo utilizzare per forza un for per farlo..

    Grazie !
  • Re: Divisione tra elementi array.

    Escher ha scritto:


    Come fai tu però non prendi un array b. prendi dei numeri o mi sbaglio?
    Se ho capito giusto il problema è: per ogni numero contenuto in 'a' verifico se è divisibile per un elemento di 'b'. Quindi devi ripetutamente confrontare un numero con i valori contenuti in un array, per questo avevo fatto la funzione:
    
    bool Divisibile(int n, int divisori[dimB])
    {
    	for(int i = 0; i < dimB; i++)
    	{
    		if(n % divisori[i] == 0)
    			return true;
    	}      
    
    	return false;
    }
    
    che riceve un numero e controlla se è divisibile per uno degli elementi contenuto nell' array 'divisori' (a cui passerai 'b').

    A questo punto il ciclo principale diventa semplice (lo riscrivo tutto):
    
    const int dimA = 8;
    const int dimB = 4;
    
    bool Divisibile(int n, int divisori[dimB])
    {
    	for(int i = 0; i < dimB; i++)
    	{
    		if(n % divisori[i] == 0)
    			return true;
    	}      
    
    	return false;
    }
    
    int divisione(int a[dimA], int b[dimB])
    {
    	for(int i = 0; i < dimA; i++)
    	{
    		if (!Divisibile(a[i], b))
    			cout << a[i] << "\n";
    	}
    
    	return 0;
    }
    
    int main()
    {
    	int a[dimA] = {2, 45, 37, 21, 6, 34, 35, 77};
    	int b[dimB] = {2, 3, 5, 11};
    
    	divisione(a, b);
    	return 0;
    }
    
    Dovrebbe stampare solo 37.
  • Re: Divisione tra elementi array.

    Perfetto Grazie ! Però volevo riuscirci da solo..che palle =P !

    Un ultima domanda: da dove prendi n?
  • Re: Divisione tra elementi array.

    Beh, basta insistere, poi i risultati vengono.

    Escer ha scritto:


    Un ultima domanda: da dove prendi n?
    
    bool Divisibile(int n, int divisori[dimB])
    
    'Divisibile' è una funzione 'n' le viene passato ogni volta che la chiami, ad esempio un questo punto:
    
      if (!Divisibile(a[i], b))
    
    viene richiamata e viene passato ad 'n' il valore di 'a' e a 'divisori' viene passato 'b'.
    Se non sei pratico con le funzioni ti consiglio di studiarle bene e di usarle a manetta.
Devi accedere o registrarti per scrivere nel forum
13 risposte