esercizio sulle stringhe - sostituzione caratteri

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
glprobot1
Prode Principiante
Messaggi: 44
Iscrizione: sabato 26 marzo 2016, 16:17
Desktop: 14.4
Distribuzione: 14.4
Sesso: Maschile

esercizio sulle stringhe - sostituzione caratteri

Messaggio da glprobot1 »

Buongiorno,

Ho un problema con questo esercizio, in pratica, l'esercizio dice che:

Visto che la chiave è un int;

int chiave;
String frase = "abcd"

Ogni lettera sia sostituita del valore contenuto in chiave.

Esempio:

Se chiave = 3;

la lettera a sarà sostituita da d, la lettera b sara sostituita da e, ecc....

Come faccio a ragionare, non riesco, sono giorni che mi spremo... :muro: :muro: :muro:
Mi potete aiutare, non so come posso ragionare???
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: esercizio sulle stringhe - sostituzione caratteri

Messaggio da Claudio_F »

Una stringa è una sequenza di caratteri.
Quindi si può indicizzare un singolo carattere alla volta per conoscerne il valore ordinale (il codice che lo rappresenta).
Si somma la chiave a quel valore.
Si ottiene così un nuovo codice che corrisponderà al nuovo carattere.
Si sostituisce il vecchio carattere col nuovo (o si crea una nuova stringa un carattere alla volta a seconda del linguaggio).
Finito.

Il come farlo dipende dagli strumenti base messi a disposizione dal linguaggio utilizzato, in Python ad esempio basta una sola riga:

Codice: Seleziona tutto

frase = ''.join(chr(ord(c) + chiave) for c in frase)
In assembly Z80 qualcuna in più ma neanche tante:

Codice: Seleziona tutto

RUOTA   LD      A,(CHIAVE)
        LD      D,A
        LD      HL,FRASE
LOOP    LD      A,(HL)
        AND     A
        RET     Z
        ADD     A,D
        LD      (HL),A
        INC     HL
        JP      LOOP
In C più o meno così:

Codice: Seleziona tutto

void ruota(char* frase, int chiave)
{
    while(*frase) *frase++ += chiave;
}
GWBASIC :p

Codice: Seleziona tutto

500 FOR I=1 TO LEN(FRASE$)
510 MID$(FRASE$, I, 1) = CHR$(ASC(MID$(FRASE$, I, 1)) + CHIAVE)
520 NEXT I
Java non lo conosco...


NOTA IMPORTANTE: la traccia dell'esercizio dovrebbe anche specificare bene cosa fare se carattere+chiave supera 'z', cioè la "rotazione" dei codici dovrebbe avvenire per un insieme circolare ben preciso in cui il primo carattere utilizzabile si considera affiancato a sinistra dall'ultimo.
Ultima modifica di Claudio_F il domenica 20 agosto 2017, 11:57, modificato 1 volta in totale.
glprobot1
Prode Principiante
Messaggi: 44
Iscrizione: sabato 26 marzo 2016, 16:17
Desktop: 14.4
Distribuzione: 14.4
Sesso: Maschile

Re: esercizio sulle stringhe - sostituzione caratteri

Messaggio da glprobot1 »

Grazie, adesso provo.
Io utlizzo il linguaggio Java.

Vorrei capire in C, alcune cose:

Lei, ha scritto:
void ruota(char* frase, int chiave)
{
while(*frase) *frase++ += chiave;
}

In pratica se ho capito bene, questa funzione.
Hai dichiarato due parametri, char frase e int chiave.
hai fatto un ciclo while, ma nella codizione hai passato solo Frase, senza specificare una condizione.
dopo incrementi frase++
e dopo fai la somma con frase = frase + chiave.

Per piacere mi puoi correggere se ho sbagliato ad interpretare??? che lo devo tradurre in Java
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: esercizio sulle stringhe - sostituzione caratteri

Messaggio da Claudio_F »

Tradurre letteralmente in un altro linguaggio potrebbe non essere la scelta migliore, nel senso che ogni linguaggio ha strumenti specifici per implementare un certo algoritmo, e in Java potrebbe esserci un modo diverso da tutti gli esempi presentati (che comunque applicano lo stesso principio descritto a voce all'inizio).

Tornando al C, i parametri della funzione sono un puntatore a char e un intero.
Si poteva anche scrivere:

Codice: Seleziona tutto

char frase[]
perché una stringa C (array di char) viene sempre passata per riferimento.

Il while testa la "booleanità" di quanto specificato tra parentesi, in particolare continua a ciclare finché i caratteri puntati da 'frase' sono diversi dal valore binario zero (le stringhe C sono null terminated). Un valore zero è considerato falso e il ciclo termina. È come scrivere:

Codice: Seleziona tutto

while(*frase != 0)
Poi sommo al carattere puntato il valore di chiave, ed infine incremento il puntatore.
Il ++ finale viene applicato dopo l'utilizzo del puntatore stesso, è un post incremento, come scrivere:

Codice: Seleziona tutto

{ *frase += chiave;  frase++; }
glprobot1
Prode Principiante
Messaggi: 44
Iscrizione: sabato 26 marzo 2016, 16:17
Desktop: 14.4
Distribuzione: 14.4
Sesso: Maschile

Re: esercizio sulle stringhe - sostituzione caratteri

Messaggio da glprobot1 »

ok, grazie.

Adesso provo a convertire da C a java
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 10 ospiti