Guida [Snippet]Il Cifrario di Cesare C++

Stato
Discussione chiusa ad ulteriori risposte.

NarcoSlayer

Utente Gold
21 Febbraio 2010
729
61
147
323
Ultima modifica da un moderatore:
Ciao a tutti, partiamo con lo spiegare cos'è questo cifrario di cesare. E' un algoritmo crittografico detto a "sostituzione monoalfabetica" ma cosa significa? Vuol dire che ogni lettera in chiaro viene sostituita con una lettera che si trova in un certo numero di posizioni dopo nell'alfabeto. Il numero di posizioni rappresenta la chiave dell'algoritmo. Passiamo al codice:

Codice:
#include <iostream>
  #include <fstream>
  #include <stdlib.h>


  const int MAX_NAME = 256;


  using namespace std;
 
 
  // DICHIARAZIONE delle funzioni
  void cifratore(ifstream &in, ofstream &out, int key);
  bool open_stream(fstream &s, bool out);
 


  int main() {
    fstream instream,  outstream;   
    bool in, out;
    int k;
   
    // Si apre lo stream di input
    in  = open_stream(instream, false);
    out = open_stream(outstream, true);
   
    // Si controlla se entrambi gli stream sono stati aperti correttamente
    if (!in || !out )
      return 0;
   
   
    cout<<endl<<"digitare il valore della chiave: ";
    cin>>k;  
   
    // Si chiama la funzione cifratore, con il valore di chiave inserito dall'utente
    cifratore((ifstream &) instream, (ofstream &) outstream, k);
   


    // Si chiudono gli stream
    instream.close();
    outstream.close();
   
    return 0;
  }
 
 
  /* Apre lo stream passato come primo parametro,
   * il parametro out specifica se è uno stream
   * di output.                              
   */
  bool open_stream(fstream &s, bool out)
  {
    char f_name[MAX_NAME];
   
    // Si controlla innanzituttto che lo stream non sia gia aperto
    //if (s)
      s.close();
   
   
    cout<<endl<<"digitare il nome del file da aprire: ";
    cin.getline(f_name, MAX_NAME);
   
    // Si controlla se è uno stream di output
    if (out)
      s.open(f_name, ios::out);   
    else s.open(f_name, ios::in);
   
    // Si controlla se lo stream è stato aperto correttamente
    if (!s) {
      cout<<endl<<"ERRORE!: impossibile aprire il file: "<<f_name;
      return false;
    } else return true;
 
  }
 
   
   
  /* Cripta  (cifrario di Cesare) il contenuto dello stream di input
   * (primo parametro) in quello di output (secondo parametro).
   * Il parametro key specifica la chiave.
   */ 
  void cifratore(ifstream &in, ofstream &out, int key)
  {
    char c;


    while (( c =in.get())!=EOF) {
      out.put(c+key);
    }
   
    // Si forza la scrittura su file
   // out.flush();
   
    return;
  }

Il codice è molto semplice e serve a comprendere dei concetti fondamentali dell'I/O nel c++, se avete domande chiedete pure...
 
  • Mi piace
Reazioni: MadCoder
Stato
Discussione chiusa ad ulteriori risposte.