Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Программа шифрования


Автор: WaRPLeX 25.10.2004, 16:27
Привет всем! Курсовую задали в инстике. А я не понимаю С++. Это вообще не из моей области. Есть ли добрые люди которые помогли бы.
Суть:
Прога. Вводишь любой текст с клавы. Есть таблица замены символов (к примеру одной букве соответствует другая). По этой таблице текст кодируется (побуквенно) и сохраняется в фаил (любой, по любому пути).
При просмотре файла просто набор букв без смысла выводится, т.к. всё зашифровано.
И обратная программы нужна.
Открываешь фаил (по любому фиксированному пути). Программа с помощью этойже таблицы замены символов текс расшифровывает и выводит на экран.

Надеюсь мне кто-нибудь поможет.
Заранее благодарен.
Мыло: i.v.gusev@mail.ru

Автор: chipset 25.10.2004, 16:27
Совет: используй std::map

Автор: Mad 25.10.2004, 16:37
chipset
зачем так сложно, можно и по проще :
Код

char code_table[256] = {' ', .../*описание таблицы*/};

char EncodeChar(char c)
{
    return code_table[c];
}

:D :D :D

Автор: Step 25.10.2004, 16:49
Mad, chipset- правильно советует... а обратное преобразование ты еще через одну таблицу будешь делать...

Автор: Mad 25.10.2004, 16:59
Step
Код

char Decode(char c)
{
   char ret=0;
   while (code_table[ret] != c)
       ret++;
   return ret;
}


Автор: Step 25.10.2004, 17:06
Mad, приношу вам свои извинения (понимая что мог зацепить подобным высказыванием), да можно и так. можно и через две табицы, можно и через ассоциативные масивы... решений много, а вот что выберет вопрошающий это уже его дела... конечна ваше предложение это самая простая реализация и для столь ограниченной задачи наверное оптимольное

:)

Автор: WaRPLeX 26.10.2004, 08:13
А как задать таблицу шифрования типа

Буква её шифр
А В
Б Г
В Д

И какие #include <?> - нужны для моей прогИ?

Таблица задаётся массивом?

char Decode(char c)
{
char ret=0;
while (code_table[ret] != c)
ret++;
return ret;
}
Выше это что и к чему относится!

Автор: WaRPLeX 2.11.2004, 16:39
Дак помогите что ли

Автор: LuckLess 2.11.2004, 21:11
таблица в данном случае - это массив(одномерный).
Любому символу соответствует его код (1 байт если не брать unicode) , и если брать код символа как идекс массива , то какбы получаешь таблицу.


Добавлено @ 21:17
для приведенного Mad-ом кода #includ-ы не нужны.
но вероятно тебе понадабются windows.h и kernel32.lib для readfile()/writefile()/createfile()
и stdio.h для scanf()(если используешь C) или iostream.h(если не ошибся , так как обыцно пишу все на С) для ввода на С++.

Автор: bel_nikita 5.11.2004, 01:52
WaRPLeX
Цитата
Дак помогите что ли

Помогу, что ли smile

Вот, типа простенький алгоритм шифорования/дешифорования:
Код

#pragma warning(disable:4786) // 'identifier' : identifier was truncated to 'number' characters in the debug information
#include <map>

typedef struct __stCode {
 char  Char;  // символ
 char  Code; // шифр символа
 __stCode(char ch,char code){ Char = ch; Code = code; };
} stCode;

#define INSERT_CODE(Symbol,Code) stCode(Symbol,Code)

stCode CodeTable[]=  // задаем таблицу шифрования, тут я думаю все понятно
{
 INSERT_CODE('A','1'),
 INSERT_CODE('B','2'),
 INSERT_CODE('E','3'),
 INSERT_CODE('L','4'),
 INSERT_CODE('N','5'),
 INSERT_CODE('I','6'),
 INSERT_CODE('K','7'),
 INSERT_CODE('T','8'),
};

typedef std::map<char,char> CODINGMAP;

CODINGMAP CodingTable; // таблица для кодирования символов
CODINGMAP DeCodingTable; // таблица для декодирования символов

// создание таблиц
void CreateCodingTable()
{
 for(int i=0; i<sizeof(CodeTable)/sizeof(CodeTable[0]); ++i)
   CodingTable.insert(CODINGMAP::value_type(CodeTable[i].Char,CodeTable[i].Code));

 for(i=0; i<sizeof(CodeTable)/sizeof(CodeTable[0]); ++i)
   DeCodingTable.insert(CODINGMAP::value_type(CodeTable[i].Code,CodeTable[i].Char));
}

// кодирование си-строки
void Coding(char* p)
{
 for (; *p; p++ )
 {
   CODINGMAP::iterator iter=CodingTable.find(*p);
   if ( iter!=CodingTable.end() )
   {
     *p = iter->second;
   }
 }
}

// декодирование си-строки
void DeCoding(char* p)
{
 for (; *p; p++ )
 {
   CODINGMAP::iterator iter=DeCodingTable.find(*p);
   if ( iter!=DeCodingTable.end() )
   {
     *p = iter->second;
   }
 }
}

// пример использования
int main(int argc, char* argv[])
{

 CreateCodingTable(); // создаем таблицы кодирования/декодирования

 char* pchData = "BEL_NIKITA"; // типа данные, которые хотим зашифровать

 // тут покопируем строчки
 char Temp[256];
 sprintf(Temp,"%s",pchData);
 // зачем это надо было - потом как-нить объясню

 
 printf("\n%s",Temp); // выводим исходные данные
 Coding(Temp); // кодируем
 printf("\n%s",Temp); // выводим кодированые данные
 DeCoding(Temp); // декодируем
 printf("\n%s",Temp); // выводим декодированые данные

 return 0;
}


Результат:
Цитата
BEL_NIKITA
234_567681
BEL_NIKITA


З.Ы.: Ну, а писать, читать файл и вводить строки от пользователя в следующей серии. Спать уже охота. Поздно, однако smile

З.Ы.2: а компилятор какой? а то может BC 3.1, так зря все писал это...

Автор: WaRPLeX 5.11.2004, 17:19
bel_nikita
ой спасибо. у меня завтра в 12 утра здавать. Как ты вовремя. И как раз мне на день рождения (у меня сегодня). Спасибо просто приогромнейшее.
Круто было бы если бы она целая была, тоесть полная как в задании. Я бы такую в жизни не написал! И коменты вообще к стати.
Ещё раз спасибо.
И если не трудно, было-бы здорово, если её дописать.

Автор: WaRPLeX 5.11.2004, 17:20
Буду надеяться, что опять мне поможете.

Автор: WaRPLeX 5.11.2004, 17:38
И у нас вообще не билдер а ДОС версия.
вроде ВС7

Автор: bel_nikita 5.11.2004, 17:57
WaRPLeX В честь Дня Рождения примите поздравления! smile

Цитата
И у нас вообще не билдер а ДОС версия.
smile

Дык, это... там же я STL юзаю. Под ДОСом моя писанина не будет работать. Точнее в BC 3.1 нет STL smile

Автор: WaRPLeX 6.11.2004, 12:20
Спасибо за поздравления.
Я вчера посмотрел, у нас ВС 3.1.
Я преподу показал прогу, говорю, типа она пока не до конца. А он мне, что это, а что это. Говорит, типа ты чё так сложно то сделал. Типа ты гений чтоли.
Говорит, что сложно так будет её защищать. Нам ведь каждую строчку обяснять что делает надо.
Он мне говорил как надо переделать, что-то про таблицу из одномерного массива, но я ничего не понял, т.к. был пьян (день рождения всё таки).
Вообщем препод дал мне ещё времени.

bel_nikita
Если тебе не сложно, то напиши как можно проще. Мы ещё только самые основные понятия прошли по С++. А то я сам много что в программе не понял. Мы такое наверно дальше будем изучать.
Вообщем, буду очень благодарен, если поможешь!

Автор: bel_nikita 6.11.2004, 15:01
WaRPLeX
Цитата
bel_nikita
Если тебе не сложно, то напиши как можно проще. Мы ещё только самые основные понятия прошли по С++. А то я сам много что в программе не понял. Мы такое наверно дальше будем изучать.
Вообщем, буду очень благодарен, если поможешь!

Проще можно. Будет совсем по простому smile
Но! Надо же самому, что-то иногда делать! И не надо меня упрашивать! Это не поможет!

Код

#include <stdio.h>
// структура символ-код
typedef struct __stCode {
 char  Char; // символ
 char  Code; // код
 __stCode(char ch,char code){ Char = ch; Code = code; };
} stCode;

// дефайн для красоты
#define INSERT_CODE(Symbol,Code) stCode(Symbol,Code)

// таблица кодинга/декодинга символов
stCode CodeTable[]=
{
 INSERT_CODE('A','1'),
 INSERT_CODE('B','2'),
 INSERT_CODE('E','3'),
 INSERT_CODE('L','4'),
 INSERT_CODE('N','5'),
 INSERT_CODE('I','6'),
 INSERT_CODE('K','7'),
 INSERT_CODE('T','8'),
 // здесь добавлешь свои символ-код
};

// кодирование Си-строки
void Coding(char* p)
{
 for (; *p; p++ ) // цикл до конца Си-строки, т.е. до '\0'
 {
   for ( int i=0; i<sizeof(CodeTable)/sizeof(CodeTable[0]); ++i ) // бежим по всей таблице
   {
     if ( *p == CodeTable[i].Char ) // нашли символ в таблице
       *p = CodeTable[i].Code; // кодируем
   }
 }
}

// декодирование
void DeCoding(char* p)
{
 for (; *p; p++ ) // цикл до конца Си-строки, т.е. до '\0'
 {
   for ( int i=0; i<sizeof(CodeTable)/sizeof(CodeTable[0]); ++i ) // бежим по всей таблице
   {
     if ( *p == CodeTable[i].Code ) // нашли код в таблице
       *p = CodeTable[i].Char; // декодируем
   }
 }
}

// Запись в файл "CODE.TXT" кодированной строки
void FileWrite(char* p,int lenStr)
{
 FILE *FileW = fopen("CODE.TXT","w"); // открываем файл для записи
 fwrite(&p[0],sizeof(char),lenStr,FileW); // пишем файл
 fclose(FileW); // закрываем
}

// Чтение из файла "CODE.TXT" кодированной строки
int ReadFile(char *p, int lenStr)
{
 FILE *FileR = fopen("CODE.TXT","r"); // открываем файл для чтения
 int iRes = fread(&p[0],sizeof(char),lenStr,FileR); // читаем
 fclose(FileR); // закрывем
 return iRes; // возвращаем число реально прочитанных символов
}

// пример
int main(int argc, char* argv[])
{
 char chString[1024]; // буфер для ввода с клавы
 int iIndex = 0;
 int iLetter;

 printf("\nVvedite stroku:");

 // тута вводим строку до по синения, т.е. до тех пор пока не нажмем Enter
 while ( (iLetter = getchar() ) != '\n' )
   chString[iIndex++] = iLetter;

 chString[iIndex] = NULL; // для того чтобы сделать Си-строку
 
 Coding(chString); // кодируем
 printf("\n%s",chString); // смотрим  что у нас получилось

 FileWrite(chString,strlen(chString)); // пишем в файл

 char chTemp[1024]; // буфер для чтения из файла

 int iLenfReaded = ReadFile(chTemp,1024); // читаем из файла в буфер

 chTemp[iLenfReaded] = NULL; // делаем Си-строку

 DeCoding(chTemp); // декодируем
 
 printf(chTemp); // смотрим  что у нас получилось

 return 0; // радуемся жизни
}


З.Ы.: WaRPLeX - откомпиль прогу в BC 3.1. Надеюсь разбить прогу на две (кодирование и декодирование) не составит труда.

З.Ы.2: Успехов!

З.Ы.3: Если надумаешь благодарить меня, то просто зарегистрируйся и почаще заходи на форум. Здесь найдутся люди, которые тебе всегда тебе помогут smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)