Oppure

Loading
05/01/11 15:11
crack001
Salve ragazzi, studiando mi è capitata questa traccia sotto mano:

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
aaa
05/01/11 16:04
Pitagora
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:
char stringa[20];
strncpy(stringa, C, n);
// ciclo con variabile per la selezione degli elementi
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:
aaa
05/01/11 16:22
crack001
no aspetta, come hai fatto te l'esempio verrebbe fuori una cosa del genere:
void rot(char C[],int n,int k){
	int i;
	char b[n];
	strcpy(b,C);
	for(i=0;i<n;i++){
		C[i]=b[i+k];
	}
	
}


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

void rot(char C[],int n,int k){
	int i;
	char b[n];
	strcpy(b,C);
	for(i=0;i<n;i++){
		if(i+k>=n){
			C[i]=b[i-k];
			}
		C[i]=b[i+k];		
	}
}


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 05/01/11 16:50
aaa
05/01/11 19:07
gigisoft
Postato originariamente da crack001:

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

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 ):

Funzione rot(C[], n, k)
Variabili:
  Temp = Carattere
  I = Intero

Inizio Funzione
  Se ((k < 0) Oppure (n < 0)) Allora
  Inizio Se
    Errore!!!
    Esci
  Fine Se

  Se (k = 1) allora
  Inizio Se
    Temp = C[n]
    For I = n to 2 step (-1)

    Inizio For
      C[I] = C[I - 1]
    Fine For

    C[1] = Temp
  Altrimenti

    For I = 1 to k
    Inizio For
      rot(C, n, 1)
    Fine For

  Fine Se
Fine Funzione



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

Luigi
Ultima modifica effettuata da gigisoft 07/01/11 18:46
aaa
05/01/11 20:09
carmine
io userei la classica inversione senza nessuna funzione stringa!
    int i,
    n=10,
    app;
    int hex[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int j=n-1;
    
    for (i = 0; i < n/2; i++)
    {
        app = hex[ i ];
        hex[ i ] = hex[ j ];
        hex[ j ] = app;
        j--;
    }



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

aaa
07/01/11 10:21
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?
aaa
07/01/11 18:51
gigisoft
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):

Funzione rot(C[], n, k)
Variabili:
  Temp = Carattere
  I = Intero
 
Inizio Funzione

// Controllo di correttezza dei parametri n  e k
  Se ((k <= 0) Oppure (n < 0)) Allora
  Inizio Se
    Errore!!!
    Esci
  Fine Se

// Rotazione di 1 elemento

  Temp = C[n - 1]
  For I = (n - 1) to 1 step (-1)
 
  Inizio For
    C[I] = C[I - 1]
  Fine For
 
  C[0] = Temp

  // Rotazione di k - 1 elementi
  Se (K > 1)
  Inizio Se
    rot(C, n, k - 1)
  Fine Se
Fine Funzione

aaa
14/01/11 13:04
crack001
ho risolto con la copia della stringa

void rot(char C[],int n,int k){
	int i;
	char b[n];
	char temp;
	strcpy(b,C);
	for(i=0;i<n;i++){
		if(i+k>=n){
			
			C[i]=b[(i+k)-n];
			}
		else{
		C[i]=b[i+k];
	}
		printf("%c ",C[i]);
	}
aaa