0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15
1

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

31.03.2012, 22:35. Показов 895. Ответов 5
Метки нет (Все метки)

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
#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;
 }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2012, 22:35
Ответы с готовыми решениями:

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

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

Создать какой-нибудь класс. Например класс автомобиль, объявить в нем поля с различными режимами доступа
Создать какой-нибудь класс. Например класс автомобиль, объявить в нем поля с различными режимами...

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

5
15 / 15 / 6
Регистрация: 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;
}
0
204 / 205 / 16
Регистрация: 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: писал прямо тут, на компиляторе не проверял, но, думаю, направление понятно.
1
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15
01.04.2012, 18:13  [ТС] 4
Konstantin_D, здорово, спасибо но как сделать тоже самое, но ввод строк осуществлять с клавиатуры? мой бред, видимо, здесь не годится?

Добавлено через 27 минут
villu, что-то со swap я не могу разобраться..судя по комментарию, чтобы поймать возможные исключения, вы вынесли все это в отдельную функцию?
0
204 / 205 / 16
Регистрация: 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 САМ очищает за собой память в деструкторе.
Советую запомнить этот прием
1
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15
01.04.2012, 18:49  [ТС] 6
villu, столько нового)) спасибо, понятно
0
01.04.2012, 18:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.04.2012, 18:49
Помогаю со студенческими работами здесь

Подсчет строк с различными элементами
Написал программу, но она не считает что нужно( Найти количество строк матрицы MxN, в которых все...

Добавление строк в таблицу с различными данными
Доброго времени суток, форумчане! Как сделать таблицу из 5 колонок, в первой ячейке первой строки...

Нужен класс со статическими функциями
кому не сложно киньте несколько кодов для C# нужен класс со статическими функциями зарание спасибо

Замена структуры с функциями на класс с методами
Заменить код приведенный ниже на соответствующие объявление класса golf. Замените функцию...


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

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

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