Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2010, 23:28   #1
KEIego
Пользователь
 
Регистрация: 24.09.2010
Сообщений: 22
Вопрос Представление кодов символов в 16-ричной системе счисления

Здравствуйте! При разработке программы, разделяющей любую заданную символьную строку на группы символов, возникла проблема. Как реализовать разделение строки на группы символов, коды которых заканчиваются одной цифрой в шестандцатиричной системе счисления?
Программа сравнивает коды в десятичной системе счисления (и кстати при отображении в потоке стандартного вывода после первой группы символов почему-то ставит два пробела, видимо я что-то упустила в функциях cout).

Код программы:
Код:
#include <iostream>
#include <cstdlib>
#include <cstring>
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[10];
   first=NULL;
   last=NULL;
   int i, len=0;
   while(str[len]) len++;
   for (i=0; i<=len;i++) s[str[i]%10]+=str[i];
   for (i=0; i<10; 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])%10;
    while(pt->data[len]) {len++; cout<<" ";}
    pt=pt->next;
   }
  cout<<endl;*/
  }
int main()
 {
  char c;
  string str;
  while((c=getchar())!='\n') str+=c;
  group A(str);
  A.print();
 }
Закоментированные строки:
//print(); - отображение введенной символьной строки на экране
/*pt=first;
while(pt!=NULL)
{
len=0;
cout<<(pt->data[0])%10;
while(pt->data[len]) {len++; cout<<" ";}
pt=pt->next;
} cout<<endl;*/ - здесь компилятор выдает ошибки
101 C:\Users\Liza\Documents\Áàóìàíêà\ma x.cpp no match for 'operator%' in '*pt->Llist::data % 10'
и
102 C:\Users\Liza\Documents\Áàóìàíêà\ma x.cpp could not convert `*(pt->Llist::data + (+(((unsigned int)len) * 4u)))' to `bool'

Последний раз редактировалось KEIego; 09.10.2010 в 01:10.
KEIego вне форума Ответить с цитированием
Старый 09.10.2010, 12:10   #2
coinkrsk
пыжашийся нуб
Пользователь
 
Регистрация: 19.06.2010
Сообщений: 93
По умолчанию

Ну я тут мало что понял, но если вся проблема именно в индентификации символов у которых в кодировке на конце - цифра, то их можно поймать так:
Код:
if( (int)c % 16 < 10 ) cout << "на конце - цифра";
else cout << "на конце буква";
coinkrsk вне форума Ответить с цитированием
Старый 09.10.2010, 18:47   #3
KEIego
Пользователь
 
Регистрация: 24.09.2010
Сообщений: 22
По умолчанию

спасибо большое! кажется, с этим я разобралась)) пока пытаюсь решить другие проблемки в программе)
KEIego вне форума Ответить с цитированием
Старый 10.10.2010, 10:10   #4
KEIego
Пользователь
 
Регистрация: 24.09.2010
Сообщений: 22
По умолчанию

Попытки отладть программу не приводят к успеху.
В этой части программы компилятор выдает ошибку.
Код:
  pt=first;
  while(pt!=NULL)
   {
    len=0;
    cout<<(pt->data[0][0])%10;
    while(pt->data[len]) {len++; cout<<" ";}
    pt=pt->next;
   }
  cout<<endl;
Ошибка в конкретной строке while(pt->data[len]) {len++; cout<<" ";}. Строка cout<<(pt->data[0][0])%10; последнюю цифру кода у группу, а вот в следующей строке я должна добиться того, чтобы эта цифра стояла именно под начальным символом группы. Пробовала вводить так 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> >&)'.
Помогите справиться с этим, пожалуйста!
KEIego вне форума Ответить с цитированием
Старый 10.10.2010, 10:24   #5
coinkrsk
пыжашийся нуб
Пользователь
 
Регистрация: 19.06.2010
Сообщений: 93
По умолчанию

Ну, если проект находится на той же стадии, что и в первом посте, то очевидные ошибки:
1) В функции
Код:
void group::dlt(Llist *xpt)
 {
  if ((xpt!=NULL) and (xpt<=last) and (xpt>=first))
...
Судя по всему вы пишете на С++ а в С++ нет оператора and вместо него надо писать &&

2)Вместо #include <cstring> напишите #include <string>

Правильно ли работает программа я не знаю, но по крайней мере компилируется.

Если раскомментировать кусок кода по поводу которогу у вас возникли вопросы, то тут:
1)
Код:
cout << (pt->data[0]) % 10;
pt->data[0] - это строка. % - деление с остатком, работает с целыми числами. Что бы исправить ошибку - поясните что вы вообще хотите добиться от программы этой строчкой.

2) тут - тоже не совсем понятно чего вы добиваетесь.
Код:
while(pt->data[len]) {len++; cout<<" ";}
Если сильно напрячься по это похоже на то, что вы пытаетель вывести на экран столько пробелов, сколько строк содержит массив pt->data.
Если это действительно так, приемлемым вариантом было бы
Код:
string* tempPointer = pt->data;
while(tempPointer) {tempPointer++; cout<<' ';}
но последный должен ссылаться на 0 или программа будет просто вылетать, хоть и скомпилируется.

Вам совет: поясняйте суть того, что должна делать строка кода по поводу которой у вас возникли вопросы. Чем меньше люди понимают что от них требуется, тем хуже будет ответ.

Последний раз редактировалось Stilet; 10.10.2010 в 13:00.
coinkrsk вне форума Ответить с цитированием
Старый 10.10.2010, 18:29   #6
KEIego
Пользователь
 
Регистрация: 24.09.2010
Сообщений: 22
По умолчанию

coinkrsk, спасибо большое! Постараюсь в следующий раз при возникновении вопросов формулировать их доступным языком.
Вроде бы добилась правильной работы программы, завтра выложу сюда работающую версию, может быть кому-то, кто будет работать со списками, пригодится.
KEIego вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложение, вычитание в двоичной системе счисления Vemor Паскаль, Turbo Pascal, PascalABC.NET 5 16.06.2009 14:02
Сложение в двоичной системе счисления Volchara Общие вопросы C/C++ 2 23.04.2009 19:54
Сложение в 23ичной системе счисления Ямагути Общие вопросы C/C++ 6 04.12.2008 21:21
Деление чисел в двоичной системе счисления Mss_Smith Помощь студентам 9 04.05.2007 17:02