Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15

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

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

Студворк — интернет-сервис помощи студентам
Добрый вечер! Облазила весь форум, но нужной информации так и не нашла для себя) В общем, вот в чем вся соль:
Нужно написать класс строк с различными функциями (а именно,: ввод, вывод, конкатенация (+), наибольшая общая подпоследовательность (*), дистанция (-), выделение подстроки, копирование, сравнение, поиск подстроки).
Я пока только начала (ну как только, около недели уже парюсь), удалось написать лишь ввод (сей естественно будет с клавиатуры).
Прошу помочь хотя бы с конкатенацией, ну и за одно ввод посмотрите. Вот код:
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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2012, 22:35
Ответы с готовыми решениями:

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

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

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

5
 Аватар для Konstantin_D
15 / 15 / 6
Регистрация: 21.07.2011
Сообщений: 89
01.04.2012, 17:21
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
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  [ТС]
Konstantin_D, здорово, спасибо но как сделать тоже самое, но ввод строк осуществлять с клавиатуры? мой бред, видимо, здесь не годится?

Добавлено через 27 минут
villu, что-то со swap я не могу разобраться..судя по комментарию, чтобы поймать возможные исключения, вы вынесли все это в отдельную функцию?
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
01.04.2012, 18:32
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  [ТС]
villu, столько нового)) спасибо, понятно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.04.2012, 18:49
Помогаю со студенческими работами здесь

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

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

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

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

Замена структуры с функциями на класс с методами
Заменить код приведенный ниже на соответствующие объявление класса golf. Замените функцию setgolf(golf &amp; g, const char*name, int hc);...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru