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

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

Восстановить пароль Регистрация
 
TimeTwo
68 / 68 / 31
Регистрация: 29.11.2009
Сообщений: 318
05.01.2012, 22:59     реализация класса строка #1
не могу понять как реализовать ... помогите вот там где "???????????" там абсолютно непонятно, что мне делать....

задание: реализовать класс строка с динамическим кол-вом эел-тов, требования:
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,094
05.01.2012, 23:20     реализация класса строка #2
Давайте последовательно.
Что происходит в istream& operator>>(istream& is, String& str) ? Куда по-вашему указывает str после возврата из этой функции?
TimeTwo
68 / 68 / 31
Регистрация: 29.11.2009
Сообщений: 318
05.01.2012, 23:27  [ТС]     реализация класса строка #3
эта часть взята из учебника также как и часть вывода...
оператор должен осуществлять ввод объектов класса строки с клавиатуры
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,094
05.01.2012, 23:48     реализация класса строка #4
Цитата Сообщение от TimeTwo Посмотреть сообщение
вызываем конструктор преобразования и перегруженный оператор присваивания
Я не вчитался в коммент. Тем не менее, где то, что в нём заявлено?
TimeTwo
68 / 68 / 31
Регистрация: 29.11.2009
Сообщений: 318
06.01.2012, 00:21  [ТС]     реализация класса строка #5
вопрос состоит все равно в другом ...

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

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

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

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

Добавлено через 2 минуты
Если Space добавляет нужное количество пробелов в конце стоки, то нужно выделить новый буфер под символы, ибо в старый новые символы не поместятся, и скопировать туда старую строку, дописав после последнего символа пробелов(можно использовать realloc или чего там есть вместо него в плюсах). Не забыть завершающий ноль и удалить старый массив.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
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 в с++ и не выделывается.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,094
06.01.2012, 01:22     реализация класса строка #8
Gepar, наблюдаю весьма вероятный сегфолт. Что будет проверять х?

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

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

Цитата Сообщение от Gepar Посмотреть сообщение
зачем
Затем, что в плюсах realloc использовать не принято.
TimeTwo
68 / 68 / 31
Регистрация: 29.11.2009
Сообщений: 318
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;
                    
                }
даже если я выполню проверку что подстрока должна быть не больше чем сама срока .... непонимаю каким образом я буду выводить эту подстроку....
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,094
06.01.2012, 17:02     реализация класса строка #12
Что у вас с форматированием? И откуда взялись a и z в параметрах,? Проверять надо то, входит ли стартовый символ в строку. Т.е. x должен быть меньше len. Вообще организуйте свой код нормально для начала.
TimeTwo
68 / 68 / 31
Регистрация: 29.11.2009
Сообщений: 318
06.01.2012, 17:04  [ТС]     реализация класса строка #13
господи если кто то может написать эту программу за вознаграждение ... что бы она работала на borland 3.1 напишите мне icq-2267144
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2012, 00:19     реализация класса строка
Еще ссылки по теме:

Реализация класса C++
Реализация класса Цех C++
C++ Реализация конструктора класса

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

Или воспользуйтесь поиском по форуму:
TimeTwo
68 / 68 / 31
Регистрация: 29.11.2009
Сообщений: 318
09.01.2012, 00:19  [ТС]     реализация класса строка #14
сделано ...
Yandex
Объявления
09.01.2012, 00:19     реализация класса строка
Ответ Создать тему
Опции темы

Текущее время: 15:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru