Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
1

Класс Строка

28.04.2016, 06:39. Показов 758. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
в универе дали лабу "Реализовать класс строка"
Я сделал
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#pragma once
 
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
 
using namespace std;
 
class String{
    char *str;
    int length;
public:
    String();
    String(char *buf_str);
    String(const String &copy);
    ~String();
 
    String operator + (const String &right);
    String operator * (const String &right);
    String operator = (const String &right);
    String operator - (const String &right);
 
    friend String operator + (const String &a, char c);
    friend ostream& operator << (ostream& s, String& x);
    friend String get_lot(const String &a, const String &b);
    char* operator [](int i);
 
    char *get_string();
};
#include "classString.h"
 
String::String()
{
    str = NULL;
    length = 0;
}
 
String::String(char *buf_str)
{
    length = strlen(buf_str);
    str = new char[length + 1];
    for(int i = 0; i < length; i++)
        str[i] = buf_str[i];
    str[length] = '\0';
}
 
String::String(const String &copy)
{
    length = copy.length;
    str = new char[length+1];
    for(int i = 0; i < length; i++)
        str[i] = copy.str[i];
    str[length] = '\0';
 }
 
String::~String()
{
    delete []str;
}
 
String String::operator + (const String &right)
{
    String result;
    delete result.str;
    result.length = length + right.length;
    result.str = new char[result.length + 1];
    strcpy(result.str, str);
    strcpy(result.str + length, right.str);
 
    return result;
}
 
String String::operator * (const String &right_2)
{
    String temp;
    char *tmp = NULL;
    int count = 0;
 
    temp.str = new char[1];
    temp.str[0] = '\0';
 
    for(int i = 0; i < strlen(str); i++)
    {
        for(int j = 0; j < right_2.length; j++)
        {
            if(str[i] == right_2.str[j] && count != strlen(str))
            {
                tmp = new char[temp.length + 1];
                count++;
                strcpy(tmp, temp.str);
                delete []temp.str;
                temp.length++;
                temp.str = new char[temp.length+1];
                strcpy(temp.str, tmp);
                temp.str[temp.length-1] = str[i];
                temp.str[temp.length] = '\0';
                delete []tmp;
            }
        }
    }
    return temp;
}
 
String String::operator = (const String &right)
{
    if(this == &right)
        return *this;
 
    delete []str;
    length = right.length;
    str = new char[length + 1];
    strcpy(str, right.str);
 
    return *this;
}
 
String String::operator - (const String &rigght)
{
    String temp;
    char *tmp = NULL;
    int count = 0;
    temp.str = new char[1];
    temp.str[0] = '\0';
 
    for(int i = 0; i < strlen(str); i++)
    {
        for(int j = 0; j < rigght.length; j++)
        {
            if(str[i] != rigght.str[j])
            {
                count++;
                if(count == strlen(rigght.str))
                {
                    tmp = new char[temp.length + 1];
                    strcpy(tmp, temp.str);
                    delete []temp.str;
                    temp.length++;
                    temp.str = new char[temp.length+1];
                    strcpy(temp.str, tmp);
                    temp.str[temp.length-1] = str[i];
                    temp.str[temp.length] = '\0';
                    delete []tmp;
                }
            }
        }
        count = 0;
    }
 
    return temp;
}
 
String operator + (const String &a, char c)
{
    String t;
    t.str = new char[a.length + 1];
    strcpy(t.str, a.str);
    t.str[a.length] = c;
    t.str[a.length + 1] = '\0';
    t.length = a.length + 1;
 
    return t;
}
 
ostream& operator <<(ostream& s, String& x)
{
    return s << x.str;
}
 
String get_lot(const String &a, const String &b)
{
    String temp[5];
    temp[0] = String(a),
    temp[1] = String(b),
    temp[2],
    temp[3],
    temp[4];
 
    temp[2] = temp[0] + temp[1];
    temp[3] = temp[0] * temp[1];
    temp[4] = temp[2] - temp[3];
 
    cout << "a =" << temp[0] << endl;
    cout << "b =" << temp[1] << endl;
    cout << "a + b =" << temp[2] << endl;
    cout << "a * b =" << temp[3] << endl;
    cout << "(a + b) - (a * b) =" << temp[4] << endl;
 
    return temp[4];
}
 
char* String::operator [](int i)
{
    char *p = new char[length + 1];
    for(int i = 0; i < length; i++)
       p[i] = str[i];
    p[length] = '\0';
    return p;
}
 
char *String::get_string()
{
    return str;
}
И был послан ибо это не то, что хотел препод, без каких-либо разъяснений что делать. Вся группа такая-же как и я.
Примерно он хотел, чтобы там использовались шаблонны класс и класс-контейнер, но что-как связать-не пойму. прочитал про библиотеку шаблонных классов. там есть вектор и т.д., а про строку ничего. Дайте наводку. как делать и хоть описание класса- остальное уже постараюсь сделать сам ибо 3 по ООП не хочется, но и препод не идет навстречу тем, кто не знает его предмет.
Заранее спасибо

Добавлено через 5 часов 10 минут
Почитал литературу, примерно понял чего он хочет. Чтобы у меня к строке можно было прибавить данные разных типов. Назрел другой вопрос: если он хочет чтобы я использовал класс- контейнер, то наверное, я возьму map ибо он показался для строк самым подходящим. В книге, к сожалению, уже используются реализованные методы контейнерного класса, мне же нужно написать их самому и не очень понятно что с чем связать

Добавлено через 29 секунд
не только прибавить...разные действия совершить, наверное
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2016, 06:39
Ответы с готовыми решениями:

Создать класс строка и производный класс битовая строка, не работает переопределение операций
Здравствуйте уважаемые форумчане.Мне очень нужна помощь в разработке класса.Сам класс вроде...

Написать класс строка и производный класс, ее шифрующий
Добрый день уважаемые форумчане. Вопрос стоит в решении данной задачи. Мне очень нужна ваша помощь...

Класс строка, класс текст, агрегация
12. Текст (2 класса: строка, текст находятся в отношении агрегации) Конструкторы: по умолчанию, с...

Класс строка
Надо реализовать в классе 1)Создание пустой строки 2)Удаление строки 3)Добавление символа в...

17
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 312
28.04.2016, 10:59 2
а вы наследование проходили? может препод просто хотел дочерний класс от stringа с перегрузкой минуса, и чтобы в конец строки можно было массив интов прибавить?
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
28.04.2016, 14:41  [ТС] 3
Да что-то вроде этого. Только как с строке прибавить инт?

Добавлено через 6 минут
Да-да, а как это сделать. я уже голову переломал. И шаблонный класс создавал и несколько раз переписывал програамму
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
28.04.2016, 15:03 4
Nike1995, немного не понятно, зачем вам класс контейнер, да и я бы предложил вам такой вариант, коль нужно, создайте контейнер векотра, допустим перегрузки для сложения не строк, а чисел, очень даже легко сделать, просто преобразуйте ваши числа в символьный тип, вот вам код
C++
1
2
3
4
5
6
7
void operator+(int number) {
        char* numberInChar;
        itoa(number,numberInChar,10);
 
        for(int i = 0; numberInChar[i] != '\0'; i++)
            someVector.push_back(numberInChar[i]);
    }
Добавлено через 2 минуты
там не помню точно надо выделять память под чар или нет, попробуйте может статический массив не суть, просто я без компилятора сейчас, но смысл в том что можно допустим использовать функцию преодразования числа в строку, наподобии itoa

Добавлено через 1 минуту
если вам так не нравится то напишите свою itoa, она будет принимать число, разбивать его на цифры, а эти цифры будут заносится в строку, ну естественно нужно преобразование адекватное, к символьным числам, допустим цифра 1 если мне не изменяет память это char(49), в ASCII ну и там так далее, найдите таблицу и проблем не возникнет
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
28.04.2016, 15:03  [ТС] 5
Не то, мне нужно к объекту класса Строка перегрузить оператор + так, чтобы можно было конкатинировать как строки, так и числа
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
28.04.2016, 15:18 6
Nike1995, ну а в чем проблемма, сделайте спецификацию шаблона для типа чар допустим, а обычный вид для чисел
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
28.04.2016, 15:24  [ТС] 7
Базовый класс
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
class Base{
protected:
    int n;
public:
    Base();
    Base(int count);
    Base(const Base &copy);
    int get_size() const;
};
 
Base::Base()
{
    n = 0;
}
 
Base::Base(int count)
{
    n = count;
}
 
Base::Base(const Base &copy)
{
    n = copy.n;
}
 
int Base::get_size() const
{
    return n;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "baseClass.h"
 
template <typename T>
class array: public Base{
protected:
    T *arr;
public:
    array();
    array(int count);
    array(int count, T one,...);
    array(const array &copy);
    ~array();
    array<T> insertElem(const array &copy, T el, int id);
    array<T> deleteElem(const array &copy, int id);
 
    T &operator [](int i);
    const T &operator [] (int i) const;
    array<T> operator = (const array<T> &right);
    array<T> operator + (const array<T> &right);
};
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
122
123
124
125
126
127
128
129
130
#pragma once
#include <iostream>
#include "arrayClass.h"
#include "stdarg.h"
using namespace std;
 
template <typename T>
array<T>::array()
{
    arr = NULL;
    n = 0;
}
 
template <typename T>
array<T>:: array(int count)
{
    n = count;
    arr = new T[n];
}
 
template <typename T>
array<T>::array(int count, T one,...)
{
    n = count;
    arr = new T[count];
    va_list vl;
    va_start(vl, count);
    arr[0] = one;
    for(int i = 1; i < count; i++)
    {
        arr[i] = va_arg(vl, T);
    }
    va_end(vl);
}
 
template <typename T>
array<T>::array(const array &copy)
{
    n = copy.n;
    arr = new T[n];
    for(int i = 0; i < n; i++)
    {
        arr[i] = copy.arr[i];
    }
}
 
template <typename T>
array<T>::~array()
{
    delete []arr;
}
 
template <typename T>
array<T> array<T>::insertElem(const array &copy, T el, int id)
{
    int n = copy.get_size()+1;
    array<T> new_arr = new array<T>[n];
    for(int i = 0; i < n; i++)
    {
        new_arr[i] = copy[i];
    }
 
    new_arr[id] = el;
 
    for(int i = 0; i < n - 1; i--)
    {
        new_arr[i] = copy[i - 1];
    }
 
    return new_arr;
}
 
template <typename T>
array<T> array<T>::deleteElem(const array &copy, int id)
{
    int n = copy.get_size() - 1;
    array<T> new_arr = new array<T>[n];
    for(int i = 0; i < id; i++)
    {
        new_arr[i] = copy[i];
    }
    for(int i = id; i < n; i++)
    {
        new_arr[i] = copy[i + 1];
    }
 
    return new_arr;
}
 
template <typename T>
array<T> array<T>::operator + (const array<T> &right)
{
    int r = right.get_size();
    array<T> new_arr = new array<T>[r];
    for (int i = 0; i < r; i++)
    {
        new_arr[i] = left[i];
    }
    cout << new_arr << "!!!" << endl;
    return new_arr;
}
 
template <typename T>
array<T> array<T>::operator = (const array<T> &right)
{
    if (this == &right)
        return right;
 
    n = right.n;
    arr = new T [n];
 
    for (int i = 0; i < n; i++)
    {
        arr[i] = right.data[i];
    }
 
    return this;
}
 
template <typename T>
const T &array<T>::operator [] (int i) const
{
    return arr[i];
}
 
template <typename T>
T &array<T>::operator [] (int i)
{
    return arr[i];
}
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>
#include "baseClass.h"
#include "arrayClass.hpp"
using namespace std;
 
enum Type {TInt, TDouble, TString};
 
 
void printArray(const Base *arr, Type type)
{
    switch (type)
    {
    case TInt:
        {
            cout << "int" << endl;
            const array<int> *arr_1 = static_cast <const array<int>*> (arr);
            const int k = arr->get_size();
            for (int i = 0; i < k; i++)
                cout <<(*arr_1)[i] << " ";
            cout << endl;
            break;
        }
    case TDouble:
        {
            cout << "double" << endl;
            const array<double> *arr_1 = static_cast <const array<double>*>(arr);
            for (int i=0; i<arr->get_size(); i++)
                cout << (*arr_1)[i] << " ";
            cout << endl;
            break;
        }
    case TString:
        {
            cout << "String" << endl;
            const array<char*> *arr_1 = static_cast <const array<char*>*>(arr);
            for(int i = 0; i < arr->get_size();i++)
                cout << (*arr_1)[i] << " ";
            break;
        }
    }
    cout << endl;
}
 
int main()
{
    const array<int> arr1(5, 1,2,3,4,5);
    const array<char*> arr2(2,"asd","bbb");
 
    cout << arr1[1]+arr2[1] << endl;
    printArray(&arr1, TInt);
    printArray(&arr2, TString);
 
    return 0;
}
Добавлено через 1 минуту
Я пару месяцев как начал изучать с++ и ООП, сложновато с лету понимать
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
28.04.2016, 15:30 8
ну если вы имеете ввиду что при строке
Олег + Шульженко = Олег Шульженко -- если чары
5 + 5 = 10 -- если инты то как то так
Это требуется ?

Добавлено через 2 минуты
или при числах результат должен быть 55
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
28.04.2016, 15:30  [ТС] 9
нет
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
28.04.2016, 15:34 10
Nike1995,
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<class T> class myString {
private:
    std::vector<T> info;
public:
 
};
template<class T> T myString::operator+(T &obj) {
    return info.data() + obj;
}
template<> char* myString<char*>::operator+(char* obj) {
    return strcat(info.data() + obj);
}
ну вот пример спецификации, данный код будет неадекватно работать, потому что в векторе может там быть массив чисел и как к нему придавить, просто в массив пихнуть или что на результате получать, просто объясните задание конкретнее, честно очень непонятно говорите чего вы хотите

Добавлено через 51 секунду
ну в данном примере не смотрите на то что возращают операторы, а поймите суть спецификации шаблона для определенного типа

Добавлено через 23 секунды
щас накидаю вообщем целый код, как я представляю ваше задание
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
28.04.2016, 15:34  [ТС] 11
Мне вообще сказали реализовать класс строка и все.
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
28.04.2016, 15:37 12
просто не пойму к чему преподаватель придрался, если задание создать класс строку, если так то вы все правильно делали и добавить перегрузку, для разных типов при сложении и тд, а если он хочет сделать из этого шаблонный класс, то это уже больше похоже на задание создать класс колекцию
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
28.04.2016, 15:37  [ТС] 13
Stitch Igorek, не подскажете как через наследование это сделать? Две программы(что мог) я выложил выше
0
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 312
28.04.2016, 15:54 14
Nike1995, просто при объявлении своего класса напиши
C++
1
2
3
4
class String : public string
{
/*...*/
}
и реализуй для него только перегрузки(поля с массивами не надо), в этом случае ты получишь все методы из базового класса(+, strlen, и т.д.), и сможем природнить к нему свои методы(ну или переопределить существующие, например strlen() у тебя по желанию сможет не длину строки а какое нибудь рандомное число выводить). ну как то так.

Добавлено через 1 минуту
Забыл добавить - там еще конструкторы нужно будет организовать, чтобы они на предка ссылались(только не помню обязательно все или можно некоторые)
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
28.04.2016, 15:57  [ТС] 15
Добавлено через 37 секунд
Stitch Igorek, не очень понимаю как это решает проблему как к строке число приклеить через перегруженный оператор +
0
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 312
28.04.2016, 16:04 16
надо поле - я ошибся - sting str - string базовый а не дочерний

Добавлено через 4 минуты
Nike1995, в базовом классе нет метода
C++
1
operator+(const strig &str, const int &var)
а ты его можешь написать, при этом тебе не надо будет писать метод (string + string), так как он у тебя уже будет от родителя
а как именно это число сплюсовать - это уже реализация - можно перевести в символ, или еще какие нибудь методы выберешь
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
28.04.2016, 16:27  [ТС] 17
А как сделать класс итератор для моего класса?
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
29.04.2016, 17:51 18
Nike1995,
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
template <class T> class iterator {
protected:
    T *ptr;
public:
    iterator() : ptr(nullptr) {}
    iterator(T* ptr) : ptr(ptr) {}
    T& operator*() { return *ptr; }
    T* operator->() { return ptr; }
    bool operator==(const iterator& other) const { return ptr == other.ptr; }
    bool operator!=(const iterator& other) const { return !(*this == other); }
};
template <class T> class std_iterator : public iterator<T> {
public:
    std_iterator() : iterator<T>() {}
    std_iterator(T* ptr) : iterator<T>(ptr) {}
    T* operator++() { return ++ptr; }
    T* operator--() { return --ptr; }
    T* operator+(int i) { return ptr + i; }
    T* operator-(int i) { return ptr - i; }
};
template <class T> class reverse_iterator : public iterator<T> {
public:
    reverse_iterator() : iterator<T>() {}
    reverse_iterator(T* ptr) : iterator<T>(ptr) {}
    T* operator++() { return --ptr; }
    T* operator--() { return ++ptr; }
    T* operator+(int i) { return ptr - i; }
    T* operator-(int i) { return ptr + i; }
};
template <class T> class const_std_iterator : public std_iterator<T> {
public:
    const_std_iterator(T* ptr) : std_iterator<T>(ptr) {}
    const T& operator*() { return *ptr; }
    const T* operator->() { return ptr; }
};
template <class T> class const_reverse_iterator : public reverse_iterator<T> {
public:
    const_reverse_iterator(T* ptr) : reverse_iterator<T>(ptr) {}
    const T& operator*() { return *ptr; }
    const T* operator->() { return ptr; }
};
1
29.04.2016, 17:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.04.2016, 17:51
Помогаю со студенческими работами здесь

Класс Строка
Класс Строка должен включать данное типа строка символов - S и уметь обрабатывать параметр методов...

Класс-строка
Определить класс-строку. В класс включить два конструктора: для определения класса строки строкой...

Класс Строка
На основе типа char создайте класс Stroka. Перегрузите операцию приведения строки типа char к типу...

Класс - строка
Народ, здравствуйте, есть такая задача. Определить класс - строку. в класс включить два...

Класс строка и оператор+
Помогите, пожалуйста, написать программу! А) Создать класс строка. Класс содержит следующие...

Класс. Строка. Чтение из файла.
Добрый день. Возникла проблемка. #include &lt;iostream&gt; using namespace std; class zdanie {...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru