devo scrivere un programma che implementi l'algoritmo di Vigenere utilizzando l'alfabeto italiano. Dopo quasi un giorno (mi considero fortunato essendo all'inizio) sono riuscito a scrivere qualcosa, pensando fosse corretto. Inutile dirvi il rammarico quando ho scoperto che non era cosi. il codice è il seguente:
	codice:
	#include "vigenere.h"
#include <string>
using namespace std;
Vigenere::Vigenere(string str){
                       key = str;
                       key = StringToUpper(key);
                       for(int cnt = 0; cnt < key.length(); cnt++){
                               if(key[cnt] < 'A' || key[cnt] > 'Z')
                               key.erase(cnt,1);
                       }
                       
                       //nel caso in cui la chiave sia più corta del testo
                       for(int cnt = 0; cnt < text.length(); cnt++){
                               if(key.length() != text.length()){
                                               if(key.length() < text.length())
                                               key += key[cnt];
                                               }                
                       }
                                                                      
                       return;
}                   
//tavola di Vigenere con alfabeto italiano
char Vigenere::Table(string alphabet){
                       int temp;
                       temp = alphabet.length(); 
                       int ROWS(temp);
                       int COLS(temp);
                       char ALPH[temp];
                       for(int i = 0; i < temp; i++){
                               ALPH[i] = alphabet[i];
                       }
                       char VIG[ROWS][COLS];
                       
	                   for(int i = 0; i < ROWS; i++){		                       
		                           for(int j = 0; j < COLS; j++){
			                       VIG[i][j]=ALPH[(i + j)%21];
			                       }
                        }
                        return VIG[ROWS][COLS];
}
string Vigenere::StringToUpper(string convstr){
       for(int cnt = 0; cnt < convstr.length(); cnt++){
               convstr[cnt] = toupper(convstr[cnt]);
               }
       return convstr;
}
//elimina i caratteri speciali, tenendo solo le lettere
string Vigenere::EraseChar(string str){
       for (int i = 0; i < str.length(); i++){
           if(!(str[i] >= 'A' && str[i] <= 'Z'))
                       str.erase(i,1);
                       i--;
                       }
       return str;
}   
string Vigenere::encode(string text){
       string line;
              
       //cerca il valore corrispondente alla chiave nella prima colonna di VIG
       int index_k;
       for(int i = 0; i < ROWS; i++){ 
               if(key[i]==VIG[i][1])
               index_k = i;
       }
       
       //cerca il valore corrispondente al testo nella prima riga di VIG
       int index_t;
       for(int i = 0; i < COLS; i++){
               if(text[i]==VIG[1][i])
               index_t = i;
       }
       
       //calcola la lettera codificata
       for(int i = 0; i < text.length(); i++){
               line[i] = ALPH[(index_k + index_t)%21];
       }
       
       line = StringToUpper(line); 
       if(!line.empty()){
           line = EraseChar(line);
           }
           
       return line;
}
string Vigenere::decode(string text){
       string line;
              
       //cerca il valore corrispondente alla chiave nella prima colonna di VIG
       int index_key;
       for(int i = 0; i < ROWS; i++){
               if(key[i]==VIG[i][1])
               index_k = i;
       }
       
       //nella riga i-esima cerca la lettera corrispondente al carattere cifrato
       int index_d;
       for(int i = 0; i < COLS; i++){
               if(text[i] == VIG[index_key][i])
               index_d = i;
       }
       
       //calcola la lettera decodificata
       for(int i = 0; i < text.length(); i++){
               line[i] = ALPH[index_d];
       }
       
       line = StringToUpper(line);
       if(!line.empty()){
           line = EraseChar(line);
           }
           
       return line;
}
 
potete per favore darmi una mano