Funzione restituzione array

giuliomontenero
Scrivere una funzione c++ che, dato un array di interi positivi a ed un intero k, restituisce un array contenente gli elementi di a che sono divisibili per k:
Esempio: a={4,7,3,1,45,6,32,20} , k=3.
La funzione restituisce {3,45,6}

Non capisco dove sbaglio
#include<iostream>
using namespace std;
const int N=10;
void funzione(int [N],int);
int main()
{
    int k;
    int a[N]={4,7,3,1,45,6,32,20};
    cout<<"Inserisci un numero k"<<endl;
    cin>>k;
    funzione(a,k);
return 1;

}
void funzione(int x[N],int k)
{
    int c[N];
    int dc=0;
    bool condizione=false;
    for(int i=0;i<N && !condizione;i++)
    {
        if(x[i]%k==0 && !condizione)
        {
            condizione=true;
            c[dc]=x[i];
            dc++;
        }
        else
        condizione=false;
    }
for(int s=0;s<dc;s++)
cout<<x[s]<<" ";
}



oppure in un altro modo quasi uguale
#include<iostream>
using namespace std;
const int N=10;
void funzione(int [N],int );
int main()
{
    int k;
    int a[N]={4,7,3,1,45,6,32,20};
    cout<<"Inserisci un numero k"<<endl;
    cin>>k;
    funzione(a,k);

return 0;

}
void funzione(int x[N],int t)
{
    int c[N];
    int dc=0;
    bool condizione=true;
    for(int i=0;i<N && condizione;i++)
    {
        if(x[i]%t!=0 && condizione)
            condizione=false;
        else
        condizione=true;
        c[dc]=x[i];
        dc++;
    }
for(int s=0;s<dc;s++)
cout<<x[s]<<" ";
}


Risposte
Rggb1
Due appunti:
- la funzione stampa un risultato, non lo restituisce;
- cosa te ne fai della variabile 'condizione'?

giuliomontenero
vado a verificare la condizione dell'esercizio che è true se gli elementi sono divisibili per k
e poi stampo tutto

quindi come si potrebbe modificare?

Rggb1
"maschulillo":
vado a verificare la condizione dell'esercizio che è true se gli elementi sono divisibili per k

Infatti non ti serve una variabile.
if (x[i]%k == 0)
{
  // La condizione e` vera: l'elemento i-esimo
  // x[i] e` divisibile per il numero k
  c[dc++]=x[i];
};

ed ovviamente non serve nemmeno un ramo 'else'.

giuliomontenero
#include<iostream>
using namespace std;
const int N=10;
void funzione(int [N],int);
int main()
{
    int k;
    int a[N]={4,7,3,1,45,6,32,20};
    cout<<"Inserisci un numero k"<<endl;
    cin>>k;
    funzione(a,k);
return 1;

}
void funzione(int x[N],int t)
{
    int c[N];
    int dc=0;
    for(int i=0;i<N;i++)
    {
        if(x[i]%t==0)
        {
            c[dc]=x[i];
            dc++;
        }
    }
for(int s=0;s<dc;s++)
cout<<x[s]<<" ";
}



a me ancora non funziona
non capisco il perchè!!!!!

Rggb1
Perché mandi in uscita l'array 'x' passato alla funzione e non l'array 'c' che la funzione ha appena calcolato. ;)

giuliomontenero
ho capito
ma perchè ora mi stampa anche gli zeri nell'array trovato?

Umby2
"maschulillo":
ho capito
ma perchè ora mi stampa anche gli zeri nell'array trovato?


In che senso gli zero ?
Il ciclo di stampa termina giustamente a "dc", quindi stampa solo i campi valorizzati.

Rggb1
Se l'array contiene valori zero (nel tuo esempio ha 8 valori inizializzati su una dimensione di 10, quindi gli ultimi due lo sono) il risultato li comprende in quanto qualunque sia 'k' - a meno non sia esso stesso zero, ma avresti un errore - si ha che l'espressione
0%k == 0
vale vero. Se vuoi evitare questo, metti un controllo appropriato.

apatriarca
Ma che bisogno hai di memorizzare i valori in un array se poi li devi stampare? Invece di memorizzare i valori in c puoi stampare direttamente il valore:
void funzione(int x[N],int t)
{
    for (int i = 0; i < N; ++i) {
        if (x[i] % t == 0) {
            cout << x[i] << " ";
        }
    }
    cout << endl;
}

giuliomontenero
@Rggb che controllo dovrei mettere?
@apatriarca ma anche stampando subito i valori mi stampa gli zeri successivi dell'array
come evitare questo?

Rggb1
"apatriarca":
Ma che bisogno hai di memorizzare i valori in un array se poi li devi stampare?

Ovviamente non ne ha bisogno; io però avevo capito che la f. deve ritornare l'array calcolato - e non solo stamparlo.

@maschulillo
Se vuoi evitare di considerare nel risultato gli elementi che valgono zero è ovviamente sufficiente verificare, prima di calcolare, che l'elemento stesso sia diverso da zero: non ci vedo alcuna difficoltà.

Magari controlla anche se con "restituisce" si intenda (o no) che il valore di ritorno della funzione sia l'array calcolato.

giuliomontenero
ho capito ma se io come condizione vado a mettere che il numero debba essere diverso da zero
e nell'array ci dovesse essere qualche numero 0 oltre agli zeri finali
così me li va a togliere tutti e non mi considera effettivamente tutti i numeri dell'array
hai capito cosa voglio dire?
non c'è un modo per risolvere questo?

Rggb1
"maschulillo":
ho capito ma se io come condizione vado a mettere che il numero debba essere diverso da zero
e nell'array ci dovesse essere qualche numero 0 oltre agli zeri finali
così me li va a togliere tutti e non mi considera effettivamente tutti i numeri dell'array

Ci sei arrivato. :smt023

"maschulillo":
non c'è un modo per risolvere questo?

Certo, in vari modi. Il più semplice è ovviamente impostare (o sapere) a priori il numero di elementi dell'array; nel tuo esempio 10 (N) è il numero massimo e non il numero effettivo, che puoi assegnare ad un'altra variabile.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.