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

Вывод кода символа в шестнадцатиричной системе счисления - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.73
kib
0 / 0 / 0
Регистрация: 25.09.2010
Сообщений: 22
10.10.2010, 00:23     Вывод кода символа в шестнадцатиричной системе счисления #1
Добрый вечер! У меня возник вопрос. Программа разделяет символьную строку (любую) на группы символов, коды которых заканчиваются одной цифрой в системе счисления по основанию 16. Результат отображается на потоке стандартного вывода. Необходимо под начальным символом каждой группы указать крайнюю правую цифру его кода. Например строка jjzez разделится на две группы jjzz и e, под первой группой должна быть буква A (в шестнадцатиричной системе у j - 6A, у z - 7A), а под второй группой цифра 5. Как это реализовать?
(на закомментированню часть /*...*/ компилятор выдает ошибки, где как раз делаю попытки вывода крайней правой цифры кода:
102 C:\Users\Liza\Documents\Áàóìàíêà\ma x.cpp no match for 'operator%' in '*pt->Llist::data % 10'
и
103 C:\Users\Liza\Documents\Áàóìàíêà\ma x.cpp could not convert `*(pt->Llist::data + (+(((unsigned int)len) * 4u)))' to `bool')
Код программы:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
 
class Llist
 {
public:
  string *data;
  Llist *next;
  Llist(){next=NULL;data=new string;}
  ~Llist() {cout<<"cleaning up Llist"<<endl; delete data;}
 };
 
 class group
 {
private:
  Llist *first, *last;
public:
  void add(string);
  void dlt(Llist*);
  void print();
  group(string);
  ~group();
 };
group::group(string str)
 {
   string s[16];
   first=NULL;
   last=NULL;
   int i, len=0;
   while(str[len]) len++;
   for (i=0; i<=len;i++) s[str[i]%16]+=str[i];
   for (i=0; i<16; i++) if (s[i][0]) add(s[i]);
   //print();
 }
group::~group()
 {
  cout<<"CLEANING UP..."<<endl;
  Llist *pt, *pt1;
  while(first!=last)
   {
    pt=first;
    while(pt->next!=last) {pt=pt->next;}
    delete last;
    last=pt;
   }
   if(first!=NULL) delete first;
 }
void group::add(string a)
 {
  if(first==NULL)
     {
      first=new Llist;
      last=first;
     }
  else
     {
      last->next=new Llist;
      last=last->next;
     }
  *(last->data)=a;
 }
 
void group::dlt(Llist *xpt)
 {
  if ((xpt!=NULL) and (xpt<=last) and (xpt>=first))
   {
    if (xpt==first)
     {
       first=first->next;
       delete xpt;
     }
    else
     {
       Llist *pt;
       pt=first;
       while(pt->next!=xpt) pt=pt->next;
       pt->next=xpt->next;
       if (xpt==last) last=pt;
       delete xpt;
     }
   }
 }
 
void group::print()
 {
  Llist *pt;
  int len=0;
  pt=first;
  while(pt!=NULL)
   {
    cout<<*(pt->data)<<" ";
    pt=pt->next;
   }
  cout<<endl;
  /*pt=first;
  while(pt!=NULL)
   {
    len=0;
    cout<<(pt->data[0])%16;
    while(pt->data[len]) {len++; cout<<" ";}
    pt=pt->next;
   }
  cout<<endl;*/
  }
int main()
 {
  cout<<"Vvedite stroku simvolov"<<endl;       
  char c;
  string str;
  while((c=getchar())!='\n') str+=c;
  group A(str);
  A.print();
 }
Добавлено через 3 часа 58 минут
Вот с ошибкой в одной строке разобралась, data ведь у меня двумерный массив, т.е. в 1 строке (там где есть ошибка) нужно писать cout<<(pt->data[0][0]%16). А во второй ошибочной строке получается надо вывести пробелы просто, но я еще не могу разобраться с этим, а сожалению, может быть кто сталкивался с этим?
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
 
class Llist
 {
public:
  string *data;
  Llist *next;
  Llist(){next=NULL;data=new string;}
  ~Llist() {cout<<"cleaning up Llist"<<endl; delete data;}
 };
 
 class group
 {
private:
  Llist *first, *last;
public:
  void add(string);
  void dlt(Llist*);
  void print();
  group(string);
  ~group();
 };
group::group(string str)
 {
   string s[16];
   first=NULL;
   last=NULL;
   int i, len=0;
   while(str[len]) len++;
   for (i=0; i<=len;i++) s[str[i]%16]+=str[i];
   for (i=0; i<16; i++) if (s[i][0]) add(s[i]);
   //print();
 }
group::~group()
 {
  cout<<"CLEANING UP..."<<endl;
  Llist *pt, *pt1;
  while(first!=last)
   {
    pt=first;
    while(pt->next!=last) {pt=pt->next;}
    delete last;
    last=pt;
   }
   if(first!=NULL) delete first;
 }
void group::add(string a)
 {
  if(first==NULL)
     {
      first=new Llist;
      last=first;
     }
  else
     {
      last->next=new Llist;
      last=last->next;
     }
  *(last->data)=a;
 }
 
void group::dlt(Llist *xpt)
 {
  if ((xpt!=NULL) and (xpt<=last) and (xpt>=first))
   {
    if (xpt==first)
     {
       first=first->next;
       delete xpt;
     }
    else
     {
       Llist *pt;
       pt=first;
       while(pt->next!=xpt) pt=pt->next;
       pt->next=xpt->next;
       if (xpt==last) last=pt;
       delete xpt;
     }
   }
 }
 
void group::print()
 {
  Llist *pt;
  int len=0;
  pt=first;
  while(pt!=NULL)
   {
    cout<<*(pt->data)<<" ";
    pt=pt->next;
   }
  cout<<endl;
  /*pt=first;
  while(pt!=NULL)
   {
    len=0;
    cout<<(pt->data[0][0])%16;
    while(pt->data[len]) {len++; cout<<" ";}
    pt=pt->next;
   }
  cout<<endl;*/
  }
int main()
 {
  cout<<"Vvedite stroku simvolov"<<endl;       
  char c;
  string str;
  while((c=getchar())!='\n') str+=c;
  group A(str);
  A.print();
 }
Добавлено через 2 минуты
Пробовала вводить типо такого цикла for(int i=0;strlen((pt->data[k]))>i;i++){cout<<" ";}, как раз для вывода пробелов, но тоже не вышло.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2010, 00:23     Вывод кода символа в шестнадцатиричной системе счисления
Посмотрите здесь:

C++ Вывод символа слева и его соответствующего кода ASCII справа
C++ Вывод символа в 10 и 16 системе счисления
Вывод чисел 1-256 в двоичной, восьмеричной и шестнадцатиричной системах C++
C++ Оформить вывод числа в двоичной системе счисления
C++ Вывод кода символа
C++ Проверить корректность числа в заданной системе счисления и перевести в другую систему счисления
Умножение в 4-системе счисления C++
C++ Определить, является ли заданный текст записью числа в шестнадцатиричной системе счисления

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
10.10.2010, 07:33     Вывод кода символа в шестнадцатиричной системе счисления #2
Не очень понятно, что Вам требуется сделать,
но может быть натолкнет Вас на мысли.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
 
int main()
{
    unsigned char symbol = 'j';
    unsigned int codes[2] = { 0 };
    
    codes[0] = symbol & 0xF;
    codes[1] = symbol >> 4;
    
    std::cout << std::hex << symbol  << ": " << 
                             codes[0] << " " << 
                             codes[1] << std::endl;
}
В итоге в массиве codes лежит код символа, разделенный на две части.
kib
0 / 0 / 0
Регистрация: 25.09.2010
Сообщений: 22
10.10.2010, 10:06  [ТС]     Вывод кода символа в шестнадцатиричной системе счисления #3
По идее, мне нужно отлалить вот эту часть программы
C++
1
2
3
4
5
6
7
8
9
  pt=first;
  while(pt!=NULL)
   {
    len=0;
    cout<<(pt->data[0][0])%16;
    while(pt->data[len]) {len++; cout<<" ";}
    pt=pt->next;
   }
  cout<<endl;
Строка cout<<(pt->data[0][0])%16; высчитывает последнюю цифру кода символов группы, то есть здесь уже не выдает ошибок, а вот в другой строке while(pt->data[len]) {len++; cout<<" ";} мне надо добиться, чтобы каждый этот символ был под начальным символом группы, то есть отстался вывод. Но компилятор выдает в этом месте ошибку. Пробовала вводить так for(int i=0;strlen((pt->data[len]))>i;i++){cout<<" ";}, здесь компилятор ругается на strlen и пишет:
no matching function for call to `strlen(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
Yandex
Объявления
10.10.2010, 10:06     Вывод кода символа в шестнадцатиричной системе счисления
Ответ Создать тему
Опции темы

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