Задача:
Цитата:
На вход программе подается текст, состоящий не более чем из 200 символов. Текст был зашифрован следующим образом. Сначала определили количество букв в самом коротком слове, обозначив полученное число n (словом называется непрерывная последовательность английских букв, слова друг от друга отделяются любыми другими символами). Затем заменили каждую английскую букву в тексте на следующую за ней n-й по счету в алфавите (алфавит считается циклическим, за буквой Z следует буква А), оставив другие символы неизменными. Строчные буквы при этом остались строчными, а прописные — прописными. Напишите программу, которая будет выводить расшифрованный текст. Программа должна считать выходые данные из файла input.txt и вывести результат в файл output.txt
|
Пример входа:
Цитата:
Jgnnq yqtnf! Vjku oguucig ku xgta ugetgv.
|
Пример выхода:
Цитата:
Hello world! This message is very secret.
|
Код:
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
/*
Надо сделать так, чтоб метод возвращал предыдущий n-ый символ алфавита циклически
т.е. чтобы перед A была Z
и, соответсвенно, если с=B и n=5, то возвращается W
*/
void PrevChar(char c, int n)
{
if(islower(c)) {
if(c=='a')
printf("%c", 'z'-n+1);
else
printf("%c", c-n);
}
else if(isupper(c)) {
if(c=='A')
printf("%c", 'Z'-n+1);
else
printf("%c", c-n);
}
else
printf("%c", c);
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
char c;
int n = 0;
int min = 1000;
bool flag = false;
while (scanf("%c", &c) == 1) {
if(isalpha(c)) {
n++;
}
else if(!isalpha(c)) {
if(n<min && n!=0)
min=n;
n=0;
flag=true;
}
if(!flag)
min=n;
}
fclose (stdin);
freopen("input.txt","r",stdin);
while (scanf("%c", &c) == 1) {
PrevChar(c,min);
}
fclose (stdout);
fclose (stdin);
system("PAUSE");
return 0;
}
На предложенном примере работает (из-за костыля в методе PrevChar), но если буква и n другие, то появляются левые знаки из ASCII.
UPD:
Код:
void PrevChar(char c, int n)
{
int count = 26;
int k = 0;
if(count - ('Z'-toupper(c)+1)<n)
k=n-(count - ('Z'-toupper(c)+1));
if(islower(c)) {
if(k != 0)
printf("%c", tolower('Z'+1-k));
else
printf("%c", c-n);
}
else if(isupper(c)) {
if(k != 0)
printf("%c", toupper('Z'+1-k));
else
printf("%c", c-n);
}
else
printf("%c", c);
}
Теперь знаки вроде бы предыдущие буквы вычисляются правильно, но авто-компилятор говорит, что результат неверен. Видимо, где-то закралась дырка
UPD: если длина слова больше алфавита, то вывод кривой. Мб в этом проблема (Я не знаю что подают на вход программе).
UPD: фикс длины слова, если она больше алфавита
Код:
void PrevChar(char c, int n)
{
int count = 26;
int k = -1;
if(n>26)
n=n-26;
if(count - ('Z'-toupper(c)+1)<n)
k=n-(count - ('Z'-toupper(c)+1));
if(islower(c)) {
if(k != -1)
printf("%c", tolower('Z'+1-k));
else
printf("%c", c-n);
}
else if(isupper(c)) {
if(k != -1)
printf("%c", toupper('Z'+1-k));
else
printf("%c", c-n);
}
else
printf("%c", c);
}
Однако все равно где-то что-то не так