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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
vikav89
0 / 0 / 0
Регистрация: 12.12.2014
Сообщений: 51
#1

Класс "Cтрока" - C++

26.09.2015, 21:28. Просмотров 275. Ответов 1
Метки нет (Все метки)

Определить класс-строку. В класс включить два конструктора: для определения класса
строки строкой символов и путем копирования другой строки (объекта класса строки).
Определить операции над строками:
- удаление одной строки из другой ( если одна строка является подстрокой другой);
-- преобразование символов строки в строчные (маленькие) символы
форумчане помогите пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2015, 21:28     Класс "Cтрока"
Посмотрите здесь:

Класс "линия" наследуется классом "отрезок" - C++
Помогите, пожалуйста, разобраться с лабораторной. Нужно создать базовый класс "линия": координаты начала и конца, конструктор с...

Иерархия: класс "карта", "колода карт" - C++
(Иерархия). Создать класс карта, имеющая ранг и масть. Карту можно перевернуть и открыть. Создать класс – колода карт, содержащий карты....

Класс "Динамический массив точек", в котором лежит класс Point - C++
Такое вот условаие. Не могу понять что от меня хотят. Может кто или обьяснить или дать пример решения. (лучше просто объяснить). ...

Класс: Реализовать класс "участник" - C++
Конечно странно, просить об этом....здесь, но мне нужно помочь с подругой. Дело в том что у меня есть знакомая, и она програмист С++. Она...

Непонятна постановка задачи "класс «Универсальная переменная»" - C++
Здравствуйте! стоит передо мной следующая задача: Реализовать класс var - «Универсальная переменная». Объекты экземпляры этого...

Класс "ArrayList", похоже на проблему с выделением памяти - C++
Вроде бы все работает, ошибок не выдает... но на выходе совсем не то, похоже на проблему с выделением памяти... ArrayList.h #pragma...

Класс "creditCard", программа зацикливается на вводе данных - C++
прога не работает корректно! зацикливается на вводе данных и не выходит на exit #include <iostream> #include<string.h> using...

Класс "Зачетка": Ссылка на неразрешенный внешний символ - C++
Практиковался( Visual Studio 2012) в написании программы и выдаёт вот такую ошибку 1>MSVCRTD.lib(crtexe.obj) : error LNK2019: ссылка на...

Класс "Дробь" для обработки обычных дробей - C++
помогите пожалуйста написать перегрузку операций Система обработки обычных дробей. Примерный перечень выполняемых действий: -...

Класс "Окружность" с данными центр и радиус окружности. - C++
Помогите, пожалуйста, решить задачу: Класс "Окружность" с данными центр и радиус окружности. Задание. 1. Объявить класс в...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
minimum_y
14 / 14 / 2
Регистрация: 26.05.2013
Сообщений: 45
27.09.2015, 01:20     Класс "Cтрока" #2
Набросал на скорую руку

my_string.h

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
#pragma once
 
/*
    Класс представляет строку.
*/
class MyString final
{
 public:
 
     /*
        Инициализация пустой строки.
     */
     MyString();
 
     /*
        Инициализация строкой символов.
     */
     MyString(const char* s);
 
     /*
        Инициализация путем копирования другой строки.
     */
     MyString(const MyString& s);
 
     MyString& operator = (const MyString& s);
 
     /*
        Возвращает указатель на данные.
     */
     const char* c_str() const;
 
     /*
        Возвращает длину строки.
     */
     size_t length() const;
 
     /*
        Преобразует символоы строки в строчные символы.
     */
     void toLowerCase();
 
     /*
        Возвращает true, когда вызывающая строка является подстрокой s.
     */
     bool isSubstring(const MyString& s) const;
 
     /*
        Удаляет все вхождения подстроки.
     */
     void removeSubstring(const MyString& s);
 
     /*
        Очищает память.
     */
     ~MyString();
 
 private:
 
     char* mBuffer;
     size_t mLength;
 
     void setBuffer(const char* s);
};

my_string.cpp

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
117
118
119
120
121
#include "my_string.h"
#include <string.h> // memcpy, strlen, strcpy, strstr
#include <wctype.h> // towlower
#include <stdexcept>
 
 
MyString::MyString()
    : MyString("")
{
}
 
MyString::MyString(const char* s)
{
    if ((s == nullptr))
    {
        throw std::invalid_argument("Null pointer 's'");
    }
 
    setBuffer(s);
}
 
MyString::MyString(const MyString& s)
{
    setBuffer(s.mBuffer);
}
 
MyString& MyString::operator = (const MyString& s)
{
    if (this == &s)
        return *this;
 
    setBuffer(s.mBuffer);
    return *this;
}
 
const char* MyString::c_str() const
{
    return mBuffer;
}
 
size_t MyString::length() const
{
    return mLength;
}
 
void MyString::toLowerCase()
{
    for (size_t i = 0u; i < mLength; ++i)
    {
        mBuffer[i] = ::towlower(mBuffer[i]);
    }
 
    // или так, если библиотечные функции не подходят (проверено только на латинице)
 
    //const int DIFF = 'a' - 'A';
    //for (size_t i = 0u; i < mLength; ++i)
    //{
    //  char symbCode = mBuffer[i];
    //  if (symbCode >= 65 && symbCode <= 90)
    //  {
    //      mBuffer[i] = (symbCode + DIFF);
    //  }
    //}
}
 
bool MyString::isSubstring(const MyString& s) const
{
    // этот метод можно вообще удалить, если не хочется пользоваться библиотечными функциями
    return (::strstr(s.mBuffer, mBuffer) != nullptr);
}
 
void MyString::removeSubstring(const MyString& s)
{
    if (!s.isSubstring(*this))
    {
        return;
    }
 
    size_t substringLength = s.length();
    while (char* p = ::strstr(mBuffer, s.mBuffer))
    {
 
        size_t symbCount = mLength - substringLength;
        size_t bufferSize = symbCount + 1u;
 
        char* temp = static_cast<char*>(::malloc(bufferSize));
        if (temp == nullptr)
        {
            throw std::runtime_error("malloc fails");
        }
 
        ::memset(temp, 0, bufferSize);
 
        ::memcpy(temp, mBuffer, p - mBuffer);
        ::memcpy(temp + (p - mBuffer), p + substringLength, (mBuffer + mLength) - (p + substringLength));
 
        ::free(mBuffer);
        setBuffer(temp);
        ::free(temp);
    }
}
 
MyString::~MyString()
{
    ::free(mBuffer);
}
 
void MyString::setBuffer(const char* s)
{
    size_t len = ::strlen(s);
    size_t bufferSize = len + 1u;
    mBuffer = static_cast<char*>(::malloc(bufferSize));
 
    if (mBuffer == nullptr)
    {
        throw std::runtime_error("malloc fails");
    }
 
    ::strcpy_s(mBuffer, bufferSize, s);
    mLength = len;
}
main.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include "my_string.h"
 
int main()
{
    MyString s1 = "DDDEDDADBEEFDD";
    MyString s2 = "DD";
 
    if (s2.isSubstring(s1)) // проверка не обязательна
        s1.removeSubstring(s2);
 
    std::cout << s1.c_str() << std::endl; // выведет DEADBEEF
 
    s1.toLowerCase();
    std::cout << s1.c_str() << std::endl; // выведет deadbeef
 
    MyString s3 = s1; // вызовется конструктор копирования
 
    std::cin.get();
    std::cin.get();
    return 0;
}
Добавлено через 9 минут
PS: К оператору присваивания не стал писать комментарий. Почитайте на досуге, что это такое и для чего нужно, вдруг спросят.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru