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

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

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


Привет. Опитвам се 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
и т.н
Не мога да се сетя за лесен и ефективен алгоритъм.

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

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


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

преди 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 вложени цикъла, но се получава толкова объркано, че няма на къде.
Търся някаква простичка реализация.

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

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


Линк към този отговор
Сподели в други сайтове
преди 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;
}
}

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

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

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


Линк към този отговор
Сподели в други сайтове
преди 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;

}
}

 

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

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


Линк към този отговор
Сподели в други сайтове
преди 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. Тогава транспонирам. За целта мисля да правя двумерни масиви.

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

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


Линк към този отговор
Сподели в други сайтове
преди 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 написа:

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

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

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

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


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

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

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


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

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

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

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


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

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

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

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

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

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


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

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

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

Цитат

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

 

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

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


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

 трябва да са  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 матрици
То ако беше да му набия фиксирани, отдавна да съм им сложил началото и края директно с индекси и да се приключва. Ама началото и края, както и изобразяването/форматирането/запълването трябва да ги правя динамично.

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

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


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

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

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

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


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

имаш  ... 4  масива по 20 реда

с по 4 възможни варианта на буква .

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


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

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

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

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

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

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


Линк към този отговор
Сподели в други сайтове
#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, който се явява тримерен масив, получаваш матриците, подредени по големина на малките делители.

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

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


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

четиримерен масив мисля че е

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


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

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

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

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

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

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

Вход

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

Вход

×

Информация

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