Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
Apple ha rinnovato iPhone 18 Pro soprattutto dentro: chip A20 Pro a 2 nm con memoria affiancata al SoC, camera di vapore tre volte più ampia, Dynamic Island più piccola del 25% grazie a Face ID sotto il display e fotocamera principale con diaframma variabile da f/1.48 a f/4. Lo abbiamo misurato al colorimetro e nei benchmark, usato con iOS 27 e messo alla prova in fotografia tra laghi, borghi e interni poco illuminati
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
A Londra, per il trentennale dei Toughbook, Panasonic ha presentato il tablet G3 e il 2-in-1 34. Con Jon Tucker, a capo dell'ingegneria europea, abbiamo parlato di ciò che non si vede: batterie, antenne, porte seriali e accorgimenti nati sul campo
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione
realme C100x scommette tutto, forse troppo, sulla batteria da 7500 mAh e sulla certificazione ArmorShell per farsi notare nella fascia più economica del mercato: lo abbiamo messo alla prova per capire a chi è rivolto questo smartphone che sacrifica un po' prestazioni, display e fotocamera per offrire l'autonomia migliore possibile a un prezzo decisamente contenuto
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: 2794
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: 2794
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: 2794
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: 2794
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: 2794
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


iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre iPhone 18 Pro: la recensione del miglior iPhone ...
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34 Panasonic, 30 anni di Toughbook: la "Bibbia...
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione realme C100x, lo smartphone economico con la bat...
Star Wars Zero Company è l'erede di XCOM 2 Star Wars Zero Company è l'erede di XCOM ...
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia) Test ride Can-Am Origin: la moto elettrica che f...
ECOVACS T90S PRO OMNI Care Kit a 699€: 4...
iPhone Duo, i problemi di produzione con...
Lenovo e FIFA, il bilancio dei Mondiali ...
La Terra vista dalla Stazione Spaziale: ...
L'IA cinese ti spiega come produrre armi...
Nuova Fire TV Stick 4K e Telecomando Fir...
Addio Visa e Mastercard? L'Europa prepar...
Allarme IA in Florida: lo stato invoca i...
Tutte le Offerte Prime anticipate: robot...
Procura di Sassari e Oxygen Forensics: i...
Duo-Man trasforma iPhone Duo in un Walkm...
Questa carta da parati produce elettrici...
Perseverance scopre su Marte rocce mai o...
Batterie allo stato solido, Gotion alza ...
Caviar presenta la Black Edition di iPho...
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: 23:00.


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