#include <stdlib.h>
#include <iostream.h>
#include <strng.h>
#include <iomanip.h>

#define MAX 20

typedef char Znak;
typedef Znak*  Znaki;

/**
W klasie Haslo przechowujemy haslo zakodowane prostym
szyfrem przestawieniowym, w kt¢rym ka¾dy znak jest zamieniany na inny.
Szyfr jest wi©c dany na podstawie pewnej permutacji kod¢w znak¢w.
*/
class Haslo{
private:
/**zakodowane hasˆo*/
 Znaki haslo;
/**funkcja koduj¥ca pojedynczy znak*/
 Znak* (*koder)(Znak&);
public:
 Haslo(Znak* (*koder)(Znak&)){haslo=new Znak[MAX]; this->koder=koder;}
 ~Haslo(){delete[] haslo;}
 Znaki kod(Znaki l);
 void ustaw(Znaki haslo){strcpy(this->haslo,haslo); kod(this->haslo);}
 void wypisz();
};

/**prosta, przykˆadowa funkcja koduj¥ca*/
Znak* koder1(Znak &z){(z+=255); return &z;}

int main(){
  cout << "Podaj ˆancuch znak¢w do zakodowania" << endl;
  char lan[MAX];
  cin  >> setw(MAX-1) >> lan;
  Haslo h(koder1);
  h.ustaw(lan);
  cout << "kodowanie: " << endl;
  h.wypisz();
  cout << endl;
  return EXIT_SUCCESS;
}

Znaki Haslo::kod(Znaki l){
  unsigned int i,len=strlen(l);
  for (i=0;i<len;i++){l[i]=*koder(l[i]);}
  return l;
}

void Haslo::wypisz(){cout << haslo << endl;}

