Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Динамическая строка и перегрузка операций 
V
    Опции темы
LipaNia
  Дата 17.11.2007, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 17.11.2007

Репутация: нет
Всего: нет



[C++]

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

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

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

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

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

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

 smile  smile  smile 

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

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

 smile 


PM MAIL   Вверх
AndrRus
Дата 17.11.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 14.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 1



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;
}

PM MAIL ICQ   Вверх
LipaNia
Дата 18.11.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 17.11.2007

Репутация: нет
Всего: нет



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


PM MAIL   Вверх
Oleg_Ci
Дата 26.11.2007, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Код

// 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;
Это без латинских букв ?


Это сообщение отредактировал(а) Oleg_Ci - 26.11.2007, 16:01
PM MAIL   Вверх
LipaNia
Дата 30.11.2007, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 17.11.2007

Репутация: нет
Всего: нет



да да ! именно без латинских! 

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


 smile 
PM MAIL   Вверх
BeloFF
Дата 16.6.2010, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



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

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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0446 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.