Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C] ciclo while con interruzione

    Buongiorno a tutti,
    vi posto un codice che ho scritto, fondamentalmente è un ciclo while con un'interruzione. Il codice dovrebbe andare ma a mio parere (da principiante) direi che è tutt'altro che ottimizzato, non riesco a capire come..
    In sostanza, letto un carattere lo si deve confrontare con i caratteri presenti in una tabella.
    La tabella è fatta così: tab[26][2], nella prima colonna ci sono i caratteri da fornire in output mentre nella seconda colonna quelli da confrontare con il carattere in input.


    codice:
    i=0;
    j=0;
    c=getc(f);     //leggo carattere da file
    if (tab[i][2]==c)
           fprintf(f2,"%c", tab[1][1];         //stampa il valore nel file
    else
         while (tab[i][2]!=c)
         {
              if(tab[i+1][2]==c)                //se hai trovato il valore
              {
                     fprintf(f2,"%c", tab[i+1][1]);        //stampa il valore nel file
                     break;                                      //esci da while
              }
              i++;
         }
    Tutto questo codice è inserito in un altro ciclo while, quello classico usato per la lettura di un file
    Si poteva fare anche con un semplice ciclo for (da 0 a 26, viste le 26 righe della tabella) ma è uno spreco di risorse, visto che il match tra input e output è univoco...
    Spero ci sia un modo migliore per fare il tutto

    Grazie

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Nel tuo codice controlli la stessa condizione 3 volte, in sostanza.
    Uno dei modi più compatti per scriverlo con un while è questo (assumendo che tutti i caratteri in input siano presenti nella tabella):
    codice:
    int i = 0;
    while(tab[i][2]!=c) ++i;
    fputc(tab[i][1], f2);
    oppure (senza assumere che tutti i caratteri in input siano presenti nella tabella)
    codice:
    int i = 0;
    while((tab[i][2]!=c) && (i<TAB_LENGTH)) ++i;
    if(i!=TAB_LENGTH) fputc(tab[i][1], f2);
    Tuttavia c'è un modo assai più efficiente, una hashtable.
    Nel caso dei caratteri è piuttosto semplice in quanto ogni carattere è in sostanza un numero e basta trasformare questo numero in un indice per la tua tabella.
    Per farlo bisogna però conoscere i caratteri interessati.
    Ultima modifica di Scara95; 13-01-2015 a 11:30 Motivo: correzione funzione
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    codice:
    int i = 0;
    while(tab[i][2]!=c) ++i;
    fputc(tab[i][1], f2);
    Ecco la soluzione ottimizzata che cercavo, grazie. In pratica, finchè non trovi il match semplicemente incrementa l'indice di riga, quando lo trova si blocca il while e a quel punto, con quell'indice i stampa su file. Come ho fatto a non pensarci?
    Tuttavia c'è un modo assai più efficiente, una hashtable.
    Nel caso dei caratteri è piuttosto semplice in quanto ogni carattere è in sostanza un numero e basta trasformare questo numero in un indice per la tua tabella.
    Per farlo bisogna però conoscere i caratteri interessati.
    Non so cosa sia una hashtable, nel mio caso è un abbozzo di algoritmo per decrittografare.
    Tab di conversione (prima col:corretto, seconda col: crittografato):
    A-H
    B-Z
    C-K
    ...
    leggi Z allora stampa B ---> leggi K allora stampa C e così via per tutto il file, carattere per carattere

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Allora per le tabelle di conversione ti basta fare così:
    codice:
    #include <stdio.h>
    
    #define LEN ('Z'-'A'+1)
    #define BASE 'A'
    
    
    int main(void) {
        char crypt[LEN];
        crypt['A'-BASE] = 'H'; //'A'-BASE <=> 0
        crypt['B'-BASE] = 'Z'; //'B'-BASE <=> 1
        crypt['C'-BASE] = 'K'; //'C'-BASE <=> 2
        //...
        char decrypt[LEN];
        int i;
        for(i = 0; i < LEN; ++i)
            decrypt[crypt[i]-BASE] = i+BASE;
        //...
        
        //decrypt
        char c = fgetc(f);
        c -= BASE;
        if(c >= 0 && c < LEN) fputc(decrypt[c], f);
        
        //crypt
        char c = fgetc(f);
        c -= BASE;
        if(c >= 0 && c < LEN) fputc(crypt[c], f);
        return 0;
    }
    Non ho scritto per intero le assegnazioni e non mi sono preoccupato di aprire un file.
    Ultima modifica di Scara95; 13-01-2015 a 12:15 Motivo: correzione minore: , f
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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.