Salve a tutti: io ho il seguente problema che mi viene dato.....

I cifrari a scorrimento sono metodi di cifratura che agiscono su un testo in cui ogni lettera del testo in chiaro viene sostituita, nel testo cifrato, con la lettera che si trova un certo numero di posizioni dopo nell’alfabeto. La sostituzione avviene lettera per lettera scorrendo il testo dall’inizio alla fine. Un famoso cifrario è il Santa[V,C], un cifrario che spacca l'alfabeto in vocali e consonanti e quindi fa scorrere una vocale di V vocali (solo sull'insieme delle vocali, ordinate alfabeticamente) e una consonante di C consonanti (solo sull'insieme delle consonanti, ordinate alfabeticamente). Stringa: ciao Cifrata Santa[2,1]: duie Si scriva una funzione che, ricevuta in ingresso una stringa di testo (consideriamo solo caratteri minuscoli) ed i valori V e C, restituisce la stringa cifrata usando Santa[V,C].

ho provato a risolvere in questo modo ma non capisco dove sbaglio, grazie a chi risponde

codice:

# include <stdio.h>
# include <string.h>
# define dim 100

void funzione(int, int , char*,int);

int main(){
    char stringa[dim];
    int l,V,C;

        do{
        printf("inserisci la  stringa:");
        scanf("%[^\n]",&stringa);
        l=strlen(stringa);}
        while(l<0 || l>dim);

        stringa[l]='\0';

        printf("inserisci il numero di spostamento della vocale:");
        scanf("%d",&V);
        printf("inserisci il numero di spostamento della consonante:");
        scanf("%d",&C);

        santa(V,C,stringa,l);

        printf("la stringa cifrata Ë: %s",stringa);

return 0;}

void funzione(int v, int c, char *stringa, int dim){

    int i,cont=0,stop=0,j;

    for(i=0;i<dim;i++){

        if(*(stringa+i)=='a' || *(stringa+i)=='e' || *(stringa+i)=='i' || *(stringa+i)=='o' || *(stringa+i)=='u'){
            for(j=1;j<26;j++){
                if(stop==0){
                if(*(stringa+i)+'j' >'122'){
                    *(stringa+i)=( *(stringa+i)+'j'-'26');}
                else
                *(stinga+i)+='j';
                if(*(stringa+i)=='a' || *(stringa+i)=='e' || *(stringa+i)=='i' || *(stringa+i)=='o' || *(stringa+i)=='u'){
                   cont++;
                        if(cont==v)
                            stop=1;}}}}}}

chiesto 13 Feb '16, 19:29

mai's gravatar image

mai
20124

modificato 14 Feb '16, 12:20

enzotib's gravatar image

enzotib ♦♦
14.0k112186

@mai: per prima cosa, non mi è chiaro il procedimento per leggere la stringa di input, che potrebbe essere molto più semplice, per esempio:

fgets(stringa, dim, stdin);
n = strlen(stringa);
stringa[n-1]='\0';

Seconda cosa, la funzione la usi nel main come "santa", ma la dichiari come "funzione", invece devi essere coerente ed usare lo stesso nome. Inoltre l'ultimo parametro che indica la lunghezza non serve, dato che la lunghezza può essere ottenuta tramite "strlen". E ancora, il ciclo principale della funzione è su "dim" e non sulla lunghezza effettiva della stringa.

(14 Feb '16, 12:38) enzotib ♦♦ enzotib's gravatar image

Ciao, allora per quanto riguarda l'input ci hanno insegnato solo il modo che ho usato non so cosa vuol dire fgets. Per la funzione invece si hai ragione ho provato a cambiarla ma mi dà lo stesso errore .....la storia della lunghezza non ho capito perché deve lavorare sulla dim 100 Grazie

(14 Feb '16, 19:17) mai mai's gravatar image

Ho individuato i seguenti errori, ma non riesco ad entrare nella logica della funzione che dovrebbe fare la cifratura, quindi ti segnalo gli errori che una volta corretti consentono di compilare il programma, poi magari spiegherai meglio cosa ti aspetti e cosa invece ottieni.

  1. come dicevamo, il prototipo, la chiamata e la definizione della funzione devono concordare

        void funzione(int, int , char*,int);
    

    dev'essere invece

        void santa(int, int , char*,int);`
    
  2. la variabile stringa è già un puntatore, non bisogna mettere davanti il carattere "&"

        scanf("%[^\n]",&stringa);
    

    dev'essere invece

        scanf("%[^\n]",stringa);
    
  3. stesso motivo di prima a riguardo del nome della funzione, inoltre "dim" è già una #define, non si può usare come nome di variabile, che ho cambiato in dim2

        void funzione(int v, int c, char *stringa, int dim){
    

    dev'essere invece

        void santa(int v, int c, char *stringa, int dim2){
    
  4. come prima, la variabile dim diventa dim2

        for(i=0;i<dim;i++){
    

    dev'essere invece

        for(i=0;i<dim2;i++){
    
  5. non esiste il carattere '122', invece esiste il carattere il cui codice ASCII è 122, quindi bisogna togliere le virgolette singole

        if(*(stringa+i)+'j' >'122'){
    

    dev'essere invece

        if(*(stringa+i)+'j' >122){
    
  6. come prima, '26' dev'essere 26

        *(stringa+i)=( *(stringa+i)+'j'-'26');}
    

    dev'essere invece

        *(stringa+i)=( *(stringa+i)+'j'-26);}
    
  7. refuso, manca la r di stringa

        *(stinga+i)+='j';
    

    dev'essere invece

        *(stringa+i)+='j';
    
coll. permanente

ha risposto 14 Feb '16, 22:40

enzotib's gravatar image

enzotib ♦♦
14.0k112186

ho cambiato quello che mi hai detto e ho anche cambiato un'altra riga e lo scritta in questo modo: (stringa+i)=( (stringa+i)-'j'(v%26) %26 + 'j' adesso il programma mi cambia solo la lettera 'i' in 'u' che è giusto ma poi non continua con le altre vocali e non capisco il perchè... per le consonanti invece non ho ancora scritto la parte di codice visto che le lettere sono di più non so da dove iniziare..... grazie per l'aiuto

http://pastebin.ubuntu.com/15078753/

(15 Feb '16, 12:47) mai mai's gravatar image

@mai: c'è ancora il punto 1. che non hai sistemato, funziona lo stesso, ma è segnalato come un warning.
Inoltre, non ti voglio dare la soluzione, ma un'idea per risolvere: definisci una stringa costante vocali="aeiou", dopodiché, se un carattere dell'input corrisponde al carattere di indice 2 questa stringa, ovvero ad una "i", fai (2+v)%5.
Stessa cosa per le consonanti, definisci consonanti="bcdfghjklmnpqrstvwxyz", di lunghezza 21, quindi se trovi che un carattere dell'input corrisponde al carattere di indice j di questa stringa, basta fare (j+C)%21, ed hai l'indice della nuova consonante

(15 Feb '16, 19:05) enzotib ♦♦ enzotib's gravatar image
La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×103
×22

domanda posta: 13 Feb '16, 19:29

domanda visualizzata: 914 volte

ultimo aggiornamento: 15 Feb '16, 19:05

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.