Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

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

 

Разделено изобразяване на char масив!

Featured Replies

Привет. Опитвам се char масив от 80 знака да го разделям на равни части. За целта прилагам деление без остатък, за да видя всички делители на 80.
Обаче как да реализирам обхождането на char-а в граници, така че първото да е например 0-20, 20-40, 40-60, 60-80?
За да намеря дългината на char-а ползвам strlen, a за вектора .size();. Ползвам вектор, защото искам Програмата да разделя по произволен Input,  аз не знам колко знака може да е той, от там не знам и какъв масив да създам като граници и колко ще са делитетелите. За това и ползвам вектор, защото ако инициализирам масив без граници, не мога да определя такива след това - масивът не поддържа size, за разлика от vector-а.
Като минималната граница е предната максимална+1, а следващата максимална я взимам от вектор с делителите на числото 80?
Искам да го направя така цикълът, че да дава това
Делители записани във вектора  2, 5, 8,10, 20, 40
Елементи от масива char
0-20  след това 20-30 след това 30-40 след това 40-50 цлед това 50-60 след това 60-70 след това 70-80
на следващ итерация да изпълнява да изобразява разделено по следващият делител
0-20 20-40 40-60 60-80
и т.н
Не мога да се сетя за лесен и ефективен алгоритъм.

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

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

Привет. Опитвам се char масив от 80 знака да го разделям на равни части. За целта прилагам деление без остатък, за да видя всички делители на 80.
Обаче как да реализирам обхождането на char-а в граници, така че първото да е например 0-20, 20-40, 40-60, 60-80?
Като минималната граница е предната максимална+1, а следващата максимална я взимам от вектор с делителите на числото 80?
Искам да го направя така цикълът, че да дава това
Делители записани във вектора  2, 5, 8,10, 20, 40
0-19 20-30 30-40 40-50 50-60 60-70 70-80
на следващ итерация да изпълнява и да изобразява разделено
0-20 20-40 40-60 60-80
и т.н
Не мога да се сетя за лесен и ефективен алгоритъм.

Две числа, които дефинират горна и долна граница. И на следваща стъпка добавяш към двете и делителя. Т.е.:

имаш а1=0, а2=степ-1 и цикъла ти е от а1 до а2. След това изпълняваш а1+=степ, а2+=степ, цикъл и т.н.

преди 7 минути, capnemo написа:

Две числа, които дефинират горна и долна граница. И на следваща стъпка добавяш към двете и делителя. Т.е.:

имаш а1=0, а2=степ-1 и цикъла ти е от а1 до а2. След това изпълняваш а1+=степ, а2+=степ, цикъл и т.н.

Аз това го знам, дори съм си нарисувал блок диаграма обаче не мога да си го представя като програмен код.
Опитах да го правя с долна граница buf променлива, горна граница char/ на вектора на делитетелите без остатък, като после в цикъла променям buf+1 и го записвам като следваща долна граница.
Опитах с 3 вложени цикъла, но се получава толкова объркано, че няма на къде.
Търся някаква простичка реализация.

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

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

Аз това го знам, дори съм си нарисувал блок диаграма обаче не мога да си го представя като програмен код.
Опитах да го правя с долна граница buf променлива, горна граница char/ на вектора на делитетелите без остатък, като после в цикъла променям buf+1 и го записвам като следваща долна граница.
Опитах с 3 вложени цикъла, но се получава толкова объркано, че няма на къде.
Търся някаква простичка реализация.

добре. Имаш масив р с в елемента в който са делителите

 

фор и=0; и<в; и++
{
и1=80/р[и]
а1=0
а2=80/и1-1
фор к=0;к<и1;к++
{
фор л=0;л<а2;л++
{
/* работа */
}
a1+=и1
а2=+и1
}
}

нещо такова :)

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

преди 19 минути, capnemo написа:

нещо такова

Такова?
 

for(int i=0; i<block.size(); i++)
{
int i1=strlen(characters)/block[i]
a1=0;
a2=strlen(characters)/i1-1;
for(int j=1; j<i1; j++)
{
for(int l=1; l<a2; l++)
{
cout<<characters[l];
}
a1+=i1;
a2=+i1;
}
}

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

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

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

Такова?
 


for(int i=0; i<block.size(); i++)
{
int i1=strlen(characters)/block[i]
a1=0
a2=80/i1-1
for(int j=1; j<i1; j++)
{
for(int l=1; l<a2; l++)
{
cout<<characters[l];
}
a1+=i1;
a2=+i1;
}
}

 

тези редове трябва малко да се коригират:

for(int l=а1; l<a2; l++)
...
a2+=i1;

Но мисля че останалото трябва да работи

П.П. Аз по-горе не съм ги домислил :)

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

тези редове трябва малко да се коригират:

for(int l=а1; l<a2; l++)
...
a2+=i1;

Но мисля че останалото трябва да работи

Добре, но ако инициализирам променливите а1 и а2, то при всяко изпълнение на големият цикъл те ще се нулират, а няма да придобиват зададени стойности в малкият цикъл. Тези променливи да ги разбирам, че си имал предвид, че трябва да се декларират извън цикъла?
п.п Пробвах го и нещо не сработва.

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

П.П. Аз по-горе не съм ги домислил :)

Нещо не сработва. По същество се опитвам да направя това:
 

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

int main()
{
    int b=0; charsequence[]="FETVTTINEEHWVSNOREEIFNELTXIEEVEIRTTNOXEFEENFIINTEOGVNHSUHEIREETEVEEETTEINIHWTGIGREEHNHELNTFIGRNNONHEFIUETEINRETTVENIHEETWFNHRNEIETSNLVEFEIVEIOVNEOGUEE";
    char alphabet[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int seqcount=strlen(sequence);
    cout<<"length of the string "<<seqcount<<endl;
    int numbers[seqcount];
    for(int i=0;i<seqcount;i++)
    {
        for(int j=0; j<27;j++)
        {
            if(sequence[i]==alphabet[j])
            {
            numbers[b]=j;
            b++;
            }
        }

    }
        for(int i=0;i<seqcount;i++)
    {
        cout<<numbers[i]<<" ";
    }
    cout<<endl;
    vector <int> blocksize;
    int b2=0;
    int ns;
    cout<<"block sizes"<<endl;
    for(int i=2; i<seqcount; i++)
    {
        if(seqcount%i==0)
        {
            blocksize.push_back(i);
        }
    }
    int numdiv=blocksize.size();
    cout<<"count of possible dividers "<<numdiv<<endl;
    for (int i=0; i<numdiv; i++)
    {
        cout<<blocksize[i]<<" ";
    }
    cout<<endl<<"possible combinations";
    int squire[numdiv];
    for(int i=0; i<numdiv; i++)
    {
        squire[i]=seqcount/blocksize[i];
    }
    cout<<endl<<"Chars in block"<<endl;
    for(int i=0; i<numdiv; i++)
    {
        cout<<squire[i]<<" ";
    }
    int buf2=0;

}
}

 

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

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

Добре, но ако инициализирам променливите а1 и а2, то при всяко изпълнение на големият цикъл те ще се нулират, а няма да придобиват зададени стойности в малкият цикъл. Тези променливи да ги разбирам, че си имал предвид, че трябва да се декларират извън цикъла?
п.п Пробвах го и нещо не сработва.

Нещо не сработва. По същество се опитвам да направя това:
 

 

Честно казано не ми се чете кода. Но ти се замисли че делителите на 80 са доста повече от тези, които си изброил:2,4,5,8,10,16,20,40,80

А имам чувството че ти ги търсиш в програмата :)

преди 4 минути, capnemo написа:

Честно казано не ми се чете кода. Но ти се замисли че делителите на 80 са доста повече от тези, които си изброил:2,4,5,8,10,16,20,40,80

А имам чувството че ти ги търсиш в програмата :)

Да, търся ги в програмата, записвам ги във vector.
После искам да разделя представянето на всяка буква като цифра на отделни групи, за да мога да ги обработвам група по група.

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

Да, търся ги в програмата, записвам ги във vector.
После искам да разделя представянето на всяка буква като цифра на отделни групи, за да мога да ги обработвам група по група.

Нещо не схванах голямата идея. Какво всъщност искаш да постигнеш (не това, което си мислиш че е пътя да го постигнеш)?

преди 9 минути, capnemo написа:

Нещо не схванах голямата идея. Какво всъщност искаш да постигнеш (не това, което си мислиш че е пътя да го постигнеш)?

1.Вкарвам char масив с букви от английската азбука.
2.Намирам дължината на char-а с strlen
3. На всяка буква намирам числовото съответствие от 0 до 25.
4. Записвам в масив numbers[strlen char]
5. Правя цикъл.
6. Деля strlen char на число.. Всяко число поредно i, на което се дели дължината на char-а БЕЗ ОСТАТЪК записвам във vector.
7. Искам да хвана numbers и да го разделям на равни части. делителите на Numbers са тези, които сме записали във vector в стъпка 6.
8. Получените групи от числа смятам да ги цикля като правоъгълници в двете оси - x и y, докато x=y. Тогава транспонирам. За целта мисля да правя двумерни масиви.

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

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

1.Вкарвам char масив с букви от английската азбука.
2.Намирам дължината на char-а с strlen
3. На всяка буква намирам числовото съответствие от 0 до 25.
4. Записвам в масив numbers[strlen char]
5. Правя цикъл.
6. Деля strlen char на число.. Всяко число поредно i, на което се дели дължината на char-а БЕЗ ОСТАТЪК записвам във vector.
7. Искам да хвана numbers и да го разделям на равни части. делителите на Numbers са тези, които сме записали във vector в стъпка 6.
8. Получените групи от числа смятам да ги цикля като правоъгълници в двете оси - x и y, докато x=y. Тогава транспонирам. За целта мисля да правя двумерни масиви.

Не, нека го повторя отново. Не ми давай алгоритъма, който мислиш че ще ти свърши работа. Дай ми идеята, работата, но погледната от много високо. Примерно: "Искам да направя честотен анализ на текст"

преди 17 минути, capnemo написа:

Не, нека го повторя отново. Не ми давай алгоритъма, който мислиш че ще ти свърши работа. Дай ми идеята, работата, но погледната от много високо. Примерно: "Искам да направя честотен анализ на текст"

Шифър с правоъгълник сигурно знаеш какво е? Искам да си упражня програмирането, защото искам да записвам магистратура.
На кратко - стрингът го разделяш и го пишеш по хоризонтала и четеш по вертикала. Или обратното.
Тази задача е от примерен изпит от предни години и се съмявам, че е най-лесната.

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

преди 1 час, Yvan Sergeev написа:

 разделяй и владей .

И какво общо има това с темата?

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

И какво общо има това с темата?

Има такъв алгоритъм.

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

Не можеш ли да копи пейстнеш условието или да направиш снимка 

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

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

В условието не пише повече отколкото написах аз.
Разделяш стринга на делителите му, получаваш отделни участъци с дължина = дължината на стринга/делител
После правиш матрици, като менкаш размерите им. В определен вариант на матрицата с размерност x, y се получава съобщение, което можеш да прочетеш, започвайки отляво горе по вертикала или хоризонтала.
Описанието на шифъра е:
 

Цитат

m реда по n стълба.
Съобщението се разбива на m.n букви.
За криптиране всеки блок се записва в правоъгълник с m реда и n стълба по редове.
Шифрираното съобщение се записва по стълбове. Дешифриране - шифрираното съобщение се изписва по редове - блок по блок

 

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

 трябва да са  4 масива

с дължина 20

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

Ми лесно става

Матрицата я правиш с vector<vector<char>>

Всъщност една от матриците. За другите е аналогично.

броя вектори е равен на един от делителите, а дължината на векторите е равна на дължината на стринга разделена на този делител

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

Ми лесно става

Матрицата я правиш с vector<vector<char>>

Всъщност една от матриците. За другите е аналогично.

броя вектори е равен на един от делителите, а дължината на векторите е равна на дължината на стринга разделена на този делител

След като видя програмният код по-горе, да не мислиш, че не знам? :)
Аз имам делителите записани във вектор dividers, имам дължината на стринга.
Трябва да го разделя на незастъпващи се части, четейки го поиндексно символ по символ от char масива.
имам 80 символа да ги разцепя на части. разцепвам ги по всеки един делител без остатък.
ето тук не мога да намеря алгоритъм, който да ми взима от променливите и универсално да цепи по делител, независимо какъв е той, посочен във вектора.
Аз имам стринга, трябва да го нацепя на блокове с големина дължина на стринга/делител и след това да въртя матрици с размерност x+1/y-1, докато x!=y.

преди 17 минути, Yvan Sergeev написа:

 трябва да са  4 масива

с дължина 20

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

Не, не е така.
80 има делители 2, 4, 5, 8, 10, 20, 40
Трябва да правя масиви спрямо броя 80/2=40 матрици, 80/40=2 матрици
То ако беше да му набия фиксирани, отдавна да съм им сложил началото и края директно с индекси и да се приключва. Ама началото и края, както и изобразяването/форматирането/запълването трябва да ги правя динамично.

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

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

Това 80 магическо число ли е, константа ли е или примерна дължина ?

Май се опетлах.

Примерна дължина, която зависи от input-а. За това взимам strlen на input-а, който се казва char sequence
Според дължината на input-а е и броят делители без остатък записан във vector dividers.
После деля sequence на блокове с дължина seqcount/divider Горе всичко пише.

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

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

vector<char> vchar;
vector<vector<char>> vvchar;
vector<vector<vector<char>>> vvvchar;

vector<int> dividers;

void findDividers(int n)
{
	int sqr;
	dividers.clear();
	sqr = round(sqrt((double)n));
	for (int i = 1; i <= sqr; i++)
	{
		if (n % i == 0)
		{
			dividers.push_back(i);
		}
	}
}

void makeMatrix(int columns, string& s)
{
	vchar.clear();
	vvchar.clear();
	for (int i = 0; i < s.length(); i++)
	{
		vchar.push_back(s[i]);
		if (i % columns + 1 == columns)
		{
			vvchar.push_back(vchar);
			vchar.clear();
		}
	}
}



int main()
{
	string s;
	getline(cin, s);
	findDividers(s.length());
	for (int i = 0; i < dividers.size(); i++)
	{
		makeMatrix(s.length() / dividers[i], s);
		vvvchar.push_back(vvchar);
	}
    return 0;
}

накрая преди връщане от main във vvvchar, който се явява тримерен масив, получаваш матриците, подредени по големина на малките делители.

По нататък не съм писал, щото не ми стана ясно как се обработва шифъра

Архивирана тема

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

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.