Форум программистов, компьютерный форум CyberForum.ru

Системы счисления - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Adramelah
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 13
11.12.2009, 20:51     Системы счисления #1
Умные люди помогите пожалуста написать програму на С++ для превода целого двуичного числа в шестнадчетиричное. Желательно посредством "простих" функций. Заранее спасибо!!!!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
11.12.2009, 23:45     Системы счисления #2
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
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <string>
 
using namespace std;
 
const char ch[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
 
int R10(string s) // перевод строки в 10-ое число
{
    int base = 1,
        res = 0;
    while (s.size())    {
        res += base * ((int) s[s.size()-1] - '0');
        s.resize(s.size()-1);
        base <<= 1;
    }
    return res;
}
 
string R16(int n) // перевод числа в 16 представление
{
    string s;
    while (n)   {
        s.insert(s.begin(),ch[n%16]);
        n /= 16;
    }
    return s;
}
 
int main()
{
    string number;
    cin >> number;
    int n = R10(number);
    cout << (R16(n)) << endl;
    system("pause");
    return 0;
}
Adramelah
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 13
12.12.2009, 00:17  [ТС]     Системы счисления #3
Спасибо! Если можно немного вкратсе обяснить, просто есть кое што что мы еще не изучали((((
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
12.12.2009, 00:25     Системы счисления #4
что именно? строки?
base <<= 1 - то битовый сдвиг влево на 1 разряд, тоесть дописываем 0 в конец числа и если вы поэксперементируете, то увидите, что это умножение на 2, base >>= 1 - деление на 2.
вроде больше ничего такого, что можно не знать нет..
manfeese
 Аватар для manfeese
128 / 127 / 16
Регистрация: 04.01.2009
Сообщений: 415
12.12.2009, 01:02     Системы счисления #5
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
27
28
29
30
31
32
33
34
35
36
37
#include <iostream.h>
#include <conio.h>
 
// Value - число, которое нужно перевести,
// Digits - количество выводимых символов
 
char *ToHex(unsigned Value,unsigned Digits)
{
  char *Hex = new char[Digits];
  Hex[Digits]='\0';
  int r;
  while (Value>=16 && Digits!=0)
          {
           r=Value%16;
           if (r>=10) Hex[--Digits]= r+55;
           else Hex[--Digits]= r+48;
           Value/=16;
          }
 
  if (Digits >0)
  {
         if (Value>=10) Hex[--Digits]= Value+55;
         else Hex[--Digits]= Value+48;
 
         for (int i = Digits-1; i >= 0; i--)  Hex[i]=48;
  }
  return Hex;
}
 
int main()
{
        int number;
        cin>>number;
        cout<<ToHex(number,8);
        getch();
        return 0;
}
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
12.12.2009, 01:14     Системы счисления #6
а давайте посоревнуемся, у кого выйдет меньше кода? (в разумных пределах)
manfeese
 Аватар для manfeese
128 / 127 / 16
Регистрация: 04.01.2009
Сообщений: 415
12.12.2009, 01:31     Системы счисления #7
В смысле??? Если так уж хочется, тогда надо оговорить конкретное условие программы...
Adramelah
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 13
12.12.2009, 03:17  [ТС]     Системы счисления #8
Спасибо вам большое! Вы сделали мне курсач! Спасибо за обяснения, думаю розберусь!

Добавлено через 13 минут
теряюсь в участке
C++
1
2
3
                while (s.size())        {
                res += base * ((int) s[s.size()-1] - '0');
                s.resize(s.size()-1);
первого кода, и
C++
1
2
3
4
char *Hex = new char[Digits];
  Hex[Digits]='\0';
  int r;
  while (Value>=16 && Digits!=0)
второго, буду презнателен если обясните или подскажете какую книгу скачать чтобы самому розобратся
Андрейка
408 / 212 / 22
Регистрация: 25.03.2009
Сообщений: 715
12.12.2009, 06:24     Системы счисления #9
Adramelah, в первом случае почитай про контейнер std::string , а во втором динамически выделяется память под строку , например в строке типа char x[15] ; 14 значимых символов и последний резервирется под нулевой символ , отсюда Hex[Digits]='\0';
manfeese
 Аватар для manfeese
128 / 127 / 16
Регистрация: 04.01.2009
Сообщений: 415
12.12.2009, 13:07     Системы счисления #10
И еще как вариант: из строки двоичной в строку шестнадцатиричную, как это сделал outoftime, только по своему
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
27
28
29
30
31
32
33
34
35
36
37
#include <iostream.h>
#include <conio.h>
 
char *BinToHex(char *Bin, int Length)
{
  int HexLen = (Length-1)/4, Sum=0;
  if ((Length-1)%4) HexLen++;
  char *Hex = new char[HexLen+1];
  Hex[HexLen--]='\0';
 
  for (int i=0,k=1; i < Length-1; i++, k<<=1)
  {
   if (i && !(i%4))
   {
    if (Sum>=10) Hex[HexLen--]=Sum+55;
    else Hex[HexLen--]=Sum+48;
    Sum=0;
    k=1;
   }
   if (Bin[Length-2-i]=='1') Sum+=k;
  }
 
  if (Sum>=10) Hex[HexLen]=Sum+55;
  else Hex[HexLen]=Sum+48;
  return Hex;
}
 
int main()
{
    char s[100];
    int n=0;
    cin>>s;
    do {n++;} while (s[n-1]!='\0');
    cout<<BinToHex(s,n);
    getch();
    return 0;
}
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
12.12.2009, 15:46     Системы счисления #11
Цитата Сообщение от manfeese Посмотреть сообщение
В смысле??? Если так уж хочется, тогда надо оговорить конкретное условие программы...
допустим что у нас на входе строка, которая представляет число -(1<<31)..(1<<31 - 1) в двоичной системе счисления, вывести 16-ичное представление.. блоки #include, #define, #typedef, namespace а также все функции должні иметь по отступу сверху и снизу.
Пример:
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
using namespace std;//использовать пространство имен обязательно если используются cout, cin
 
int main() {
  cout << "Sample" << endl;
  return 0;
}


C++
1
2
3
while (s.size())        {
res += base * ((int) s[s.size()-1] - '0');
s.resize(s.size()-1);
base - это множитель, каждое число в n-ой системе счисления можно представить как x0 + x1*base+x2*base^2+...+xn*base^k-1; что-бы не возносить каждый раз в степень base, мы ее умножаем на саму n, где n - система счисления, k - количество чисел числа. s[s.size()-1] - возвращает последний символ строки, можно еще так писать: *(--s.end()) но для этого надо знать что представляют собой итераторы.. так как мы получили символ, и преобразовываем его в число, значит мы получит код символа, но нам надо число, которое представляет этот символ а не его код, поэтому мы отнимаем код нуля s[s.size()-1] - '0'. s.resize(s.size()-1); - отсекает последний символ строки, while (s.size()) работает до тех пор пока размер строки не станет нуль.
manfeese
 Аватар для manfeese
128 / 127 / 16
Регистрация: 04.01.2009
Сообщений: 415
12.12.2009, 15:56     Системы счисления #12
outoftime, Я немного не понял! Это ты мне объяснил так подробно??? или это что-то вроде условий???
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
12.12.2009, 16:13     Системы счисления #13
все что после примера не тебе
manfeese
 Аватар для manfeese
128 / 127 / 16
Регистрация: 04.01.2009
Сообщений: 415
12.12.2009, 16:26     Системы счисления #14
так я уже выложил свой вариант для ввода строки, содержащей двоичное представление числа, и выводящей его шестнадцатиричное представление, ранее...

А если уж ставить условия, то хотелось бы предложить не использовать встроенные функции (кроме ввода-вывода), а писать исключительно свои, тогда и будет видно насколько коды отличаються друг от друга по размеру и эффективности!!!
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
12.12.2009, 17:26     Системы счисления #15
хотя, минуса можно откинуть.. считаем только мантисы

Добавлено через 1 минуту
без СТЛ-я? эффективность это одно, а мало кода - это другое))

Добавлено через 35 минут
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
#include <iostream>
#include <string>
#include <algorithm>
 
using namespace std;
 
int main()  {
    string s, sn;
    int res = 0, base = 8, k = 4;
    char a[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    cin >> s;
    do  {
        res += (*(--s.end()) - '0') ? ( ((base << 1) == 16) ? (base = 1) : (base <<= 1) ) : ((((base << 1) == 16) ? (base = 1) : (base <<= 1)) ? (0) : (0));
        if (!(--k)) {
            sn.push_back( a[res] );
            k = 4;
            res = 0;
        }
        s.resize(s.size() - 1);
    } while (s.size());
    if (res) sn.push_back(a[res]);
    reverse(sn.begin(),sn.end());
    cout << sn << endl;
    return 0;
}
Это все на что у меня хватает фантазии..
Adramelah
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 13
12.12.2009, 18:53  [ТС]     Системы счисления #16
Да еще одна проблемка: на windows 7 поставил билдер, вбиваю код в console wizard, сохраняю , запуск а черное окно бликнет и все, выбивает ошыбки:
[Linker Error] Unresolved external '__InitVCL' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CP32MTI.LIB|crtlvcl

[Linker Error] Unresolved external '__ExitVCL' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CP32MTI.LIB|crtlvcl

[Linker Error] Unresolved external '_main' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\C0X32.OBJ

Не подскажете что делать!
Adramelah
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 13
12.12.2009, 20:01  [ТС]     Системы счисления #17
Все розобрался! на последний вопрос отвечать ненужно
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
12.12.2009, 20:32     Системы счисления #18
проекты хорошо делать на вижуал студии, если вы редактируете код одного безимяного файла-программы тогда проще использовать wxDevC++
Adramelah
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 13
12.12.2009, 20:48  [ТС]     Системы счисления #19
Выручайте! Походу проги написаные вами не катят для меня, т.к материл такой не проходили и сделать нужно используя простые цыклы for, do-while и т д а также массивы. Даже естли я розберусь с написаными вами програмами препод всеравно завалит! Помогите чем можете
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2009, 21:13     Системы счисления
Еще ссылки по теме:

C++ Системы счисления
C++ Перевод чисел из двоичной системы счисления в систему счисления кратной степеням двойки и обратно
C++ С восьмеричной системы счисления в десятичную систему счисления

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

Или воспользуйтесь поиском по форуму:
КсенияСергеевна
0 / 0 / 0
Регистрация: 07.09.2009
Сообщений: 45
12.12.2009, 21:13     Системы счисления #20
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "stdafx.h"
#include <iostream>
#include "math.h"
using namespace std;
#define q 2
 
int main(void)
{char a[q];
int g,l,j=0,m=1,n=0,s=0,T=1,r=0;
 
for( j; j<q; j++) 
{cout<<"vvedite element ";
cin>>a[j];};
 
cout<<"vvedite isxodnoe osnovanie ";
cin>>g;
 
for(int u=q-1; u<=0; u--) 
{m=a[u]*T;
T*=g;
n+=m;
};
 
cout<<"vvedite osnovanie dlya perevoda ";
cin>>l;
 
int i=0;
const int z=20;
char b[z],k=0;
 
while(n>l)
{
s=n%l;
b[i]=s;
n=n/l;
i++;};
 
 b[i]=n;
 
cout<<"chislo ";
 
for(int j=0;j<q;j++)
{cout<<a[j];}
 
cout<<" v "<<g<<" sisteme chisleniya "<<endl<<"posle perexoda v "<<l<<" sistemy chisleniya = ";
 
for(int r=i; r>=0; r--)
{cout<<b[r];
};
 
cout<<endl;
 
system("pause");
}
Добавлено через 14 минут
я тебе кинула из любой в любую,попробуй переделать!
Yandex
Объявления
12.12.2009, 21:13     Системы счисления
Ответ Создать тему
Опции темы

Текущее время: 05:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru