[C++] Koder obiektowy

0

Mam problem, pytałem na tweaku, gościu powiedział, że u niego program zadziałał pod Gentoo, ja kompiluje go przez gcc z Code:Blocks czyli tym samym kompilatorem, i nie odkodowuje mi! Oto kod programu:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void Zakoduj(char* before, int* after, int a);
void Odkoduj(char* before, int* after, int a);

int main()
{

    struct KOD
    {

        int kod[100];
        int przelicznik;

    };

    KOD podaj;
    char tresc[100];

    printf("Koder objektowy by Guardian\nWybierz:\n");
    printf("1. Koduj\n");
    printf("2. Dekoduj\n");

    int opcja;

    scanf("%d", &opcja);

    if(opcja == 1)
    {

        printf("Podaj tresc do kodowania:\n");
        scanf("%s", tresc);

        int x = (int) rand() % 21;
        podaj.przelicznik = (int) pow(2,(double) x);

        Zakoduj(tresc, podaj.kod, x);

        //Zapis binarny

        FILE* plik = fopen("kod.dat","wb");

        fwrite(&podaj,1, sizeof( KOD ), plik);

        fclose(plik);

    }
    else
    {

        FILE* plik = fopen("kod.dat","rb");

        fread(&podaj,1, sizeof( KOD ), plik);

        fclose(plik);

        Odkoduj(tresc, podaj.kod, podaj.przelicznik);

        printf("%s\n", tresc);

    }


    return 0;
}

void Zakoduj(char* before, int* after, int a)
{

    int bufor;

    for(int i = 0; i < 100; i++)
    {

        bufor = before[i];
        after[i] = bufor + a;

    }

}

void Odkoduj(char* before, int* after, int a)
{

    int i = 1;
    int bufor;

    while(1)
    {

        if(pow(a,1/i) == 2) break;
        i++;
    }

a = i;

    for(int i = 0; i < 100; i++)
    {

        bufor = after[i];
        before[i] = (char)( after[i] - a);
    }

}
0
  1. scanf("%s",...) wczyta ci tylko jeden wyraz
  2. Twoje odkodowanie trwa baaaardzo długo, dla klucza=20, wykonujesz 220 porównań.. Całkowicie niepotrzebnie, wystarczy zdekodować wartość 2klucz, w ciągu N=klucz kroków:
void Odkoduj(char* before, const int* after, int a)
{
    int i;
    const int size=21; //to co przy ran%
    for (i=0; i<size; ++i)
    {
        if ((a & (1<<i)))
            break;
    }
    
    a = i;
    for(i = 0; i < 100; i++)
        before[i] = after[i] - a;
}
  1. obiektowy ! Tylko co to znaczy "koder obiektowy" [???]
0

Mówiąć obiektowy, miałęm na myśli, że wykorzystuje w nim obiekt, strukturę. Dzięki, teraz odkodowuje Od razu, ale nie zabardzo rozumiem ten zapis, który wykorzystałeś. Mógłbyś mi wytłumaczyć na czym to polega?
Dzięki za cierpliwość i pozdrawiam.

0

No to "koder strukturalny", a nie obiektowy, bo nie masz obiektu, np.: klasy Koder z metodą Zakoduj() :-P

np. 2^5 = binarnie: 100000 (jedynka na piątej pozycji od prawej strony licząc od zera), własność potęg liczby 2 :]

Pętla wyszukuje pierwszej jedynki od prawej strony. Wartość wejściowa maskowana jest z jedynką umieszczoną na kolejnej pozycji, jeśli w wartości wejściowej jest na tej pozycji jedynka to warunek if() jest spełniony i pętla kończy się, czyli:
a = 32 (2^5)
i=0: a & (1<<0) = a & 000001 = 100000 & 000001 = 0
i=1: a & (1<<1) = a & 000010 = 100000 & 000010 = 0
i=2: a & (1<<2) = a & 000100 = 100000 & 000100 = 0
i=3: a & (1<<3) = a & 001000 = 100000 & 001000 = 0
i=4: a & (1<<4) = a & 010000 = 100000 & 010000 = 0
i=5: a & (1<<5) = a & 100000 = 100000 & 100000 = 1 -> znaleziony: i = 5
To jest tak tylko dla potęgi dwójki :)

0

Dzięki, teraz zrozumiałem. Zapomniałęm, że operator >> tyczy się systemu dwójkowego :)

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