Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Szyfrowanie macierzowe - dynamiczna alokacja tablic dwuwymiarowych

Ostatnio zmodyfikowano 2014-01-26 15:34
Autor Wiadomość
szwarcus
Temat założony przez niniejszego użytkownika
Szyfrowanie macierzowe - dynamiczna alokacja tablic dwuwymiarowych
» 2014-01-25 21:38:06
Witam mój problem polega na tym, że program działał, chciałem przejść ze tablic statycznych na dynamiczne i zaczęły się schody i program przestał działać jak należy, cały algorytm szyfrowania jest w porządku. Dynamiczna alokacja jest zrobiona na podstawie ilości znaków w pliku wejściowym ( to też jeszcze działało).
Chodzi w tym programie o to by wczytywał on z terminala ciąg znaków, zapisywał go do pliku wejściowego który wchodzi do pętli szyfracyjnej i po wykonaniu usuwa ten plik tworząc plik zaszyfrowany. I jeszcze jeżeli byście mogli to pomóżcie tak by przy wczytywaniu znaków z terminala, działał backspace i nie powodował zamieszania. Definicja _CRT_SECURE_NO_WARNINGS 1 jest wymagana w każdym moim programie jeżeli możecie to pomóżcie mi się tego pozbyć ( środowisko Visual Studio 2013 )
C/C++
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define MAX 100


char ** alokujTablice2D( int x, int y, char ** tab )
{
    tab =( char ** ) malloc( x * sizeof( char * ) );
    int i;
    for( i = 0; i < x; i++ )
    {
        tab[ i ] =( char * ) malloc( y * sizeof( char ) );
    }
    return tab;
}
void main()
{
   
    FILE * we, * wy, * wede;
    char wyjpath[ MAX ];
    char wejscie[] = "plikwejsciowy.txt"; //nazwa pliku wejsciowego
    char wyjscie[ MAX ];
    printf( "PODAJ SCIEZKE PLIKU WYJSCIOWEGO TWOJEGO SZYFRU\nSCIEZKA MUSI MIEC POSTAC np\n\t\t C:\\plikzaszyfowany.txt\nPAMIETAJ O DODANIU NAZWY PLIKU Z ROZSZERZENIEM TEKSTOWYM\n---------------------------------------------------------------------------\n\n" );
    scanf( "%s", & wyjpath );
    int getch();
    for( int i = 0; i < MAX; i++ )
    {
        wyjscie[ i ] = wyjpath[ i ];
    }
    //nazwa pliku wyjsciowego
    char ** macierz;
   
    char * pomoc;
    int i, j, k, l, m, n;
    char znak;
    i = 0;
    char zp[ 30 ];
    size_t sz;
   
   
   
    {
        printf( "PLIK WEJSCIOWY JEST USUWANY PO ZASZYFROWANIU\n\n" );
        printf( "1)PODAJ DOWOLNY CIAG ZNAKOW DO SZYFRU\n" );
        printf( "2)NIE UZYWAJ BACKSPACE !!!!!!!\n" );
        printf( "3)NIE UZYWAJ ZNAKOW SPECJALNYCH\n" );
        printf( "4)JESLI CHCESZ ZAKONCZYC WCISNIJ ENTER\n\n" );
       
       
        we = fopen( wejscie, "ab" );
        scanf( "%s", & zp );
        do
        {
            fputc( zp[ 30 ], we );
            printf( "%c", zp );
           
        } while(( char ) zp != 13 );
       
        fclose( we );
    }
   
    fseek( we, 0, 2 ); // sprawdza rozmiar pliku do końca
    sz = ftell( we ); //przypisuje wartosc zmiennej
    pomoc =( char * ) malloc( sz * sizeof( char ) ); // tablica pomocniczna jednowymiarowa na podstawie rozmiaru pliku
    alokujTablice2D( sz, sz, macierz ); // macierz kwadratowa na podstawie rozmiaru plikow stworzona
   
   
    we = fopen( wejscie, "rb" ); // odczytuje wejscie
    wy = fopen( wyjscie, "wb" ); // nadpisuje wyjscie
    if( we != NULL )
    {
        if( wy != NULL )
        {
           
            while(( znak = getc( we ) ) != EOF ) //odczytywanie wszystkich znakow z pliku wejsciowego
            {
                pomoc[ i ] = znak; //zapisywanie wszystkich znakow to tablicy pomocniczej
                i++; //zliczanie znakow
            }
           
           
            j = 1;
            do //dopasowywanie wielkosci macierzy - powiekszamy ilosc kolumn i wierszy tak
            { //dlugo az pomiesci wszystkie odczytane z pliku znaki
                j++;
                k = j * j;
            } while( k < i );
           
            for( l = 0; l < j; l++ ) //wypelnianie macierzy spacjami
            for( m = 0; m < j; m++ ) //w przypadku gdy macierz nie jest wypelniona
            {
                macierz[ l ][ m ] = 32;
            }
           
            m = 0; n = 0;
           
            for( l = 0; l < i; l++ ) //przepisywanie wszystkich znakow z pomocy do macierzy
            {
                macierz[ n ][ m ] = pomoc[ l ];
                m++;
                if( m == j ) //gdy zapelniony jeden wiersz to do nastepnego
                {
                    n++;
                    m = 0;
                }
            }
           
            //odczytywanie znakow z macierzy kolumnami
            for( l = 0; l < j; l++ )
            for( m = 0; m < j; m++ )
            {
                znak = macierz[ m ][ l ];
                putc( znak, wy );
            }
           
           
            fclose( wy );
        }
        fclose( we );
       
    }
   
   
    printf( "\n\n\n\n\nOperacja zostala zakonczona\n" );
    wede = wy;
   
   
    remove( wejscie );
    system( "pause" );
}
P-103196
szwarcus
Temat założony przez niniejszego użytkownika
» 2014-01-26 15:34:53
Z dynamiczną alokacją trochę ciężko ale udało mi się napisać tak by backspace działał :)

C/C++
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

/*char** alokujTablice2D(int x, int y, char** tab)
{
tab = (char**)malloc(x*sizeof(char*));
int i;
for (i = 0; i<x; i++)
{
tab[i] = (char*)malloc(y*sizeof(char));
}
return tab;
}*/
void komunikat()
{
   
    printf( "PLIK WEJSCIOWY JEST USUWANY PO ZASZYFROWANIU\n\n" );
    printf( "1)PODAJ DOWOLNY CIAG ZNAKOW DO SZYFRU\n" );
    printf( "2)NIE UZYWAJ ZNAKOW SPECJALNYCH\n" );
    printf( "3)JESLI CHCESZ ZAKONCZYC WCISNIJ ENTER\n\n" );
   
}


int main()
{
   
    FILE * we = fopen( "plikwejsciowy.txt", "ab" ), * wy, * wede;
    char macierz[ MAX ][ MAX ], pomoc[ MAX ], wyjscie[ MAX ], wyjpath[ MAX ], znak, tab[ 100 ];
    printf( "PODAJ SCIEZKE PLIKU WYJSCIOWEGO TWOJEGO SZYFRU\nSCIEZKA MUSI MIEC POSTAC np\n\t\t C:\\plikzaszyfowany.txt\nPAMIETAJ O DODANIU NAZWY PLIKU Z ROZSZERZENIEM TEKSTOWYM\n---------------------------------------------------------------------------\n\n" );
    scanf( "%s", & wyjpath );
    for( int i = 0; i < MAX; i++ )
    {
        wyjscie[ i ] = wyjpath[ i ];
    }
   
    int i = 0, j, k, l, m, n;
   
   
   
    fflush( stdin ); //Czysci bufor wejscia by moc wpisac lancuch
   
    komunikat();
   
    fgets( tab, sizeof( tab ), stdin ); // Dzieki fgets mozna wczytac dowolna ilosc znakow
    fputs( tab, we ); //wstawia do pliku
    fclose( we );
   
    we = fopen( "plikwejsciowy.txt", "rb" ); // odczytuje wejscie
    wy = fopen( wyjscie, "wb" ); // nadpisuje wyjscie
    if( we != NULL )
    {
        if( wy != NULL )
        {
           
            while(( znak = getc( we ) ) != EOF ) //odczytywanie wszystkich znakow z pliku wejsciowego
            {
                pomoc[ i ] = znak; //zapisywanie wszystkich znakow to tablicy pomocniczej
                i++; //zliczanie znakow
            }
           
           
            j = 1;
            do //dopasowywanie wielkosci macierzy - powiekszamy ilosc kolumn i wierszy tak
            { //dlugo az pomiesci wszystkie odczytane z pliku znaki
                j++;
                k = j * j;
            } while( k < i );
           
           
            for( l = 0; l < j; l++ ) //wypelnianie macierzy spacjami
            for( m = 0; m < j; m++ ) //w przypadku gdy macierz nie jest wypelniona
            {
                macierz[ l ][ m ] = 32;
            }
           
           
            m = 0; n = 0;
           
            for( l = 0; l < i; l++ ) //przepisywanie wszystkich znakow z pomocy do macierzy
            {
                macierz[ n ][ m ] = pomoc[ l ];
                m++;
                if( m == j ) //gdy zapelniony jeden wiersz to do nastepnego
                {
                    n++;
                    m = 0;
                }
            }
           
            //odczytywanie znakow z macierzy kolumnami
            for( l = 0; l < j; l++ )
            for( m = 0; m < j; m++ )
            {
                znak = macierz[ m ][ l ];
                putc( znak, wy );
            }
           
           
            fclose( wy );
        }
        fclose( we );
       
    }
    printf( "\n\n\n\n\nOperacja zostala zakonczona\n" );
    wede = wy;
   
   
    remove( "plikwejsciowy.txt" );
    system( "pause" );
    return 0;
}
P-103255
« 1 »
  Strona 1 z 1