Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Come si può fare questa rotazione?
Forum - C/C++ - Come si può fare questa rotazione?

Avatar
crack001 (Normal User)
Rookie


Messaggi: 52
Iscritto: 25/10/2007

Segnala al moderatore
Postato alle 16:11
Mercoledì, 05/01/2011
Salve ragazzi, studiando mi è capitata questa traccia sotto mano:

Codice sorgente - presumibilmente C#

  1. Scrivere una funzione void rot(char C[], int n, int k) che ruota i caratteri del vettore C di k posizioni a destra. Ad esempio, se i caratteri nel vettore C sono "programma" (n = 9) e k = 3, allora la funzione modifica il vettore in modo che contenga "mmaprogra".



Sinceramente ho buttato giu qualcosa su carta per capire il procedimento xo mi richiede troppi passaggi tra variabili, che procedimento si può utilizzare per far si che la funzione non diventi troppo elaboriosa e lunga?? sara anche un programmino semplice ma mi sta facendo impazzire da 1 oretta XD non ne vengo fuori hahah

PM
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 17:04
Mercoledì, 05/01/2011
vuoi la funzione già tutta implementata? o dei suggerimenti?

Ti do solo suggerimenti :D

Copi l'intero vettore di caratteri in un altro vettore ad esempio: char stringa1[20]; In quel vettore ci lavori su. I risultati ottenuti saranno salvati sul vettore in questo caso C.
Esempio:
Codice sorgente - presumibilmente C/C++

  1. char stringa[20];
  2. strncpy(stringa, C, n);
  3. // ciclo con variabile per la selezione degli elementi
  4. stringa[0] = C[0+k];


Se il risultato ovvero 0+k (in questo caso) è maggiore di n, il carattere sarà copiato nel primo elemento del vettore C[0]...

Ti si è accesa la :idea:

PM
Avatar
crack001 (Normal User)
Rookie


Messaggi: 52
Iscritto: 25/10/2007

Up
0
Down
V
Segnala al moderatore
Postato alle 17:22
Mercoledì, 05/01/2011
no aspetta, come hai fatto te l'esempio verrebbe fuori una cosa del genere:
Codice sorgente - presumibilmente C++

  1. void rot(char C[],int n,int k){
  2.         int i;
  3.         char b[n];
  4.         strcpy(b,C);
  5.         for(i=0;i<n;i++){
  6.                 C[i]=b[i+k];
  7.         }
  8.        
  9. }



facendo in questo modo la prima stringa andrebbe a contenere dopo il coclo solamente le lettere che io non dovevo spostare, quando invece le lettere che "hanno ruotato" non ci sono xke sono state eliminate

EDIT

cioè io l'ho fatto in questo modo

Codice sorgente - presumibilmente C++

  1. void rot(char C[],int n,int k){
  2.         int i;
  3.         char b[n];
  4.         strcpy(b,C);
  5.         for(i=0;i<n;i++){
  6.                 if(i+k>=n){
  7.                         C[i]=b[i-k];
  8.                         }
  9.                 C[i]=b[i+k];           
  10.         }
  11. }



teoricamente cosi dovrebbe funzionare xo quando mando in esecuzione con  C=ciao k=2 mi stampa solo "ao" cosa sbaglio? logicamente dovrebbe funzionare ma non va

Ultima modifica effettuata da crack001 il 05/01/2011 alle 17:50
PM
Avatar
crack001 (Normal User)
Rookie


Messaggi: 52
Iscritto: 25/10/2007

Up
0
Down
V
Segnala al moderatore
Postato alle 11:21
Venerdì, 07/01/2011
Grazie a tutti per aver risposto, ho provato a tradurre quello di gigisoft, ma ci sono errori di indice credo, cioè non mi è tnt kiaro cm funziona la ricorsione in questa funzione, viene richiamata solo con k=1???

cmq...visto che ormai grazie a pitagora avevo buttato giu quel piccolo codice con la copia della stringa, logicamente dovrebbe funzionare, xke non funziona come si deve?

PM
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 19:51
Venerdì, 07/01/2011
Testo quotato

Postato originariamente da crack001:

Grazie a tutti per aver risposto, ho provato a tradurre quello di gigisoft, ma ci sono errori di indice credo, cioè non mi è tnt kiaro cm funziona la ricorsione in questa funzione, viene richiamata solo con k=1???

cmq...visto che ormai grazie a pitagora avevo buttato giu quel piccolo codice con la copia della stringa, logicamente dovrebbe funzionare, xke non funziona come si deve?



beh... riguardo agli indici, io l'ho scritto in pseudo codifica, per 1 intendevo il primo elemento per 2 il secondo, ecc...
il C pero' parte da 0, scusa se non sono stato chiaro su questo punto.

Poi c'era effettivamente un errore, nella roazione di un elemento bsognava usare n anziche' k, scusami anche per questo.

Riguardo alla ricorsione, se k=1 faccio la rotazione di 1, se k=x>1 faccio x rotazioni di 1; in realta' si poteva fare anche cosi' (ora gli indici sono giusti):
Codice sorgente - presumibilmente VB.NET

  1. Funzione rot(C[], n, k)
  2. Variabili:
  3.   Temp = Carattere
  4.   I = Intero
  5.  
  6. Inizio Funzione
  7.  
  8. // Controllo di correttezza dei parametri n  e k
  9.   Se ((k <= 0) Oppure (n < 0)) Allora
  10.   Inizio Se
  11.     Errore!!!
  12.     Esci
  13.   Fine Se
  14.  
  15. // Rotazione di 1 elemento
  16.  
  17.   Temp = C[n - 1]
  18.   For I = (n - 1) to 1 step (-1)
  19.  
  20.   Inizio For
  21.     C[I] = C[I - 1]
  22.   Fine For
  23.  
  24.   C[0] = Temp
  25.  
  26.   // Rotazione di k - 1 elementi
  27.   Se (K > 1)
  28.   Inizio Se
  29.     rot(C, n, k - 1)
  30.   Fine Se
  31. Fine Funzione



PM
Avatar
crack001 (Normal User)
Rookie


Messaggi: 52
Iscritto: 25/10/2007

Up
0
Down
V
Segnala al moderatore
Postato alle 14:04
Venerdì, 14/01/2011
ho risolto con la copia della stringa

Codice sorgente - presumibilmente C++

  1. void rot(char C[],int n,int k){
  2.         int i;
  3.         char b[n];
  4.         char temp;
  5.         strcpy(b,C);
  6.         for(i=0;i<n;i++){
  7.                 if(i+k>=n){
  8.                        
  9.                         C[i]=b[(i+k)-n];
  10.                         }
  11.                 else{
  12.                 C[i]=b[i+k];
  13.         }
  14.                 printf("%c ",C[i]);
  15.         }


PM
Avatar
carmine (Member)
Pro


Messaggi: 168
Iscritto: 20/04/2010

Up
-1
Down
V
Segnala al moderatore
Postato alle 21:09
Mercoledì, 05/01/2011
io userei la classica inversione senza nessuna funzione stringa!
Codice sorgente - presumibilmente C++

  1. int i,
  2.     n=10,
  3.     app;
  4.     int hex[10] = { 1,2,3,4,5,6,7,8,9,10 };
  5.     int j=n-1;
  6.    
  7.     for (i = 0; i < n/2; i++)
  8.     {
  9.         app = hex[ i ];
  10.         hex[ i ] = hex[ j ];
  11.         hex[ j ] = app;
  12.         j--;
  13.     }



ovviamente in questo caso ci vuole qlk controllo in più però è piuttosto semplice!


PM
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Up
-2
Down
V
Segnala al moderatore
Postato alle 20:07
Mercoledì, 05/01/2011
Testo quotato

Postato originariamente da crack001:

Salve ragazzi, studiando mi è capitata questa traccia sotto mano:

Codice sorgente - presumibilmente C#

  1. Scrivere una funzione void rot(char C[], int n, int k) che ruota i caratteri del vettore C di k posizioni a destra. Ad esempio, se i caratteri nel vettore C sono "programma" (n = 9) e k = 3, allora la funzione modifica il vettore in modo che contenga "mmaprogra".



Sinceramente ho buttato giu qualcosa su carta per capire il procedimento xo mi richiede troppi passaggi tra variabili, che procedimento si può utilizzare per far si che la funzione non diventi troppo elaboriosa e lunga?? sara anche un programmino semplice ma mi sta facendo impazzire da 1 oretta XD non ne vengo fuori hahah



Salve,
se vuoi evitare di ricopiare tutto l'array, nella funzione rot fai cosi' ( te lo scrivo in pseudocodice ):

Codice sorgente - presumibilmente VB.NET

  1. Funzione rot(C[], n, k)
  2. Variabili:
  3.   Temp = Carattere
  4.   I = Intero
  5.  
  6. Inizio Funzione
  7.   Se ((k < 0) Oppure (n < 0)) Allora
  8.   Inizio Se
  9.     Errore!!!
  10.     Esci
  11.   Fine Se
  12.  
  13.   Se (k = 1) allora
  14.   Inizio Se
  15.     Temp = C[n]
  16.     For I = n to 2 step (-1)
  17.  
  18.     Inizio For
  19.       C[I] = C[I - 1]
  20.     Fine For
  21.  
  22.     C[1] = Temp
  23.   Altrimenti
  24.  
  25.     For I = 1 to k
  26.     Inizio For
  27.       rot(C, n, 1)
  28.     Fine For
  29.  
  30.   Fine Se
  31. Fine Funzione



Per la traduzione in C non dovresti avere troppi problemi.
Ciao. :k:

Luigi

Ultima modifica effettuata da gigisoft il 07/01/2011 alle 19:46
PM