Aiuto esercizio con array

di cslash89 il
10 risposte
Buonasera a tutti, ho bisogno di un aiuto per un esercizio con i vettori. L'esercizio è banale, ho un vettore di dimensione n (con n inserito da tastiera) e devo inserire poi i numeri pari in vettore e i dispari in un altro vettore. L'esercizio in linea di massima funziona ma, stampa dei numeri strani oltre i valori richiesti.

#include <cstdlib>
#include <iostream>
#define MAX 20
using namespace std;

/*
 * 
 */
void carica(int vet[], int n);
void stampa(int vet[], int n);
int npari (int vet[], int n, int vetpari[]);
void stampapari(int vetpari[], int n);
int ndisp(int vet[], int n, int vetdisp[]);
void stampadisp(int vetdisp[], int n);
int main(int argc, char** argv) {
    int n, vet[MAX], vetpari[MAX], vetdisp[MAX];
    cout<<"Dimensione del vettore: ";
    cin>>n;
    while(n<1 || n>MAX){
        cout<<"Dimensione non valida. Reinserisci la dimensione: ";
        cin>>n;
    }
    carica(vet, n);
    stampa(vet, n);
    npari(vet, n, vetpari);
    stampapari(vetpari, n);
    ndisp(vet, n, vetdisp);
    stampadisp(vetdisp, n);
    return 0;
}
void carica(int vet[], int n){
    for(int x=0; x<n; x++){
        cout<<"Inserisci l'elemento dell'array alla "<<x<<" posizione: ";
        cin>>vet[x];
    }
}
void stampa(int vet[], int n){
    cout<<"Array={";
    for(int i=0; i<n; i++){
        cout<<vet[i]<<"; ";
    }
    cout<<"\b\b}"<<endl;;
}
int npari(int vet[], int n, int vetpari[]){
    int pari=0; 
    for(int i=0; i<n; i++){
        if(vet[i]%2==0){
            vetpari[pari]=vet[i];
            pari++;
            
        }
    }
}
void stampapari(int vetpari[], int n){
    cout<<"Array Pari={";
    for(int i=0; i<n; i++){
        cout<<vetpari[i]<<"; ";
    }
    cout<<"\b\b}"<<endl;
}
int ndisp(int vet[], int n, int vetdisp[]){
    int disp=0;
    for(int i=0; i<n; i++){
        if(vet[i]%2!=0){
            vetdisp[disp]=vet[i];
            disp++;
        }
    }
}
void stampadisp(int vetdisp[], int n){
    cout<<"Array Dispari={";
    for(int i=0; i<n; i++){
        cout<<vetdisp[i]<<"; ";
    }
    cout<<"\b\b}"<<endl;
}
Esempio di stampa:
Dimensione del vettore: 4
Inserisci l'elemento dell'array alla 0 posizione: 1
Inserisci l'elemento dell'array alla 1 posizione: 2
Inserisci l'elemento dell'array alla 2 posizione: 3
Inserisci l'elemento dell'array alla 3 posizione: 4
Array={1; 2; 3; 4}
Array Pari={2; 4; -2146333957; 1}
Array Dispari={1; 3; -2144442240; 1}

10 Risposte

  • Come già detto i backspace non ti servono: cicla su un elemento in meno e aggiungi una riga appropriata.

    Le funzioni che dichiari con un return value devono appunto avere un return value all'interno.

    Per il resto la descrizione di un problema deve essere precisa, con l'esempio che hai provato, con i valori che ti aspettavi e quelli che sono stati invece stampati. "Numeri strani" non vuol dire nulla
  • Weierstrass ha scritto:


    Come già detto i backspace non ti servono: cicla su un elemento in meno e aggiungi una riga appropriata.

    Le funzioni che dichiari con un return value devono appunto avere un return value all'interno.

    Per il resto la descrizione di un problema deve essere precisa, con l'esempio che hai provato, con i valori che ti aspettavi e quelli che sono stati invece stampati. "Numeri strani" non vuol dire nulla
    Ho aggiornato il post con l'esempio del problema
  • Ok, allora è chiaro.
    Quanti sono i numeri pari? Quanti elementi chiedi di stampare dall'array dei numeri pari?
  • In questo caso i ho inserito 4 elementi . due pari e due dispari.
    Come vedi i primi due elementi dell'array coincidono, con i pari e dispari ma mette altri 2 "fantasma" per riempire tutto il vettore a quanto ho capito.
    se metto ad esempio, invece 4 pari ottengo:
    Array={2; 4; 6; 8}
    Array Pari={2; 4; 6; 8}
    Array Dispari={-18320880; 3; -2144442240; 1}
  • Non sono numeri fantasma: sono indirizzi di memoria, dovuti al fatto che hai allocato degli array nello stack senza inizializzarli.

    Hai scritto due funzioni per contare i pari e i dispari: correggile (manca una riga con il return value) e poi usale per stampare il numero corretto di elementi
  • Ho corretto così:
    
    int npari(int vet[], int n, int vetpari[]){
        int pari=0; 
        for(int i=0; i<n; i++){
            if(vet[i]%2==0){
                vetpari[pari]=vet[i];
                pari++;
                
            }
        }
        return pari;
    }
    
    
    int ndisp(int vet[], int n, int vetdisp[]){
        int disp=0;
        for(int i=0; i<n; i++){
            if(vet[i]%2!=0){
                vetdisp[disp]=vet[i];
                disp++;
            }
        }
        return disp;
    }
    
    Ho fatto bene?
    Ora però non so come stampare correttamente...
  • 
    int m;
    
    m = npari(vet, n, vetpari);
    stampapari(vetpari, m);
    
  • Weierstrass ha scritto:


    
    int m;
    
    m = npari(vet, n, vetpari);
    stampapari(vetpari, m);
    
    Gentilissimo Ora ho capito dove sbagliavo del resto ho cominciato da poco con le funzioni XD
    Ora vorrei un consiglio/inofrmazione...
    ma in C++ è indispensabile imparare i puntatori?
    Dicono che rendano il codice più pulito e leggibile, ma onestamente di leggibile ci ho trovato davvero poco..
  • Passa a C# o Java. Per quanto hai imparato finora il passaggio è a costo zero
  • Weierstrass ha scritto:


    Passa a C# o Java. Per quanto hai imparato finora il passaggio è a costo zero
    Grazie per il conisglio, ovviamente un tentativo di apprendimento lo farò, anche perchè magari mi sembra difficile solo perchp non ci ho ancora messo mano... Se si rivelerà difficile passerò ad altro
Devi accedere o registrarti per scrivere nel forum
10 risposte