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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2011, 12:07   #1
nd0ut
 
Регистрация: 06.02.2011
Сообщений: 4
По умолчанию Циклический алфавит (c++)

Задача:
Цитата:

На вход программе подается текст, состоящий не более чем из 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);
}
Однако все равно где-то что-то не так

Последний раз редактировалось nd0ut; 17.02.2011 в 20:40.
nd0ut вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алфавит. the_deer_one Общие вопросы C/C++ 2 13.09.2010 14:53
Алфавит blok20 Помощь студентам 0 17.04.2010 20:55
Алфавит Mikimaus Общие вопросы C/C++ 7 17.11.2009 19:15
Греческий алфавит kaa1977 Помощь студентам 11 14.05.2009 20:10
Национальный алфавит Bagirli Общие вопросы Delphi 5 30.03.2008 01:44