Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2011, 13:23   #1
bloger
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 12
По умолчанию ошибка в ввыводе символов

Помогите сделать афинскую дешифровку букв.Вводится слово и ключ. Нужно переставить каждую букву на столько позиций сколько задан ключ.
Шифровать получается все правильно, а вот наоборот не хочет возращять слово. Если ввести qwerty и ключ 3 получится sygtva.Но назад не получается слово qwerty.

PHP код:
  char arr[256];
  
int i,j;
  
int n=0;
  
int k=1//к-во сдвигов
  
char s1[256];//выходной массив
  
int count 26;
  
char alf[]="abcdefghijklmnopqrstuvwxyz";
  
int temp;

int enter_text()
{
      
printf("Слово:\n");
      
scanf("%s",arr);
      
printf("Ключ:");
      
scanf("%d",&k);
      


int shift()
{
    
int n strlen(arr);
    
int m strlen(alf);
    
    for (
0ni++){ //перебор букв 
        
for (0mj++){ 
            if ( 
arr[i] == alf[j] ){  //сравниваем каждую букву
                
temp = (j+k) % count;  //% count - предел алфавита
                
s1[i] = alf[temp]; //буква со сдвигом
            
}
        }
    }
   
        
puts("Шифр:");
        
puts(s1);
        
puts("\n");
    
    return 
1;  
}


int d_shift()
{
    
int n strlen(arr);
    
int m strlen(alf);
    
    for (
0ni++){  
        for (
0mj++){ 
            if ( 
arr[i] == alf[j] ){  
                
temp = (j-k) % count;  
                
s1[i] = alf[temp]; 
            }
        }
    }
   
        
puts("Дешифр:");
        
puts(s1);
        
puts("\n");
    
    return 
1;  

 
int main()
{
L:      printf("действия:\n1.Шифровать\n2.Дешифровать\n3.Выход\n");
        
scanf("%d",&n);
        
        switch(
n)
        {
          case 
1enter_text();
                  
shift();
                  break;
          
          case 
2enter_text();
                     
d_shift();
                  break;
                  
          case 
3: exit(0); break;
        }               
        goto 
L;
        
encryption();    
        
getch();


Последний раз редактировалось bloger; 07.11.2011 в 20:06.
bloger вне форума Ответить с цитированием
Старый 07.11.2011, 14:37   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Попробуйте передавать массивы в функции через аргументы, а не через глобальные переменные. А заодно и все остальные переменные, типа счётчиков циклов, не делайте глобальными - во всей этой программе глобальны только алфавит и число символов в нём.
Abstraction вне форума Ответить с цитированием
Старый 07.11.2011, 19:36   #3
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

Сделайте двойной алфавит (52 символа); при шифровке база смещения = 0 и ключ прибавляется. При обратном действии база = 26 и ключ вычитается. [Что у Вас при дешифрации получится, когда код символа меньше ключа...?]
nick42 вне форума Ответить с цитированием
Старый 07.11.2011, 19:50   #4
bloger
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 12
По умолчанию

Скрин http://s017.radikal.ru/i427/1111/be/ff973010ceeb.jpg
bloger вне форума Ответить с цитированием
Старый 07.11.2011, 19:51   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
[Что у Вас при дешифрации получится, когда код символа меньше ключа...?]
Кстати да, это зависит от компилятора. Лучше (j-k+26) вместо (j-k), или действительно повторить алфавит дважды.
Abstraction вне форума Ответить с цитированием
Старый 07.11.2011, 19:55   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

И лучше бы не "дешифровать", а "расшифровать" ("Расшифрованный текст", кстати). "Дешифровать" - это взломать код, "расшифровать" - применить ключ.
Abstraction вне форума Ответить с цитированием
Старый 07.11.2011, 20:00   #7
bloger
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 12
По умолчанию

(j-k+26) работает. Только все равно не пойму принципа такого.За помощь большое спасибо.
bloger вне форума Ответить с цитированием
Старый 07.11.2011, 20:14   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Рассмотрите зашифровывание буквы y. Её номер 24, 24+3=27, 27%26=1, alf[1]=b.
Теперь в обратную сторону: b, её номер 1, 1-3=-2. Чему равно (-2)%26 ?
В алгебре, остаток от деления -2 на 26 равен 24 или -2, в зависимости от определения "остатка" в случае отрицательного делимого. К сожалению, стандарт C++ не оговаривает, что именно должно получиться при такой операции, то есть, реальный исход будет зависеть от того, что решили авторы данного конкретного компилятора.
Если же прибавить 26, у нас всегда будет получаться неотрицательное число (если, конечно, не зададут ключ больше 26).
Abstraction вне форума Ответить с цитированием
Старый 30.11.2011, 20:15   #9
bloger
Пользователь
 
Регистрация: 19.11.2009
Сообщений: 12
По умолчанию

Код:
int enter_text()
{
      printf("Слово:\n");
      gets(arr);
      printf("Ключ:");
      scanf("%d",&k);
      
}
Если я ввожу слово test and test (с пробелами) и ключ 2 то получу слово
vguvccpfcvguv. При обратной шифровке получу слово не test and test а,
testaandatest. Вместо пробелов будет у меня 2 буквы а. Как мне сделать чтобы вместо а были пробелы ???
bloger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подсчет числа комбинации символов 'ab' во входном потоке символов (Си) skrappy_kokko Помощь студентам 4 14.09.2011 23:10
Дана последовательность символов (строка). Группу символов, разделенную с одной или обеих сторон пробелам viper1941 Паскаль, Turbo Pascal, PascalABC.NET 1 14.04.2011 08:46
Ошибка в процедуре замены символов. PAvl Паскаль, Turbo Pascal, PascalABC.NET 2 03.12.2010 11:47
Что делать, если количество символов в билдере не соответствует количеству символов в билде? BoT_T Общие вопросы Delphi 0 16.11.2010 10:42
верно ли, что среди символов данного текста есть n подряд идущих символов, Yuliya-Nik Помощь студентам 0 06.10.2010 23:44