Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Динамическая строка и перегрузка операций


Автор: LipaNia 17.11.2007, 01:52
[C++]

Пользовательский класс String должен содержать необходимые элементы-данные, которые создаются в динамической области памяти.

Конструктор для создания строк:String (…);

Деструктор:~String(); 

Метод ввода исходной строки: Set();

Метод печати:void print(…);

Код методов  – вне пространства определения класса 
Программа иллюстрирует прямой и косвенный способы обращения к методам

 smile  smile  smile 

Кста тож не могу решить, но очень сильно нужно...

Ввести с клавиатуры строку  символов S1. Признак окончания ввода строки - нажатие клавиши "Ввод". Программа должна содержать перегруженную операцию «=», использование которой скопирует S1 в S2 при следующих условиях: без всех a..z;

 smile 


Автор: AndrRus 17.11.2007, 23:00
LipaNia, не совсем понял формулировку задачи: это все одна программа?

В общем вот код программы, как я это понял, так что сразу прошу извинить, если что-то не так:

file.h
Код

#ifndef _file_h_
#define _file_h_

#include <string>

using std::string;

#include <iostream>

using std::cout;
using std::endl;
using std::cin;

class MyClass {
private:
    string *line;
    int size;

public:
    MyClass (int = 1);
    ~MyClass ();

    void set ();
    void print ();

    MyClass &operator = (const MyClass &argument);
};

#endif


<name>.cpp
Код

#include "file.h"

MyClass::MyClass (int N) {
    size = N > 0 ? N: 1;
    line = new string [size];
}

MyClass::~MyClass () {
    if (line) {
        delete []line;
        line = NULL;
    }
}

void MyClass::set () {
    for (int i = 0; i < size; i++) {
        cout << "Enter line " << i + 1 << ": ";
        getline (cin, line[i]);
    }
}

void MyClass::print () {
    cout << "\nLines: " << endl;
    for (int i = 0; i < size; i++) {
        cout << "Line " << i + 1 << ": " << line[i] << endl;
    }
}

MyClass &MyClass::operator = (const MyClass &argument) {
    if (line) { delete[] line; line = NULL; }
    size = argument.size;
    line = new string [size];
    for (int i = 0; i < size; i++) {
        string temp ("az");
        for (int j = 0; j < 2; j++) {
            line[i] = argument.line[i];
            int position = line[i].find (temp[j]);
            while (position != string::npos) {
                line[i].replace (position, 1, "");
                position = line[i].find (temp[j], position + 1);
            }
        }
    }
    return *this;
}
    


main.cpp
Код

#include "file.h"

int main () {
    MyClass obj_first (2);

    obj_first.set ();
    obj_first.print ();

    MyClass obj_second; 
    obj_second = obj_first;

    obj_second.print ();
    
    return 0;
}

Автор: LipaNia 18.11.2007, 13:02
Ввести с клавиатуры строку  символов S1. Признак окончания ввода строки - нажатие клавиши "Ввод". Программа должна содержать перегруженную операцию «=», использование которой скопирует S1 в S2 при следующих условиях: без всех a..z;
  Вот собсна само задание ! А вначале идёт просто описание метода ! smile  я тупой ! ДА ?


Автор: Oleg_Ci 26.11.2007, 10:02
Код

// MS 2005
#include <iostream>
#include <cstring>
using namespace std;

////////////////// class //////////////////////////////////////////
class String{
private:
// ... элементы-данные создаются в динамической области памяти.
    char *m_pszStr; // указатель на строку с нулём на коце
    int *m_pnSize; // указатель на размер строки

    void New( const char *str ); // выделение памяти
    void Del(); // удаление памяти

public:
    String(); // конструктор по умолчанию
    explicit String(const String &str); // конструктор копирования
    String( const char * str ); // дополнительный конструктор
    ~String(); // деструктор

    void Set();
    void Print();
    String & operator=( const String & str );
};
///////////////////// function ///////////////////////////////////
const char g_cszDel[] = "qwertyuiopasdfghjklzxcvbnm"; // строка латинских букв

void String::New( const char *str ){
    int size = strlen(str);
    m_pszStr = new char[size+1]; // массив для строки символов
    m_pnSize = new int(size); // длинна строки
    strcpy( m_pszStr, str ); // копируем строку
}
void String::Del(){
    delete [] m_pszStr;
    delete m_pnSize;
}

String::String(){ New("\0"); }
String::String(const char *str){ New(str); }
String::String(const String &str){ New(str.m_pszStr); }
String::~String(){ Del(); }

void String::Print(){ std::cout << m_pszStr << '\n'; }
void String::Set(){
    Del();
    char tmp[1000];
    cin.getline( tmp, 1000 );
    cin.sync();
    New(tmp); 
}


String & String::operator =(const String &str){
    if( this == &str ) return *this; // если присваиваем самого себя
    Del();
    char *tmp = new char[*str.m_pnSize+1];
    char *pt =tmp, *beg;
    // копируем строку
    for( beg=str.m_pszStr; *beg; ++beg )
        if(!strchr(g_cszDel, *beg)){
            *pt = *beg;
            pt++;
        }
    *pt = '\0';
    New(tmp);
    delete [] tmp;
    return *this;
}

//////////////////// Main ////////////////////////////////////////
int main(){
    String str, str2;
    str.Set();
    str2 = str; // копируем без маленьких латинских букв
    str2.Print();


    getchar(); // пауза
    return 0;
}

Цитата(LipaNia @  17.11.2007,  04:52 Найти цитируемый пост)
... при следующих условиях: без всех a..z;
Это без латинских букв ?

Автор: LipaNia 30.11.2007, 21:05
да да ! именно без латинских! 

 Олег огромная вам благодарность !   smile  smile  smile 


 smile 

Автор: BeloFF 16.6.2010, 14:56
Добрый день.
Подскажите, можно как-нибудь сделать  это же задание, но с оговоркой не без латинских букв, а 
!!!! подстроку до последнего пробела !!!

То есть получается необходимо выбросить последнее введенное слово.

Был бы очень благодарен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)