Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
23.04.2014, 21:06

Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига

23.04.2014, 21:06. Показов 1670. Ответов 12
Метки нет (Все метки)

Доброго времени суток! Помогите пожалуйста разобраться, почему вместо заданных мною, скажем 4 символов, после циклического сдвига он выдаёт в разы больше. Ошибка начинает появляться на третьем цикле for. Вот функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void lrotate(unsigned char ch[],int n)
    { unsigned int in[80];
        for(int j=0;ch[j] > 0;j++)
        {
            in[j]=ch[j];
 
        }
 
        for(int k=0;in[k];k++)
            {
                 cout << in[k] << endl;
                for(int i=0;i < n; i++)
                {
                    in[k] = in[k] << 1;
                    if(in[k] & 256)
                        in[k] = in[k] | 1;
                }
 
            }
        int l=0;
        while(in[l])
        {
            cout << in[l] <<" ";
            l++;
        }
    }
0
Лучшие ответы (1)
 Аватар для IT_Exp
IT_Exp
34794
23.04.2014, 21:06
Ответы с готовыми решениями:

Алгоритм для циклического сдвига слова на N символов влево
Дана строка, содержащая текст. Зашифровать текст, циклически Help

Напишите функции для циклического сдвига слова влево и вправо
Нужно использовать SHL и SHR для сдвига? Не очень понятно как определить в какой момент нужно прекращать сдвиги?

Написать программу для циклического сдвига списка на n-1 элементов влево
Здравствуйте, помогите написать программу на Lisp Написать программу для циклического сдвига списка на n-1 элементов влево (очень нужно)

12
Заблокирован
23.04.2014, 21:30
Это Г. код. Лучше скажи, для чего тебе нужен этот сдвиг и в каком узле своего софта ты его используешь?
0
24.04.2014, 09:48
На самом деле, Я решил задачу немного другим способом...Но мне не понятно, отчего(в этом варианте решения) вместо положенного количества чисел получается в массиве больше. Если конкретно, на вопрос ответить: то планировалась функция, для того, чтобы разобраться в элементарном шифровании по сдвигу и для этого и использовалась. Я не понимаю, откуда эти дополнительные элементы в массиве появляются? Вот во воложении Я поместил результат пробы этой кодировки:
Миниатюры
Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига  
0
24.04.2014, 09:59
Да! Newbie666 поясните что значит "Г. код" это качество моего кода))) или определение какое-то?
0
Заблокирован
24.04.2014, 10:53
Цитата Сообщение от Кателевский ВН Посмотреть сообщение
Да! Newbie666 поясните что значит "Г. код"
это гавно код , ты прав

Давай весь проект в архиве сюда, тогда гляну.
0
24.04.2014, 11:29
Вот ловите, не судите строго, Я пока ещё чайник)
Вложения
Тип файла: 7z kodirovka.7z (182.5 Кб, 5 просмотров)
0
24.04.2014, 11:32
Хотя нет, как можно строже, больше знать буду)))
0
Заблокирован
24.04.2014, 11:52
О.о.о какой же мусор в твоём исходнике, у меня ваще твоя так сказать программа вылетает с экзепшеном, даже разбираться не хочу в таком мусоре...
Ты скажи, что ты хочешь сделать? Закодировать строку какой то другой строкой? Зачем тебе какая - то мутохрень? Нельзя побайтово XOR-м байты закодить и потом также раскодить? Код в две строки будет.
0
24.04.2014, 12:05
Цитата Сообщение от Кателевский ВН Посмотреть сообщение
while(in[l])
а что это за условие цикла? кто сказал что
а) в массиве не хранится нулей до последнего числа?
б) в массиве последнее число именно нуль?
0
19501
24.04.2014, 14:59
Кателевский ВН, в смысл всего этого не вдавался, остается на твоей совести. Но вот вроде бы то, что должно быть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void lrotate(unsigned char ch[], int n)
{
    unsigned int in[80];
    size_t j;
    for(j = 0; ch[j]; ++j)
    {
        in[j] = static_cast<unsigned int>(ch[j]);
        for(int i = 0; i < n; ++i)
        {
            in[j] <<= 1;
            if(in[j] & 256)
            {
                in[j] |= 1;
            }
        }
    }
    for(size_t i = 0; i < j; ++i)
    {
        cout << in[i] << " ";
    }
}
0
25.04.2014, 09:42
Ты скажи, что ты хочешь сделать? Закодировать строку какой то другой строкой?
Там, в задании у Шилдта, вторая строка выполняет роль количества сдвигов, поэтому только её размер и нужен.
Зачем тебе какая - то мутохрень?
Это задание, Я его решил по своему, не так как в архиве который скинул. Но мне интересно откуда лишние данные берутся в этой попытке решения программы?
Нельзя побайтово XOR-м байты закодить и потом также раскодить? Код в две строки будет.
Я же говорил, Я начинающий...
а что это за условие цикла?
а) в массиве не хранится нулей до последнего числа?
б) в массиве последнее число именно нуль?
Это для того, чтобы выводить данные из заполненного массива пока 0 не обозначит завершение.
По условию задания нулей нет, кроме, как в конце строки.

Добавлено через 7 минут
DrOffset поясните пожалуйста это место "in[j] = static_cast<unsigned int>(ch[j]);", что-то мне подсказывает здесь проблема у меня и была. Почему именно такое приведение типов Вы использовали? Может быть лишние данные именно от того и появлялись у меня, из за неправильного приведения типов? Тогда почему они появляются?
0
19501
25.04.2014, 13:32
Лучший ответ Сообщение было отмечено Кателевский ВН как решение

Решение

Цитата Сообщение от Кателевский ВН Посмотреть сообщение
поясните пожалуйста это место "in[j] = static_cast<unsigned int>(ch[j]);"
Это не играет роли. Вообще-то расширение char->int - это автоматическое преобразование (оно у тебя и было), но я посчитал, что в алгоритме присутствует определенная неочевидность, и обозначил явно намерение это сделать.
Цитата Сообщение от Кателевский ВН Посмотреть сообщение
что-то мне подсказывает здесь проблема у меня и была.
Нет. Проблема была из-за неправильного чтения массива in (последний цикл while). Массив не обязан заканчиваться нулем, поэтому условие срабатывало значительно большее количество раз, чем требовалось, выводя мусор из памяти. Ноль мог встретиться и позже, тогда мусорных "элементов" было бы еще больше. Я же просто немного сократил твой алгоритм, добавил некоторой четкости формулировок и убрал ошибку выведения данных массива in.

Добавлено через 2 минуты
Цитата Сообщение от Кателевский ВН Посмотреть сообщение
По условию задания нулей нет, кроме, как в конце строки.
В конце строки ноль есть. Но он в конце строки. А в конце массив in нет нуля, потому что его туда никто не пишет. Массив in - это уже не строка.

Добавлено через 6 минут
Цитата Сообщение от Кателевский ВН Посмотреть сообщение
Почему именно такое приведение типов Вы использовали?
Вообще, С++-касты задумывались в том числе и для того, чтобы внести определенную декларативность в исходный код. Чтобы было сразу видно, что тут происходит, чтобы, в том числе, можно было найти такой каст поиском по тексту.
В общем, чем четче обозначены намерения программиста в исходном коде, тем меньше ему придется писать комментариев (они, как известно, имеют свойство устаревать и рассинхронизироваться с кодом), и тем проще будет другому программисту сходу разобраться.
1
27.04.2014, 10:19
Я понял, благодарю за помощь, очень помогли.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 Аватар для BasicMan
BasicMan
29316
27.04.2014, 10:19

Определить функцию для циклического сдвига списка вправо на один элемент
Дан список. Определить функцию для циклического сдвига списка вправо на один элемент. Использовать только базис Лиспа. Самым простым...

Напишите программу для выполнения циклического сдвига массива вправо на 4 элемента
напишите программу для выполнения циклического сдвига массива вправо на 4 элемента

Оператор побитового сдвига
как называется этот оператор и что он делает ?

Операция побитового сдвига
Задача состоит в том,что нужно введенное число (unsigned char) перевести в двоичную, а затем проверить биты полученного числа (тоесть, что...

Перегрузка оператора побитового сдвига <<
Здравствуйте, подскажите, пожалуйста, как правильно перегрузить оператор побитового сдвига?public static Set&lt;T&gt; operator &lt;&lt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru