Advertisement
Guest User

Untitled

a guest
Mar 20th, 2011
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.42 KB | None | 0 0
  1. /* На вход программе подается текст, состоящий не более чем из 200 символов.
  2. Текст был зашифрован следующим образом. Сначала определили количество букв в самом коротком слове, обозначив полученное число n
  3. (словом называется непрерывная последовательность английских букв, слова друг от друга отделяются любыми другими символами).
  4. Затем заменили каждую английскую букву в тексте на следующую за ней n-й по счету в алфавите
  5. (алфавит считается циклическим, за буквой Z следует буква А), оставив другие символы неизменными.
  6. Строчные буквы при этом остались строчными, а прописные — прописными. Напишите программу, которая будет выводить расшифрованный текст.
  7. Программа должна считать выходые данные из файла input.txt и вывести результат в файл output.txt
  8.  
  9. Формат входного файла:
  10. Входной файл содержит одну строку с текстом. Длина строки не превышает 200 символов.
  11.  
  12. Формат выходного файла:
  13. Выведите в выходной файл ответ расшифрованный текст.
  14.  
  15.  
  16. Пример:
  17.  
  18. input.txt  
  19. Jgnnq yqtnf! Vjku oguucig ku xgta ugetgv.  
  20.  
  21. output.txt
  22. Hello world! This message is very secret.*/
  23.  
  24. #include <stdio.h>
  25. #include <iostream>
  26.  
  27. /*метод для дешифрования #1*/
  28. void PrevChar(char c, int n, int count)
  29. {
  30.     if(isalpha(c)) { //если буква
  31.         if(count - ('Z'-toupper(c))<=n) { //если нужен циклический алфавит
  32.             int k=n-(count - ('Z'-toupper(c)+1)); //считаем, на сколько надо сдвинуться влево от Z
  33.  
  34.             if(isupper(c))  c='Z'+1-k; //если буква большая, выводим большую
  35.             else            c='z'+1-k; //если буква не большая, выводим не большую
  36.         }
  37.         else c=c-n; //если циклический алфавит не нужен, то просто выводим предыдущую n-ную букву
  38.     }
  39.  
  40.     printf("%c", c); //собсно сам вывод получившегося символа (если не буква - никакой обработки нет)
  41. }
  42.  
  43. /*метод для дешифрования #2
  44. void PrevChar(char c, int n)
  45. {
  46.     if(isalpha(c))
  47.     {
  48.         char alpha[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  49.         char newchar;
  50.         int newcharid;
  51.         int charid;
  52.        
  53.         for(int i = 1; i<sizeof(alpha);i++)
  54.             if(alpha[i]==toupper(c)) {
  55.                 charid=i;
  56.                 break;
  57.             }
  58.  
  59.         if(charid-n<=0) {
  60.             newcharid = 26-(n-charid);
  61.             newchar = alpha[newcharid];
  62.         }
  63.         else {
  64.             newcharid=charid-n;
  65.             newchar=alpha[newcharid];
  66.         }
  67.  
  68.         if(isupper(c))
  69.             printf("%c", toupper(newchar));
  70.         else
  71.             printf("%c", tolower(newchar));
  72.  
  73.     }
  74.     else
  75.         printf("%c", c);
  76.  
  77. }
  78. */
  79.  
  80.  
  81.  
  82. /*метод для шифрования*/
  83. void NextChar(char c, int n, int count)
  84. {
  85.     if(isalpha(c)) { //если буква
  86.         if('Z'-toupper(c)<n) {
  87.             int k=n-('Z'-toupper(c)+1);
  88.  
  89.             if(isupper(c))
  90.                 c='A'+k;
  91.             else
  92.                 c='a'+k;
  93.         }
  94.         else c=c+n;
  95.     }
  96.  
  97.     printf("%c", c);
  98. }
  99.  
  100. int main()
  101. {
  102.  
  103.     freopen("input.txt","r",stdin);
  104.     freopen("output.txt","w",stdout);
  105.  
  106.     const int count = 26; //сколько букв в алфавите
  107.     char c; //текущий символ
  108.     int n = 0; //счетчик минимальной длины слова
  109.     int min = count*10; //минимальная длина слова, иницилизация
  110.  
  111.     while (scanf("%c", &c) == 1) { //для каждого символа
  112.         if(isalpha(c)) { //если это английская буква
  113.             n++; //инкремент счетчика
  114.         }
  115.         else if(!isalpha(c)) { //если это не английская буква
  116.             if(n<min && n>1) //если счетчик меньше имеющейся минимальной длины и больше еденицы (последовательность)
  117.                 min=n; //обновляем минимальную длину
  118.             n=0; //очищаем счетчик
  119.         }
  120.     }
  121.    
  122.     if(n<min && n>1) //если счетчик меньше имеющейся минимальной длины и больше еденицы (последовательность)
  123.         min=n; //обновляем минимальную длину
  124.        
  125.     while(min>count) //пока минимальная длина больше алфавита
  126.         min=min-count; //уменьшаем минимальную длину на кол-во букв в алфавитеъ
  127.        
  128.     freopen("input.txt","r",stdin); //читаем вход сначала
  129.    
  130.     while (scanf("%c", &c) == 1) { //для каждого символа
  131.         PrevChar(c,min, count); //выводим min-ный предыдущий символ алфавита
  132.         //NextChar(c,min, count); //выводим min-ный следующий символ алфавита
  133.     }
  134.  
  135.     fclose (stdout);
  136.     fclose (stdin);
  137.  
  138.     return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement