Proszę o pomoc w optymalizacji kodu - klasy w c++

0

Witam, mam do oddania projekt na zaliczenie. Jednak muszę wszystko jakoś tak ułożyć, żeby program wykorzystywał klasy i aby były one w miarę sensowne i użyteczne :)

Program służy do szyfrowania i deszyfrowania plików tekstowych. Szyfrator zapisuje po kolei znaki do prostokątnej tablicy takim wężykiem [w dół, w górę, w dół, w górę (przesuwając się o kolumnę w lewo)] a potem odczytuje znaki linia po linii i zapisuje do innego pliku txt. Kodem są podane przez użytkownika wymiary dwuwymiarowej tablicy - wysokość i szerokość. Deszyfrator robi to samo tylko na odwrót ;)

Poniższy kod jest mniej więcej ok, działa. Problem w tym, że właściwie nie wykorzystuje klas. Prosiłbym kogoś o pomoc, lub naprowadzenie mnie na rozwiązanie :

#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

class data {
public:
    char file_name[256];
    int size;
};

void encryption (int x, int y, char source[256], char target[256]) {

    std::fstream plik;
    plik.open( source,std::ios::in);
    if (plik.is_open()==true) {
        std::cout<<"Source file accessed successfully!"<<std::endl;
    } else {
        std::cout<<"Unable to access source file"<<std::endl;
    }
    std::fstream plik2;
    plik2.open( target,std::ios::out);
    if (plik2.is_open()==true) {
        std::cout<<"Target accessed successfully!"<<std::endl;
    } else {
        std::cout<<"Unable to access target file"<<std::endl;
    }

    char tab[x][y];
    int i,j;

    for (i=0; i<x; i++) {
        for (j=0; j<y; j++) {
            tab[i][j]='\0';
        }
    }

    i=j=0;

    char zmienna;
    zmienna = plik.get();

    while (plik.good()) {
        i=j=0;
        while ((i<x) && (plik.good())) {
            tab[i][j]=zmienna;
            zmienna = plik.get();
            if (i%2==0) j++;
            if (j==y) {
                j--;
                i++;
            }
            if (i%2==1) j--;
            if (j==(-1)) {
                j++;
                i++;
            }
        }

        i=j=0;

        while (j<y) {
            while (i<x) {
                plik2.put (tab[i][j]);
                i++;
            }
            i=0;
            j++;
        }

        for (i=0; i<x; i++) {
            for (j=0; j<y; j++) {
                tab[i][j]='\0';
            }
        }
    }

    plik.close();
    plik2.close();
    cout << "Working on files finished!"<<endl<<endl;
    system ("PAUSE");

}

void decryption (int x, int y, char source[256], char target[256]) {

    std::fstream plik;
    plik.open( source,std::ios::in);
    if (plik.is_open()==true) {
        std::cout<<"Source file accessed successfully!"<<std::endl;
    } else {
        std::cout<<"Unable to access source file"<<std::endl;
    }
    std::fstream plik2;
    plik2.open( target,std::ios::out);
    if (plik2.is_open()==true) {
        std::cout<<"Target file accessed successfully!"<<std::endl;
    } else {
        std::cout<<"Unable to access target file"<<std::endl;
    }

    char tab[x][y];
    int i,j;

    for (i=0; i<x; i++) {
        for (j=0; j<y; j++) {
            tab[i][j]='\0';
        }
    }

    char zmienna;
    zmienna = plik.get();

    while (plik.good()) {
        i=j=0;
        while (j<y) {
            while ((i<x) && (plik.good())) {
                tab[i][j]=zmienna;
                zmienna = plik.get();
                i++;
            }
            i=0;
            j++;
        }

        i=j=0;

        while (i<x) {

            plik2.put (tab[i][j]);
            if (i%2==0) j++;
            if (j==y) {
                j--;
                i++;
            }
            if (i%2==1) j--;
            if (j==(-1)) {
                j++;
                i++;
            }

        }
        for (i=0; i<x; i++) {
            for (j=0; j<y; j++) {
                tab[i][j]='\0';
            }
        }
    }

    plik.close();
    plik2.close();
    cout << "Working on file finished!" <<endl<<endl;
    system ("PAUSE");
}

int main() {

    data height;
    data width;
    data source;
    data target;
    int a;
    cout << "1. Encryption \n2. Decryption"<<endl;
    cin >> a;
    cout << "Enter source file name:"<<endl;
    cin >> source.file_name;
    cout << "Enter target file name:"<<endl;
    cin >> target.file_name;
    cout <<"Enter X dimension:"<<endl;
    cin >> width.size;
    cout <<"Enter Y dimension:"<<endl;
    cin >> height.size;
    cout <<endl;

    switch (a) {
    case 1:
        encryption (width.size, height.size, source.file_name, target.file_name);
        break;
    case 2:
        decryption (width.size, height.size, source.file_name, target.file_name);
        break;
    default:
        return 0;
        break;
    }
}

Z góry dziękuję za pomoc :)

// pokolorowane, formatowanie w "Java-style"; może być Marku? - R

0
  1. dużo kodu - kolorowanie składni jest konieczne, użyj tagów <cpp>tu kod</cpp>.
  2. Kod należy formatować! W większości masz sformatowany i wygląda na to, że używasz Eclipse, więc łaskawie wciśnij Ctrl-Shift-F, żeby reszta też miała właściwe wcięcia. Osobiście nie cierpię domyślnego formatowania (K&R) używanego przez Eclipse, ale zawsze lepiej się to czyta.
0

Sorry, ale jako gość chyba nie mogę edytować swoich postów :/
Mam nadzieję ze ktoś mi pomoże :)

0

Jak na początkującego całkiem nieźle :). Masz tylko trochę nadmiarowego kodu, a chodzenie wężykiem jest troszkę przekombinowane.

Jedna z możliwości wygląda tak:

class Szyfrant
{
     std::ifstream input;
     std::ostream output;

     int codex,codey;
public:
     Szyfrant( int x, int y)
     {
     codex = x;
     codey = y;
     }

     openSource( const char* sourceName );
     openTarget( const char* targetName );

     void Koduj();
     void Dekoduj();
};

Sam skonwertuj sobie kod, myślę że dasz sobie radę.
Inne bardziej przydatne rozwiązania wymagają, dodatkowej wiedzy z dynamicznych tablic lub bardziej zaawansowanych bibliotek.

0

Bardzo dziękuję, projekt już gotowy :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0