Risultato errato da semplice differenza

di il
8 risposte

Risultato errato da semplice differenza

Ciao a tutti.
Posto il codice dell'esercizio che mi è stato assegnato. In output i valori delle differenze prodotte nell'ultimo ciclo mi danno valori errati.
Mi è stata suggerito che potrebbe essere overflow. Sto provando a capire cosa sia.

#include<iostream>
using namespace std;
//i must use 5 loops for this exercise! Thank you all!

int main() { 
int a; cout << "size array:" << endl; cin >> a; 
int b [a], c[a] , *d = new int[2*a]; //pointer is twice the size of arrays
int f = -1;
int k = 0;

cout << endl;

//I must initialized two array, the second with the opposite value of the first.

	for(int e=0; e < a ; e++){int i; cout << "init. first array:" << endl; cin >> i; b[e] = i;}
 	for(int e : b) { f++; c[f] = -e;} //cout << c[f] << endl

//now i must initialized the pointer's first half value with the sum of the respective value for each position in arrays

	do	
		 d[k] = b[k] + c[k];
	while( ++ k < a);

//now the second half but with difference

       
        while(k++ < 2*a)  d[k] = b[k] - c[k];

//result it has to be 4 numbers: es. x -x 0 2x
for(int e=0,m=a; e < a; e++, m++) { cout << b[e] << " "<< c[e] <<" "<< d[e] <<" "<< d[m] << endl;}
	
}

8 Risposte

  • Re: Risultato errato da semplice differenza

    Innanzitutto al fine di rendere il codice più chiaro e leggibile ti consiglio di scrivere una sola istruzione per riga e di rispettare l'indentazione.

    Un paio di domande:
    - perchè complicarsi così tanto la vita con quei cicli strani?
    - a differenza di b e c (che non sono array statici, ma VLA, che non sono previsti dallo standard C++), perché per d hai fatto ricorso all'allocazione dinamica della memoria?

    Veniamo ora agli errori logici presenti nel codice:
    - all'interno del ciclo while (non il do/while), k varia nell'intervallo [a+1 ; 2*a], mentre dovrebbe variare nell'intervallo [a ; 2*a-1]. Soluzione? Per esempio sostituire il while con un do/while e k++ con ++k;
    - a questo punto l'indice k varierà correttamente in riferimento a d, ma non agli array b e c che hanno dimensione pari ad a e non a 2*a. Soluzione? Sostituire per a e b l'indice k con k-a.

    Vale la pena precisare che nel for finalizzato alla stampa, la variabile m può essere evitata sostituendo l'indice m con e+a.

    P.S.
    Non conoscevo quel costrutto con il : che hai utilizzato nel secondo for... mi toccherà approfondire!
  • Re: Risultato errato da semplice differenza

    Grazie Nippolo.
    Ti spiego in breve, i cicli che vedi sono quelli previsti dalla consegna dell'esercizio e ahimè devo completarlo con quelli.
    Ti chiedo solo, la causa dell'errore può essere l'allocazione dinamica della memoria? non so perchè l'ho fatta cosi, ho visto che è un modo di inizializzare un puntatore (altrimenti come posso dargli la capienza? O forse il puntatore per sua natura non necessita in realtà di una capienza predefinita?)
    Grazie infine per la spiegazione chiara.
  • Re: Risultato errato da semplice differenza

    Di niente, ma credo che tu non abbia letto molto attentamente quello che ho scritto!
    L'allocazione dinamica non c'entra nulla, gli errori sono quelli che ti ho indicato, insieme alle possibili soluzioni, nel precedente post.
    Ti spiego in breve, i cicli che vedi sono quelli previsti dalla consegna dell'esercizio e ahimè devo completarlo con quelli.
    Se postassi la traccia credo sarebbe tutto più chiaro.
    non so perchè l'ho fatta cosi, ho visto che è un modo di inizializzare un puntatore (altrimenti come posso dargli la capienza? O forse il puntatore per sua natura non necessita in realtà di una capienza predefinita?)
    Mi sembra che tu non abbia l idee molto chiare al riguardo, ti consiglio di approfondire un po' la teoria per capire cosa si intende per allocazione dinamica della memoria e come funziona. Detto questo la domanda è un'altra... perchè per d hai fatto ricorso all'allocazione dinamica della memoria mentre per b e c no?
  • Re: Risultato errato da semplice differenza

    perchè per d hai fatto ricorso all'allocazione dinamica della memoria mentre per b e c no?
    Devo riguardare bene la teoria perchè no, non so proprio rispondere a questa domanda.

    Posto intanto la traccia dell'esercizio:

    "provate a scrivere da voi e a eseguire un programma, costituito dalla SOLA funzione main, che faccia le seguenti cose:

    dichiari due array di uguale capienza e un puntatore, tutti dello stesso tipo;

    dichiari, in aggiunta, UNA SOLA variabile intera con visibilità estesa a tutta la funzione main;

    inizializzi il puntatore in maniera tale da indirizzare il doppio della capienza di ciascuno dei due array;

    usi un ciclo for (della prima specie) per inizializzare il contenuto del primo array con valori opportuni letti da tastiera;

    usi un ciclo for (della seconda specie) per inizializzare ordinatamente il contenuto del secondo array con valori opposti a quelli del contenuto del primo;

    usi un ciclo do per inizializzare ordinatamente la prima metà dei valori puntati dal puntatore con le somme dei contenuti dei due array;

    usi un ciclo while per inizializzare ordinatamente la seconda metà dei valori puntati dal puntatore con le differenze dei contenuti dei due array;

    usi il ciclo che ritenete più idoneo (ma UNO SOLO) per scrivere ordinatamente sul canale di output i contenuti dei due array e quelli puntati dal puntatore;



    Quel che si dovrà vedere saranno quaterne di due numeri tra loro opposti seguiti da zero e dal doppio del primo numero, per ogni valore digitato da tastiera, che dovrà coincidere (come è evidente) col primo numero di ogni quaterna. "
  • Re: Risultato errato da semplice differenza

    Premetto che faccio fatica a capire l'utilità didattica di esercizi posti in tal modo!
    In ogni caso:
    - riguardo al seguente punto
    inizializzi il puntatore in maniera tale da indirizzare il doppio della capienza di ciascuno dei due array;
    la cosa che si avvicina maggiormente alla richiesta è effettivamente l'allocazione dinamica della memoria;
    - per il resto mi sembra che tu abbia seguito abbastanza bene quella che è la traccia... forse l'unico punto che non hai seguito è
    dichiari, in aggiunta, UNA SOLA variabile intera con visibilità estesa a tutta la funzione main;
    - per quanto riguarda gli errori te li ho già segnalati nei precedenti post... sei in grado di aggiustare il codice?
  • Re: Risultato errato da semplice differenza

    Nippolo, in merito a quello strano modo di impostare il ciclo ho trovato questo:

    https://en.cppreference.com/w/cpp/language/range-fo

    Devo purtroppo ammettere di non averci capito nulla. Tu sei riuscito a reperire qualche fonte un po' più chiara e, magari, che SPIEGHI le cose anziché presentarle in quella forma sintetica che trovo così criptica?
  • Re: Risultato errato da semplice differenza

    Premesso che le mie conoscenze del linguaggio si limitano più o meno ai concetti base, ammetto che per capire appieno quell'articolo dovrei prima approfondire vari altri argomenti. In ogni caso credo di aver capito in linea di massima come funzioni questa tipologia di iterazione basata sul range.

    Cercando un po' su internet ho trovato quest'articolo, magari può essere utile:
    https://www.italiancpp.org/2013/09/23/modern-range-based-iteration/
  • Re: Risultato errato da semplice differenza

    1) La traccia non dice che la lunghezza dei vettori vada letta da tastiera.

    Quindi potresti anche dichiarare i vettori in questo modo
    #define LEN 3
    int b[LEN], c[LEN];
    2) Come già detto da Nippolo i vettori b e c come da te dichiarati non sono array statici.

    Il tuo codice potrebbe darti errore in fase di compilazione con alcuni compilatori o addirittura alcune versioni del compilatore che ora usi e non ti da problemi (ad esempio g++ col flag -pedantic potrebbe darti errore).

    Facendo come ti ho detto al punto 1, risolveresti anche il punto 2.

    3) L'errore del ciclo while (come ti ha già detto Nippolo) è la fonte dei tuoi problemi.

    Ti basta incrementare la variabile k come ultima istruzione del blocco while.
    while(k < 2*a) { d[k] = b[k-a] - c[k-a]; k++; }
    Attento che per b e c l'indice non è k ma k-a.

    4) Per il resto, ho modificato il tuo codice risolvendo i vari errori che già ti sono stati segnalati da Nippolo e funziona tutto alla perfezione.
Devi accedere o registrarti per scrivere nel forum
8 risposte