Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22

Discussione: C++ vecchi ricordi!

  1. #1

    C++ vecchi ricordi!

    Help me please!
    Stavo cercando di studiare un esercizio di Algoritmi e strutture dati rispolverando il c++ ma purtroppo mi son accorto di aver perso un po' di informazioni visto che è da un po' che uso solo Java, nn ricordo se una funzione in C++ puo' restituire o meno un array perchè quando compilo questo codice:

    Codice PHP:
    #include <iostream.h>

    const int N 10;

    int[] Span (int P[N]);

    void main () {
        
    int P[N] = {1,4,8,3,5,3,9,2,5,34};
        
    int S[N] = Span (P[N]);
    }

    int[] Span (int P[N]) {
        
    int k;
        
    bool done;
            
    int[] S;
        for (
    int i 010i++) {
            
    0;
            
    done false;
            
    repeat
            
    if (P[i-k] == P[i]) {
            
    1;
            } else {
            
    done true;
            
    until (i) or done
        
    }
        
    S[i] = k;

        return 
    S[];

    mi dice che la dichiarazione del prototipo funzione Spam termina scorrettamente. Chi mi aiuta a capire dov'è l'errore??

  2. #2

    Re: C++ vecchi ricordi!

    Originariamente inviato da andypower
    Help me please!
    Stavo cercando di studiare un esercizio di Algoritmi e strutture dati rispolverando il c++ ma purtroppo mi son accorto di aver perso un po' di informazioni visto che è da un po' che uso solo Java, nn ricordo se una funzione in C++ puo' restituire o meno un array perchè quando compilo questo codice:
    ...

    mi dice che la dichiarazione del prototipo funzione Spam termina scorrettamente. Chi mi aiuta a capire dov'è l'errore??
    ecco...
    codice:
    #include <iostream.h> /* NON utilizzare + <iostream.h> ma al suo posto <iostream> ,che è la sua nuova versione riscritta qualche anno fà */
    
    /* se utilizzi <iostream> il resto del programma sarà cmq lo stesso anche se dovrai inserire in questo punto:
    using namespace std;   naturalmente non commentato */
    
    const int N = 10;
    
    int* Span (int P[]);
    
    /* la funzione main() non è mai void ma per convenzione SEMPRE int,tanto che molti compilatori danno errore se la dichiari void */
    int main () {
    	int P[N] = {1,4,8,3,5,3,9,2,5,34},*s;
            s = new int[N]; /*alloco la memoria per 10 interi anche se non cononosco cosa fà la funzione span(),quindi non so quanto sarà grande il puntatore/array che restituirà)*/	
            s = Span(P);
    return 0; /* aggiungi sempre return 0 alla fine del main o cmq di una funzione che svolge il suo compito CORRETTAMENTE.Ritorna -1 quando invece vi sono "errori" di vario tipo(in un controllo per verificare l'esistenza di un file,in un controllo per controllare se la memoria allocata dinamicamente è disponibile sul pc,ecc.... */
    }
    
    /* manca la dichiarazione del array/puntatore S dentro la seguente funzione e poi repeat/until non è un ciclo del c/c++...rimpiazzalo con un DO-WHILE */
    int* Span (int P[]) {
    	int k;
    	bool done;
    	for (int i = 0; i < 10; i++) {
    		k = 0;
    		done = false;
    		repeat
    		if (P[i-k] == P[i]) {
    		k = k + 1;
    		} else {
    		done = true;
    		until (k > i) or done
    	}
    	S[i] = k;
    
    	return S;
    }

    Io ti ho sistemato il fatto del return e altre cosette importanti(confronta i due codice ) e ti ho aggiunto dei commenti utili.
    Anche se :

    1)Nella funzione ho visto l'istruzione repeat-unitl-done ma esiste in c/c++?? non so ma credo di no.Io la ricordo in pascal/delphi!

    2)Sempre nella funzione spam() utilizzi l'array S(che poi è tra l'altro anche "ritornato" dalla stessa) ma senza dichiararlo .
    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  3. #3

    Con l'asterisco

    mettendo l'asterisco invece delle parentesi quadre dovrei passare un riferimento, tipo un puntatore giusto? Cmq si il repeat until nn dovrebbe esistere in c++ era pseudocodice che devo tradurre nella maniera giusta per il C++, un do while dovrebbe essere la stessa cosa del repeat until? Oppure la condizione del until deve essere negativa? cioè mi spiego meglio:
    nel mio codice c'è:
    codice:
    repeat
        if (P[i-k] == P[i]) {
        k = k + 1;
        } else {
        done = true;
    until (k > i) or done
    in C++ dovrebbe essere così:
    codice:
    do {
        if (P[i-k] == P[i]) {
        k = k + 1;
        } else {
        done = true;
    } while ((k > i) || done);
    oppure così:
    codice:
    do {
        if (P[i-k] == P[i]) {
        k = k + 1;
        } else {
        done = true;
    } while ((k < i) || done == false);
    P.S.: Giusto ho corretto il problema con la nn dichiarazione dell'array S[] :adhone:

  4. #4

    Re: Con l'asterisco

    Originariamente inviato da andypower
    mettendo l'asterisco invece delle parentesi quadre dovrei passare un riferimento, tipo un puntatore giusto? Cmq si il repeat until nn dovrebbe esistere in c++ era pseudocodice che devo tradurre nella maniera giusta per il C++, un do while dovrebbe essere la stessa cosa del repeat until? Oppure la condizione del until deve essere negativa? cioè mi spiego meglio:
    nel mio codice c'è:
    codice:
    repeat
        if (P[i-k] == P[i]) {
        k = k + 1;
        } else {
        done = true;
    until (k > i) or done
    in C++ dovrebbe essere così:
    codice:
    do {
        if (P[i-k] == P[i]) {
        k = k + 1;
        } else {
        done = true;
    } while ((k > i) || done);
    oppure così:
    codice:
    do {
        if (P[i-k] == P[i]) {
        k = k + 1;
        } else {
        done = true;
    } while ((k < i) || done == false);
    Per ritornare un array in una funzione devi ritornare un puntatore all'area di memoria stessa:ecco perchè ho scritto int* come valore di ritorno della funzione stessa.

    Il repeat until(usato che io sappia in pascal/delphi e non esistente in c-c++) equivale ad un DO WHILE.(NON ad una while-do,perchè il repeat esegue SEMPRE,ALMENO UNA VOLTA,il blocco di istruzioni...propio come il DO-WHILE)

    La PRIMA "traduzione" e quella corretta perchè quando un valore booleano è inserito in una condizione si sottende come VERO(per considerarlo come falso o ,fai come nel tuo secondo esempio,done==false, o !done).


    ps dopo aver tradotto questa parte ricordati di dichiarare dentro la funzione span() l'array s e hai terminato :gren:

    pss molto importante... guarda come ho fatto nel main per assegnare all'"array"(è impropio definirlo array e nelle righe seguenti ti dirò il motivo) s(anche QUESTO NON L'HAI DICHIARATO NEL MAIN... ) il valore di ritorno della funzione span(): ho utilizzato un puntatore allocato dinamicamente con new(se era c avrei dovuto usare malloc o calloc).
    Come hai fatto tu sarebbe un assegnamento illecito in quanto un array è un puntatore COSTANTE ad una area di memoria:cio' significa che puoi modificare i suoi elementi ma non la zona di memoria fisica alla quale punta(in questi casi si usa un puntatore difatti...)

    EDIT guarda il codice che ti ho postato sopra che ci ho aggiunto dei commenti
    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  5. #5

    Così

    Allora io ho fatto così... il compilatore mi dà due warning, uno mi dice che s è assegnato ad un valore nn usato nella funzione mentre l'altro una sospetta conversione di puntatore nella funzione Span() è per questi motivi che il programma nn gira? L'idea è quella che questo codice deve analizzare l'array P[] prendendo in riferimento una posizione per volta deve confrontarla con tutte le posizioni precedenti a quella presa in considerazione e nel caso in cui le pos precedenti abbiano un valore inferiore o uguale a quello preso come riferimento deve memorizzare nella cella dell'array s[] con lo stesso indice [i] della posizione presa in considerazione quanti valori sono minori o uguali a quello che abbiamo come riferimento, così per tutte le posizioni dell'array
    codice:
    #include <iostream>
    
    using namespace std;
    
    const int N = 10;
    
    int* Span (int P[]);
    
    int main () {
    	int P[N] = {1,4,8,3,5,3,9,2,5,34}, *s;
    	s = new int[N];
    	s = Span (P);
    	for (int i = 0; i < N; i++) {
    		cout << s[i] << " " << endl;
    	}
         return 0;
    }
    
    int* Span (int P[N]) {
    	int k, i;
    	int S[N];
    	bool done;
    	for (i = 0; i < 10; i++) {
    		k = 0;
    		done = false;
    		do {
    		    if (P[i-k] == P[i]) {
    		    k = k + 1;
    		    } else {
    		    done = true;
    			}
    		} while ((k > i) || done);
    	}
    	S[i] = k;
    
    	return S;
    }

  6. #6

    Re: Così

    Originariamente inviato da andypower
    Allora io ho fatto così... il compilatore mi dà due warning, uno mi dice che s è assegnato ad un valore nn usato nella funzione mentre l'altro una sospetta conversione di puntatore nella funzione Span() è per questi motivi che il programma nn gira? L'idea è quella che questo codice deve analizzare l'array P[] prendendo in riferimento una posizione per volta deve confrontarla con tutte le posizioni precedenti a quella presa in considerazione e nel caso in cui le pos precedenti abbiano un valore inferiore o uguale a quello preso come riferimento deve memorizzare nella cella dell'array s[] con lo stesso indice [i] della posizione presa in considerazione quanti valori sono minori o uguali a quello che abbiamo come riferimento, così per tutte le posizioni dell'array
    1) s secondo il tuo compilatore in quale funzione non è usato?(main o span).
    Te lo chiedo perchè in entrambe viene usato!

    2)conversione di tipo dove? span() ritorna un puntatore ad int che è correttamente assegnato,nel main,ad un altro dello stesso tipo.

    Cmq prova cosi':
    codice:
    #include <iostream> 
    using namespace std; 
    
    const int N = 10; 
    int* Span (int P[]); 
     
    int main (){ 
     int P[N] = {1,4,8,3,5,3,9,2,5,34},*s; 
     s = new int[N]; 
     s = Span (P); 
     for (int i = 0; i < N; i++) 
     cout << s[i] << " " << endl; 
    
    return 0; 
    } 
     
    int* Span (int P[N]){ 
    int k, i,*S; 
    bool done;
    S=new int[100];
    
    for (i = 0; i < 10; i++){ 
    k = 0; 
    done = false; 
     
    do{ 
      if (P[i-k] == P[i])  
           k = k + 1; 
      else  
           done = true;  
     }while ((k > i) || done); 
     /*  PER ME S[i]=k; si trova qua...controlla sull'originale */ 
    } 
    S[i] = k; 
     
     return S; 
    }
    nella funz ti ho allocato un array dinamico,sempre con new, S di 100 elementi perchè non capisco a cosa serve visto che è fuori dal ciclo for

    Ogni volta che richiami span()scrive ad una posizione i-esima di S il valore di k...
    sicuro che l'originale che dovevi tradurre era cosi? mi sembra strano...
    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  7. #7

    1 ok

    Problema di parentesi, è come dici tu :tongue: svista!! cmq nonostante tutto il prog è ancora in loop

    per quanto riguarda s mi dice che nn è usato nel main poi con la modifica il secondo warning è scomparso, ora il cod è così:

    codice:
    #include <iostream>
    
    using namespace std;
    
    const int N = 10;
    
    int* Span (int P[]);
    
    int main () {
    	int P[N] = {1,4,8,3,5,3,9,2,5,34}, *s;
    	s = new int[N];
    	s = Span (P);
    	for (int i = 0; i < N; i++) {
    		cout << s[i] << " " << endl;
    	}
    	return 0;
    }
    
    int* Span (int P[N]) {
    	int k, i, *S;
    	S = new int[N];
    	bool done;
    	for (i = 0; i < 10; i++) {
    		k = 0;
    		done = false;
    		do {
    		    if (P[i-k] <= P[i]) {
    		    k = k + 1;
    		    } else {
    		    done = true;
    			}
    		} while ((k > i) || done);
    	S[i] = k;
           }
    	return S;
    }
    ma il programma cmq nn và, sembra sia in loop...!

  8. #8
    leggi la mia penultima risp che ho modificato il codice mettendo quella nota...


    ps cmq s nel main è utilizzato(viene allocato con new e poi gli si associa il ritorno della funz span().Non capisco xchè quel warning dica il contrario...
    Cmq puoi eseguirlo ugualmente anche con quell'"avvertimento" (credo dipendi dal compilatore...approposito quale usi ? )
    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  9. #9
    Problema di parentesi, è come dici tu :tongue: svista!! cmq nonostante tutto il prog è ancora in loop e c'è il warning su s nel main

  10. #10
    Originariamente inviato da andypower
    Problema di parentesi, è come dici tu :tongue: svista!! cmq nonostante tutto il prog è ancora in loop e c'è il warning su s nel main
    gnggn mi sembra strano infatti... :metallica: :gren:

    Per il warning ti ho detto nel penultimo messaggio!!

    Ora cmq non dovrebbe andare + in loop,prova ad eseguirlo e fammi sapere
    Se si blocca ancora controlla se hai copiato/convertito BENE l'originale

    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.