Problema: creare un array di numeri e dividere i numeri pari dai dispari

di il
6 risposte

Problema: creare un array di numeri e dividere i numeri pari dai dispari

Buonasera, sono nuovo del forum e anche a programmare...
sto risolvendo un problema di informatica in c++, dove chiede di creare un array di numeri casuali A[n], contare quanti numeri pari e dispari sono presenti nell'array e poi creare altri due nuovi array, uno P[np] con all'interno i num pari dell'array A[n] e un array D[nd] con i numeri dispari di A[n].
io sono riuscito a calcolare la quantità di numeri pari e dispari, ma non riesco a metterli nei rispettivi array. ottengo array con numeri uguali..
sotto vi allego il mio codice e l'output che ottengo.
grazie in anticipo.

#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;

int main() {
   
    int N;
    int* A;
    int np;
    int nd;
    int* D;
    int* P;
    cout << "Quanti numeri valutare? " << endl;
    cin >> N ;
    cout << endl;
   
    A=new int [N];
    for (int i=0; i<N; i++) {
        A[i]=rand()%(5*N);
        cout << A[i] << endl;
    }
   
    for (int i=0; i<N; i++) {
        if (A[i]%2==0) {
            np=np+1;
        } else {
            nd=nd+1;
        }
    }
    cout << "nd = " <<nd << '\t' << "np = " << np << endl;
   
    for (int i=0; i<N; i++) {
        if (A[i]%2==0) {
            P=new int [np];         
            for (int j=0; j<np; j++) {
                P[j]=A[i];
            }
        } else {
            D=new int [nd];      
            for (int j=0; j<nd; j++) {
                D[j]=A[i];
            }
        }
    }
    for (int j=0; j<np; j++) {
        cout << "P"<< j <<"= " << P[j] << endl;
    }  
    for (int j=0; j<nd; j++) {
        cout << "D"<< j <<"= " << D[j] << endl;
    }  
    delete [] A;
    return 0;
}
Quanti numeri valutare?
7

8
11
2
5
8
10
31
nd = 3  np = 4
P0= 10
P1= 10
P2= 10
P3= 10
D0= 31
D1= 31
D2= 31

6 Risposte

  • Re: Problema: creare un array di numeri e dividere i numeri pari dai dispari

    Di c++ non c'è praticamente nulla.
    Sicuro non debba fare un programma C?
  • Re: Problema: creare un array di numeri e dividere i numeri pari dai dispari

    Una volta calcolati np e nd, le new vanno fatte subito dopo, una sola volta *fuori dal ciclo*.

    Con il ciclo riempirai i due array usando due indici diversi.
  • Re: Problema: creare un array di numeri e dividere i numeri pari dai dispari

    oregon ha scritto:


    Una volta calcolati np e nd, le new vanno fatte subito dopo, una sola volta *fuori dal ciclo*.

    Con il ciclo riempirai i due array usando due indici diversi.
    forse il problema è nei cicli for, perchè anche mettendo le new fuori dal ciclo gli array P e D si riempono dello stesso numero, esattamente come prima.

    scusate l'ignoranza ma sono davvero alle prime armi.
  • Re: Problema: creare un array di numeri e dividere i numeri pari dai dispari

    Consiglio: dichiara e inizializza le variabili quando effettivamente ti servono.
    E concordo con +m2+, di C++ non c’è nulla se non gli stream e new e delete.

    Detto ciò devi in un ciclo contare i numeri pari e i numeri dispari, poi allocare lo spazio per i numeri, poi, utilizzando due indici ausiliari, mettere i valori dell’array nella rispettiva parte.

    Oppure utilizzi std::vector e in un ciclo solo hai fatto
  • Re: Problema: creare un array di numeri e dividere i numeri pari dai dispari

    Forse è meglio che ci fai vedere cosa hai scritto
  • Re: Problema: creare un array di numeri e dividere i numeri pari dai dispari

    Ciao,
    il problema nel tuo algoritmo è in questo ciclo for:

    tony097 ha scritto:


    
    
        for (int i=0; i<N; i++) {
            if (A[i]%2==0) {
                P=new int [np];         
                for (int j=0; j<np; j++) {
                    P[j]=A[i];
                }
            } else {
                D=new int [nd];      
                for (int j=0; j<nd; j++) {
                    D[j]=A[i];
                }
            }
        }
    
    Quando trovi un numero pari od un numero dispari, riempi l'intero array (dei pari o dei dispari) con quel numero, di conseguenza stampa solo l'ultimo pari e l'ultimo dispari che trova
    Una soluzione potrebbe essere
    
    int *P = new int[np];
    int *D = new int[nd];
    int index_p = 0;
    int index_d = 0;
    
    for(int i = 0; i < N; i++){
    	if(A[i] % 2 == 0){
    		P[index_p] = A[i];
    		index_p++;
    	}else{
    		D[index_d] = A[i];
    		index_d++;
    	}
    }
    
    Come detto già da oregon, P e D vanno inizializzati fuori il ciclo altrimento lo farà sempre, perdendo i valori salvati in precedenza.
    Ho utilizzato due indici supplementari index_p e index_d per mantenere la posizione dell'ultimo elemento pari o dispari che ho inserito nel rispettivo array, questo è il metodo più semplice per inserire in modo coerente e nella giusta successione gli elementi (evitando di creare buchi o sovrascritture di elementi già inseriti).
Devi accedere o registrarti per scrivere nel forum
6 risposte