Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите розобратса, не понимаю почему не работает функция 
:(
    Опции темы
tayler
  Дата 24.1.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.1.2009

Репутация: нет
Всего: нет



Значит так....у меня задание написать простой шифратор....я себе придумал простой алгоритм:
1)функция читает 1 знак с файла
2)функция "sprawdz_czy_nalezy" проверяет есть ли он в таблице alfabet[]
 а)если есть return 1
 б)если нет return 0
3)если sprawdz_czy_nalezy = 0, функция переходит к след знаку
4)если sprawdz_czy_nalezy = 1, ето описывать не буду бо там вроде все ок=)

проблема в том что у меня не коректно работает если "sprawdz_czy_nalezy" не так подаю туда аргументы!?

Код

#include <stdio.h>
#include <stdlib.h>
#include <conio.h> 
#include "plik.h"

#define TABLE_SIZE 1024

void *malloc();
char *input_file;

int main(int argc, char *argv[])
{
    char *alf;
    char *hom;
    char *q;
    
    FILE *input_file; 
    FILE *output_file; 
      
      char input_file_name[81], output_file_name[81],parameter=0;
      
      input_file = malloc(TABLE_SIZE*sizeof(char));
      
      
      
      
int i,j,k;
char c;

alfabet[]={"a""b""c""d""e""f""g""h""i""j""k""l""m""n""o""p""q""r""s""t""u""v""w""x""y""z""A""B""C""D""E""F""G""H""I""J""K""L""M""N""O""P""Q""R""S""T""U""V""W""X""Y""Z""!""\"""#""$""\%""&""\'""("")""-"".""//""0""1""2""3""4""5""6""7""8""9"":"";""<""="">""?""@""\n""\t"" "};
  char homofon[]={180,169,12,23,4,170,22,1,177,26,164,160,7,175,161,25,176,5,8,179,162,178,189,20,166,27,163,183,6,182,11,180,24,15,171,19,2,173,16,168,21,174,31,167,30,18,172,3,29,17,181,28,33,34,35,36,37,38,39,42,44,40,47,41,45,46,43,48,49,57,54,52,53,51,55,56,50,58,59,60,61,62,63,64,13,9,32};
 while((parameter!='c') && (parameter!='d')&&(parameter!='C') && (parameter!='D'))
 {
  parameter = getch();
 }
  if((parameter=='c')||(parameter=='C'))
                                        {printf("You want to code, Please input file name's\n\nOriginal file name: ");}
     else if ((parameter=='d')||(parameter=='D'))
                                        {printf("You want to decode, Please input file name's\n\nCoded file name: ");}
     
     scanf("%s",&input_file_name); 
                  
                  input_file=fopen(input_file_name,"rb");
                  
                  if(input_file==NULL)
                                      {printf("\aFatal error opening INPUT file\nFile of this name does not exist\n\nprogram will be closed\n");getch();return;}
 printf("\nResult file name: ");
                  
                  scanf("%s",&output_file_name);
                  
                  if(strcmp(input_file_name, output_file_name)==0)
                                             {printf("\a\n\nFatal Error. The names of files can't be the same!!!!");
                                             getch();
                                             return;
                                             }
                  else;
    
    output_file=fopen(output_file_name,"wb"); 
    
  if((parameter=='c')||(parameter=='C'))
  {
   alf=&alfabet[0];
   hom=&homofon[0];
   }
   else{
        alf=&homofon[0];
        hom=&alfabet[0];
   }
 while ((c=getc(input_file)) != EOF) 
    {
    q=&c;

  if((sprawdz_czy_nalezy(q, alf))==1)
  {
  k=0;
  while(c!=alf[k])
  k++;

  putc(hom[k],output_file);
  }
  else;
}
fclose(input_file);
fclose(output_file);
getch();
}

int sprawdz_czy_nalezy( char *q, char *alf)
   {
   int j;
   for(j=0;j<83;j++)
  {
                    printf("%d",j);
   if(*q != *(alf+j))
   {}
   else; {printf("sa\n");return 1;}
  } 
  printf("nie sa\n");
 return 0;   
}



P.S. компилятор devC++

Это сообщение отредактировал(а) tayler - 24.1.2009, 17:29
PM MAIL   Вверх
mes
Дата 24.1.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(tayler @  24.1.2009,  16:28 Найти цитируемый пост)
проблема в том что у меня не коректно работает если "sprawdz_czy_nalezy" 

Некорректно это как ? 



Цитата(tayler @  24.1.2009,  16:28 Найти цитируемый пост)
int sprawdz_czy_nalezy( char *q, char *alf)

q у Вас же символ, зачем  указатель на него передовать ?

Цитата(tayler @  24.1.2009,  16:28 Найти цитируемый пост)
   if(*q != *(alf+j))
   {}
   else; {printf("sa\n");return 1;}

a зачем простите ";" после else  smile

Добавлено через 2 минуты и 51 секунду
Цитата(tayler @  24.1.2009,  16:28 Найти цитируемый пост)
"a""b""c""d""e""f""g""h""i""j""k""l""m""n""o""p""q""r""s""t""u""v""w""x""y""z""A""B""C""D""E""F""G""H""I""J""K""L""M""N""O""P""Q""R""S""T""U""V""W""X""Y""Z""!""\"""#""$""\%""&""\'""("")""-"".""//""0""1""2""3""4""5""6""7""8""9"":"";""<""="">""?""@""\n""\t"" "

внутренние кавычки тут излишни, они лишь затрудняют чтение кода..




--------------------
PM MAIL WWW   Вверх
tayler
  Дата 24.1.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.1.2009

Репутация: нет
Всего: нет



спс за указания......значет так по очереди,

по моему некоректно работает потомучто тасколько мне извесно то в документах  *.тхт кроме обычных знаков(букв,знаков табуляци, знака нового рядка,пробела итп.) есть еще кучя мусора (как знаки возвращения каретки принтера ,или чтото в етом типе) вот собственно ета функция (sprawdz_czy_nalezy) создана для того чтоб проверить если знака нету в alfabet[] пропускай его(тоисть не записывай в output_file)...
дело в том что знаки которых нет в етой таблице он заменяет буквой q 
сюда "if(*q != *(alf+j))" даю указатель бо если передаю туда "с" то мне выбивает ерроры 

main.c syntax error before "char" 
main.c In function `sprawdz_czy_nalezy':
main.c number of arguments doesn't match prototype
plik.h prototype declaration 
main.c `c' undeclared (first use in this function) 
main.c `alf' undeclared (first use in this function) 

а кавычки уберу спс за подсказку.....кстати там нельзя вообше както так указать alfabet[]={a-z , A-z , 0-9 ,}
чтото было такое только вот не помню как ето записывалось (

вот а вообше проблема в том что он типа шифрует только он не замечяет знаков новой линии, табуляции итп..
мож мне будет лутше чемто другим читать знаки из файла!?

помогите както стабилизировать код, ато вчера всю ночь писал, а на пн надо сдать =)

Это сообщение отредактировал(а) tayler - 24.1.2009, 21:02
PM MAIL   Вверх
JackYF
Дата 24.1.2009, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162




M
JackYF
Тему почистил.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
mes
Дата 24.1.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



вот написал функцию, ловите и проверяйте
Код

// в алфавите не использовать коды ниже 32
// алфавит состоит из пар, буквы и его кодового символа
const char * alfabet = "aBbRc5d1e&f6g7h......";// вместо точек дополните алфавит


char code_char (char c, bool code, const char * alfabet) 
// code == true ->кодировать, ==false -> раскодировать
{
    if  (c<32) return c; // управляющие символы оставляем без изменения.

    if (code) for ( ; *alfabet ; ++alfabet ) if (*(alfabet++)==c) return *alfabet;
    else      for ( ; *alfabet ; ++alfabet ) if (*(++alfabet)==c) return *(alfabet-1);

    return c;// если в словаре не нашли, возвращаем без изменения
}



Это сообщение отредактировал(а) mes - 24.1.2009, 22:41


--------------------
PM MAIL WWW   Вверх
mes
Дата 24.1.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



мне кажется составлять алфавит вручную не очень удобно, проще написать какой нибудь генератор.
к тому же желательно иметь возможность проверить алфавит


--------------------
PM MAIL WWW   Вверх
tayler
Дата 24.1.2009, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.1.2009

Репутация: нет
Всего: нет



Ребят написал таки его  smile =)))
если кому надо пишыте в ЛС или сюда выложу =)
всем спасибо за помощь =) smile 

Это сообщение отредактировал(а) tayler - 25.1.2009, 11:45
PM MAIL   Вверх
mes
Дата 24.1.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



ну тогда просто напишите функцию, показывающую сколько вхождений на каждый символ  имеется
для управляющих  должно быть 0, а для остальных не больше одного.

Добавлено @ 22:22
ловите функцию подсчета, осталось добавить ее вызов в цикл, и вывести отчет.
Код

int  char_in_alfabet  (char c, bool code, const char * alfabet) 
// возвращает кол-во встреченных символов
{
    int count =0;
    if (code) for ( ; *alfabet ; ++alfabet ) if (*(alfabet++)==c) ++count;
    else      for ( ; *alfabet ; ++alfabet ) if (*(++alfabet)==c) ++count;
    return count;
}


Это сообщение отредактировал(а) mes - 24.1.2009, 22:44


--------------------
PM MAIL WWW   Вверх
cutwater
Дата 24.1.2009, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 2
Всего: 10



2 tayler:

Я насколько понимаю, Вы не знакомы с шифрованием до этого "проекта" были.
Исходя из алгоритма вашего, ваш шифр является обыкновенной подстановкой, взломать его намного легче не простым перебором, а методом частотного анализа, с очень большой вероятностью и минимумом затрат.

Извините, но говорить о защищенности такого алгоритма не имеет смысла, ибо похожие алгоритмы применялись с десяток-два лет назад. При нынишних мощностях и развитии криптографии применяются на n порядков более сложные алгоритмы шифрования.


--------------------
user posted image
PM MAIL   Вверх
tayler
Дата 25.1.2009, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.1.2009

Репутация: нет
Всего: нет



2 cutwater:

Нет не знаком=)))

я чуть поправил алгоритм теперь он стал чуть сложнее покрайней мере мне так кажетса=)))

выгледит ето приблизительно так:

1) Беру чар
2) приравнимаю к таблице алфавит
3) Номер чара в таблице алфавит шифрую спомощю шифра Цезара F(n)=(n+i)mod93
где "n" ето порядковый номер в таблице, "i" ето порядковый номер в файле
4) Потом то что получита я использую как порядковый номер для таблицы маски(так как я ее называю) =)

очень надеюсь что каждий второй  розшифровать етого не сможет, хотя какая разница =))
мне б проект сдать, он там и говорл чтоб ничего особенного не делать =)

Это сообщение отредактировал(а) tayler - 25.1.2009, 11:55
PM MAIL   Вверх
cutwater
Дата 25.1.2009, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 2
Всего: 10



Я думаю если необходимо просто сдать "проект", без его практического применения, то все равно как он шифрует.
А если интересна современная криптография то советую почитать хотябы того же Брюса Шнайера "Прикладная криптография"


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0762 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.