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

Класс строк с различными функциями - C++

Восстановить пароль Регистрация
 
Amy_lee
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15
31.03.2012, 22:35     Класс строк с различными функциями #1
Добрый вечер! Облазила весь форум, но нужной информации так и не нашла для себя) В общем, вот в чем вся соль:
Нужно написать класс строк с различными функциями (а именно,: ввод, вывод, конкатенация (+), наибольшая общая подпоследовательность (*), дистанция (-), выделение подстроки, копирование, сравнение, поиск подстроки).
Я пока только начала (ну как только, около недели уже парюсь), удалось написать лишь ввод (сей естественно будет с клавиатуры).
Прошу помочь хотя бы с конкатенацией, ну и за одно ввод посмотрите. Вот код:
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
#include<iostream>
#include<string>
#include<conio.h>
 
using namespace std;
class mystr
{
    char* str;
    int length;
 
public:
 
    char scanf();
    char concat(char *str1, char *str2); //будущая конкатенация строк
 
   mystr() {str=NULL;}
 
   mystr (const char *s)
   { length = strlen(s);
   str = new char[length+1];   
   strcpy(str,s);
   }
 
   ~mystr(){delete str;} 
}; 
 
char mystr::scanf()
{
    int i=0;
    int size = 5;
    char * str = new char[size];
 
    do{
    while(i < size){
        str[i] = getc(stdin);
        if(str[i] == '\n') {str[i] = 0; i++; break;}
        i++;
    }
    if(str[i-1])
    {
        char *newstr = new char[size*2];
        for(int j=0;j<size;j++) newstr[j] = str[j];
        size*=2;
        delete str;
        str = newstr;
    }
    }while(str[i-1]);
    return * str;
}
 
char mystr::concat(char *str1, char *str2)       //  ?
{
}
 
 
 
 int main(void)
 {
     mystr A,B;
 
     A.scanf();
     B.scanf();
 
     getch();
     return 0;
 }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2012, 22:35     Класс строк с различными функциями
Посмотрите здесь:

C++ Создать абстрактный класс с виртуальной функцией вычисления нормы и модуля; определить производные классы с собственными функциями
C++ Создать абстрактный базовый класс с виртуальными функциями - площадь и периметр.
Создать базовый класс список. Реализовать на базе списка стек и очередь с виртуальными функциями вставки и вытаскивания C++
Реализовать класс больших чисел с функциями сложения, вычитания, записи и вывода C++
C++ Создать класс с перегруженными функциями и продемонстрировать различные способы наследования
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
01.04.2012, 17:21     Класс строк с различными функциями #2
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
#include <iostream>
#include <string>
using namespace std;
 
class mystr
{
    char* str;
    int length;
public:
    mystr();
    mystr(const char *s);
    mystr(const mystr& str);
    ~mystr() {delete [] str;} // внимание на []
    mystr& operator=(const mystr& s);
    friend mystr operator+(const mystr& s1, const mystr& s2); // конкатенация строк
    friend ostream& operator<<(ostream& os, const mystr& str);
}; 
mystr::mystr()
{
    str = new char [1];
    str[0] = '\0';
    length = 0;
}
mystr::mystr (const char *s)
{
    length = strlen(s);
    str = new char[length+1];   
    strcpy(str,s);
}
mystr::mystr(const mystr& s)
{
    length = s.length;
    str = new char [length+1];
    strcpy(str, s.str);
}
mystr& mystr::operator=(const mystr& s)
{
    if (this == &s)
        return *this;
    delete [] str;
    length = s.length;
    str = new char [length+1];
    strcpy(str, s.str);
    return *this;
}
mystr operator+(const mystr& s1, const mystr& s2)
{
    char* tmp = new char[s1.length + s2.length + 1];
    strcpy(tmp, s1.str);
    strcpy(tmp+s1.length, s2.str);
    return mystr(tmp);
}
ostream& operator<<(ostream& os, const mystr& s)
{
    os << s.str;
    return os;
}
 
int main()
{
    mystr A("qwe rty");
    mystr B("asd fgh");
    cout << A << endl << B << endl;
    mystr C("A + B = " + A + " " + B);
    cout << C << endl;
    C = A;
    cout << C << endl;
}
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
01.04.2012, 17:38     Класс строк с различными функциями #3
C++
1
2
3
4
5
6
7
8
9
10
mystr& mystr::operator=(const mystr& s)
{
    if (this == &s)
        return *this;
    delete [] str;
    length = s.length;
    str = new char [length+1];
    strcpy(str, s.str);
    return *this;
}
лучше так.
C++
1
2
3
4
5
6
7
8
9
10
11
mystr& mystr::operator=(const mystr& s)
{
    if (this == &s)
        return *this;
    char *tmp = new char [s.length + 1]; // может кинуть исключение
    delete [] str;
    str = tmp;
    length = s.length;
    strcpy(str, s.str);
    return *this;
}
иначе небезопасно.
А еще лучше реализовать через безопасный swap
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void mystr::swap(mystr& other) /*throw()*/ {
 
    char *tmp = other.str;
    other.str = str;
    str = tmp;
 
    int tlen = other.length;
    other.length = length;
    length = tlen
 
}
 
mystr& mystr::operator=(const mystr& s)
{
    mystr tmp(s);
    swap(tmp);
    return *this;
}
PS: писал прямо тут, на компиляторе не проверял, но, думаю, направление понятно.
Amy_lee
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15
01.04.2012, 18:13  [ТС]     Класс строк с различными функциями #4
Konstantin_D, здорово, спасибо но как сделать тоже самое, но ввод строк осуществлять с клавиатуры? мой бред, видимо, здесь не годится?

Добавлено через 27 минут
villu, что-то со swap я не могу разобраться..судя по комментарию, чтобы поймать возможные исключения, вы вынесли все это в отдельную функцию?
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
01.04.2012, 18:32     Класс строк с различными функциями #5
Amy_lee, смотри какое дело:
вызов new может кинуть исключение и в случае если это произойдет тут
C++
1
2
3
    delete [] str;
    length = s.length;
    str = new char [length+1];
У нас получится "сломанный" объект. То есть: у нас будет новая длина, но значение указателя СТАРОЕ, поскольку new кинул исключение и значение str не изменилось. И более того, оно уже удалено, то есть str у нас указывает вникуда.
Лечится это либо выделение памяти сначала и в случае успаха присваиванием нового значения:
C++
1
2
3
    char *tmp = new char [s.length + 1]; // выделили
    delete [] str; // удалили. delete исключениями не кидается
    str = tmp; // сменили, все хорошо
Со swap это есть такой распространенный прием. Дело в том, что swap не кидает исключений (обычно) потому что сделан так, что просто меняет значения указателей у двух объектов местами.
C++
1
2
3
4
5
6
7
8
9
10
11
void mystr::swap(mystr& other) /*throw()*/ {
    // поменяли указатели местами
    char *tmp = other.str;
    other.str = str;
    str = tmp;
 
    // поменяли размеры местами
    int tlen = other.length;
    other.length = length;
    length = tlen
}
функция гарантированно не кинет исключений
далее мы делаем так:

Создаем новый объект
меняемся с ним указателями
возвращаем ссылку на себя
C++
1
2
3
4
5
{
    mystr tmp(s); // может кинуть исключение, но при этом мы не сломаем this 
    swap(tmp);    // безопасно, мы ничего не сломаем
    return *this;   // ну понятно
}  // тут будет вызван деструктор объекта tmp, который подчистит старую память
В довесок новый объект tmp САМ очищает за собой память в деструкторе.
Советую запомнить этот прием
Amy_lee
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15
01.04.2012, 18:49  [ТС]     Класс строк с различными функциями #6
villu, столько нового)) спасибо, понятно
Yandex
Объявления
01.04.2012, 18:49     Класс строк с различными функциями
Ответ Создать тему
Опции темы

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