Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* На вход программе подается текст, состоящий не более чем из 200 символов.
- Текст был зашифрован следующим образом. Сначала определили количество букв в самом коротком слове, обозначив полученное число n
- (словом называется непрерывная последовательность английских букв, слова друг от друга отделяются любыми другими символами).
- Затем заменили каждую английскую букву в тексте на следующую за ней n-й по счету в алфавите
- (алфавит считается циклическим, за буквой Z следует буква А), оставив другие символы неизменными.
- Строчные буквы при этом остались строчными, а прописные — прописными. Напишите программу, которая будет выводить расшифрованный текст.
- Программа должна считать выходые данные из файла input.txt и вывести результат в файл output.txt
- Формат входного файла:
- Входной файл содержит одну строку с текстом. Длина строки не превышает 200 символов.
- Формат выходного файла:
- Выведите в выходной файл ответ расшифрованный текст.
- Пример:
- input.txt
- Jgnnq yqtnf! Vjku oguucig ku xgta ugetgv.
- output.txt
- Hello world! This message is very secret.*/
- #include <stdio.h>
- #include <iostream>
- /*метод для дешифрования #1*/
- void PrevChar(char c, int n, int count)
- {
- if(isalpha(c)) { //если буква
- if(count - ('Z'-toupper(c))<=n) { //если нужен циклический алфавит
- int k=n-(count - ('Z'-toupper(c)+1)); //считаем, на сколько надо сдвинуться влево от Z
- if(isupper(c)) c='Z'+1-k; //если буква большая, выводим большую
- else c='z'+1-k; //если буква не большая, выводим не большую
- }
- else c=c-n; //если циклический алфавит не нужен, то просто выводим предыдущую n-ную букву
- }
- printf("%c", c); //собсно сам вывод получившегося символа (если не буква - никакой обработки нет)
- }
- /*метод для дешифрования #2
- void PrevChar(char c, int n)
- {
- if(isalpha(c))
- {
- char alpha[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- char newchar;
- int newcharid;
- int charid;
- for(int i = 1; i<sizeof(alpha);i++)
- if(alpha[i]==toupper(c)) {
- charid=i;
- break;
- }
- if(charid-n<=0) {
- newcharid = 26-(n-charid);
- newchar = alpha[newcharid];
- }
- else {
- newcharid=charid-n;
- newchar=alpha[newcharid];
- }
- if(isupper(c))
- printf("%c", toupper(newchar));
- else
- printf("%c", tolower(newchar));
- }
- else
- printf("%c", c);
- }
- */
- /*метод для шифрования*/
- void NextChar(char c, int n, int count)
- {
- if(isalpha(c)) { //если буква
- if('Z'-toupper(c)<n) {
- int k=n-('Z'-toupper(c)+1);
- if(isupper(c))
- c='A'+k;
- else
- c='a'+k;
- }
- else c=c+n;
- }
- printf("%c", c);
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- const int count = 26; //сколько букв в алфавите
- char c; //текущий символ
- int n = 0; //счетчик минимальной длины слова
- int min = count*10; //минимальная длина слова, иницилизация
- while (scanf("%c", &c) == 1) { //для каждого символа
- if(isalpha(c)) { //если это английская буква
- n++; //инкремент счетчика
- }
- else if(!isalpha(c)) { //если это не английская буква
- if(n<min && n>1) //если счетчик меньше имеющейся минимальной длины и больше еденицы (последовательность)
- min=n; //обновляем минимальную длину
- n=0; //очищаем счетчик
- }
- }
- if(n<min && n>1) //если счетчик меньше имеющейся минимальной длины и больше еденицы (последовательность)
- min=n; //обновляем минимальную длину
- while(min>count) //пока минимальная длина больше алфавита
- min=min-count; //уменьшаем минимальную длину на кол-во букв в алфавитеъ
- freopen("input.txt","r",stdin); //читаем вход сначала
- while (scanf("%c", &c) == 1) { //для каждого символа
- PrevChar(c,min, count); //выводим min-ный предыдущий символ алфавита
- //NextChar(c,min, count); //выводим min-ный следующий символ алфавита
- }
- fclose (stdout);
- fclose (stdin);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement