Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
TimeTwo
71 / 71 / 32
Регистрация: 29.11.2009
Сообщений: 326
#1

реализация класса строка - C++

05.01.2012, 22:59. Просмотров 1127. Ответов 13
Метки нет (Все метки)

не могу понять как реализовать ... помогите вот там где "???????????" там абсолютно непонятно, что мне делать....

задание: реализовать класс строка с динамическим кол-вом эел-тов, требования:
1) возврат подстроки (вывести элементы из строки например с 3 по 5)
2) изменить размер строки путем добавления в конец пустых символов
3) вставить подстроку в строку после определенного символа (символ определяется номером)
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
#include <iostream.h>
#include <cstring.h>
 
class String                    
{
   private:
       char* S;   
       size_t len;  
   public:
                String();                   
                String(const char *s);     
                String(const String &s);  
                ~String(){ delete [] S;}          
                
        istream& operator>>(istream&, String&); //  Функция реализует ввод объектов класса с клавиатуры
    ostream& operator<<(ostream&, const String&); //  Функция реализует вывод объектов класса на экран
    char& operator[] (int index) const
                {
                        if (index < 0 || index >= len)
                        {
                                cout << "Выход за рамки." << endl;
                                exit(1);
                        }
                        return S[index];
                }
    size_t GetLen() //  Функция возвращает длину строки
                { 
                        return len;
                }  
    void SubStr (int x, int c) // вывод произвольной подстроки
                {
                        // ????????????
                }
        void Rec (int i, char a) // Запись подствроки в строку
                {
                        // ????????????
                }
    void Space (int n) // Добавление пустых символов 
        {
            // ????????????
        }
        bool Empty ()
                {
                        if (len != 0)
                        {
                                cout << "Строка не пустая" << endl;
                                return true;
                        }
                        else
                        {
                                cout << "Строка пустая" << endl;
                                return false;
                        }
                }
 
};
 
 
istream& operator>>(istream& is, String& str)
{
    const int N = 65536;
    char temp[N] = {0};// Временный массив для многострочного ввода
    size_t Length = 0, //длина последней введенной строки, 
    Total = 0; //общая длина ввода;
    do   // ввод продолжается до ввода пустой строки
    {
        is.getline(temp + Total, N - Total); // запрашиваем строку
        Length = strlen(temp + Total);// замеряем длину введенной строки
        if(Length == 0) // если строка пуста
                {
            break;
                }
        Total += Length + 1 ; // увеличиваем общую длину   1 - это \n 
        temp[Total - 1] = '\n';         
    } while (Total < N);
    temp[Total - 1] = 0; // Убираем последний Enter
    str = temp;// вызываем конструктор преобразования и перегруженный оператор присваивания
        return is;
}
   
 
ostream& operator<<(ostream& os, const String& str)
{
    os << str.S;                //  Вывод строки
    return os;                  //  Возврат объекта вывода
}
 
 
int main()
{
        setlocale (LC_ALL, "Rus");
        int UserChoise, n, z;
        char x;
        String a, b, c;
    cout << "Введите строку: ";
    cin >> a;
        do 
        {
                cout << endl;
                cout << "          Меню" << endl;
                cout << "==========================================" << endl;
                cout << " [1] Чтение подстроки" << endl;
                cout << " [2] Добавление пустых символов" << endl;
                cout << " [3] Вставка подстроки в строку" << endl;
                cout << " [4] Выход" << endl;
                cout << "==========================================" << endl;
                cout << endl;
                cout << "Ваш выбор : ";
                cin >> UserChoise;
                cout << endl;
                switch (UserChoise)
                {
                        
                        case 1: 
                cout << "Введите индекс первого элемента: ";
                                cin >> z;
                                cout << "Введите кол-во символов: ";
                                cin >> n;
                                c.SubStr(z, n);
                                cout << endl;
                                break;
                        case 2:
                                cout << "Введите кол-во пустых символов: ";
                                cin >> n;
                                c.Space(n);
                                cout << endl;
                                break;
                        
                        case 3: 
                    cout << "Введите индекс элемента после которого осуществлять вставку: ";
                                cin >> z;
                                cout << "Введите подстроку: ";
                                cin >> b;
                                c.SubStr(z, n);
                                cout << endl;
                                break; 
                                
                        case 4:
                                cout << "ПОКА !!!!" << endl;
                                break;
                        
                        default:
                                cout << endl << "Неправильный выбор! Попробуйте снова." << endl;
                }
                
        } while (UserChoise != 4);
   
        return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2012, 22:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос реализация класса строка (C++):

Реализация класса на базе класса Stack с возможностью !индексирования! - C++
Помогите пожалуйста!!! Нужно реализовать на базе класса stack другой класс с возможностью индексирования, а именно: Например 1 - й...

класс «Строка» (данные-члены класса – строчка, функции-члены класса – операции) - C++
Помогите пожалйуста с реализацией программы... Реализовать класс «Строка» (данные-члены класса – строчка (указатель на массив, ...

Реализация классов вектор и строка - C++
Для лабораторной работы нужно было написать свою реализацию классов вектор и строка. Выкладываю что получилось, может, кому пригодится. ...

Реализация класса - C++
Спроектировать и реализовать класс BigInt, позволяющий хранить целые числа в диапазоне , и производить набор основных операций с ними. ...

Реализация класса - C++
Так как только начал изучать с++, возникает вопрос: есть задание : Реализовать класс IntArray. Разработать тестовую программу для...

Реализация класса - C++
Помогите понять пожалуйста. Пример из Дейтела: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;GradeBook.h&quot; using namespace...

13
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
05.01.2012, 23:20 #2
Давайте последовательно.
Что происходит в istream& operator>>(istream& is, String& str) ? Куда по-вашему указывает str после возврата из этой функции?
0
TimeTwo
71 / 71 / 32
Регистрация: 29.11.2009
Сообщений: 326
05.01.2012, 23:27  [ТС] #3
эта часть взята из учебника также как и часть вывода...
оператор должен осуществлять ввод объектов класса строки с клавиатуры
0
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
05.01.2012, 23:48 #4
Цитата Сообщение от TimeTwo Посмотреть сообщение
вызываем конструктор преобразования и перегруженный оператор присваивания
Я не вчитался в коммент. Тем не менее, где то, что в нём заявлено?
0
TimeTwo
71 / 71 / 32
Регистрация: 29.11.2009
Сообщений: 326
06.01.2012, 00:21  [ТС] #5
вопрос состоит все равно в другом ...

я абсолютно не понимаю как реализовать фукции что должно быть в местах где ????? и нужно ли что то еще

я не разбираюсь в классах абсолютно ...
0
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
06.01.2012, 00:39 #6
Ладно, предположим, мы волшебным образом заполучили массив символов и его длину.

Для вывода ещё части нужно скормить cin кусок того самого массива начиная с символа x, то есть S[x], заместив временное S[x + c + 1] нулём. Разумеется, нужно сделать проверки, чтобы не вылезти за границу нашего массива.

Добавлено через 1 минуту
Rec, судя по прототипу, заменяет лишь один символ, не наблюдаю ничего, что могло бы вызвать затруднения.

Добавлено через 2 минуты
Если Space добавляет нужное количество пробелов в конце стоки, то нужно выделить новый буфер под символы, ибо в старый новые символы не поместятся, и скопировать туда старую строку, дописав после последнего символа пробелов(можно использовать realloc или чего там есть вместо него в плюсах). Не забыть завершающий ноль и удалить старый массив.
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
06.01.2012, 01:21 #7
Вероятно здесь так
C++
1
2
3
4
5
6
7
8
9
10
        void SubStr (int x, int c) // вывод произвольной подстроки
                {
                   int size=c-x;
                   char* result=new char[size+1]
                    strncpy(result,&s[x],size);
                    result[size]=0;
                    cout<<result; //вывести результат, хотя логичнее было бы вообще-то вернуть подстроку
                     delete [] result;
                    
                }
Я это естественно не компилировал.

Тут Вы что-то напутали, какая же это подстрока когда там просто char, те 1 символ.
C++
1
2
3
4
        void Rec (int i, char a) // Запись подствроки в строку
                {
                        // ????????????  
                }
Это непойми зачем, вряд ли это нужно, думаю стоит просто убрать.
C++
1
2
3
4
        void Space (int n) // Добавление пустых символов 
                {
                        // ????????????
                }
Добавлено через 2 минуты
Цитата Сообщение от NoMasters Посмотреть сообщение
то нужно выделить новый буфер под символы, ибо в старый новые символы не поместятся, и скопировать туда старую строку
Найн! realoc и так сохраняет содержимое строки, если выделять памяти больше чем было так что не надо старую строку копировать. Альтернативы realoc в с++ к сожалению нет, нам советуют использовать string в с++ и не выделывается.
0
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
06.01.2012, 01:22 #8
Gepar, наблюдаю весьма вероятный сегфолт. Что будет проверять х?

Добавлено через 53 секунды
Цитата Сообщение от Gepar Посмотреть сообщение
realoc и так сохраняет содержимое строки,
спасибо, кэп
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
06.01.2012, 02:22 #9
NoMasters, ну а зачем же Вы написали что нужно будет ещё и скопировать старую строку после применения realoc тогда?

Цитата Сообщение от NoMasters Посмотреть сообщение
Gepar, наблюдаю весьма вероятный сегфолт. Что будет проверять х?
Вы о чём? Или Вы о том что я в SubStr (int x, int c) не добавил проверки что x<c и что они вообще положительные числа? Так я и то что в строке вообще есть столько символов не добавлял как-бы, пускай этим занимается уже сам автор.
0
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
06.01.2012, 02:27 #10
Текущая длина строки 25 символов, некто пишет
C++
1
str.SubSrt(30, 34);
Угадай, что будет.

Цитата Сообщение от Gepar Посмотреть сообщение
зачем
Затем, что в плюсах realloc использовать не принято.
0
TimeTwo
71 / 71 / 32
Регистрация: 29.11.2009
Сообщений: 326
06.01.2012, 16:50  [ТС] #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 void SubStr (char a,int z, int c) // вывод произвольной подстроки
                {
                   if (a.len>c){
                   int size=x;
                   char* result=new char[size]
                    strncpy(result,&s[x],size);
                    result[size]=0;
                    cout<<result; //вывести результат, хотя логичнее было бы вообще-то вернуть подстроку
                     delete [] result;
}
else break;
endif;
                    
                }
даже если я выполню проверку что подстрока должна быть не больше чем сама срока .... непонимаю каким образом я буду выводить эту подстроку....
0
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
06.01.2012, 17:02 #12
Что у вас с форматированием? И откуда взялись a и z в параметрах,? Проверять надо то, входит ли стартовый символ в строку. Т.е. x должен быть меньше len. Вообще организуйте свой код нормально для начала.
0
TimeTwo
71 / 71 / 32
Регистрация: 29.11.2009
Сообщений: 326
06.01.2012, 17:04  [ТС] #13
господи если кто то может написать эту программу за вознаграждение ... что бы она работала на borland 3.1 напишите мне icq-2267144
0
TimeTwo
71 / 71 / 32
Регистрация: 29.11.2009
Сообщений: 326
09.01.2012, 00:19  [ТС] #14
сделано ...
0
09.01.2012, 00:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2012, 00:19
Привет! Вот еще темы с ответами:

реализация класса - C++
Дано: класс &quot;Фильмы&quot; (название, жанр, главные роли). Вопрос: Возможно ли такой подход к реализации? class films { string...

Реализация класса множества - C++
Реализую класс множества. Некорректно работает удаление элемента из множества. Прошу помощи // Ðåàëèçàöèÿ êëàññà ìíîæåñòâà #include...

Реализация класса матрица - C++
День добрый форум! Хочу узнать ваше мнение по поводу того, как лучше реализовать класс матриц. Какую структуру лучше выбрать?...

Реализация класса контейнер. - C++
Естественно, это нужно сделать без использования подключаемых библиотек. Описать шаблон-класс нужно сначало. И затем программу, которая...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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