crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Помогите дописать программу.
Ivan767
  опции профиля:
сообщение 1.12.2011, 22:15
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 1.12.2011
Пользователь №: 3036

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем доброго времени суток! Помогите пожалуйста дописать программу С++, которая получает случайное целое типа int и выводит его двоичное представление на экран затем выполняет преобразование, и после выводит на экран двоичное представление результата преобразования.
Условие программы:
Назовем симметричным байт, в котором нулевой бит имеет такое же значение, что и седьмой, а первый – такое же, что и шестой. Изменить порядок следования симметричных байтов в числе на обратный.
И если сможете, сделайте так чтобы преобразование осуществлялось с помощью битовых операций. Использование массивов для представления битов числа нежелательно.
Буду очень признателен если поможете)


#include<iostream>
using namespace std;

#include<iomanip>

using std::setw;
using std::cin;

void dispBits(int);

int main()
{
int n;

cout<<"vvedite sluchaynoe celoe chislo: ";
cin>>n;

dispBits(n);

return 0;
}
void dispBits(int val)
{
const int SHIFT=8*sizeof(int)-1;
const int MASK=1<<SHIFT;

cout<<setw(7)<<val<<" = ";

for(int i=1;i<=SHIFT+1;i++){
cout<<(val&MASK?'1':'0');
val<<=1;

if(i%8==0)
cout<<' ';
}
cout<<endl;
}

эта часть получает целое число и выводит его в двоичном виде. помогите доделать пожалуйста!
Если можно ее как то проще сделать, сделайте по самому простому. Очень надо. Заранее благодарю!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 2.12.2011, 0:15
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


#include <iostream>
#include <conio.h>
#include <vector>
#include <ctime>

using namespace std;

//---------------------------------------------------------------------------

int main()
{
int x;
vector<bool> bin;
//генерируем случайное сичло
srand(time(0));
x = rand();
cout << x << endl;
//переводим в двоичный вид
while (x/2 != 0) {
    bin.push_back(x%2);
    x = x/2;
}
bin.push_back(x%2);
//выводим
for (int i = bin.size()-1; i >= 0; i--) {
   cout << bin.at(i);
}

getch();
    return 0;
}

Цитата
Изменить порядок следования симметричных байтов в числе на обратный.

Не совсем понял что нужно. А если в числе всего один байт? А если в числе нету симметричных байтов? Приведите пример того что вы имели ввиду.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 2.12.2011, 6:47
Сообщение #3


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


ilyabvt, не бери в голову, сумасшедшие преподы и не такое насочиняют ))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Ivan767
  опции профиля:
сообщение 2.12.2011, 8:53
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 1.12.2011
Пользователь №: 3036

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ilyabvt @ 2.12.2011, 1:15) *
Не совсем понял что нужно. А если в числе всего один байт? А если в числе нету симметричных байтов? Приведите пример того что вы имели ввиду.


Программа должна преобразовать введенное с клавиатуры число в десятичной системе, затем преобразовывает его в двоичную, а в итоге вывести на экран шестнадцатиричный код введенного числа с клавиатуры, и затем с помощью сдвигов поучить следующее → (как пример) 0xDEADBEEF → 0xDEEFBEAD.

Я так думаю, что скорее всего я должен делать сам все сдвиги для любого числа, т.к. не совсем понимаю как программа будет находить симметричные байты и делать сдвиги автоматически. Можно конечно попробовать перевести число DEADBEEF в десятичный код (результат будет 3 735 928 559) и уже сдвиги делать для этого числа DEADBEEF. давайте так попробуем.

Спасибо что откинулись!

ой ой ой сори сори! это же случайное число должно быть! что то я перепутал)
Цитата(Ivan767 @ 2.12.2011, 9:29) *
Программа должна преобразовать введенное с клавиатуры число в десятичной системе, затем преобразовывает его в двоичную, а в итоге вывести на экран шестнадцатиричный код введенного числа с клавиатуры, и затем


Я попробую уточнить этот момент
Цитата(Ivan767 @ 2.12.2011, 9:29) *
А если в числе всего один байт? А если в числе нету симметричных байтов?

Отпишусь чуть позже)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Ivan767
  опции профиля:
сообщение 2.12.2011, 13:35
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 1.12.2011
Пользователь №: 3036

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ilyabvt @ 2.12.2011, 1:15) *
А если в числе всего один байт? А если в числе нету симметричных байтов?

Если в числе будет один байт то он должен заменить пустые ячейки нулями, т.е во так 0x0000BEEF

Я не указал что мне нужно шестнадцатиричный код преобразовывать. сори)
вот эта часть преобразовывает случайное десятичное число в шестнадцатиричный код:
#include<iostream>
using namespace std;
int main(){
int i;
cin >> dec >> i;
cout << hex << i << endl;
return 0;
}

теперь надо дописать чтобы программа меняла все что надо.

_______

ВОТ ЧТО НАДО СДЕЛАТЬ.
В общем нужно сделать чтоб я сам заранее вводил число с клавиатуры и оно само преобразовало в шестнадцатеричный код. т.е. я ввожу 3 735 928 559 и получаю DEADBEEF и затем получаю DEEFBEAD. Теперь не надо получать случайное число, а именно вводить его самому.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Ivan767
  опции профиля:
сообщение 2.12.2011, 20:14
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 1.12.2011
Пользователь №: 3036

Спасибо сказали: 0 раз(а)




Репутация:   0  


Запутал конечно я вас)
Теперь не надо получать случайное число, а именно вводить его самому. В общем нужно сделать чтоб я сам вводил число с клавиатуры и оно само преобразовало в шестнадцатеричный код. т.е. я ввожу 3 735 928 559 и получаю DEADBEEF и затем после всех сдвигов получаю DEEFBEAD. т.е. выполняем следующее:
Назовем симметричным байт, в котором нулевой бит имеет такое же значение, что и седьмой, а первый – такое же, что и шестой. Изменить порядок следования симметричных байтов в числе на обратный.
И если сможете, сделайте так чтобы преобразование осуществлялось с помощью битовых операций. Использование массивов для представления битов числа нежелательно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 3.12.2011, 2:32
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Раскрывающийся текст

#include <iostream>
#include <conio.h>
#include <vector>
using namespace std;

void ShowHex(unsigned int dec) {
    vector<char> hex;
    char hex_num[16] = {'0', '1', '2', '3', '4', '5', '6', '7',
                        '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
                       };

    while (dec/16 != 0) {
       hex.push_back(hex_num[dec%16]);
       dec = dec/16;
    }
    hex.push_back(hex_num[dec%16]);
    for (int i = hex.size()-1; i >= 0; i--) {
       cout << hex.at(i);
    }
}

unsigned char* GenerateBytes(unsigned int dec) {
   unsigned char *x = new unsigned char[4];
   x[0] = dec >> 24;
   x[1] = dec >> 16;
   x[2] = dec >> 8;
   x[3] = dec;
   return x;
}

bool CheckByte(unsigned char byte) {
    //195 = 11000011
    //66 = 01000010
    //129 = 10000001
    if (  (byte & 195 == 0) || (byte & 195 == 66) ||
          (byte & 195 == 129) || (byte & 195 == 195) ) {
        return true;
    }
    else
        return false;
}

int Castling(unsigned int dec) {
    unsigned char *bytes = GenerateBytes(dec);
    int number, number_byte[4];
    int count_symmetric = 4;
    for (int i = 0; i < 4; i++) {
       if (CheckByte(bytes[i]) == false) {
          number_byte[i] = int(bytes[i]) << 8*(3-i);
          count_symmetric--;
       }

    }

    //перестановка симметричных байтов
    if (count_symmetric == 1) {
       for (int i = 0; i < 4; i++) {
          if (CheckByte(bytes[i]) == true) {
             number_byte[i] = int(bytes[i]) << 8*(3-i);
          }
          break;
       }
    }
    else if (count_symmetric == 2 || count_symmetric == 3) {
       for (int i = 0; i < 4; i++) {
          if (CheckByte(bytes[i]) == true) {
             for (int j = 3; j > 0; j--) {
                if (CheckByte(bytes[j]) == true) {
                   number_byte[i] = int(bytes[j]) << 8*(3-i);
                   number_byte[j] = int(bytes[i]) << 8*(3-j);
                   break;
                }
             }
             break;
          }
       }
    }
    else if (count_symmetric == 4) {
       for (int i = 0; i < 4; i++) {
          number_byte[i] = int(bytes[3-i]) << 8*(3-i);
       }
    }

    number = number_byte[0] | number_byte[1] | number_byte[2] | number_byte[3];
    return number;
}
//---------------------------------------------------------------------------

int main()
{
unsigned int x, x_end;
cin >> x;

ShowHex(x);
cout << endl;
x_end = Castling(x);
ShowHex(x_end);
getch();
    return 0;
}


GenerateBytes разбивает число на отдельные байты.
CheckByte проверяет является ли байт симметричным.
P.S. Код получился громоздким, но у меня нет желания его оптимизировать.)) Алексей прав - это явно невменяемый преподаватель.

Сообщение отредактировал ilyabvt - 3.12.2011, 2:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 3.12.2011, 9:26
Сообщение #8


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


преподаватель нормальны: его задача - научить студента думать. а вот студенты невменяемые: ленивые и тупые.
а потом такое чмо приходит с дипломом на работу и нихрена (очень мягко выражаясь) не умеет, потому что в башке пусто. я, конечно, такого "специалиста" сразу выкину к чертям собачьим, но время будет потеряно.
я предупреждаю профессиональных программистов: чем больше вы делаете таких задач - тем тупее те, кто потом придёт устраиваться к вам же на работу. вы оказываете себе и другим медвежью услугу. человек, который не умеет (и главное - не хочет!) думать, не должен получить диплом об образовании.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Ivan767
  опции профиля:
сообщение 3.12.2011, 14:29
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 1.12.2011
Пользователь №: 3036

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 3.12.2011, 10:26) *
преподаватель нормальны: его задача - научить студента думать. а вот студенты невменяемые: ленивые и тупые.
а потом такое чмо приходит с дипломом на работу и нихрена (очень мягко выражаясь) не умеет, потому что в башке пусто. я, конечно, такого "специалиста" сразу выкину к чертям собачьим, но время будет потеряно.
я предупреждаю профессиональных программистов: чем больше вы делаете таких задач - тем тупее те, кто потом придёт устраиваться к вам же на работу. вы оказываете себе и другим медвежью услугу. человек, который не умеет (и главное - не хочет!) думать, не должен получить диплом об образовании.


Как бы не надо людей так оскорблять! информатика не мой профилирующий предмет, и я не супер программист и в будущем отношение к программированию иметь не буду.

Цитата(ilyabvt @ 3.12.2011, 3:32) *
Раскрывающийся текст

#include <iostream>
#include <conio.h>
#include <vector>
using namespace std;

void ShowHex(unsigned int dec) {
    vector<char> hex;
    char hex_num[16] = {'0', '1', '2', '3', '4', '5', '6', '7',
                        '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
                       };

    while (dec/16 != 0) {
       hex.push_back(hex_num[dec%16]);
       dec = dec/16;
    }
    hex.push_back(hex_num[dec%16]);
    for (int i = hex.size()-1; i >= 0; i--) {
       cout << hex.at(i);
    }
}

unsigned char* GenerateBytes(unsigned int dec) {
   unsigned char *x = new unsigned char[4];
   x[0] = dec >> 24;
   x[1] = dec >> 16;
   x[2] = dec >> 8;
   x[3] = dec;
   return x;
}

bool CheckByte(unsigned char byte) {
    //195 = 11000011
    //66 = 01000010
    //129 = 10000001
    if (  (byte & 195 == 0) || (byte & 195 == 66) ||
          (byte & 195 == 129) || (byte & 195 == 195) ) {
        return true;
    }
    else
        return false;
}

int Castling(unsigned int dec) {
    unsigned char *bytes = GenerateBytes(dec);
    int number, number_byte[4];
    int count_symmetric = 4;
    for (int i = 0; i < 4; i++) {
       if (CheckByte(bytes[i]) == false) {
          number_byte[i] = int(bytes[i]) << 8*(3-i);
          count_symmetric--;
       }

    }

    //перестановка симметричных байтов
    if (count_symmetric == 1) {
       for (int i = 0; i < 4; i++) {
          if (CheckByte(bytes[i]) == true) {
             number_byte[i] = int(bytes[i]) << 8*(3-i);
          }
          break;
       }
    }
    else if (count_symmetric == 2 || count_symmetric == 3) {
       for (int i = 0; i < 4; i++) {
          if (CheckByte(bytes[i]) == true) {
             for (int j = 3; j > 0; j--) {
                if (CheckByte(bytes[j]) == true) {
                   number_byte[i] = int(bytes[j]) << 8*(3-i);
                   number_byte[j] = int(bytes[i]) << 8*(3-j);
                   break;
                }
             }
             break;
          }
       }
    }
    else if (count_symmetric == 4) {
       for (int i = 0; i < 4; i++) {
          number_byte[i] = int(bytes[3-i]) << 8*(3-i);
       }
    }

    number = number_byte[0] | number_byte[1] | number_byte[2] | number_byte[3];
    return number;
}
//---------------------------------------------------------------------------

int main()
{
unsigned int x, x_end;
cin >> x;

ShowHex(x);
cout << endl;
x_end = Castling(x);
ShowHex(x_end);
getch();
    return 0;
}


GenerateBytes разбивает число на отдельные байты.
CheckByte проверяет является ли байт симметричным.
P.S. Код получился громоздким, но у меня нет желания его оптимизировать.)) Алексей прав - это явно невменяемый преподаватель.


Спасибо и на этом! )

Мне такое уже не первый человек говорит что "это явно невменяемый преподаватель.", на самом деле преподаватель нормальный)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 3.12.2011, 18:20
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Цитата
человек, который не умеет (и главное - не хочет!) думать, не должен получить диплом об образовании.

Согласен. И тем не менее, такие люди получают их пачками (мне иногда кажется что студент который хочет думать это уже вымирающий вид :( ).
Цитата
Как бы не надо людей так оскорблять!

Оскорбление было не персонализированным.
Цитата
на самом деле преподаватель нормальный

Приношу свои извинения. Брякнул сгоряча.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 16:53