Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
Nelle ultime settimane abbiamo provato tre delle proposte top di gamma di NZXT nelle categorie case, dissipatori e ventole. Rispettivamente, parliamo dell'H9 Flow RGB+, Kraken Elite 420 e F140X. Si tratta, chiaramente, di prodotti di fascia alta che si rivolgono agli utenti DIY che desiderano il massimo per la propria build. Tuttavia, mentre i primi due dispositivi mantengono questa direzione, le ventole purtroppo hanno mostrato qualche tallone d'Achille di troppo
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-04-2011, 18:26   #1
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
[C++]Funzione ricorsiva: incastro stringhe

Ho fatto questo esercizio ma non riesco a farlo funzionare, mi date una mano?

Si scriva in C++ una funzione RICORSIVA che, ricevuti come parametri (almeno) tre array di caratteri, A B e C, e la loro dimensione, riempia C incastrando ad incrocio i caratteri presenti in A e B come descritto di seguito. Ogni coppia di elementi consecutivi in C deve essere formata da un carattere di A e da uno di B; gli elementi di A vanno usati da sinistra verso destra( cioè prima il primo, poi il secondo e così via) mentre gli elementi di B devono essere usati da destra verso sinistra (ossia, prima l’ultimo, poi penultimo, ecc.). Pertanto, la prima coppia di elementi in C sarà formata dal primo carattere di A e dall’ultimo in B, la seconda coppia in C, conterrà, il secondo elemento di A ed il penultimo di B e così via, finché tutti i caratteri di A e di B saranno stati considerati.
Si noti che, perché l’incastro sia fattibile, gli array A e B devono avere la stessa dimensione n, mentre la dimensione di C deve essere 2*n. Se la funzione riceve come parametri array le cui dimensioni non rispettano queste condizioni, l’incastro non deve essere effettuato e la funzione deve terminare restituendo false.
Codice:
 
  A                     B                    C
VERDE             ROSSO              VOESRSDOER
                                                                          
        
ESEMPIO: Dati gli array A e B riportati sopra, la funzione dovrà 
riempire l’array C come illustrato in figura e terminerà restituendo true.
La mia soluzione:
Codice:
bool incastro(char A[], int dim, char B[], int dim, char C[],  int dimC, int i){
       if(dimC!=dim*2)
       return false;
       
       if(A[i]==dim)
       return true;
       C[i]=A[i];
       C[i]=B[i];

incastro(A, dim, B, dim-1, C, dimC, i+1);
}

Ultima modifica di mistergks : 06-04-2011 alle 18:28.
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 06-04-2011, 19:00   #2
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2789
Codice:
bool incastro(char A[], int dim, char B[], int dim, char C[],  int dimC, int i){
       if(dimC!=dim*2)
       return false;
       
       if(A[i]==dim)
       return true;
       C[i]=A[i];
       C[i]=B[i];

incastro(A, dim, B, dim-1, C, dimC, i+1);
}
Ti ho evidenziato le parti che secondo me sono da correggere.
Intanto non puoi chiamare con lo stesso nome due parametri diversi (mi riferisco a dim che hai usato sia per la dimensione di A sia per quella di B).
Poi nella condizione di terminazione true dovresti confrontare l'indice i con dim, non A[i].
Le assegnazioni non vanno bene per via degli indici, devi considerare che, mentre in A e in B avanzi di uno per volta a leggere i valori, in C devi inserire 2 valori per volta. Riguardo a questo inoltre tu hai scritto consecutivamente due valori diversi nella stessa posizione C[i].
Infine ci sono dei problemi nella chiamata finale: perché diminuisci dim di 1? Tieni poi sempre conto che devi usare due nomi di parametri distinti per le dimensioni.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2011, 12:41   #3
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
ho risolto spero.... ora va bene il codice migliorato??

Codice:
bool incastro(char A[],int sizeA, char B[],int sizeB, char C[], int sizeC, int i){
     
     if(sizeA != sizeB && sizeC != 2*sizeA) //per terminare subito
     return false;
     
     if(i==sizeC) //caso base
     return true;
     
     C[i]=A[i];
     C[i+1]=B[sizeB];
     
     incastro(A, sizeA, B, --sizeB, C, sizeC, i+1);        
}

Ultima modifica di mistergks : 07-04-2011 alle 12:52.
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2011, 13:33   #4
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2789
Quote:
Originariamente inviato da mistergks Guarda i messaggi
ho risolto spero.... ora va bene il codice migliorato??

Codice:
bool incastro(char A[],int sizeA, char B[],int sizeB, char C[], int sizeC, int i){
     
     if(sizeA != sizeB && sizeC != 2*sizeA) //per terminare subito
     return false;
     
     if(i==sizeC) //caso base
     return true;
     
     C[i]=A[i];
     C[i+1]=B[sizeB];
     
     incastro(A, sizeA, B, --sizeB, C, sizeC, i+1);        
}
Quel && deve diventare un || Perché se una qualsiasi di quelle condizioni si verifica non puoi andare avanti.
Gli indici di C non vanno bene, facciamo un esempio:
alla prima iterazione i=0 -> scrivi in C[0] e C[1]
alla seconda i=1 -> scrivi in C[1] e C[2]
In pratica ogni volta sovrascrivi uno dei valori che hai scritto prima.
Non puoi usare sizeB per indicizzare B perché quando effettui la chiamata ricorsiva devi decrementare sizeB e questo lo rende diverso da sizeA facendoti entrare nel primo if.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2011, 14:31   #5
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
Ops...che disastro ... ora dovrebbe andare...
Codice:
bool incastro(char A[],int sizeA, char B[],int sizeB, char C[], int sizeC, int i){
     
     if(sizeA != sizeB || sizeC != 2*sizeA) //per terminare subito
     return false;
     
     if(i==sizeC) //caso base
     return true;
     
     C[i]=A[i];
     C[i+1]=B[j];
     
     incastro(A, sizeA, B, sizeB, C, sizeC, i+2, --j);        
}
come mai il compilatore mi da questo errore?
Codice:
error: too few arguments to function `bool incastro(char*, int, char*, int, char*, int, int, int)'
Significa che la funzione ha troppi argomenti? c'è un numero massimo? non lo sapevo...e come si fa quindi?

Ultima modifica di mistergks : 07-04-2011 alle 14:43.
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2011, 18:16   #6
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2789
Quote:
Originariamente inviato da mistergks Guarda i messaggi
Ops...che disastro ... ora dovrebbe andare...
Codice:
bool incastro(char A[],int sizeA, char B[],int sizeB, char C[], int sizeC, int i){
     
     if(sizeA != sizeB || sizeC != 2*sizeA) //per terminare subito
     return false;
     
     if(i==sizeC) //caso base
     return true;
     
     C[i]=A[i];
     C[i+1]=B[j];
     
     incastro(A, sizeA, B, sizeB, C, sizeC, i+2, --j);        
}
come mai il compilatore mi da questo errore?
Codice:
error: too few arguments to function `bool incastro(char*, int, char*, int, char*, int, int, int)'
Significa che la funzione ha troppi argomenti? c'è un numero massimo? non lo sapevo...e come si fa quindi?
j dove è dichiarato? Inoltre se i avanza di 2 in 2 quando leggi il valore A[i] salterai tutti i valori in posizione dispari (leggerai A[0], A[2], A[4], A[6] ...)
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2011, 18:49   #7
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
oh cavolo.....come posso risolvere sta cosa???
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2011, 21:04   #8
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2789
Io userei solo l'indice i, quindi farei a meno di j. Inoltre i lo incrementerei di 1 per volta, invece di 2.
Quindi per i=0:
C[0]=A[0]
C[1]=B[sizeB-1]
per i=1
C[2]=A[1]
C[3]=B[sizeB-2]
per i=2
C[4]=A[2]
C[5]=B[sizeB-3]
...
Devi capire qual è la relazione tra questi indici e i.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2011, 22:36   #9
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
Ho usato un nuovo indice per l'array A..mi sembra l'unica soluzione... la j è vero...c'era l'errore che andava inizializzata a dimB per scorrere dall'ultimo elemento al primo...comunque ora ho usato direttamente l'indice di dimensione...

Codice:
bool incastro(char A[],int sizeA, char B[],int sizeB, char C[], int sizeC, int i, int k){
     
     if(sizeA != sizeB || sizeC != 2*sizeA) //per terminare subito
     return false;
     
     if(i==sizeC) //caso base
     return true;
     
     C[i]=A[k];
     C[i+1]=B[sizeB-k];
     
     incastro(A, sizeA, B, sizeB, C, sizeC, i+2, ++k);        
}

Ultima modifica di mistergks : 07-04-2011 alle 23:14.
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2011, 23:23   #10
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
Mi è sorto un dubbio sul caso base... incrementando i di 2... se ad esempio non ci fosse stato il vincolo, che il vettore C deve essere grande quando la somma di A e B ed essi devono essere uguali...quindi C avrà size pari sicuramente, quale sarebbe stato il caso base?
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2011, 14:06   #11
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2789
Ciao, ora il tuo codice mi sembra quasi corretto, manca solo un -1 lì dove l'ho aggiunto nel codice sotto e un return
Codice:
bool incastro(char A[],int sizeA, char B[],int sizeB, char C[], int sizeC, int i, int k){
     
     if(sizeA != sizeB || sizeC != 2*sizeA) //per terminare subito
     return false;
     
     if(i==sizeC) //caso base
     return true;
     
     C[i]=A[k];
     C[i+1]=B[sizeB-k-1];
     
     return incastro(A, sizeA, B, sizeB, C, sizeC, i+2, ++k);        
}
Quel -1 serve perché altrimenti per k=0 sfori oltre il limite dell'array B, e in più non andrai mai a considerare B[0].
Per il resto va tutto bene. Non ho capito molto la tua domanda quindi evito di rispondere in modo errato.

Ti aggiungo il codice dell'esercizio svolto usando solo l'indice i (quindi senza k) e con una piccola ulteriore ottimizzazione/miglioria.
Codice:
bool incastro(char A[], int sizeA, char B[], int sizeB, char C[], int sizeC){

     if(sizeA != sizeB || sizeC != 2*sizeA)
          return false;
     return incastro_int(A,B,sizeA,C,0);

}

bool incastro_int(char A[], char B[], int sizeAB, char C[], int i){

     if(i==sizeAB)
     return true;
     
     C[2*i]=A[i];
     C[2*i+1]=B[sizeAB-i-1];
     
     return incastro_int(A, B, sizeAB, C, i+1);     
   
}
Non l'ho provato ma dovrebbe andare.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Anthropic ha un'AI che trova falle in Wi...
I 10 migliori sconti Amazon del weekend:...
Con un coupon scendono ancora: le super ...
Minimo storico per Samsung Galaxy S26 Ul...
Si è conclusa la missione lunare ...
EK Waterblock si arrende agli aumenti, i...
Geekbench si aggiorna: tutti i test con ...
Per la prima volta un computer quantisti...
Telecamere Reolink 4K su Amazon: Wi-Fi 6...
Anthropic vuole farsi i chip da sola? Co...
Il fondatore di Framework: il personal c...
JBL Live Flex 3 a 129€ su Amazon: ANC ad...
Come un uomo ha costruito un'azienda da ...
Multe fino a 400 euro anche se hai pagat...
Tapo lancia una valanga di offerte su Am...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:00.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v