#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;
}
Задача по С++ (строки)
Разработать класс А, одной из компонент которого является символьная строка и класс В, одним из методов которого является функция, выполняю-щая вывод на экран слова минимальной длинны символьной строки объекта класса А.
Вот исходник(компил отдельно функцию - работает):
Код:
Тут вроде загвостка в аргументахи параметрах..чот я не соображу...:(
И еще загвостка - в конце введенной строки должен быть обязательно пробел..а то не будет учитываться последнее слово, как сделать, чтоб пробел ненужен был...(или мот алгоритм другой подскажите..переделаю)
1. Метод класса AClass Out() у тебя объявлен таким образом char Out(), т.е. параметров функция не принимает, а в описании она уже Out(char* string)
2. не совсем ясно зачем этот-же метод у тебя возвращает char
3. в задании говорится что одним из методов класса BClass является функция, выполняю-щая вывод на экран слова ... объекта класса АClass.
Почему-жу тогда просто не написать в описании класса
Код:
class BClass
{
public:
BClass();
~BClass();
char OutMinStr();
};
//---
{
public:
BClass();
~BClass();
char OutMinStr();
};
//---
И опять-же, тут у тебя список парамтров пуст, а при описании функции - OutMinStr(char* string), и тип возвращаемого значения опять char, зачем?
4. Ну и в конце концов у тебя объет класса BClass нигде не объявляется (или я уже к вечеру плохо вижу :)), и соответственно не используется.
Поправь оба класса, а там уже разберемся с твоим алгоритмом
Код:
oA.Out(string);
oA.OutMinStr(string);
oA.OutMinStr(string);
нужны ли параметры?
p\s пошел читать книжку Прата..мот чо пойму...:(
Код:
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 );
...
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 );
...
Цитата:
почему friend ненадо...у меня ж символьная строка приватная
А зачем тебе эту строку из BClass'a трогать? Вызывай свой метод из BClass'a в AClass'е, т.е. создай в A объект B и все, передавай в параметрах метода свою строку.
Цитата:
нужны ли параметры?
в A.In() и A.Out() не нужны. Ты ведь в обоих случаях работаешь со строкой, которая лежит внутри класса.
И, самое главное! OutMinStr(string) - это метод класса B! Поэтому строчка oA.OutMinStr(string) не верна.
Код:
#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;
}
#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...не пойму как написать функцию?
Код:
#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;
}
#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;
}
Мне еще посоветовали, чтобы не нужен был пробел(в конце ввода строки), сравнивать значения строки не с 32, а с обобщенным пробелом. Для этого, использовать функцию int isspase(int) из math.h.
Сча ищу int isspase(int), чтоб посмотреть как работает...