0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 94
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Помогите пожалуйста разобраться, почему вместо заданных мною, скажем 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.04.2014, 21:06
Ответы с готовыми решениями:

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

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

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

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

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

Давай весь проект в архиве сюда, тогда гляну.
0
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 94
24.04.2014, 11:29  [ТС] 6
Вот ловите, не судите строго, Я пока ещё чайник)
Вложения
Тип файла: 7z kodirovka.7z (182.5 Кб, 5 просмотров)
0
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 94
24.04.2014, 11:32  [ТС] 7
Хотя нет, как можно строже, больше знать буду)))
0
Заблокирован
24.04.2014, 11:52 8
О.о.о какой же мусор в твоём исходнике, у меня ваще твоя так сказать программа вылетает с экзепшеном, даже разбираться не хочу в таком мусоре...
Ты скажи, что ты хочешь сделать? Закодировать строку какой то другой строкой? Зачем тебе какая - то мутохрень? Нельзя побайтово XOR-м байты закодить и потом также раскодить? Код в две строки будет.
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
24.04.2014, 12:05 9
Цитата Сообщение от Кателевский ВН Посмотреть сообщение
while(in[l])
а что это за условие цикла? кто сказал что
а) в массиве не хранится нулей до последнего числа?
б) в массиве последнее число именно нуль?
0
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
24.04.2014, 14:59 10
Кателевский ВН, в смысл всего этого не вдавался, остается на твоей совести. Но вот вроде бы то, что должно быть:
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
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 94
25.04.2014, 09:42  [ТС] 11
Ты скажи, что ты хочешь сделать? Закодировать строку какой то другой строкой?
Там, в задании у Шилдта, вторая строка выполняет роль количества сдвигов, поэтому только её размер и нужен.
Зачем тебе какая - то мутохрень?
Это задание, Я его решил по своему, не так как в архиве который скинул. Но мне интересно откуда лишние данные берутся в этой попытке решения программы?
Нельзя побайтово XOR-м байты закодить и потом также раскодить? Код в две строки будет.
Я же говорил, Я начинающий...
а что это за условие цикла?
а) в массиве не хранится нулей до последнего числа?
б) в массиве последнее число именно нуль?
Это для того, чтобы выводить данные из заполненного массива пока 0 не обозначит завершение.
По условию задания нулей нет, кроме, как в конце строки.

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

Решение

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

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

Добавлено через 6 минут
Цитата Сообщение от Кателевский ВН Посмотреть сообщение
Почему именно такое приведение типов Вы использовали?
Вообще, С++-касты задумывались в том числе и для того, чтобы внести определенную декларативность в исходный код. Чтобы было сразу видно, что тут происходит, чтобы, в том числе, можно было найти такой каст поиском по тексту.
В общем, чем четче обозначены намерения программиста в исходном коде, тем меньше ему придется писать комментариев (они, как известно, имеют свойство устаревать и рассинхронизироваться с кодом), и тем проще будет другому программисту сходу разобраться.
1
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 94
27.04.2014, 10:19  [ТС] 13
Я понял, благодарю за помощь, очень помогли.
0
27.04.2014, 10:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2014, 10:19
Помогаю со студенческими работами здесь

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

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

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

Перегрузка оператора побитового сдвига <<
Здравствуйте, подскажите, пожалуйста, как правильно перегрузить оператор побитового сдвига?public...

Ассемблерная вставка - реализация побитового сдвига
Помогите пожалуйста. Я не изучал только делфи, а надо сделать в паскале вставку на ассемблере. ...

33 года понадобилось бухгалтеру, чтобы понять, чего не хватает в клавиатуре
Многим пользователям компьютеров приходится постоянно вводить числовые данные — достаточно...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru