Класс строки (удаление из строки слова с заданным номером и символа с заданным номером)

Myptuk

Описать в классе (строки) функции удаления из строки слова с заданным номером и символа с заданным номером. Каждая функция возвращает новую строку. Нужна помощь! (с++)
14 ответов

Myptuk

#include <iostream>
#include <string>
 
class String
{
    std::string str_;
    static const char* tokens; 
public:
    String(std::string str): str_(str) {} 
    std::string deleteWord(const size_t& position)
    {
        size_t beginPos = 0, nextPos = 0, wordPos = 0;
        std::string str(str_);
        if (((beginPos = str.find_first_of(tokens)) != 0) && position - 1 == 0)
        {
            str.erase(0, beginPos);
            return str;
        }
        else
            ++wordPos;
        while((beginPos = str.find_first_of(tokens, nextPos)) != std::string::npos)
        {
            if ((nextPos = str.find_first_of(tokens, beginPos + 1)) == std::string::npos)
                nextPos = str.size();
            if ((nextPos - beginPos) > 1)
            {
                if (wordPos == position - 1)
                {
                    str.erase(beginPos + 1, nextPos - (beginPos + 1));
                    return str;
                }
                ++wordPos;
            }
        } 
    }
    std::string deleteCharacter(const size_t position)
    {
        std::string str(str_);
        if (position <= str.size())
            str.erase(position - 1, 1);
        return str;
    }
    friend std::ostream& operator <<(std::ostream&, String);
};
const char* String::tokens = ", .?!:(){}[];"; 
 
std::ostream& operator <<(std::ostream& t, String obj)
{
    return (t << obj.str_);
}
 
int main()
{
    String str = "one, two, (three), [four;five";
    String strWithoutWord = str.deleteWord(4);
    strWithoutWord = strWithoutWord.deleteWord(1);
    std::cout << strWithoutWord << '\n';
    String strWithoutChar = strWithoutWord.deleteCharacter(3);
    std::cout << strWithoutChar << '\n';
    system("pause");
    return 0;
}


Myptuk

Myptuk,
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
 
class String{
    private:
        string str;                     //строка
 
    public:
        String():str("") {}                 //конструктор по умолчанию
        String(string _str):str(_str) {}    //конструктор с параметрами
 
        string get_string(){                //просмотреть содержимое строки
            return str;                     
        }
 
        string del_word(int number){        //метод удаления слова
            int count(0);                   //счетчик слов
            string word;                    //промежуточное слово
            istringstream ii(str);
 
            str.clear();                    //очищаем строку
            while(ii >> word){              //берем по слову
                ++count;                    //увеличиваем счетчик
 
                if(count != number)         //если слово не соответсвует заданному
                    str += (word + ' ');        //записываем в строку
            }
 
            return str;                     //возвращаем строку
        }
 
        string del_symbol(int number){          //метод удаления символа
            str.erase(number, 1);               //алгорим удаления одного символа
            return str;                         //возвращаем строку
        }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    String line("Hello world! I love programming.");
 
    line.del_word(4);
    cout << line.get_string() << endl;
 
    line.del_symbol(3);
    cout << line.get_string() << endl;
 
    cout << "\n\n";
    return 0;
}


Myptuk

спасибо, думаю разберусь теперь гляньте пожалуйста. что-то ничего не происходит.Stroka.h :
#pragma once
 
class Stroka
{
    char *str;
    int n;
public:
    Stroka(void);
    ~Stroka(void);
 
    void Input(void);
    void Print(void);
    Stroka del_word(int number)
    Stroka del_symbol(int number)
    Stroka get_string()
};
Stroka.cpp
#include "StdAfx.h"
#include "Stroka.h"
#include "iostream"
using namespace std;
 
Stroka::Stroka(void)
{
    str=0;
    n=0;
    cout<<"stroka sozdana"<<endl;
}
 
Stroka::~Stroka(void)
{
    delete[]str;
    cout<<"stroka udalena"<<endl;
}
void Stroka::Input(void)
{
    cout<<"Vvedi stroky: "<<endl;
    char buf[100];
    cin.getline(buf,100);
    while (buf[n])
    {
        n++;
    }
    str=new char[n+1];
    for (int i=0;i<n;i++)
    {
        str[i]=buf[i];
    }
}
void Stroka::Print(void)
{
    cout<<"Stroka: "<<endl;
    for (int i=0;i<n;i++)
    {
        cout<<str[i]<<endl;;
    }
}
Stroka::del_word(int number)
{       
    int count(0);                   //счетчик слов
    string word;                    //промежуточное слово
    istringstream ii(str);
 
    str.clear();                    //очищаем строку
    while(ii >> word)
    {              //берем по слову
        ++count;                    //увеличиваем счетчик
 
        if(count != number)         //если слово не соответсвует заданному
            str += (word + ' ');        //записываем в строку
    }
 
    return str;                     //возвращаем строку
}
Stroka::del_symbol(int number)
{
    str.erase(number, 1);               //алгорим удаления одного символа
    return str;                         //возвращаем строку
}
Stroka::get_string()
{                
    return str;                     
}
};
само тело class2.cpp :
// class2.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "Stroka.h"
#include "IOstream"
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    Stroka s1;
    s1.Input();
    s1.Print();
 
    s1.del_word(1);
    cout << s1.get_string() << endl;
 
    s1.del_symbol(3);
    cout << s1.get_string() << endl;
 
    cout << "\n\n";
    return 0;
}


Myptuk

Myptuk,
#pragma once
#include "string"
 
class Stroka
{
    string str;
    int n;
public:
    Stroka(void);
    ~Stroka(void);
 
    void Input(void);
    void Print(void);
    Stroka del_word(int number);
    Stroka del_symbol(int number);
};
#include "StdAfx.h"
#include "Stroka.h"
#include "iostream"
#include "sstream"
#include "string"
using namespace std;
 
Stroka::Stroka(void)
{
    str=0;
    n=0;
    cout<<"stroka sozdana"<<endl;
}
 
Stroka::~Stroka(void)
{
    cout<<"stroka udalena"<<endl;
}
void Stroka::Input(void)
{
    cout<<"Vvedi stroky: "<<endl;
    getline(cin, str, '\n');
}
 
void Stroka::Print(void)
{
    cout << str << endl;
}
 
Stroka::del_word(int number)
{       
    int count(0);                   //счетчик слов
    string word;                    //промежуточное слово
    istringstream ii(str);
 
    str.clear();                    //очищаем строку
    while(ii >> word)
    {              //берем по слову
        ++count;                    //увеличиваем счетчик
 
        if(count != number)         //если слово не соответсвует заданному
            str += (word + ' ');        //записываем в строку
    }
 
    return str;                     //возвращаем строку
}
Stroka::del_symbol(int number)
{
    str.erase(number, 1);               //алгорим удаления одного символа
    return str;                         //возвращаем строку
}
};
#include "stdafx.h"
#include "Stroka.h"
#include "IOstream"
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    Stroka s1;
    s1.Input();
    s1.Print();
 
    s1.del_word(1);
    cout << s1.Print() << endl;
 
    s1.del_symbol(3);
    cout << s1.Print() << endl;
 
    cout << "\n\n";
    return 0;
}


Myptuk

нифига не выводит


Myptuk

Myptuk,
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
 
class Stroka
{
    string str;
    int n;
 
    public:
        Stroka(void);
        ~Stroka(void);
 
        void Input(void);
        string Print(void);
        string del_word(int number);
        string del_symbol(int number);
};
 
Stroka::Stroka(void)
{
    str = "";
    n = 0;
    cout<<"stroka sozdana"<<endl;
}
 
Stroka::~Stroka(void)
{
    cout<<"stroka udalena"<<endl;
}
 
void Stroka::Input(void)
{
    cout<<"Vvedi stroky: "<<endl;
    getline(cin, str, '\n');
}
 
string Stroka::Print(void)
{
    return str;
}
 
string Stroka::del_word(int number)
{       
    int count(0);                   //счетчик слов
    string word;                    //промежуточное слово
    istringstream ii(str);
 
    str.clear();                    //очищаем строку
    while(ii >> word)
    {              //берем по слову
        ++count;                    //увеличиваем счетчик
 
        if(count != number)         //если слово не соответсвует заданному
            str += (word + ' ');        //записываем в строку
    }
 
    return str;                     //возвращаем строку
}
string Stroka::del_symbol(int number)
{
    str.erase(number, 1);               //алгорим удаления одного символа
    return str;                         //возвращаем строку
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    Stroka s1;
    s1.Input();
    s1.Print();
 
    s1.del_word(1);
    cout << s1.Print() << endl;
 
    s1.del_symbol(3);
    cout << s1.Print() << endl;
 
    cout << "\n\n";
    return 0;
}


Myptuk

Указания к работе: Разработать класс MyString, реализующий для класса символьной строки несколько конструкторов, деструктор и функции ввода-вывода. Реализовать в этом классе заданные в варианте индивидуального задания функции. Создание объектов класса, ввод исходных данных, вызов разработанных функций, проверку успешности их выполнения и печать результатов работы выполнять из функции main() программы. Каждая функция разрабатывается без использования стандартных функций (обработка массивов char[] с помощью циклов). При необходимости создать и вернуть из функции новую строку функция должна иметь возвращаемое значение типа MyString. Память под объект должна выделяться в создающей его функции, освобождаться (явно или неявно) – в main(). В остальных случаях тип возвращаемого значения определяется самостоятельно. Функции типа void не использовать.строка должна задаваться массивом char *str, и класс должен быть Stroka.h и Stroka.cpp, в одно всё нельзя слить..


Myptuk

Myptuk, ну так вы же не описали с самого начала задание, я и не знал


Myptuk

ИСХОДНЫЙ КОД:
#pragma once
 
class Stroka
{
    char *str;
    int n;
public:
    Stroka(void);
    ~Stroka(void);
 
    void Input(void);
    void Print(void);
};
}
#include "StdAfx.h"
#include "Stroka.h"
#include "iostream"
using namespace std;
 
Stroka::Stroka(void)
{
    str=0;
    n=0;
    cout<<"stroka sozdana"<<endl;
}
 
Stroka::~Stroka(void)
{
    delete[]str;
    cout<<"stroka udalena"<<endl;
}
void Stroka::Input(void)
{
    cout<<"Vvedi stroky: "<<endl;
    char buf[100];
    cin.getline(buf,100);
    while (buf[n])
    {
        n++;
    }
    str=new char[n+1];
    for (int i=0;i<n;i++)
    {
        str[i]=buf[i];
    }
}
void Stroka::Print(void)
{
    cout<<endl;
    for (int i=0;i<n;i++)
    {
        cout<<str[i];
    }
    cout<<endl;
}
// class2-2.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "Stroka.h"
#include "IOstream"
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    Stroka s1;
    s1.Input();
    s1.Print();
    return 0;
}
yoghurt92, сможешь помочь?


Myptuk

Myptuk, щас)Myptuk,
#pragma once
 
class Stroka
{
        char *str;
        int n;
 
    public:
        Stroka(void);
        ~Stroka(void);
 
        void Input(void);
        char *Print(void);
        char *del_symbol(int);
        char *del_word(int);
};
#include "StdAfx.h"
#include "Stroka.h"
#include "iostream"
#include <conio.h>
#include <stdio.h>
#include <ctype.h>
using namespace std;
 
Stroka::Stroka(void):str(NULL), n(0) {}
 
Stroka::~Stroka(void){ delete[]str; }
 
void Stroka::Input(void)
{
    str = new char[100];
 
    cout << "Введите строку: ";
    cin.getline(str,100);
}
 
char *Stroka::Print(void)
{
    return str;
}
 
char *Stroka::del_symbol(int number)
{
    int size = strlen(str);
    char *_str = new char[size];
    strcpy(_str, str);
    memset(str, 0, 100);
 
    for(unsigned i = 0, k = 0; i < strlen(_str); ++i)
        if(i != number){
            str[k] = _str[i];
            ++k;
        }
 
    return str;
}
 
char *Stroka::del_word(int number)
{
    int size = strlen(str);
    char *s = new char[size];
    int count = 1;
 
    s[0]='\0';
    char *token = strtok (str, "!;:,.?- ");
    while  (token  !=NULL)
    {   
        if (count != number)    { strcat (s,token); strcat (s," "); }
        token = strtok(NULL,"`!;:,.?- ");
        ++count;
    }
 
    strcpy(str,s);
 
    return str;
}
#include "stdafx.h"
#include "Stroka.h"
#include "IOstream"
#include <Windows.h>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    Stroka s1;
    s1.Input();
    cout << s1.del_symbol(3) << endl;
    cout << s1.del_word(3);
 
    cout << endl;
    return 0;
}


Myptuk

зачем переписал принт (ну всмысле поставил возвращаемое char и указатель)? он же работал нормально.
Stroka::Stroka(void):str(NULL), n(0) {}
это не очень понял смысл) было так как меня учили, работало) и библиотеки
#include <conio.h>
#include <stdio.h>
#include <ctype.h>
#include <Windows.h>
первый раз вижу, не представляю что это, как и сам код функций не разобрал)
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
и это что такое?))а так спасибо, жаль не понятно многое проще точно никак? я первый курс, этого ничего не знаем еще, а то что знаем - тоже не знаем, препод не очень, а зачет горит)))и недочет нашел) каждая функция должна работать с исходной строкой.там смысл должен быть типа разбить строку на подстроки разделенные пробелом, пронумеровать их, удалить нужную подстроку и вернуть в одну строку, а удаление символа должно работать на любой символ, даже на пробел, так что ты всё сделал очень круто, но мне нужно самый простой вариант) С++ для начинающих)


Myptuk

и это что такое?))
Установка кодовой страницы для консоли в ОС Windows
это не очень понял смысл
инициализация str нулем и n нулем
зачем переписал принт
Скорее всего чтобы не зависеть от консоли. Хотя это странно при наличии такого метода Input


Myptuk

да это понял уже. библиотеки эти не используем только и функции должны работать каждый раз с исходной строкой


Myptuk

Myptuk,
#pragma once
 
class Stroka
{
    //приватные поля класса
    public:
        char *str;              //наша строка
 
    public:
        Stroka(void);           //конструктор по умолчанию
        ~Stroka(void);          //деструктор
 
        void Input(void);           //метод ввода строки
        char *Print(void);          //метод вывода строки
        char *del_symbol(int);      //метод удаления заданного символа
        char *del_word(int);        //метод удаления заданного слова
};
#include "StdAfx.h"
#include "Stroka.h"
#include "iostream"
#include <conio.h>
#include <stdio.h>
#include <ctype.h>
using namespace std;
 
Stroka::Stroka(void)        //конструктор по умолчанию
{
    str = NULL;         //строка пустая
}
 
Stroka::~Stroka(void)       //деструктор
{ 
    delete[]str;            //освобождаем выделенную память
}
 
void Stroka::Input(void)        //метод ввода строки
{
    str = new char[100];        //выделяем память
 
    cout << "Введите строку: ";
        cin.getline(str, 100);      //вводим строку но не более 100 символов
}
 
char *Stroka::Print(void)
{
    return str;
}
 
char *Stroka::del_symbol(int number)        //процедура удаления символа
{
    int size = strlen(str);                 //размер строки
    char *_str = new char[size];            //выделяем память
 
    for(unsigned i = 0, k = 0; i < strlen(_str); ++i)
        //копируем в новую строку все символы кроме указанного
        if(i != number){
             _str[k] = str[i];
            ++k;
        }
 
    return _str;                        //возвращаем новую строку
}
 
char *Stroka::del_word(int number)      //процедура удаления слова
{
    int size = strlen(str);             //размер строки
    char *_str = new char[size];            //выделяем память
    int count = 1;                      //счетчик слов
 
    char *token = strtok (str, "!;:,.?- ");     //возможные разделители слов
 
    _str[0] = '\0';
    while(token != NULL)
    {   
        if(count != number)         //копируем в новую строку все слова
        {                           //кроме указанного
            strcat(_str, token); 
            strcat(_str, " "); 
        }
 
        token = strtok(NULL,"`!;:,.?- ");
        ++count;
    }
 
    return _str;                    //возвращаем новую строку
}
#include "stdafx.h"
#include "Stroka.h"
#include "IOstream"
#include <Windows.h>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    //для отображения кириллицы в консоли
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    Stroka s1;          //создаем объект класса
    s1.Input();         //вводим строку
 
    cout << s1.del_symbol(3) << endl;       //удаляем 3 символ в строке
    cout << s1.del_word(3) << endl;         //удаляем 3 слово в строке
    cout << s1.Print() << endl;             //выводим исходную строку
 
    cout << endl;
    return 0;
}