Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Кателевский ВН
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 48
#1

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

23.04.2014, 21:06. Просмотров 491. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2014, 21:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не хватает опыта для того, чтобы понять ошибку в задаче циклического побитового сдвига (C++):

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

Ошиба циклического сдвига - C++
Вот задание. Дана действительная квадратная матрица порядка n. 1) осуществить циклический сдвиг элементов прямоугольной матрицы на N...

Функция циклического сдвига побитово вправо - C++
Форумчане, приветствую! Подскажите почему не работает сдвиг вправо? Программа компилируется, но сдвига не происходит. Сверился с...

Программа циклического сдвига элементов массива - C++
Помогите!Срочно! Составить программу циклического сдвига элементов массива А(10) на 5 позиций влево.Заранее спасибо)))

Как закодировать методом циклического сдвига? - C++
Здравствуйте! Вопрос такой, что представляет из себя кодировка методом циклического сдвига на 2 вправо чётных битов относительно нечётных...

Реализовать функции шифровки и дешифровки методом циклического сдвига битов - C++
Даны текстовые файлы. Реализовать функции шифровки и дешифровки методом циклического сдвига битов на 1 бит вправо в левом полубайте и на 1...

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

Давай весь проект в архиве сюда, тогда гляну.
0
Кателевский ВН
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 48
24.04.2014, 11:29  [ТС] #6
Вот ловите, не судите строго, Я пока ещё чайник)
0
Вложения
Тип файла: 7z kodirovka.7z (182.5 Кб, 4 просмотров)
Кателевский ВН
0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 48
24.04.2014, 11:32  [ТС] #7
Хотя нет, как можно строже, больше знать буду)))
0
newbie666
Заблокирован
24.04.2014, 11:52 #8
О.о.о какой же мусор в твоём исходнике, у меня ваще твоя так сказать программа вылетает с экзепшеном, даже разбираться не хочу в таком мусоре...
Ты скажи, что ты хочешь сделать? Закодировать строку какой то другой строкой? Зачем тебе какая - то мутохрень? Нельзя побайтово XOR-м байты закодить и потом также раскодить? Код в две строки будет.
0
Kuzia domovenok
1960 / 1813 / 142
Регистрация: 25.03.2012
Сообщений: 6,286
Записей в блоге: 1
24.04.2014, 12:05 #9
Цитата Сообщение от Кателевский ВН Посмотреть сообщение
while(in[l])
а что это за условие цикла? кто сказал что
а) в массиве не хранится нулей до последнего числа?
б) в массиве последнее число именно нуль?
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
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
Сообщений: 48
25.04.2014, 09:42  [ТС] #11
Ты скажи, что ты хочешь сделать? Закодировать строку какой то другой строкой?
Там, в задании у Шилдта, вторая строка выполняет роль количества сдвигов, поэтому только её размер и нужен.
Зачем тебе какая - то мутохрень?
Это задание, Я его решил по своему, не так как в архиве который скинул. Но мне интересно откуда лишние данные берутся в этой попытке решения программы?
Нельзя побайтово XOR-м байты закодить и потом также раскодить? Код в две строки будет.
Я же говорил, Я начинающий...
а что это за условие цикла?
а) в массиве не хранится нулей до последнего числа?
б) в массиве последнее число именно нуль?
Это для того, чтобы выводить данные из заполненного массива пока 0 не обозначит завершение.
По условию задания нулей нет, кроме, как в конце строки.

Добавлено через 7 минут
DrOffset поясните пожалуйста это место "in[j] = static_cast<unsigned int>(ch[j]);", что-то мне подсказывает здесь проблема у меня и была. Почему именно такое приведение типов Вы использовали? Может быть лишние данные именно от того и появлялись у меня, из за неправильного приведения типов? Тогда почему они появляются?
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
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
Сообщений: 48
27.04.2014, 10:19  [ТС] #13
Я понял, благодарю за помощь, очень помогли.
0
27.04.2014, 10:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2014, 10:19
Привет! Вот еще темы с ответами:

Написать программы шифрования и расшифровки файла методом циклического сдвига - C++
Написать программы шифрования и расшифровки файла методом циклического сдвига. Т.е. каждый символ исходного файла (исходный код - K1)...

Вывести результат последовательного применения циклического сдвига вправо заданной последовательности k раз - C++
Циклическим сдвигом вправо последовательности называется последовательность, получаемая из исходной перемещением последнего элемента в...

Ввести число и вывести результат циклического сдвига его битов на 1 разряд влево - C++
Проверьте пожалуйста, правильное ли решение. Ввести число и вывести результат циклического сдвига его битов на 1 разряд влево (все биты...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru