Loading...
RoYaL avatar RoYaL Trainer 6849 Точки

Сигурна ли си?

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

Един масив, в който слагам едната част от битовете които трябва да се пълнят. Той е с дължина k или q - (q - k). В случая е 10.

Един масов, в който слагам другата част от битовете, отново с дължина k (10).

В тях пълня аналогично от p/q до q + k - 1 или p + k - 1 както е условието:

int j = 0;


for (int i = _q; i <= _q + _k - 1; i++)


{


     localFrom[j] = i;
     j++;


}

 

Така с ключ 0 (на първа позиция) идва стойността на q, с ключ 1 т.е. на втора позиция q+1 и така до q+k-1 (същото и за p)

 

Намирам битовете на всяка от позициите на localFrom[i] и localTo[i]

т.е. имам примерно from[0] => 22 => (колко бита е), from[1] => 23 => (битовете) и т.н.

to[0] => 2 => (битовете), to[1] => 3 => (битовете) и т.н. до p+k-1

Като имам позициите и битовете на тези позиции, осъществявам размяна по следонто условие:

Ако бит 22 и бит 2 са различни -> ако бит 22 е 0 => слагам 1 на 22ра позиция и 0 на 2ра позиция, във всички останали случаи слагам 0 на 22ра позиция и 1 на 2ра... И така за всички позиции, които са се напълнили в масивите localFrom[] и localTo. Ако битовете които сравнявам са еднакви не правя нищо.

Накрая като пусна програмата, въведа числото, p/q/k получавам отговора от примера.

4
ViValDam avatar ViValDam 15 Точки

Няма какво да го преглеждаш ,пусни го просто и ще видиш ,че си работи перфектно и с оверфлоу и с оверлапинг !

-6
ViValDam avatar ViValDam 15 Точки

Открих си най- после грешката smileили по скоро незнанието по въпроса , но пък научих нещо важно !

Битовете, когато се работи с  uint , също трябва да са от тип uint , а не от  int , както беше при мен, иначе последният, -32 бит , както е задачата в този пример, става отрицателен ( -1 ), както е при тип  int - най-левият бит е запазен за знака - 0 за + и -1 за минус !

Открих го ,като пуснах тест да видя какво става с битовете  - иначе не се вижда от другите тестове tongue-out.

За другите примери няма значение, затова са излизали правилно , само за този има защото достига последният 32 -ят бит, които при интежер е за знака.

Сега вече всички примери ми излизат !smile

И благодарение на грешката, научих нещо важно !cool Вярно е ,че човек се учи от грешките си !

Ако бях набутала  uint навсякъде, по инерция от самото начало - нямаше да знам сега какво се случва вдействителност в света на битовете wink !

Ето я задачата готова напълно , кода си е напълно верен и си остава същият ,

само смених  типа на битовете от  int на uint :

http://dotnetfiddle.net/k9V1qX

-3
externo avatar externo 119 Точки

на определен етап от избистрянето на решението на тази задача и аз получих същия оговор 1907749073 но първата ми работа беше да се осъмня в кода си, не в примера :) след известно време осъзнах че губя битове при преместването на маската наляво и надясно, при операциите << и >>

е в крайна сметка получих точно отговора от примера, верен е!

въобще ползваш ли дебъгера? ползвай го защото ако следиш нещата само наум тук може и да върши работа, но при по-дълъг код е невъзможно да запазиш в главата си цялата идея без трасировка като дебъгера

успех!

5
RoYaL avatar RoYaL Trainer 6849 Точки

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

6
ViValDam avatar ViValDam 15 Точки

а ти защо си нагласяваш маската по отговора ?

Сигурна съм - защото всички други примери ми дават правилен резултат и в 15 задача го пусках това число с 2, 22 и 10 и все толкова си дава 

 

Маската си е винаги ясна - колкото е позицията на толкова се премества единицата на дясно !

Как ще я сбъркам ?

-6
externo avatar externo 119 Точки

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

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

1
Lyubo avatar Lyubo 172 Точки

Имаш грешка в кода най-вероятно, ако искаш качи си кода да го погледнем. Тук може да тестваш задачата с моят код.

0
externo avatar externo 119 Точки

не знам защо се получиха 2 еднакви поста, който може нека изтрие този

0
externo avatar externo 119 Точки

доста елегантно решение, супер!

моето е доста по-тромаво, но пък може би по-ясно, почти на всяка операция изписвам на конзолата какво става

който още не е готов, нека го рънне за онагледяване, със сигурност ще го разбере:

http://dotnetfiddle.net/wPnD3j

0
ViValDam avatar ViValDam 15 Точки

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

Както и примерите от 15 задача пусках и те си излизат точно отговорите - пуснала съм и кодът ми за 15 в темата за 15 - тя е частен случай на 16.

Пуснах го този пример и в 15 задача с 2 ,22 и 10  и пак същото число излиза , а аз съм я решила по 2 начина 15

-4
ViValDam avatar ViValDam 15 Точки

Ето го кодът ми , въпреки ,че го пусках в другата тема , ето го отново ,може даго пуснете спокойно във Вижуал студио - работи си перфектно !

class BitExchangeAdvanced

{

     static void Main() 

    { 

        while (true) 

       {

            Console.Write("Enter a number: Range number : Min value = 0, Max value = "); 

            Console.WriteLine(uint.MaxValue + " : \n"); 

            string line = Console.ReadLine();

            uint number; bool result = uint.TryParse(line, out number);

            if (result == false)   //not a valid uint number 

           {

                Console.WriteLine("\nThis is not a valid input for uint number!\n\n");

            } 

            else  // the input for number is valid 

            {

            Console.WriteLine("\nEnter a value for position [p]: Range p : Min value p = 0, Max value p = 31 !\n");

                 line = Console.ReadLine();

                 int p;      // mask can take values from 1 to 1000 0000 0000 0000 0000 0000 0000 0000 for uint 

                               // type uint has 32 bits word, so k=32

                               // position p takes values from 0 to 31 

                               // bits are numbered from 0 to 31 , from right to left 

                result = int.TryParse(line, out p); 

                if (result == false || p < 0 || p > 31) 

                { 

                  Console.WriteLine( result == false ? "\nThis is not a valid input for p!\n\n" : "\nOut of range!\n\n"); 

                }

                else //the input for p is valid 

               {

               Console.WriteLine("\nEnter a value for position [q]: Range q : Min value q = 0, Max value q = 31 ! \n");

                     line = Console.ReadLine(); int q; result = int.TryParse(line, out q);

                     if (result == false || q < 0 || q > 31) 

               { 

                   Console.WriteLine(result == false ? "\nThis is not a valid input for q!\n\n" : "\nTOut of range!\n\n"); 

               } 

               else // the input for q is valid 

               { 

                     int MaxValueOfK; if (p > q) 

               { 

                     MaxValueOfK = 32 - p; 

               } 

               else // q > p 

               { 

                    MaxValueOfK = 32 - q; 

               } 

                    Console.WriteLine("\nEnter a value for [k]! Range k : Min value k = 0, Max value k = " 

                                                                                                                             + MaxValueOfK + " !\n");

                    line = Console.ReadLine();

                    int k;

                   result = int.TryParse(line, out k);

                   if (result == false || p + k > 32 || q + k > 32) //not a valid integer number or k is out of it's range 

                  { 

                     Console.WriteLine(result == false ? "\nThis is not a valid input for k!\n\n" : "\nOut of range!\n\n"); 

                  } 

                  else //the input for k is valid 

                  { 

                   // condition for bits overlapping 

                   bool overlap = ( p < q  &&  p + k  >= q )  ||   ( q < p  &&  q + k  >= p ); 

                   //checking for bits overlapping  

                  if (overlap) 

                  { 

                       Console.WriteLine("\nOverlapping !\n\n"); 

                  }

                  else // there are not bits overlaps 

                  { 

                       // swaping p with q, p+1 with q+1, p+2 with q+2, ......, p+k-1 with q+k-1 

                       int bitPValue;

                       int bitQValue;

                       uint maskP;

                       uint maskQ;

                       for (int i = 0; i <= k-1; i++) 

                       { 

                             //geting the value from the bit in position [p] 

                             maskP = 1u << p; 

                             bitPValue = (int)(number & maskP) >> p; // 0  or  1 

                             //geting the value from the bit in position [q] 

                             maskQ = 1u << q; 

                            bitQValue = (int)(number & maskQ) >> q;  // 0  or 1 

 

                            //replacing the value in the q-bit with the value in the p-bit

                            if (bitPValue == 1)  //so we are inserting value [1] in q 

                            { 

                                 // changing the q-Bit Value to 1

                                 number = number | maskQ; 

                            } 

                            else //bitPValue = 0, so we are insertin value [0] in q 

                            { 

                                  // changing the q-Bit Value to 0 maskQ = ~ maskQ;

                                  number = number & maskQ;

                            } 

                                  //replacing the value in the p-bit with the value in the q-bit 

                                  if (bitQValue == 1) //so, we are inserting value [1] in p 

                            {

                                   // changing the p-Bit Value to 1 

                                   number = number | maskP ; 

                            } 

                            else  // bitQValue == 0, so we are inserting value [0] in p 

                            { 

                                   // changing the p-Bit Value to 0 

                                   maskP = ~ maskP; 

                                   number = number & maskP; 

                            } 

                            p ++; 

                            q ++; 

                            } 

                            Console.WriteLine("\nResult : \n\n" + number + " \n\n\n"); 

                      } 

                 } 

            } 

      } 

}

}

}

}

 

 

 

-6
Lyubo avatar Lyubo 172 Точки

Умишлено ли оставяш по един празен ред  нявсякъде, на първият ти тест n = 1140867093; p =  3; q =  24; k = 3; резултата ти е 0. Пак ще повторя грешката ти е в кода.

0
externo avatar externo 119 Точки

движиш маската с прекалено много позиции надясно и губиш битове - единици, от което се променя кода

реалния минус твоя отговор е = 1907751121-1907749073 = 2048

ако още не се сещаш това е 2 на 11 степен, т.е. 12 бит отдясно наляво го губиш, това пък означава че, движиш маската много надясно и реално го нулираш,

при другите числа на се получава или защото не отиват чак толкова надясно че да се нулира или просто защото конкретния бит си е 0 и така или иначе не влияе на крайния резултат

от тук извода че примерите са повече от перфектни т.к. покриват всички случаи

0
Lyubo avatar Lyubo 172 Точки

Цикъла while е напълно излишен, а ако наистина го искаш направи една проверка след 5-6 въвеждания на код спре.
uint number; bool result = uint.TryParse(line, out number); - по-този начин не пестиш място, а кода става трудно четим. Можеш да напишеш на един
ред променливи когато са от един тип, пример: int a = 4, b = 6, c = 44, t, y, u;
Защо постоянно пишеш line = Console.ReadLine();, задачата трябва да е направиш колко се се може по-кратка и лесна за разбиране, а не максимално дълга
Това:
line = Console.ReadLine();
int p;
result = int.TryParse(line, out p);

е еквивалентно на:
int p;
result = int.TryParse(Console.ReadLine(), out p);

Това е много кофти, грешно и трудно четим код -

line = Console.ReadLine(); int q; result = int.TryParse(line, out q);

 може да го напишеш като горният пример само на два реда.

bool result = uint.TryParse(Console.ReadLine(), out number);
if (result == false)
{
Console.WriteLine("\nThis is not a valid input for uint number!\n\n");
}

може да го напишеш по този начин:
while (!uint.TryParse(Console.ReadLine(), out number)) Console.WriteLine("\nThis is not a valid input for uint number!\n\n");

така ще си спестиш if-а, и ще съкратиш много кода. Правиш 4 проверки с if, ако от всяка проверка спестиш по 5+ реда са 20+ реда по-кратък код, с празните редове който оставяш стават 40+ реда.
Редно е променливите който се изпозват вътре в цикъла да се намират в самият цикъл, а не извън него.
int bitPValue;
int bitQValue;
uint maskP;
uint maskQ;

Друг много пример за много лошо написан код:

int maxValueOfK; if (p > q)
{
maxValueOfK = 32 - p;
}
else
{
maxValueOfK = 32 - q;
}

не можа ли да свалиш този if на другия ред.

Ще вечерам и после ще продължа да търся грешката/ките в кода, с промените стигнах до тук.

 

 

0
ViValDam avatar ViValDam 15 Точки

Цикъла while е за да не стартирам програмата непрекъснато , а да се върти непрекъснато и да мога да нанясам стойностите по-бързо и лесно .

Програмата си дава всички стойности верни - никаква нула ! Само третеят пример е различен и то е защото е грешен .

Защо пък ,това сда е пример за лош код ? Това пък откъде го измисли ?

А това с променливете ,че трябвало да бъдат в цикъла и да се пишат на един ред - пълни глупости !

Има най-различни променливи и някои са пишат в цикъла - някой не,  защо като не разбираш нищо - си се заел да критикува  ?

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

Аз приключих с тази задача .- за мен си е отлична !  

Я, дай твоя код да го видя ?

-6
Lyubo avatar Lyubo 172 Точки

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

1
ViValDam avatar ViValDam 15 Точки

И ако щи 1000 минуса да сложите - задачата си работи !

Прости вие не разбирате как ! Даже и да я копирате правилно не умеете !

Аз съм онлайн и на мен не ми трябват плюсове - ха ха ха !

 

Не може всички останали отговори да са ми верни и кода да е грешен !

Айде намерете грешка - всезнайковци !

Дайте да видя вашите решения , как дават този отговор , много ми е интересно ?

-9
externo avatar externo 119 Точки

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

5
ViValDam avatar ViValDam 15 Точки

Виж какво Любо - кода съм си го писала сама , ред  по ред , не съм го копирала от някъде си като теб и много добре знам какво прави всеки ред и какво дава програмата - тествала съм я поне 20 пъти , както написах по-горе  и със стойностите от 15 задача и си работи и приключвам с този въпрос .

Тези стойности които си пуснал ха ха ха - не са от моя код !Моите са същите като от примерите - освен третият !

 

Дай по добре твоят код , ама май нямаш такъв !

 

-8
externo avatar externo 119 Точки

на няколко места съм ти написал проблема, но ти просто не желаеш или да четеш или да признаеш че ти е грешен кода, все пак ще повторя:

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

2.реалния отговор минус твоя отговор е = 1907751121-1907749073 = 2048

ако още не се сещаш това е 2 на 11 степен, т.е. 12 бит отдясно наляво го губиш, това пък означава че, движиш маската много надясно/наляво и реално го нулираш,

при другите числа на се получава или защото не отиват чак толкова надясно/наляво че да се нулират или просто защото конкретния бит си е 0 и така или иначе не влияе на крайния резултат

от тук извода че примерите са повече от перфектни т.к. покриват всички случаи

0
Lyubo avatar Lyubo 172 Точки

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

"Дай по добре твоят код , ама май нямаш такъв !" , вече написах веднъж че в първият си коментар съм дал линк към моето решение.  Ето ти още един линк.

 

п.п. Продължавай в същият дух напред, късмет и успех на изпита.

0
externo avatar externo 119 Точки

ето ти онагледено, ако и сега не разбереш къде ти е грешката :) евала

 

картинка цък

 

преместила си го с p позиции - 2 и аз така направих и аз сгреших, при другите примери работи, при този не

реално се мести с 32 - q - k = 0 т.е. не се мести наляво, после надясно с p + k = 12, и пак наляво с p = 2 

0
ViValDam avatar ViValDam 15 Точки

http://dotnetfiddle.net/oCwl42

 

Ето линк към програмата ми , в твоя линк Любо, има грешка някъде , нещо се е разместило !

Само дето напразно спорихме за резултатите !

Иначе благодаря за линка , за качване на програми  ще го ползвам вече !cool

 

Сега вече може да ми тествате , решението , колкото си искате исами ще се убедите ,че дава верни отговори  !smile Аз си правя играта за Падащите камъни  - вече е почти готова - елате в темата за 12 задача от следващото домашно да я видите ! wink

-4
externo avatar externo 119 Точки

аз и Любо получаваме отговора от примера, ти - не = ние сме решили задачата, ти - не

използвай упоритостта си да прочетеш подробния ми анализ на грешките си, за да не плачеш на изпита и се замисли защо единствена имаш отрицателен резултат, та вече е своеобразен рекорд :)

0
ViValDam avatar ViValDam 15 Точки

Открих си най- после грешката smileили по скоро незнанието по въпроса , но пък научих нещо важно !

Битовете, когато се работи с  uint , въпреки ,че получават стойностти само 0 или 1 , също трябва да са от тип uint , а не от  int , както беше при мен, иначе последният, -32 бит , както е задачата в този пример, става отрицателен ( -1 ), както е при тип  int - най-левият бит е запазен за знака - 0 за + и -1 за минус !

Открих го ,като пуснах тест да видя какво става с битовете , предпоследният беше отрицателен -1 - иначе не се виждаше нищо на другите тестове surprised, защото кода беше правилен .

За другите примери няма значение, затова са излизали правилно, само за този има защото с p +k = 22 + 10  = 32 достига последният 32-ят бит, който при нормалният интежер е за знака - (-1) или  +(0) .

И тъй като в бит q ,които е на 12 позиция в момента има 1 ,числото вместо да получи 1 в 12 бит и бъде умножено по 2**11 , си остава с 0 в 12 бит и си остава същото.

Сега вече всички примери ми излизат !smile

И благодарение на грешката, научих нещо важно !cool Вярно е ,че човек се учи от грешките си !

Ако бях набутала  uint навсякъде, по инерция от самото начало - нямаше да знам сега, какво се случва в действителност в света на битовете wink !

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

кода си е напълно верен и си остава същият ,

само смених  типа на битовете  от int на uint :

http://dotnetfiddle.net/k9V1qX

-4
externo avatar externo 119 Точки

Вместо да ми преписваш коментарите все едно сама си открила грешките, можеше просто да кажеш - мерси!

 

Типична БГ ситуация: вие ми кажете, ама аз само ше си го открия, айде хубаво! Изобщо, че призна грешка е напредък :)

8
ViValDam avatar ViValDam 15 Точки

За Любо - променливите ни трябва да са от тип uint, а не от тип long !

Точно там е трика на задачата !

Не си изпълнил условията на задачата !

Прочете си задачата още веднъж !

-8
Lyubo avatar Lyubo 172 Точки

За VivaDam - отново пишеш без да провериш предварително, решението ми работи с long както и с uint !

"Точно там е трика на задачата !" - Трика на решението не е там !

"Не си изпълнил условията на задачата !" - напротив изпълнил съм го, ако не си забелязала решението ми работи коректно !

"Прочете си задачата още веднъж !" - чел съм условието многократно !

 

п.п. Опитвай се да мислиш малко, преди да пишеш нови коментари !!!

6
dimitarstoyanov90 avatar dimitarstoyanov90 164 Точки

Извинявам се за това, което ще напиша( не го приемай като критика, просто от любопитство, не му е мястото даже в тази тема но..), но ми е много чудно наистина как си успяла да събереш толкова много отрицателни гласове в рамките на такова малко време. Пак ти казвам не го приемай като критика, но явно, де да знам, нещо не правиш като хората, когато постваш нови теми и коментираш ( незнам дали е така просто предполагам, не съм ти разглеждал публикациите). Предполагам сигурно трябва да намериш друг подход за работа с форума :) Успех :) ( просто съвет)

9
ViValDam avatar ViValDam 15 Точки

Много хубав аватар имаш ! laughing

1
ViValDam avatar ViValDam 15 Точки

Виж ,какво  минусите са тъпотия ! Из целият интернет е пълно с идиоти дето само това правят - слагат минуси smile - и на видеата на софт уни има вече минуси - не ме интересуват - всеки може да мине по форума и да слага минуси и плюсове - и какво от това ?

Ето аз ти сложих на теб един - и какво от това ?laughingМога да мина из форума и да ти напраскам на всеки пост минуси - и какво от това ? 

 

За мен е важно ,че напредвам с материала  - учила съм страшно много неща в живото си - имам много дипломи в най-различни области - но това сега ми е страшно приятно да го уча и мми доставя удоволствие !

Айде чао ,нямам търпение да си довърша играта !

 

-2
ViValDam avatar ViValDam 15 Точки

Не знам , но там имаше long - никъде не видях  uint, пък честно казано твоята задача си е твоя работа !Мен ме интересува моята и да уча нови неща всеки ден .

Кода си ми е точно на място и прави точно каквото трябва и аз преключвам с тази задача !

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

Грешката не е грешка  , а съвсем нов материал, който се радвам ,че стана така , че научих - това не е преподавано изобщо на лекциите ! 

Айде ,че днес цял ден изпуснах , искам да си довърша днес играта и 4 домашно !

-5
ZloboMiR avatar ZloboMiR 50 Точки

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

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

2. Този форум не е идеалното място да си избиваме комплексите и да се правим на всезнаещи. 

3. Всички ние вероятно сме учили най-различни неща, защото са ни били интересни. Предлагам да не си ги мерим, защото ще загубиш служебно (да не кажа язък ти за дипломите). Тук сме за програмиране.
4. За минусчетата, да обясня за тях. Докато ти можеш да дадеш на всеки само по едно, за спорта , то ти може да събереш по едно от всички, от сърце. В реалния живот, в работата, ще се наложи да работиш с колеги, в екип, почти като тук. Желая на теб успех, а на бъдещите ти колеги да бъдат силни духом.
Айде, че днес доста време си загубих с този пост! И макар философски погледнато животът да е процес на губене на време, не е добре да го правим умишлено, особено пък да губим времето на другите.

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

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.