Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Задача по С++ (строки)

18K
27 марта 2007 года
Maniac.by
19 / / 20.03.2007
Помогите пожалуйста решить задачку:
Разработать класс А, одной из компонент которого является символьная строка и класс В, одним из методов которого является функция, выполняю-щая вывод на экран слова минимальной длинны символьной строки объекта класса А.
Вот исходник(компил отдельно функцию - работает):
Код:
#include <iostream>
#include <string.h>
#include <conio.h>
#define N 80

class AClass
{
private:
    char m_string[N];

public:
    AClass();
    ~AClass();
    void In();
    void Out(char *string) const;
};
//------------------------------------------------------------------------ 
class BClass
{
public:
    BClass();
    ~BClass();
    void OutMinStr(char *string);
};
//------------------------------------------------------------------------ 
AClass::AClass();
AClass::~AClass();
//------------------------------------------------------------------------ 
BClass::BClass();
BClass::~BClass();
//------------------------------------------------------------------------
void AClass::In() //вводит строку
{
    std::cout << "Enter a string: " << std::endl;
    gets(m_string);
}
//------------------------------------------------------------------------ 
void AClass::Out(char *string) const//выводит строку
{
    std::cout << "String: ";
    for ( int i=0; string; i++)
        std::cout << string;
}
 
//------------------------------------------------------------------------
/*вывод на экран слова минимальной длинны
 символьной строки объекта класса АClass*/
void OutMinStr(char *string)
{
    for (int i = 0; string == 32; i++); //начало 1-го слова
    for (int q = i; string[q] != 32; q++); //конец 1-го слова
    int min1 = q - i; //хранит длину min слова
    int p = i; //указывает на 1 символ слова min длины
//------------------------------------------------------------------------     
    for (i = p + min1; string; i++)
    {
        if (string != 32)
        {
            for (int q = i; string[q] != 32; q++);
            int min2 = q - i;
            //Отсеивание min слова
            if (min1 > min2)
            {
                min1 = min2;
                p = i; //указывает на 1 символ слова min длины
            }
            i = q;
        }
    }
//------------------------------------------------------------------------ 
    //вывод слова min длины
    std::cout << "Slovo min dlini: ";
    for ( ; string != 32; p++)
        std::cout << string;
}
//------------------------------------------------------------------------ 
int main(void)
{
    AClass oA;
    BClass oB;
    oA.In();
    oA.Out(string);
    oA.OutMinStr(string);
   
    std::cout << "Press any key..." << std::endl;
    while(!_kbhit());
    return 0;
}


Тут вроде загвостка в аргументахи параметрах..чот я не соображу...:(
И еще загвостка - в конце введенной строки должен быть обязательно пробел..а то не будет учитываться последнее слово, как сделать, чтоб пробел ненужен был...(или мот алгоритм другой подскажите..переделаю)
7.5K
27 марта 2007 года
sadman
45 / / 21.01.2006
Такс... с чего-ж начать.. итак, для начала:
1. Метод класса AClass Out() у тебя объявлен таким образом char Out(), т.е. параметров функция не принимает, а в описании она уже Out(char* string)
2. не совсем ясно зачем этот-же метод у тебя возвращает char
3. в задании говорится что одним из методов класса BClass является функция, выполняю-щая вывод на экран слова ... объекта класса АClass.
Почему-жу тогда просто не написать в описании класса
 
Код:
class BClass
{
public:
    BClass();
    ~BClass();
   
           char OutMinStr();
};
//---

И опять-же, тут у тебя список парамтров пуст, а при описании функции - OutMinStr(char* string), и тип возвращаемого значения опять char, зачем?

4. Ну и в конце концов у тебя объет класса BClass нигде не объявляется (или я уже к вечеру плохо вижу :)), и соответственно не используется.

Поправь оба класса, а там уже разберемся с твоим алгоритмом
18K
27 марта 2007 года
Maniac.by
19 / / 20.03.2007
Поправил...чот я запутался..почему friend ненадо...у меня ж символьная строка приватная...и в
 
Код:
oA.Out(string);
oA.OutMinStr(string);

нужны ли параметры?
p\s пошел читать книжку Прата..мот чо пойму...:(
9
27 марта 2007 года
Lerkin
3.0K / / 25.03.2003
Код:
class B;

class A
{
private:
    char* str;

public:
    A( void )
    {
        str = new char[80];
    }
   ~A( void )
    {
        delete [] str;
    }

    void set( char* _str)
    {
        while( *str++ = *_str++ );
    }

    friend class B;
};

class B
{
    ...
public:
    ...

    void out( const A& obj )
    {
        cout << obj.str << endl;
    }
};

...
A obj_a;
B obj_b;

obj_a.set( "http://forum.codenet.ru" );
obj_b.out( a );
...
7.5K
28 марта 2007 года
sadman
45 / / 21.01.2006
Цитата:
почему friend ненадо...у меня ж символьная строка приватная


А зачем тебе эту строку из BClass'a трогать? Вызывай свой метод из BClass'a в AClass'е, т.е. создай в A объект B и все, передавай в параметрах метода свою строку.

Цитата:
нужны ли параметры?


в A.In() и A.Out() не нужны. Ты ведь в обоих случаях работаешь со строкой, которая лежит внутри класса.
И, самое главное! OutMinStr(string) - это метод класса B! Поэтому строчка oA.OutMinStr(string) не верна.

18K
28 марта 2007 года
Maniac.by
19 / / 20.03.2007
Вот пока что получилось:
Код:
#include <iostream>
#include <string.h>
#include <conio.h>

class AClass
{
private:
    char *m_string;
    int len;

public:
    AClass();
    AClass(const char *str);
    ~AClass() {delete [] m_string;}
    void In();
    char Out() const;
};
//------------------------------------------------------------------------ 
class BClass
{
public:
    BClass(void);
    ~BClass(void);
    void OutMinStr();
};
//------------------------------------------------------------------------
AClass::AClass(void) //конструктор по умолчанию
{
    len = 0;
    m_string = new char[1];
    m_string[0] = '\0';
}
//------------------------------------------------------------------------ 
AClass::AClass(const char *str)
{
    len = strlen(str);
    m_string = new char[len+1];
    strcpy(m_string, str); //инициализировать указатель
}
//------------------------------------------------------------------------ 
BClass::BClass(void);
BClass::~BClass(void);
//------------------------------------------------------------------------
void AClass::In()
{
    std::cout << "Enter a string: " << std::endl;
    gets(m_string);
}
//------------------------------------------------------------------------ 
char AClass::Out() const
{
    return *m_string;
}
 //------------------------------------------------------------------------

/*вывод на экран слова минимальной длинны
 символьной строки объекта класса АClass*/
void OutMinStr()
{
    for (int i = 0; string == 32; i++); //начало 1-го слова
    for (int q = i; string[q] != 32; q++); //конец 1-го слова
    int min1 = q - i; //хранит длину min слова
    int p = i; //указывает на 1 символ слова min длины
//------------------------------------------------------------------------     
    for (i = p + min1; string; i++)
    {
        if (string != 32)
        {
            for (int q = i; string[q] != 32; q++);
            int min2 = q - i;
            //Отсеивание min слова
            if (min1 > min2)
            {
                min1 = min2;
                p = i; //указывает на 1 символ слова min длины
            }
            i = q;
        }
    }
//------------------------------------------------------------------------ 
    //вывод слова min длины
    std::cout << "Slovo min dlini: ";
    for ( ; string != 32; p++)
        std::cout << string;
}
//------------------------------------------------------------------------ 
int main(void)
{
    AClass oA;
    BClass oB;
    oA.In();
    std::cout << "String: " << std::cout << oA.Out;
    oB.OutMinStr();
   
    std::cout << "Press any key..." << std::endl;
    while(!_kbhit());
    return 0;
}


Теперь загвостка...нужно определить public функцию, возвращающую переменную m_string[N], чтобы её можно было передать методу OutMinStr класса BClass...не пойму как написать функцию?
7.5K
28 марта 2007 года
sadman
45 / / 21.01.2006
подкоректировал на скорую руку. по-пробуй
Код:
#include <iostream>
#include <conio.h>

using namespace std;


class AClass
{
private:
    char *m_string;
public:
    AClass();
    ~AClass()
    {
        delete []m_string;
    }
    void In();
    char* Out() const;
};
//------------------------------------------------------------------------ 
class BClass
{
public:
    BClass(void);
    ~BClass(void);
    void OutMinStr(char*);
};
//------------------------------------------------------------------------
AClass::AClass(void)
{
    m_string = new char[80];
}
//------------------------------------------------------------------------ 

BClass::BClass(void){};
BClass::~BClass(void){};
//------------------------------------------------------------------------
void AClass::In()
{
    cout << "Enter a string: " << endl;
    gets(m_string);
}
//------------------------------------------------------------------------ 
char* AClass::Out() const
{
    return m_string;
}
 //------------------------------------------------------------------------

void BClass::OutMinStr(char* str)
{
    for (int i = 0; str == 32; i++);
    for (int q = i; str[q] != 32; q++);
    int min1 = q - i;
    int p = i;
//------------------------------------------------------------------------     
    for (i = p + min1; str; i++)
    {
        if (str != 32)
        {
            for (int q = i; str[q] != 32; q++);
            int min2 = q - i;
           
            if (min1 > min2)
            {
                min1 = min2;
                p = i;
            }
            i = q;
        }
    }
//------------------------------------------------------------------------ 
    cout << "Slovo min dlini: ";
    for ( ; str != 32; p++)
        cout << str;
}
//------------------------------------------------------------------------ 
int main(void)
{
    AClass oA;
    BClass oB;

    oA.In();
    cout << "String: " << oA.Out()<<endl;
    oB.OutMinStr( oA.Out() );
   
    cout << "Press any key..." << std::endl;
    while(!_kbhit());
    return 0;
}
18K
28 марта 2007 года
Maniac.by
19 / / 20.03.2007
Респект sadman!!! Все работает:)
Мне еще посоветовали, чтобы не нужен был пробел(в конце ввода строки), сравнивать значения строки не с 32, а с обобщенным пробелом. Для этого, использовать функцию int isspase(int) из math.h.
Сча ищу int isspase(int), чтоб посмотреть как работает...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог