Премини към съдържанието

Препоръчан отговор

публикувано (редактирано)

Имам следната програма

#include <iostream>
#include <cstdlib>
#include <math.h>
#include <string>
using namespace std;

int b=0;
int main()
{
    int bif2;
    char alphabet[]=" ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char sequence[21];
    sequence[21]='\0';
    cout<<"Enter the first 20 characters of the string to decode"<<endl;
    for(int i=0; i<20; i++)
    {
        cin>>sequence[i];
    }
    for(int i=0; i<20;i++)
    {
           cout<<sequence[i]<<endl;
    }
    int numbers[20];
    for(int i=0;i<20;i++)
    {
        for(int j=0; j<27;j++)
        {
            if(sequence[i]==alphabet[j])
            {
            numbers[b]=j;
            b++;
            }
        }

    }
    for(int i=0;i<20;i++)
    {
        cout<<numbers[i]<<endl;
    }
    signed int deci[20];
    for(int i=1; i<21;i++)
    {
        int j=0;
        int bif=numbers[i-1]-numbers[i];
        int bif2=bif%26;
        cout<<bif2<<"bif2"<<endl;
        deci[j]=bif2;
        cout<<deci[j]<<" deci j"<<endl;
        j++;
    }

    for(int i=0; i<20; i++)
    {
        cout<<deci[i]<<" deci i"<<endl;
    }
}

Тя трябва да сравнява char масив със зададен char масив. При намиране на индекса на елемента от зададеният char масив, да го записва в друг масив.
Елементите от тоя масив, които са индексите на елементите от зададения char масив се изваждат, като i+1 елемент се изважда от i-тия елемент.
Резултатът трябва да се парсне по Мod26.
Когато изведа bif2, всичко като че ли се извежда коректно. Обикалям j-тия елемент на масива deci и му задавам стойностите на bif2 при всяко изпълнение на цикъла.
Обаче отдолу правя проверка и пускам цикъл, с който да прочета последователно елементите от масива deci и излизат небивалици.
Оказва се, че един път съм записал правилното нещо, а като прочета масива - не е така.
Сигурно има някаква дребна грешка, но къде е?
Има и друга питанка - когато сравнявам и записвам индекса, ако на масива alphabet нулевият елемент е А, а не първия, то се оказва че в конзолата не се изобразява нула, а нищо. Защо?

Редактирано от simtech (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Какво правиш всъщност. Не мога да се ориентирам. Дай условието на задачата

Там за последния въпрос, да не би да е, щото азбуката я почваш с интервал, а не с "А". Масива ти почва с интервал.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)
преди 30 минути, Реджеп Иведик написа:

Какво правиш всъщност. Не мога да се ориентирам. Дай условието на задачата

Там за последния въпрос, да не би да е, щото азбуката я почваш с интервал, а не с "А". Масива ти почва с интервал.

Масивът започва с интервал, защото ако сравня if {sequence==alphabet[j]} ...
Например sequence[0]='A' и alphabet[0]='A', то записвам 0 в numbers[0]. Само че като прочета после numbers[0], то в него нямам записано нищо, а нямам записана 0. Нищо не се изобразява като резултат. Обаче ако sequence[0]='B', то тогава в numbers[0] ще се запише 1.
А правя програмче за декриптиране на шифър с автоключ.
Към първото прибавям ключова стойност, резултатът го използвам като ключова стойност, която да прибавя към второто, събирам нея стойност и второто и я използвам за ключова стойност на третото.
Искам малко да си упражня програмирането, че ръждясва.
Обаче за дешифриране е достатъчно да извадя от втория шифриран елемент първия шифриран елемент и получавам plaintext-а.
Защото ако
plain[0]=5 и K=1
то
crypt[0]=plain[0]+K
crypt[1]=plain[1]+crypt[0]
crypt[2]=plain[2]+crypt[1]
От там следва, че
crypt[1]-crypt[0]=plain[1]
И всички тия сметки се извършват по модул от 26.

Редактирано от simtech (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)
преди 1 час, simtech написа:

char sequence[21];
sequence[21]='\0';

Мисля, че записваш 0 в област извън декларираната променлива, което може да доведе до непредсказуем резултат при изпълнение. Масивът ти sequence се състои от 21 елемента, с номера от 0 до 20. А после записваш 0 в sequence[21], който е 22-ри елемент. Не трябва ли да го декларираш като

char sequence[22];

за да има място за последната 0 за край на символния низ? Или по-скоро да присвоиш 0 на sequence[20], ако ти трябват само 20 елемента в масива?

Редактирано от Win_user (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)
for(int i=0;i<20;i++)
    {
        for(int j=0; j<27;j++)
        {
            if(sequence[i]==alphabet[j])
            {
            numbers[b]=j;
            b++;
            }
        }

    }

Тук това ми се струва безсмислено. Няма смисъл да търсиш какъв индекс има символа в азбуката, чрез итерации, след като можеш да го изчислиш по формула.

символ = символ - 'А'  или с едно по голям заради интервала в началото на азбуката

Редактирано от Реджеп Иведик (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)
преди 6 минути, Реджеп Иведик написа:

for(int i=0;i<20;i++)
    {
        for(int j=0; j<27;j++)
        {
            if(sequence[i]==alphabet[j])
            {
            numbers[b]=j;
            b++;
            }
        }

    }

Тук това ми се струва безсмислено. Няма смисъл да търсиш какъв индекс има символа в азбуката, чрез итерации, след като можеш да го изчислиш по формула.

символ = символ - 'А'  или 'А' + 1 заради интервала

Не е безсмислено. Въвеждам символ и трябва да го търся из цялата зададена азбука. Не го знам кой е тоя символ, който се въвежда и трябва да го намеря. Да обиколя и да сравня е най-лесното решение.
Така, всеки символ от char sequence трябва да му се намери аналога в char alphabet. След това на която итерация се появи, значи това му е индекса в char alphabet и то се записва.
Това е преобразуване на буквите от английската азбука в числа от 0 до 25.

Редактирано от simtech (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 4 минути, simtech написа:

Не е безсмислено. Въвеждам символ и трябва да го търся из цялата зададена азбука. Не го знам кой е тоя символ, който се въвежда и трябва да го намеря. Да обиколя и да сравня е най-лесното решение.

Ама това, което правиш всъщност е, че намираш индекса на символа в азбуката.

Това можеш да направиш като извадиш от символа 'А', тъй като стойностите на символите от азбуката са поредни числа

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 17 минути, Win_user написа:

Мисля, че записваш 0 в област извън декларираната променлива, което може да доведе до непредсказуем резултат при изпълнение. Масивът ти sequence се състои от 21 елемента, с номера от 0 до 20. А после записваш 0 в sequence[21], който е 22-ри елемент. Не трябва ли да го декларираш като

char sequence[22];

за да има място за последната 0 за край на символния низ? Или по-скоро да присвоиш 0 на sequence[20], ако ти трябват само 20 елемента в масива?

Така е. Декларирам char sequence[21], значи последният елемент е 20 и трябва на sequence[20] да присвоя ексейп знака.
 

преди 5 минути, Реджеп Иведик написа:

Ама това, което правиш всъщност е, че намираш индекса на символа в азбуката.

Това можеш да направиш като извадиш от символа 'А', тъй като стойностите на символите от азбуката са поредни числа

Как ще вадя от CHAR, като това не са числа и не подлежат на аритметични операции?
Както и да е. Итерацията си работи, нали? И е много мързелив начин.
Не мога да разбера защо като записвам в deci[j] и после го прочета, получавам безсмислици.
Уж на екрана ми се извежда записаното в deci[j], а после го прочитам и там са записани произволни стойности.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 9 минути, simtech написа:

Как ще вадя от CHAR, като това не са числа и не подлежат на аритметични операции?

Подлежат

Например 'В' - 'А' == 1 е "истина"

'С' - 'А' == 2 е "истина"

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 6 минути, Реджеп Иведик написа:

Подлежат

Например 'В' - 'А' == 1 е "истина"

'С' - 'А' == 2 е "истина"

И смяташ, че това е по-добро от итерацията?
Както и да е, по същество да го даваме. Защо записвам в масива, извеждам с

cout<<deci[j]<<" deci j"<<endl;


А после правя нов цикъл, за да прочета deci[..] и получавам безсмислици?

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 4 минути, simtech написа:

И смяташ, че това е по-добро от итерацията?

26 пъти по бързо

Итерацията има линейна сложност

Изчисляването по формула има константна сложност

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)
преди 13 минути, Реджеп Иведик написа:

26 пъти по бързо

Итерацията има линейна сложност

Изчисляването по формула има константна сложност

Абе аз не ти разбирам формулата, ама айде.
Имам проблем с deci.Защо?
Тва е баси тъпата програмка, как така проверявам веднъж и всичко е наред, проверявам втори път и се оказва, че уж записаното не е записано?
Аз масиви обикалям индексно с цикли.

Редактирано от simtech (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 8 минути, simtech написа:

Имам проблем с deci.Защо?

Не ми е ясно нищо. 

Напиши какво правиш на български, без да се съобразяваш с програмния език и имплементацията.

Кодираш ли, декодираш ли. Как се кодира. Как се декодира

Дай дефиниция на шифъра 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)
преди 8 минути, Реджеп Иведик написа:

Не ми е ясно нищо. 

Напиши какво правиш на български, без да се съобразяваш с програмния език и имплементацията.

Вид шифър с автоключ. Беше ми интересен
Събирам първият елемент от масива с число, което е ключово. Резултатът от събирането е криптирано число, което ползвам като ключ, който събирам с вторият елемент от масива, за да го криптирам.
Обратната операция е да вадя криптирано число от предходното, за да получа plaintext.
Търся индекса на елемент от предварително зададена азбука. Записвам индексите в нов масив. Правя сметката по-горе с обратната операция mod26. Записвам резултата в масива deci.
Компилирай го и го пусни. Извежда се deci[j]
В следващият цикъл пак извежда deci[n-тия елемент] и се оказва, че не е записано нищо.

преди 29 минути, Реджеп Иведик написа:

Кодираш ли, декодираш ли. Как се кодира. Как се декодира

Дай дефиниция на шифъра 

 

PRG.JPG

Редактирано от simtech (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 2 часа, simtech написа:

int bif=numbers[i-1]-numbers[i];

В такъв случай, това не е ли грешно ?

Не трябва ли при декодирането от следващия да вадиш предишния ?

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)
преди 8 минути, Реджеп Иведик написа:

В такъв случай, това не е ли грешно ?

Не трябва ли при декодирането от следващия да вадиш предишния ?

Да, трябва да е [i+1]
Но не мога да разбера защо грешно се записва.
А горе съм надраскал схема как работи това.
Оказва се, че от вторият криптиран елемент вадим първия и получаваме второто plain число.
Първият няма как да го намерим, защото не знаем К, ама то ще се сглоби...

Редактирано от simtech (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Правиш ненужни неща.

Предлагам следния алгоритъм

1. Съставяш масив char азбука, като азбуката почва от нула, щото е по лесно.

2. Въвеждаш кодирания текст.

3. Декларираш празен масив, в който ще съхраняваш декодирания текст.

4. В цикъл попълваш този масив с разликите от кодирания масив и предходната стойност на кодирания масив. Вече имаш всичко декодирано като индекси, с изключение на първата буква, тъй като не знаеш първоначалния ключ. Предполага се обаче, че можеш да го намериш като човек по смисъл.

5. Буквите намираш като числата от масива ги използваш като индекси на масива азбука.

другия вариант е към числата да прибавяш 'А', което е същото.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)
преди 24 минути, Реджеп Иведик написа:

Правиш ненужни неща.

Предлагам следния алгоритъм

1. Съставяш масив char азбука, като азбуката почва от нула, щото е по лесно.

2. Въвеждаш кодирания текст.

3. Декларираш празен масив, в който ще съхраняваш декодирания текст.

4. В цикъл попълваш този масив с разликите от кодирания масив и предходната стойност на кодирания масив. Вече имаш всичко декодирано като индекси, с изключение на първата буква, тъй като не знаеш първоначалния ключ. Предполага се обаче, че можеш да го намериш като човек по смисъл.

5. Буквите намираш като числата от масива ги използваш като индекси на масива азбука.

другия вариант е към числата да прибавяш 'А', което е същото.

Аз правя следното...

1.Съставям масив char alphabet
2.Приемам от клавиатурата елементите на масив char sequence
3. Преобразувам всеки пореден елемент от char sequence в съответстващата буква от азбуката, като търся буквата в масива char азбука и взимам индекса на клетката, в която се намира буквата.
4.Записвам резултатите в нов масив int numbers
5. От i-тия елемент на int numbers вадя i-1-вия елемент, като цикълът почва от 1.
6. Записвам резултатите в  масив deci
7. Намирам на числото, което е във всяка клетка на deci буквеното съответствие.
Проблемът ми можеш да го видиш на екрана по-долу. Виж произволните стойности, които са записани в deci, в който пиша преди това.
O14949350561054867_1.jpg
А ето го и форматирания код
Ако имаш нещо друго предвид, драсни го като код, да мога да зацепя.
НЕ МОГА да разбера как така пиша в deci масива, а пък нищо не пиша в него???

#include <iostream>
#include <cstdlib>
#include <math.h>
#include <string>
using namespace std;

int b=0;
int main()
{
    int bif2;
    char alphabet[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char sequence[21];
    sequence[20]='\0';
    cout<<"Enter the first 20 characters of the string to decode...."<<endl;
    for(int i=0; i<20; i++)
    {
        cin>>sequence[i];
    }
    cout<<"Sequence letters"<<endl;
    for(int i=0; i<20;i++)
    {
           cout<<sequence[i]<<" ";
    }
    cout<<endl;
    int numbers[20];
    cout<<"Finding matches in alphabet...."<<endl;
    for(int i=0;i<20;i++)
    {
        for(int j=0; j<27;j++)
        {
            if(sequence[i]==alphabet[j])
            {
            numbers[b]=j;
            b++;
            }
        }

    }
    cout<<"Sequence-number matches"<<endl;
    for(int i=0;i<20;i++)
    {
        cout<<numbers[i]<<" ";
    }
    cout<<endl;
    cout<<"Now, it's time for some calculations"<<endl;
    signed int deci[20];
    for(int i=1; i<20;i++)
    {
        int j=0;
        int bif=numbers[i]-numbers[i-1];
        int bif2=bif%25;
        cout<<bif2<<" bif2"<<" ";
        deci[j]=bif2;
        cout<<deci[j]<<" deci j"<<" "<<endl;
        j++;
    }
    cout<<endl;
    cout<<"Reading calculated result"<<endl;
    for(int i=0; i<20; i++)
    {
        cout<<deci[i]<<" deci i"<<endl;
    }
}

 

Редактирано от simtech (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

П.П Аз съм дебил! Инициализирам буфер в цикъла! И при всяко изпълнение на цикъла той се реинициализира! И така показалецът ми за клетка за писане в deci не мърда!! Извадих буфера от цикъла и тръгна!

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Кодираща програма, за контрол

#include <iostream>
#include <string>
using namespace std;


int main()
{
	string s;
	string input;
	string output;
	int key;
	cout << "Input the key -> ";
	getline(cin, s);
	key = stoi(s);
	cout << endl;
	cout << "Input only capital english letters no spaces, no punctuation -> ";
	getline(cin, input);
	input[0] = (input[0] + key - 'A') % 26 + 'A';
	output.push_back(input[0]);
	for (int i = 1; i < input.length(); i++)
	{
		input[i] = (input[i] + input[i - 1]) % 26 + 'A';
		output.push_back(input[i]);
	}
	cout << endl << output << endl;
    return 0;
}

 

Декодираща програма - това което се опитваш да направиш

#include <iostream>
#include <string>
using namespace std;


int main()
{
	string input;
	string output;
	cout << "Input coded text only capital English no spaces no punctuation -> ";
	getline(cin, input);
	output.push_back('*');
	for (int i = 1; i < input.length(); i++)
	{
		if (input[i] >= input[i - 1])
		{
			output.push_back((input[i] - input[i - 1]) + 'A');
		}
		else
		{
			output.push_back(input[i] + 26 - input[i - 1] + 'A');
		}
	}
	cout << endl << output << endl;
    return 0;
}

 

Виж колко е кратка 

Правиш много излишни неща !

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)
преди 22 минути, Реджеп Иведик написа:

Виж колко е кратка 

Правиш много излишни неща !

Както виждаш, аз не работя със STRING, а с CHAR. Мога да си напиша каквато искам азбука и да я обработвам в каквато последователност искам.
Не разбирам защо от i-тия елемент на input  вадиш i-1-вия елемент и добавяш A.
Разясни?
А и между другото, половината ми код е bloat - разни проверки, както виждаш. :)

Редактирано от simtech (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 22 минути, simtech написа:

П.П Аз съм дебил!

Ами не си. Откакто Нагарджуна получи сутрите, си дебил и не си дебил. Разбираш ли ?

Направи една грешка и се ожени за нея. Ами не си дебил. Всеки прави грешки. Колко други грешки ти показах, но за теб те са маловажни, защото не са грешката, за която си се оженил.

Основната ти грешка е алгоритъма. Логиката е на вълни на вълни. Правиш излишни неща. Най малко една трета от стъпките са излишни. Безсмислени кодирания и декодирания, прескачаш от контекст в контекст, без да ти прави впечатление. Защото не си се оженил за този недостатък.

За това е прошката. Не за друго. Като си простиш, сиреч, като се разведеш със грешката за която си се оженил, очите ти се отварят за милионите други грешки, които правиш междувременно.

Будистите му викат "Мечът на Манджушри"

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)
преди 10 минути, Реджеп Иведик написа:

Ами не си. Откакто Нагарджуна получи сутрите, си дебил и не си дебил. Разбираш ли ?

Направи една грешка и се ожени за нея. Ами не си дебил. Всеки прави грешки. Колко други грешки ти показах, но за теб те са маловажни, защото не са грешката, за която си се оженил.

Основната ти грешка е алгоритъма. Логиката е на вълни на вълни. Правиш излишни неща. Най малко една трета от стъпките са излишни. Безсмислени кодирания и декодирания, прескачаш от контекст в контекст, без да ти прави впечатление. Защото не си се оженил за този недостатък.

За това е прошката. Не за друго. Като си простиш, сиреч, като се разведеш със грешката за която си се оженил, очите ти се отварят за милионите други грешки, които правиш междувременно.

Будистите му викат "Мечът на Манджушри"

Аз мисля последователно. Не мога да разбера логиката в това да вадя CHAR.
Как така ще вадя char, като не можеш да извади A от Б, а само цифри??
Нарочно избрах char масив, защото се обхожда мързеливо с цикъл.
Ето готовият код...
Истината е, че мога да го свия на половина. Но съм пуснал 5 различни буфера, за да мога да правя проверки на различни етапи :D
Но наистина не разбирам формулата с ваденето на char-ове. Уточни??
 

#include <iostream>
#include <cstdlib>
#include <math.h>
using namespace std;

int b=0;
int main()
{
    int bif2;
	int numbers[20];
	int k=0;
	char decoded[19];
    char alphabet[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char sequence[21];
    sequence[20]='\0';
    cout<<"Enter the first 20 characters of the string to decode...."<<endl;
    for(int i=0; i<20; i++)
    {
        cin>>sequence[i];
    }
	for(int i=0;i<20;i++)
    {
        for(int j=0; j<27;j++)
        {
            if(sequence[i]==alphabet[j])
            {
            numbers[b]=j;
            b++;
            }
        }

    }
	 for(int i=1; i<20;i++)
    {
        int bif=numbers[i]-numbers[i-1];
        cout<<"bif is "<<bif<<endl;
        if(bif<0)
        {
            bif2=bif+25;
            cout<<bif2<<" bif2"<<" ";
           deci[k]=bif2;
            cout<<deci[k]<<" deci j"<<" "<<endl;
            cout<<"---------"<<endl;
        }
        else
        {
        int bif2=bif%25;
        cout<<bif2<<" bif2"<<" ";
        deci[k]=bif2;
        cout<<deci[k]<<" deci j"<<" "<<endl;
        cout<<"---------"<<endl;
        }
        k++;
        cout<<"j is "<<k<<endl;
    }
	char decoded[19];
    for(int i=0; i<19; i++)
    {
        decoded[i]=alphabet[deci[i]];
        cout<<decoded[i];
    }
}

 

Редактирано от simtech (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 12 минути, simtech написа:

Както виждаш, аз не работя със STRING, а с CHAR. Мога да си напиша каквато искам азбука и да я обработвам в каквато последователност искам.

Не е в това проблема. Стринг и чар се индексират по един и същи начин.

 

преди 13 минути, simtech написа:

Не разбирам защо от i-тия елемент на input  вадиш i-1-вия елемент и добавяш A.

Когато извадя от ития иминуспървия получавам число, което е декодирания индекс в съответната азбука.

 

преди 15 минути, simtech написа:

Мога да си напиша каквато искам азбука и да я обработвам в каквато последователност искам.

И това не е предимство. Така както аз съм я направил, може да работи със всички 256 символа, само трябва вместо % 26 да напиша % 256

Не го правя, защото има контролни символи, което по принцип не е проблем, ако обработвам така щото при извеждането да ги замествам със '*" да речем или друг символ. Но няма смисъл.

Дори ако напиша % 65536 ще работи с всички уникоде символи, без да се задъха, а твоята едно, че ще се задъха в пространството, защото ще ти трябва масив от 65536 елемента, ами айретен ще се задъха и във времето, защото за всеки символ ще трябва да обхождаш масив с големина 65536

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)
преди 7 минути, Реджеп Иведик написа:

Когато извадя от ития иминуспървия получавам число, което е декодирания индекс в съответната азбука.

Дай пак. Зарежи техническата част, все още не разбирам алгоритъма. Опиши го с малко псевдо код или разясни каква ти е мисълта. Не разбирам формулата, защото явно мисля по друг начин.

Редактирано от simtech (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.