RISOLTO [C] Programma che salva in una tabella solo lettere minuscole

Stato
Discussione chiusa ad ulteriori risposte.

Vito-

Nuovo Utente
104
8
Domanda: che succede se NON sommi 13? E perché mai hai deciso di sommare 13. Immetti la lettera a minuscola, cosa ti stampa?
Se non sommo 13 mi stampa il carattere cosi comé
Ho deciso di sommare 13 perche me lo chiedeva l'esercizio
Stampa un'altra lettera

spero di aver capito le domande
 

Andretti60

Utente Èlite
5,228
3,807
Beh, non lo hai mai detto che sommare 13 è richiesto dall’esercizio ;)
Allora va bene, ma mi piacerebbe avere il testo completo dell’esercizio per evitare confusione. Chiedo perché 13 è il codice ascii del tasto di ritorno e ciò è sospetto
 

Vito-

Nuovo Utente
104
8
Beh, non lo hai mai detto che sommare 13 è richiesto dall’esercizio ;)
Allora va bene, ma mi piacerebbe avere il testo completo dell’esercizio per evitare confusione. Chiedo perché 13 è il codice ascii del tasto di ritorno e ciò è sospetto
Questo é il testo:
"Realizzare un programma che legge da tastiera (e memorizza) una sequenza di caratteri alfabetici minuscoli (letti ad uno a uno), terminata dal carattere '#'; se l; utente inserisce un carattere non valido (un carattere maiuscolo, un numero o un simbolo che non sia '#'), il carattere on va memorizzato; la sequenza puo essere lunga al massimo 100 elementi (escluso lo '#'). Il programma riproduce sullo standard output la sequenza di caratteri, convertendone il contenuto secondo la cifratura ROT-13. Questa cifratura prevede che ad ogni carattere che rappresenta la lettera tra le 26 dell'alfabeto in posizione i si sostituisca la lettera in posizione i+13 (mod26). Ad esempio, digitando la sequenza di caratteri testodoprova#, il programma deve stampare la stringa di caratteri grfgbqvcebin. Si noti che applicando un numero pari di volte la trasformazione si riottenga il testo di partenza."

Non l'ho messo prima perche pensavo di riuscirci da solo sistemato quel problema iniziale, ma evidentemente la prossima volta é meglio che lo metto sin dall'inizio...
 

Andretti60

Utente Èlite
5,228
3,807
Ah, ecco. Non basta aggiungere la somma di 13, devi poi usare appropriatamente la funzione modulo. Ad ogni modo il testo ti dà un esempio di cosa devi scrivere e del risultato che devi ottenere. Pensaci bene su.

Comunque complimenti, fino ad ora sei riuscito a correggerti usando solo i suggerimenti da noi dati (come da regolamento). Continua così, ti avviso solo che di strada davanti ne hai ancora tanta. Questi esercizi sono solo la parte introduttiva alla programmazione, tanto per farsi le ossa.
 

Vito-

Nuovo Utente
104
8
Ah, ecco. Non basta aggiungere la somma di 13, devi poi usare appropriatamente la funzione modulo. Ad ogni modo il testo ti dà un esempio di cosa devi scrivere e del risultato che devi ottenere. Pensaci bene su.

Comunque complimenti, fino ad ora sei riuscito a correggerti usando solo i suggerimenti da noi dati (come da regolamento). Continua così, ti avviso solo che di strada davanti ne hai ancora tanta. Questi esercizi sono solo la parte introduttiva alla programmazione, tanto per farsi le ossa.
Intanto grazie per tutto!
Quindi da regolamento non si possono dare soluzioni??
Eh si sono ancora al primo anno di ingegneria, avro fatto tipo un 2 mesetti di lezioni, e mi sento ancora una schiappa...
 

DispatchCode

Moderatore
Staff Forum
1,360
999
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Intanto grazie per tutto!
Quindi da regolamento non si possono dare soluzioni??
Eh si sono ancora al primo anno di ingegneria, avro fatto tipo un 2 mesetti di lezioni, e mi sento ancora una schiappa...

Si, è riportato nel primo punto del regolamento di sezione https://forum.tomshw.it/threads/reg...ni-utili-sulla-sezione-programmazione.753319/

La sezione Programmazione e le sue sottosezioni non offrono un servizio di risoluzione compiti scolastici.
E' possibile chiedere aiuto ma allegando il codice scritto o le prove fatte.

In realtà poi è utile soprattutto a voi, perchè se vi diamo il codice, rischiate di copiare e incollare senza capire perchè fare una determinata cosa o come funziona. 😉


Ad ogni modo, come dice Andretti il testo dell'esercizio ti dice cosa fare; rispetto al tuo codice sopra ti manca il modulo 26 (ma solo questo non è sufficiente).

Fai qualche prova "a mano" con le lettere: la lettera 'a' diventa 'n' perchè fai (97 + 13 mod 26) = 110.
A questo punto armati di tabella ASCII https://www.asciitable.com/

Le lettere sono 26, quindi sai che quando cifri la lettera in posizione 26/2=13 (immaginale con la 'a' in posizione 0 e a seguire) ovvero la 'm', ottieni come output cifrato la 'z' (l'ultima dell'alfabeto).
Ora nota, nel caso della 'n' che ha come ascii 110, ottieni dopo l'applicazione di ROT13 il numero 123, che è oltre il range dei caratteri (il carattere dopo la 'z' nella tabella ASCII). Questo valore ti deve dare come output la lettera 'a' (97).

In pratica diventa circolare... cosa ti suggerisce questo?
 
  • Mi piace
Reazioni: Vito- e Andretti60

Andretti60

Utente Èlite
5,228
3,807
Tuttavia mi sa che si genera qualche problema dovuto al buffer di input (ovvero che rimanga il new line nel buffer). O sbaglio?

Ah, guarda, io evito sempre la lettura formattata da input, in C è terribile, ci sono troppe cose che possono andare storto, specialmente nell’odioso formato “%c” e non esiste nessuna soluzione valida al 100%
Io leggo sempre una linea alla volta usando fgets(), e poi faccio io stesso il parsing, in questo modo posso anche essere sicuro di evitare possibili errori di conversione.
 
  • Mi piace
Reazioni: DispatchCode

Vito-

Nuovo Utente
104
8
Si, è riportato nel primo punto del regolamento di sezione https://forum.tomshw.it/threads/reg...ni-utili-sulla-sezione-programmazione.753319/



In realtà poi è utile soprattutto a voi, perchè se vi diamo il codice, rischiate di copiare e incollare senza capire perchè fare una determinata cosa o come funziona. 😉


Ad ogni modo, come dice Andretti il testo dell'esercizio ti dice cosa fare; rispetto al tuo codice sopra ti manca il modulo 26 (ma solo questo non è sufficiente).

Fai qualche prova "a mano" con le lettere: la lettera 'a' diventa 'n' perchè fai (97 + 13 mod 26) = 110.
A questo punto armati di tabella ASCII https://www.asciitable.com/

Le lettere sono 26, quindi sai che quando cifri la lettera in posizione 26/2=13 (immaginale con la 'a' in posizione 0 e a seguire) ovvero la 'm', ottieni come output cifrato la 'z' (l'ultima dell'alfabeto).
Ora nota, nel caso della 'n' che ha come ascii 110, ottieni dopo l'applicazione di ROT13 il numero 123, che è oltre il range dei caratteri (il carattere dopo la 'z' nella tabella ASCII). Questo valore ti deve dare come output la lettera 'a' (97).

In pratica diventa circolare... cosa ti suggerisce questo?
C:
trasf = 'a' + (arrayCaratteri[n]+13 - 'a') % 26;
printf("%c", trasf);
 
  • Mi piace
Reazioni: DispatchCode

DispatchCode

Moderatore
Staff Forum
1,360
999
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
C:
trasf = 'a' + (arrayCaratteri[n]+13 - 'a') % 26;
printf("%c", trasf);

Si, così è corretto. 😉

Dovrai solo stampare tutti i caratteri a video. Non viene detto se devi sovrascrivere la sequenza originale o no, nel dubbio stampa solo il testo, come richiesto (almeno secondo me).
 
  • Mi piace
Reazioni: Vito-
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando

Discussioni Simili