Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про класс строки, реализация класса строки 
:(
    Опции темы
clarkkent
Дата 11.5.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 22.3.2008

Репутация: нет
Всего: нет



Добрый день уважаемым программистам. Очень надеюсь на вашу помощь. Помогите реализовать класс строки с несколькими видами функций. Пример описания класса таков:
Код

Class  string {
  public:
  string (char what) ;                                   // Инициализация литерой
  string strcat(char * scource)                  // конкатенация области памяти до первого
  string strcat(char what)                            // Добавление символа
  void print_at (unsigned x,unsigned y)    // вывод строки на экран в позиции с координатами x, y
  private:
 char * buf;
 unsigned len;
  };

PM MAIL   Вверх
baldina
Дата 11.5.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Код

string::string (char what) 
{
   len = 1;
   buf = new char[len+1];
   buf[0] = what;
   buf[1] = '\0';
}

string string::strcat (char * str)
{
   size_t str_len = strlen (str);
   char *temp = new char[len+str_len+1];
   if (buf)
   {
     strcpy (temp, buf);
     temp += len;
   }
   strcpy (temp, str);
   len += str_len;
   delete buf;
   buf = temp;

  return *this;
}


а вообще интерфейс класса немного странный по составу, и кроме того не хватает деструктора
Код

string::~string ()
{
   delete [] buf;
}


Это сообщение отредактировал(а) baldina - 11.5.2008, 15:50
PM MAIL   Вверх
clarkkent
Дата 11.5.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 22.3.2008

Репутация: нет
Всего: нет



Цитата(baldina @ 11.5.2008,  15:49)
Код

string::string (char what) 
{
   len = 1;
   buf = new char[len+1];
   buf[0] = what;
   buf[1] = '\0';
}

string string::strcat (char * str)
{
   size_t str_len = strlen (str);
   char *temp = new char[len+str_len+1];
   if (buf)
   {
     strcpy (temp, buf);
     temp += len;
   }
   strcpy (temp, str);
   len += str_len;
   delete buf;
   buf = temp;

  return *this;
}


а вообще интерфейс класса немного странный по составу, и кроме того не хватает деструктора
Код

string::~string ()
{
   delete [] buf;
}

Спасибо, в очень помогли, функция strcat (char * str) то есть конкатенация области памяти до первого хотя бы в двух словах как это можно объяснить, просто не очень представляю. А операцию добавления символа в строку как strcat (char what) как лучше сделать?

Добавлено через 11 минут и 9 секунд
baldina, Спасибо за информацию. Функция strcat (char * str) то есть конкатенация области памяти до первого хотя бы в двух словах как это можно объяснить, просто не очень представляю. А операцию добавления символа в строку как strcat (char what) как лучше сделать? 

PM MAIL   Вверх
bsa
Дата 11.5.2008, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



clarkkent, хотел бы для начала отметить некоторую неудобность класса, имеющего такой интерфейс. Рекомендую взглянуть на интерфейс стандартного класса (там, конечно, много лишнего, но суть увидеть просто): http://www.sgi.com/tech/stl/basic_string.html

Реализовать strcat очень просто:
1. твой класс должен хранить в приватной зоне указатель на начало буфера данных, размер строки в этом буфере и размер самого буфера (последние два могут совпадать, но это неоптимально, но для домашней работы сойдет).
2. метод strcat должен измерить размер добавляемой строки, если он не больше, чем свободное место в буфере, то переходим на п. 4
3. выделяем место под буфер так, чтобы туда влезла и предыдущее значение и добавляемая строка (а еще лучше в два раза больше - на будущее), копируем в него содержимое предыдущего буфера (думаю, смысла копировать больше, чем занимает строка, нет), освобождаем память предыдущего буфера, обновляем переменные класса (указатель и размеры).
4. копируем в конец строки в буфере (указатель + длина строки) добавляемую строку, обновляем переменную класса "размер строки"
PM   Вверх
clarkkent
Дата 11.5.2008, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 22.3.2008

Репутация: нет
Всего: нет



bsa, спасибо, просто мне надо именно так реализовать по заданию любым несложным способом, но так..
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0438 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.