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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Методы Оптимизации: Метод параллельных касательных - нужен алгоритм http://www.cyberforum.ru/cpp-beginners/thread1156920.html
Здравствуйте. Помогите пожалуйста с составлением алгоритма по методу параллельных касательных. Пытался читать литературу, но там алгоритмы в слишком "математическом" виде, и я их не очень понимаю.
C++ Массивы Функций. DirectX 11. Отобразить несколько моделей Всем привет, продолжаю пытаться изучать DirectX 11. Возникла задача отобразить более одной разной модели. Есть такая штука ID3D11DeviceContext* dirX11_d3dContext; // Контекст устройства (рисование) и многие подобные ему, она участвует в инициализации графического конвейера + в отрисовке объекта. Как нарисовать 1 объект ясно, как сделать сотню его копий тоже ясно возникла проблема с... http://www.cyberforum.ru/cpp-beginners/thread1156903.html
C++ Вычислить сумму тех элементов матрицы, номера строк и столбцов которых принадлежат некоторым множествам
Дана квадратная матрица А и два непустых множества S1 и S2, состоящие из каких-то элементов от 1 до 10, например S1= и S2=. Вычислить сумму тех элементов матрицы, номера строк и столбцов которых принадлежат соответственно множествам S1 и S2. Если в S1 или S2 один элемент встречается несколько раз, то соответствующие элементы А должны входить в сумму только один раз.
Считывание текста с клавиатуры и нахождение слова, начинающиеся и заканчивающиеся согласной буквой C++
#include <iostream> #include <sstream> #include <string> #include <cctype> #include <iterator> int main(){ std::string buf, wrd; size_t chislo;
C++ Отнимать от переменной заданные значение до тех пор, пока она не будет равна нулю http://www.cyberforum.ru/cpp-beginners/thread1156858.html
напишите плиз пример как сделать в цикле For что бы от переменной а(1000) отнималась переменная b(100) пока переменная а не станет ровна нулю?? а то у меня все время 900 получается(( заранее спасибо.
C++ Симметрия и присвоение переменной в матрице Доброго времени суток. Задание состоит в том, чтобы транспонированная матрица сравнивалась с полученной, после ввода. После сравнения, переменной Q присвоить значение 1(если матрицы симметричны) или 0(если не симметричны); ввод-вывод обеих матриц прописал, а вот куда пристроить присвоение и сравнение не знаю, либо отдельным блоком, либо в главном блоке. Заранее спасибо!) #include <iostream.h>... подробнее

Показать сообщение отдельно
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 405
25.04.2014, 11:06     Удаление символа из класса строки-агрегата классов символов
Извините вопрос предыдушей задачи вынес в отдельную тему. Напоминаю.
Есть класс символа ,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 предотвращает выход за границы значений
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 21:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru