crossplatform.ru

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


  Ответ в Помогите дописать программу.
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Iron Bug Дата 3.12.2011, 20:05
 
Цитата(Ivan767 @ 3.12.2011, 17:29) *
Как бы не надо людей так оскорблять! информатика не мой профилирующий предмет, и я не супер программист и в будущем отношение к программированию иметь не буду.

надо, ещё как надо. я не страдаю либерастией.
к мозгам тоже отношения иметь не будешь? математика и программирование (на таком элементарнейшем уровне это не имеет ничего общего с профессиональным программированием) - это попытки привить студентам умение шевелить мозгами, хотя бы чуть-чуть. не более того.
без мозгов можно работать дворником. ну или плитку класть, как таджики. думать там не нужно. а в диплом не должны идти липовые оценки. не будешь программистом - пусть там стоит дохлый трояк. сразу будет понятно, чего реально стоит такое образование.
ilyabvt Дата 3.12.2011, 18:20
 
Цитата
человек, который не умеет (и главное - не хочет!) думать, не должен получить диплом об образовании.

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

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

Приношу свои извинения. Брякнул сгоряча.
Ivan767 Дата 3.12.2011, 14:29
 
Цитата(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. Код получился громоздким, но у меня нет желания его оптимизировать.)) Алексей прав - это явно невменяемый преподаватель.


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

Мне такое уже не первый человек говорит что "это явно невменяемый преподаватель.", на самом деле преподаватель нормальный)
Iron Bug Дата 3.12.2011, 9:26
  преподаватель нормальны: его задача - научить студента думать. а вот студенты невменяемые: ленивые и тупые.
а потом такое чмо приходит с дипломом на работу и нихрена (очень мягко выражаясь) не умеет, потому что в башке пусто. я, конечно, такого "специалиста" сразу выкину к чертям собачьим, но время будет потеряно.
я предупреждаю профессиональных программистов: чем больше вы делаете таких задач - тем тупее те, кто потом придёт устраиваться к вам же на работу. вы оказываете себе и другим медвежью услугу. человек, который не умеет (и главное - не хочет!) думать, не должен получить диплом об образовании.
ilyabvt Дата 3.12.2011, 2: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. Код получился громоздким, но у меня нет желания его оптимизировать.)) Алексей прав - это явно невменяемый преподаватель.
Ivan767 Дата 2.12.2011, 20:14
  Запутал конечно я вас)
Теперь не надо получать случайное число, а именно вводить его самому. В общем нужно сделать чтоб я сам вводил число с клавиатуры и оно само преобразовало в шестнадцатеричный код. т.е. я ввожу 3 735 928 559 и получаю DEADBEEF и затем после всех сдвигов получаю DEEFBEAD. т.е. выполняем следующее:
Назовем симметричным байт, в котором нулевой бит имеет такое же значение, что и седьмой, а первый – такое же, что и шестой. Изменить порядок следования симметричных байтов в числе на обратный.
И если сможете, сделайте так чтобы преобразование осуществлялось с помощью битовых операций. Использование массивов для представления битов числа нежелательно.
Ivan767 Дата 2.12.2011, 13:35
 
Цитата(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, 8:53
 
Цитата(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) *
А если в числе всего один байт? А если в числе нету симметричных байтов?

Отпишусь чуть позже)
Алексей1153 Дата 2.12.2011, 6:47
  ilyabvt, не бери в голову, сумасшедшие преподы и не такое насочиняют ))
ilyabvt Дата 2.12.2011, 0:15
 
#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;
}

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

Не совсем понял что нужно. А если в числе всего один байт? А если в числе нету симметричных байтов? Приведите пример того что вы имели ввиду.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 2.5.2024, 19:30