Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di Salvy95
    Registrato dal
    Jul 2008
    Messaggi
    199

    [c] Programma per criptare parole

    Salve, volevo realizzare un programma per la codifica di cesare.. utilizzando i caratteri ascii

    ecco come:

    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define Max_word 99

    char cripta(word){ 
           
    int j=0;
           
    int l=strlen(word); //Qui mi da un wairning, perchè?
           
    int temp;
         while(
    j<l){
                    
    temp=(int)word[j]; /*mi da errore: Qui volevo prendere il singolo carattere della stringa, portarlo a numero intero, quindi se il carattere è 's' ad esempio, mi avrebbe dato il corrispondente intero nella tabella ascii */
                    
    temp++;
                    
    word[j]=temp/*errore: stessa cosa di sopra */
                    
    j++;
                    }
                    return 
    word;
                    }

    int main(int argcchar *argv[])
    {
        
    char *word[Max_word],string;
      
    printf("Benvenuti! Inserire una parola\n");
      
    scanf("%s",&word);
      
    printf("Sto criptando...");
      
    sleep(1);
      
    printf("...");
      
    string=cripta(word);
      
    sleep(1);
      
    system("PAUSE");    
      return 
    0;

    come posso risolvere?
    probabilmente è ignoranza... però potete darmi una mano?

  2. #2
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    954
    Scusa mi sfugge ma il parametro word di che tipo è? Non so hai assegnato, forse te ne mette uno di default e fa casini.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    Ecco il programma funzionante

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <windows.h>
    #define Max_word 99
    
    char * cripta (char*); //1
    
    char * cripta(char * word){//2
           int j=0;
           int l=strlen(word); 
           int temp;
          while(j<l){
                    temp=(int)word[j]; 
                    temp++;
                    
                    
                    if(temp == 123) temp = 97;
                    /* il carattere 'z' è 122 sommato a 1 risulta il caattere ascii '{'
                    * pertanto il valore deve essere portato manualmente al valore di   
                    * 'a' cioè 97. */
                    
                    if(temp == 91) temp = 65;
                     //Il carattere stavolta è 'Z'
                     
                    word[j]=temp; 
                    j++;
                    }
                    return word;
                    }
    
    int main(int argc, char *argv[])
    {
      char word[Max_word]; //3 <<<<<GRAVE prima avevi scritto char * word[] che equivale al tipo char** e non char*
      char * string; //3 pertanto non ho pututo dichiarare sulla stessa riga string
      printf("Benvenuti! Inserire una parola\n");
      scanf("%s",&word);
      printf("\nSto criptando...");
      Sleep(1);
      
      for(int aggiunta = 0; aggiunta < 25; aggiunta++)
      {printf("*");Sleep(70);}//questo l'ho aggiunto io per bellezza :)
      
      
      string = cripta(word); 
      printf("\nParola criptata: \"%s\"\n",string);
      Sleep(1);
      system("PAUSE");    
      return 0;
    }
    Dovevi dichiarare il prototipo della funzione (//1), nella dichiarazione della funzione come argomenti passati dovevi mettere char * word non word (//2), c'erano degli errori di conversione dovuti ad una scorretta dichiarazione dei tipi char * (//3), la funzione corretta è Sleep(...); e non sleep(...); e per usarla va incluso windows.h, infine c'era un errore a livello di contenuto: i caratteri z e Z venivano convertiti in { e [ pertanto ho dovuto aggiungere un pezzo di codice. Mi sembra di aver detto tutto comunque hai fatto un buon lavoro.

  4. #4
    Utente di HTML.it L'avatar di Salvy95
    Registrato dal
    Jul 2008
    Messaggi
    199

    alè

    Ok sei un mito ,funziona!
    Volevo solo chiederti una cosa...
    Perchè dobbiamo creare puntatori?

    Cioè io vengo da un tipo di programmazione "moderna" come il php o il javascript, dove i puntatori non compaiono proprio, sinceramente ancora non ho capito questo argomento!

    Se avessi scritto char string; invece di char * string;

    cosa sarebbe cambiato? :'(
    ti prego aiutami a capire :|
    ripeto quanto tu sia un mito :P

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    Mito...

    Insomma di miti ce ne sono molto più grndi in questo forum, comunque adesso devo andare domani pomeriggio ti spiego questo discorso dei puntatori. A domani.

  6. #6
    Utente di HTML.it L'avatar di Salvy95
    Registrato dal
    Jul 2008
    Messaggi
    199

    source completo

    Posto di seguito il codice completo per criptare e decriptare per i cuoriosi.

    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <windows.h>
    #define Max_word 99
    // Si ringrazia kirakira93 per l'aiuto //Sviluppatore : salvy
    char cripta(char*); //Dichiaro il prototipo della funzione per criptare.
    char cripta(char*); //Dichiaro il prototipo della funzione per decriptare.
    char cripta(char word){
           
    int j=0;
           
    int l=strlen(word);
           
    int temp;
         while(
    j<l){
                    
    temp=word[j];
                    
    temp++;
                    if(
    temp == 123){
                            
    temp 97;
                            };
                    
    /* il carattere 'z' è 122 sommato a 1 risulta il caattere ascii '{'
                    * pertanto il valore deve essere portato manualmente al valore di   
                    * 'a' cioè 97. */
                    
                    
    if(temp == 91){ 
                            
    temp 65;
                    };
                     
    //Il carattere stavolta è 'Z'
                    
    word[j]=temp;
                    
    j++;
                    }
                    return 
    word;
                    }
                    
                    
                    
                    
    char decripta(char word){
           
    int j=0;
           
    int l=strlen(word);
           
    int temp;
         while(
    j<l){
                    
    temp=word[j];
                    
    temp--;
                    if(
    temp == 96){
                            
    temp 122;
                            };
                    
                    if(
    temp == 64){ 
                            
    temp 90;
                    };
                    
    word[j]=temp;
                    
    j++;
                    }
                    return 
    word;
                    }

    int main(int argcchar *argv[])
    {
        
    int aggiunta,choose;
        
    char word[Max_word];
        
    char string;
      
    printf("Benvenuti! Questo programma è scritto per codificare e decodificare parole.\n");
      
    Sleep(1);
      
    choose:
             
    choose=NULL;
      
    printf("\a\nVuoi codificare (1), o decodificare (2) una parola?\n");
      
    scanf("%d",&choose);
      if(
    choose==1){
      
    printf("\n\aScrivi la parola da codificare\n");
      
    scanf("%s",&word);
      
    printf("\nSto codificando...");
    for(
    aggiunta 0aggiunta 20aggiunta++) {
            
    printf(".");
            
    Sleep(70);
            }
    //questo l'ho aggiunto io per bellezza
            
    Sleep(100);
      
    string=cripta(word);
      
    printf("\n%s\n\n",string);
    }
    else if(
    choose==2){
         
    printf("\n\aScrivi la parola da decodificare\n");
      
    scanf("%s",&word);
      
    printf("\nSto decodificando...");
    for(
    aggiunta 0aggiunta 20aggiunta++) {
            
    printf(".");
            
    Sleep(70);
            }
            
    Sleep(100);
      
    string=decripta(word);
      
    printf("\n%s\n\n",string);
         }
         else{
              
    printf("Scelta non consentita\n");
              goto 
    choose;
              }
              
    choose=NULL;
      
    Sleep(1);
      
    system("PAUSE");    
      return 
    0;


  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    Ciao

    Come promesso eccomi qui:
    allora char * parola [numero];
    in realtà è uguale a char parola [/*indefinito*/][numero];
    quindi bisognava dichiarare char parola [numero];

    Questo perchè la stringa è un array di char (char * o char []) terminante in automatico con \0 = NULL.
    Il valore successivo a NULL non è accessibile.
    es. char * var = "cane"; var[0] = 'c' , var[1] = 'a', var[2] = 'n', var[3] = 'e', var[4] = NULL, var[5] non accessibile, etc...

    Quindi quello che avevi scritto char * word [numero]; in realtà è un array di array di char: cioè un array di stringhe.

    Spero di essere stato chiaro.

    Comunque già che c'ero oggi ho dato una sistemata al programma:
    Andava bene tutto ma ho modificato qualcosa:
    1) Ho usato un ciclo al posto del goto: il goto andava comunque benissimo ma io ti consiglio di non usarlo perchè rende meno robusto il codice.
    2) Ho fatto in modo che il programma giri all'infinito: eri benissimo in grado di farlo anche te, ma già che c'ero l'ho fatto.
    3) Ho sostituito il system("PAUSE"); con una funzione che viene richiamata e svolge la stessa funzione di system ma è più leggibile perchè puoi modificare l'output a tuo piacimento.
    4) Infine, e questa non è una cosa di cui si poteva fare a meno come quelle di prima:

    Se digitavi un input di più interi es "32424" o di un char o più es 'k' o "shkh", il programma non gestiva l'eccezione e andava in "balla" ripetendo il goto all'infinito o in caso di caratteri multipli lo ripeteva più volte. Non so se te ne eri accorto ma in caso contrario prova a "inputare" quello che ti ho detto e tutto ti sarà chiaro.
    Per fronteggiare a questo ho fatto in modo che l'input fosse un char * (stringa) e che venisse considerata con la funzione atoi (che trasforma char a int) il primo carattere della stringa (considerando solo il primo carattere vengono evitati gli imput di più caratteri).

    In questo modo ripeto con il primo carattere della stringa viene valutato e gli altri ingnorati: es. input "cane". atoi trasforma 'c' in intero cioè 0.

    Nota atoi() non converte il char a int semplicemente ma se il char è '1' l'int è 1 non l'int corrispondente nella tabella char che in questo esmpio sarebbe 49. Se il carattere convertito da atoi() non è un numero ma un qualsiasi char l'int corrispondente risulta 0.

    altro es. input "2cane" il progrmma funzionerebbe correttamente se non avessi scritto

    if((atoi(&chooseChar[0])==1 || atoi(&chooseChar[0])==2) && chooseChar[1] != NULL) choose = 0; //se il primo carattere dell'input è 1 o 2 e il secondo è un altro carattere chose = 1
    in questo caso il valore choseChar[1] == 'c' pertanto choose viene assegnato a 0
    infine se digito "2" o "1" come input il secondo valore del vettore chooseChar è NULL pertanto tutto funziona perfettamente.


    Infine c'erano altre piccole incertezze sul codice:
    if(){/*istruzioni*/}va scritto senza ; finale.
    NON if(){/*istruzioni*/}; questo potrebbe procurarti problemi in caso di if(){}else;

    Nei blocchi {} è già "incluso" il ; quindi if(){}; else; non è lecito e da errore di compilazione.

    Infine l'ultimissima incertezza sta nei prototipi della funzione:

    char * cripta(char*); //Dichiaro il prototipo della funzione per criptare.
    char * cripta(char*); //Dichiaro il prototipo della funzione per decriptare. ERRORE

    il secondo prototipo è decripta non cripta di nuovo. Esso non ti ha dato errore di compilazione perchè le funzioni sono "esplicate" (scusa per il termine inventato ma non sapevo trovare di meglio xD", vedi //1 e //2 nel codice), prima della chiamata della funzione cripta(); e decripta();.
    Se invece "esplicavi" le funzioni (xD) dopo la funzione main senza prototipi di funzione il progetto non verrebbe compilato.

    CODICE:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <windows.h>
    #define Max_word 99
    
    
    // Si ringrazia kirakira93 per l'aiuto //Sviluppatore : salvy
    
    char * cripta(char*); //Dichiaro il prototipo della funzione per criptare.
    char * decripta(char*); //Dichiaro il prototipo della funzione per decriptare.
    int MeglioDelGoto(int);
    void InveceDiSystemPAUSE(char *);
    
    int MeglioDelGoto(int choose)
    {
    char word[Max_word];
    char * string;
    int aggiunta;
    
    
    if(choose==1){
    		     printf("\nScrivi la parola da codificare\n");
    			 scanf("%s",&word);
                 printf("\nSto codificando...");
    			 for(aggiunta = 0; aggiunta < 20; aggiunta++){
    														 printf(".");
    														 Sleep(70);
    														 }//questo l'ho aggiunto io per bellezza
    			 Sleep(100);
    			 string=cripta(word);
                 printf("\n%s\n\n",string);
                 return 1;
    			 }
    if(choose==2){
                 printf("\nScrivi la parola da decodificare\n");
    			 scanf("%s",&word);
    			 printf("\nSto decodificando...");
    			 for(aggiunta = 0; aggiunta < 20; aggiunta++){
    														 printf(".");
    														 Sleep(70);
    														 }
    			 Sleep(100);
    			 string=decripta(word);
    			 printf("\n%s\n\n",string);
    			 return 1;
    			 }
    if(choose!=1&&choose!=2){
                            printf("Scelta non consentita: scegliere 1 o 2\n");
                            return 0;
                            }
    	
    Sleep(1);  
    }
    
    char * cripta(char * word)//1 da qui è "esplicata" la funzione cioè sono illustrati i compiti che deve fare
    {
    int j=0;
    int l=strlen(word);
    int temp;
    while(j<l){
              temp=word[j];
              temp++;
              if(temp == 123){
                             temp = 97;
                             }
                             /* il carattere 'z' è 122 sommato a 1 risulta il caattere ascii '{'
                                                                        * pertanto il valore deve essere portato manualmente al valore di   
                                                                        * 'a' cioè 97. */
                    
              if(temp == 91){
                            temp = 65;
    						}
    						//Il carattere stavolta è 'Z'
              word[j]=temp;
              j++;
              } //Fine while
    return word;
    }//1 Fino a qui
                    
                    
    char * decripta(char * word)//2
    {
    int j=0;
    int l=strlen(word);
    int temp;
    while(j<l){
              temp=word[j];
              temp--;
              if(temp == 96){
                            temp = 122;
                            }
                   
              if(temp == 64){
                             temp = 90;
                            }
              word[j]=temp;
              j++;
              }
              return word;
    }//2 Fino a qui
    
    int main(int argc, char *argv[])
    {
    MessageBox (NULL,"Sviluppatore salvy\nSi ringrazia kirakira93 per l'aiuto ","Special Thanks",0);
    //Premi ok
    char chooseChar[Max_word];
    int choose;
    int RipetizioneProgramma;// = 0;
    
    printf("Benvenuti! Questo programma e' scritto per codificare e decodificare parole.\n");
    //se devi fare gli accenti scrivi così e' non è xkè altrimenti il compilatore lo trasforma in caratteri diversi:
    //la conversione tra ascii e unicode genera questa incompatibilità
    Sleep(1);
    
    do{
      printf("\nVuoi codificare (1), o decodificare (2) una parola?\n");
    
      for(int MeglioUnCicloCheIlGoto = 0; MeglioUnCicloCheIlGoto < 1; )
           {
           
           scanf("%s", chooseChar);
           choose = atoi(&chooseChar[0]);
    
           if((atoi(&chooseChar[0])==1 || atoi(&chooseChar[0])==2) && chooseChar[1] != NULL) choose = 0; 
           
           if(MeglioDelGoto(choose) == 1) MeglioUnCicloCheIlGoto = 1;
           //se il return della funzione MeglioDelGoto è 1 il ciclo termina e di coseguenza il programma
           }
    
      InveceDiSystemPAUSE("continuare");
      //Andava benissimo anche PAUSE ma questo mi è più simpatico perchè il codice è più leggibile! :)
      
      }while(RipetizioneProgramma == 0); 
    return 0;
    }
    
    void InveceDiSystemPAUSE(char * istruzione) {
    printf("\n\tPremere return per %s", istruzione);
    fflush(stdin);
    getchar();
    }
    THIS IS ALL!

  8. #8
    Utente di HTML.it L'avatar di Salvy95
    Registrato dal
    Jul 2008
    Messaggi
    199

    chiarissimo

    Sei stato chiarissimo.
    Un ultima domanda!
    Come mai abbiamo inserito
    Codice PHP:
    char string
    e non char string;
    a che serve il puntatore?
    è questo che mi chiedo!
    un normale script in javascript o php non l'avrebbe richiesto...

    sarebbe stato
    Codice PHP:
    $x=codifica(stringa); printf($x); 
    grazie per la pazienza!

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    perchè

    Allora, il PHP non lo conosco ma penso che tratti le stringhe nel suo insieme. Invece nel C le stringhe non si possono trattare nell'insieme ma come vettori di caratteri. Una cosa simile al PHP nel c++ è usando string.h: con questo include si possono trattare le stringhe così
    string stringa; stringa = "qualcosa"; strigna = stringa + "kh"; etc.... ma in realtà strign.h non fa che automatizzare le operazioni sui char * definendo il nuovo tipo string. Provalo e forse ti sarà comodo. Comunque adesso devo andare. Ciao.

  10. #10

    Re: perchè

    Originariamente inviato da kirakira93
    Una cosa simile al PHP nel c++ è usando string.h:
    L'header non è <string.h> (che è un header C), ma è semplicemente <string>.
    Se programmi in C e non in C++, comunque, non lo puoi utilizzare.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.