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

Удаление символа из класса строки-агрегата классов символов - C++

Восстановить пароль Регистрация
 
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 405
25.04.2014, 11:06     Удаление символа из класса строки-агрегата классов символов #1
Извините вопрос предыдушей задачи вынес в отдельную тему. Напоминаю.
Есть класс символа ,TSymb и класс строка, TString являющийся агрегатом из n символов.
Надо реализовать в TString метод удаления 1 символа.
Вот часть кода
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 <iostream>
using namespace std;
class TSymb 
{//символ,c печатать свое зн и отв на запрос о знач св символьного поля; 
public:
TSymb(char c);
TSymb();
~TSymb();
void printCH();
void setC(char c);
char getCH();
protected:
  char ch;
};
TSymb::TSymb(char c)
{ ch=c;}
TSymb::TSymb()
{ch='0';};
TSymb::~TSymb()
{
};
void TSymb::setC(char c)
{ch=c;} 
void TSymb::printCH()
{cout<<ch;}
char TSymb::getCH()
{ return ch;}
class TString//объект «строка»- массив из 15 симв, умеющий выводить на печать зн своих элем 
{ private:   
  TSymb *smb; 
  char *str;
  public:
     int n;//кол-во
     TString(char *ref);
     ~TString(void);
     void delN(int N);
};
TString::TString(char *ref)
{  char c;
    n=strlen(ref);str=new char[n+1];  
    smb=new TSymb [n];
    for (int i=0;i<n;i++)
     {c=ref[i]; smb[i].setC(c);str[i]=c;}
    str[n]='\0';
}
TString::~TString(void) 
 {   for(int i=0;i<n;i++)
       smb[i].~TSymb();
 } 
void TString::delN(int N)
{//удаление по номеру
 if (N>=n || N<0) return;
  smb[N].~TSymb(); n--;
}
Как я понимаю, нужно удалить только данный объект символ из массива объектов TString.
А явно выписывать деструктор ~TSymb не надо, тем более что элемент этого класса не ссылка.
т.е. написав
C++
1
2
TSymb::~TSymb()
{delete ch;};
получим ошибку.
В коде void TString::delN(int N)
видимо надо дописать сначала исключение smb[N] из массива smb а потом вызов деструктора

Добавлено через 19 минут
Вот сделал так удаление символа по номеру и еще по значению
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void TString::delN(int N)
{//удаление по номеру
 if (N>=n || N<0) return;
 for (int i=N+1;i<n;i++)
     smb[i-1]=smb[i];
 smb[n].~TSymb(); n--;
}
int TString::delC(char c)
{//удаление символов по значению
 int i,cnt=0;bool p=true;
 while (p) {
    for (i=0; i<n;i++)
     {
      if(smb[i].getCH()==c)
        {delN(i); cnt++; break;};
     }
    if (i<n) p=true;else p=false;
           };
 return cnt;
}
Удаление по значению -хитрая вещь если ее делать в цикле по кол-ву символов n - то в процессе удаления
само n уменьшается, да еще сдвиг элементов влево. Поэтому сделано как выше с помощью while и булевого признака p

Добавлено через 13 минут
Если бы был контейнер -вектор там таких проблем нет свойство size() само отслеживает
C++
1
2
3
4
5
6
7
8
9
int TString::delC(char c)
{//удаление символов по значению
 int cnt=0;
 for (int i=0; i<str.size();i++)
 {
     if(str[i].getCH()==c) 
     {delN(i); cnt++;};
 }
  return cnt;
Добавлено через 31 минуту
Извините. Удаление по значению для вектора (выше) привел неверно. Там из 2 подряд идущих удаляемых символа
один пропускается. Верный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int TString::delC(char c)
{//удаление символов по значению
 int cnt=0;char c1;
 for (int i=0; i<str.size();i++)
 {   
     c1=str[i].getCH();
     while((c1==c))
        {
            delN(i); cnt++;
            if (str.size()==0 || i==str.size()) break;
            c1=str[i].getCH();
        };
 }
  return cnt;
}
break предотвращает выход за границы значений
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2014, 11:06     Удаление символа из класса строки-агрегата классов символов
Посмотрите здесь:

C++ Удаление символа из строки
C++ Удаление символа строки
C++ Удаление символа из строки
Строка: Определить местоположение символа первой строки,который первым совпал с одним из символов второй строки. C++
C++ Заданы 2 строки. Определить местоположение символа первой строки, который первым не совпал с одним из символов второй
C++ Строки. Определить местоположение символа первой строки, который первым совпал с одним из символов второй
C++ Определить местоположение символа первой строки, который первым не совпал с одним из символов второй строки
C++ Создание класса-агрегата объектов

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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