В
Все
Б
Биология
Б
Беларуская мова
У
Українська мова
А
Алгебра
Р
Русский язык
О
ОБЖ
И
История
Ф
Физика
Қ
Қазақ тiлi
О
Окружающий мир
Э
Экономика
Н
Немецкий язык
Х
Химия
П
Право
П
Психология
Д
Другие предметы
Л
Литература
Г
География
Ф
Французский язык
М
Математика
М
Музыка
А
Английский язык
М
МХК
У
Українська література
И
Информатика
О
Обществознание
Г
Геометрия
Аня270917
Аня270917
07.02.2021 11:29 •  Информатика

Исправьте данную программу Почему то пропускается часть кода
program Viginer;

const
nabor_en: string = '';
nabor_ru: string = '';
kol_en: integer = 26;
kol_ru: integer = 33;

var
arrey_table: array[1..33, 1..33] of string;
text, key, text_key, text_cipher, text_decipher, arrey_str, nabor: string;
i, j, cifra, vihod, otvet, otvet2, x, y, length_text, num, kol: integer;

label
index, cipher_index, decipher, index_2, vihod_end, cipher;
begin

{—
| Главное меню программы |
}

index: { Главное меню программы }
writeln('Вас привествуюет программа для шифрования и дешифрования по методу Виженера');
writeln('Выьерите язык с которым будите работать:');
writeln('1 - Русский');
writeln('2 - Англизкий');
read(otvet);
if (otvet = 1) then begin kol := kol_ru; nabor := nabor_ru end else
if (otvet = 2) then begin kol := kol_en; nabor := nabor_en end else
goto index;

writeln('Если вы желаете зашифровать то введите 1 если дешифровать то введите 2. Если вы желаете покинуть программу введите 3.');
index_2: { Повтор ввода выбора действий при ошибки }
read(otvet2);
if (otvet2 = 1) then goto cipher else
if (otvet2 = 2) then goto decipher else
if (otvet2 = 3) then goto vihod_end else begin
writeln('Неверная команда');
goto index_2;
end;

{—
| Шифрование |
}

cipher: { Шифрование методом печати нужных данных }
writeln('Введите текст который нужно зашифровать:');
read(text);
writeln('Введите ключ:');
read(key);

{ Создание таблицы Виженера }
for i := 1 to kol do
begin
for j := 1 to kol do
begin
if (i > 1) then cifra := j + i - 1 else cifra := j;
arrey_table[i, j] := nabor[cifra];
end;
end;

{ Заполнение строки ключ }
length_text := Length(text);
j := 0;
for i := 1 to length_text do
begin
if (j = Length(key)) then j := 1 else j := j + 1;
text_key := text_key + key[j];
end;

{ Производим шифрование }
text_cipher := '';
for i := 1 to length_text do
begin
if (text[i] = ' ') then text_cipher := text_cipher + '&'
else begin
for j := 1 to kol do
if (nabor[j] = text[i]) then x := j;
for j := 1 to kol do
if (nabor[j] = text_key[i]) then y := j;
text_cipher := text_cipher + arrey_table[x, y];
end;
end;

{ Вывод результата }
writeln();
writeln('РЕЗУЛЬТАТ');
writeln('Ключ: ', key);
writeln('Начальный текст:');
writeln(text);
writeln('Зашифрованный текст:');
writeln(text_cipher);
writeln('Команды: повторить - 1, вернуться в главное меню - 2, выйти из программы - 3');
read(otvet);
if (otvet = 1) then goto cipher else
if (otvet = 2) then goto index else
if (otvet = 3) then goto vihod_end else begin
writeln('Неверная команда');
goto index;
end;

{—
| Дешифрование |
}

decipher: { Дешифроватор }
writeln('Введите текст для дешифрации:');
read(text);
writeln('Введите ключ:');
read(key);

{ Заполнение строки ключ }
length_text := Length(text);
j := 0;
for i := 1 to length_text do
begin
if (j = Length(key)) then j := 1 else j := j + 1;
text_key := text_key + key[j];
end;

{ Производим дешифрование }
text_decipher := '';
for i := 1 to length_text do
begin
if (text[i] = '&') then text_decipher := text_decipher + ' '
else begin
{ Вычисляем номер буквы в алфовите }
for j := 1 to kol do
if (nabor[j] = text_key[i]) then y := j;
{ Создаем нужную строку из таблицы Виженера }
arrey_str := '';
num := y;
for j := 1 to kol do
begin
cifra := j + num - 1;
arrey_str := arrey_str + nabor[cifra];
end;
{ Вычисляем номер нашего символа в созданной строке }
for j := 1 to kol do
if (arrey_str[j] = text[i]) then x := j;
{ По вычесленному номеру выбираем букву из оригинального алфовита }
text_decipher := text_decipher + nabor[x];
end;
end;
{ Вывод результата }
writeln();
writeln('РЕЗУЛЬТАТ');
writeln('Ключ: ', key);
writeln('Начальный текст:');
writeln(text);
writeln('Расшифрованный текст:');
writeln(text_decipher);
writeln('Команды: повторить - 1, вернуться в главное меню - 2, выйти из программы - 3');
read(otvet);
if (otvet = 1) then goto decipher else
if (otvet = 2) then goto index else
if (otvet = 3) then goto vihod_end else begin
writeln('Неверная команда');
goto index;
end;

vihod_end: { Выход из программы }
за использование нашей программы нажмите ESC ');
end.

Показать ответ
Ответ:
Monimix
Monimix
15.03.2020 06:53
Exp(x) - функция, возводящая число е ≈ 2.718 в степень Х.
ln(x) - натуральный логарифм по основанию е из числа Х.
Т.е exp(ln(5)) вернёт 5, exp(ln(10)) вернёт 10 и т.д. В этом случае, число N работает как показатель степени для Х.  Тогда exp(ln(3)*2) = 3^2 = 9. Ведь в математике, чтобы умножить одно число на другое, нужно сложить их логарифмы и результат вернуть "из логарифмов". Пример на десятичных логарифмах: 2 * 2. lg 2 = 0.3010. Чтобы умножить, складываем: 0.3010+0.3010=0.6020. lg 4 = 0.6020. Чтобы возвести число в степень, нужно логарифм числа умножить на показатель степени. Например: 2^8. 0.3010*8=2.408. lg 256 = 2.408. Таким образом ln(x)*n - это умножение логарифма числа на показатель степени, а exp(res) - возведение из логарифма в число. Может быть сумбурно объяснил, но как-то так.
0,0(0 оценок)
Ответ:
Ира0386
Ира0386
06.04.2023 17:58

P.S.:

Я уже потом прочел, что все данные вводятся уже в готовом виде.

Но уравнение я уже разложил.

В stdin.txt идет что-то на подобии:

1*3^6+2*3^5-21*3^4-20*3^3+71*3^2+114*3+45=0

(В проге уже все само раскладывается итд)

+ есть левые ответы (не знаю почему, но все работает корректно. Видимо ложные.)

Либо пиши проверку под это дело, либо уменьшай лимиты.

Если не нравится реализация с парсингом значений из уравнения - переписывай, ибо мне лень)))

(Лучше решения тебе явно никто не предложит)

И да - если коаф. 1, то есть что-то на подобии x^2 - 4 * x + 1 =0 (у x^2 коаф. единица), то его вручную нужно прописывать.

using System;

using System.Collections.Generic;

using System.IO;

using System.Text.RegularExpressions;

namespace Test

{

   class Program

   {

       static void Main(string[] args)

       {

           string equation = get_equation();

           int __LIMIT__ = 1000;//Лимит поиска корней.То-есть программа пытается найти корни от 1000 до -1000

           int highest_exponent;

           try

           {

               highest_exponent = int.Parse(get_higher_exponent(equation));

           }

           catch (Exception ex)

           {

               Console.WriteLine("Badequation.");

               return;

           }

           int[] multipliers = get_multipliers(exponents_remover(equation), highest_exponent);

           List<int> answers = gorner_resolver(multipliers, __LIMIT__);

           int k = 1;

           for (int i = 0; i < answers.Count; ++i)

           {

               Console.WriteLine("{0}:{1}", k, answers[i]);

               k++;

           }

           Console.ReadLine();

       }

       static string get_equation()

       {

           return File.ReadAllText("./stdin.txt").Replace(" ", "");

       }

       static string get_higher_exponent(string equation)

       {

           for (int i = 0; i < equation.Length; ++i)

           {

               if (equation[i] == '^')

               {

                   if (equation[i + 1] == '-' || equation[i + 1] == '+')

                       return equation[i + 1].ToString() + equation[i + 2].ToString();

                   return equation[i + 1].ToString();

               }

           }

           return "Bad";

       }

       static string exponents_remover(string equation)

       {

           string eq_x = equation;

           for (int i = 0; i < eq_x.Length; ++i)

           {

               if (eq_x[i] == '^')

               {

                   if (eq_x[i + 1] == '-' || eq_x[i + 1] == '+')

                       eq_x = eq_x.Remove(i + 1, 2);

                   eq_x = eq_x.Remove(i + 1, 1);

               }

           }

           return eq_x.Substring(0, eq_x.Length - 2);

       }

       static List<int> gorner_resolver(int[] multipliers, int limit)

       {

           int k = 1;

           int[] resolve = new int[multipliers.Length];

           List<int> ans = new List<int>();

           while (k <= limit)

           {

               resolve[0] = multipliers[0];

               int coaf = k;

               if (k > 0)

                   k *= -1;

               else

               {

                   k *= -1;

                   k++;

               }

               for (int i = 1; i < multipliers.Length; ++i)

               {

                   resolve[i] = resolve[i - 1] * coaf + multipliers[i];

               }

               if (resolve[resolve.Length - 1] == 0)

                   ans.Add(coaf);

           }

           return ans;

       }

       static int[] get_multipliers(string equation, int highest_exponent)

       {

           Regex re = new Regex(@"-?[0-9]+\*?");

           MatchCollection matches = re.Matches(equation);

           int[] multipliers = new int[highest_exponent + 1];

           int k = 0;

           foreach (var value in matches)

           {

               multipliers[k] = int.Parse(value.ToString().Replace("*", ""));

               k++;

           }

           return multipliers;

       }

   }

}

0,0(0 оценок)
Популярные вопросы: Информатика
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота