Войти

Показать полную графическую версию : Помогите решить


elektra192
01-11-2007, 21:50
Задание:
1.Дано класс,покажите,как прибавить дружескую функцию fr(),которая получает один параметр типа myclass и возвращает true,если значение num отрицательное,и false-в другом случае.
class myclass{
int num;
public:
myclass(int x){num=x}
};
Определите другую дружескую функцию,которая использует результат функции fr().Покажите использование.
2.Написать програму,в которой создать два класса plane и helicopter.При чем оба имееют как закрытую переменную скорость и грузоподьемность.Проверьте эти переменные и выведите результаты сравнения в виде строк.
3.Создать два класса матрица и вектор.Определить конструкторы,деструкторы.Определить функцию умножения вектора на матрицу как дружескую.Определить дружескую функцию умножения матрицы на матрицу.Определить дружескую функцию умножения числа на матрицу.Продемонстрировать роботу функций в програме.

Drongo
03-11-2007, 21:25
Значит 2-я задача готова... 1-ю тоже, но нужно откоментировать - откоментирую выложу... Завтра...))))))

// Программа Задачи №2, о Вертолёте и Планере---------------------------------
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;

class Helicopter{ // Класс Helicopter
public:
Helicopter(int, int); // Конструктор Helicopter'a
void Print() const { cout<<" Speed Helicopter: "<<Speed<<"\n"<<" Cargo Helicopter: "<<Cargo<<endl; };// Печать
private:
int Speed; // Скорость Вертолёта
int Cargo; // Грузоподъёмность Вертолёта
};
// -------------------------------------------------------------------------
class Planer{ // Класс Planer
public:
Planer(int, int); // Конструктор Planer'a
void Print() const { cout<<" Speed Planer: "<<Speed<<"\n"<<" Cargo Planer: "<<Cargo<<endl; };// Печать
private:
int Speed; // Скорость Планера
int Cargo; // Грузоподъёмность Планера
};

// Конструктор Helicopter----------------------------------------------------
Helicopter::Helicopter(int spd, int crg)
{
Speed = (spd > 0) ? spd : 230;
Cargo = (crg > 0) ? crg : 2000;
cout<<" Inizialization... 'Helicopter'\n";
}
// Конструктор Planer---------------------------------------------------------
Planer::Planer(int spd, int crg)
{
Speed = (spd > 0) ? spd : 230;
Cargo = (crg > 0) ? crg : 1535;
cout<<" Inizialization... 'Planer'\n\n";
}
// Выполнение программы------------------------------------------------------
int main()
{
int z;
Helicopter hel(21, 500); // Объект класса Helicopter, со своими значениями
Planer plnr(53, 458); // Объект класса Planer, со своими значениями

hel.Print(); // Вывод данных объекта класса Helicopter
cout<<endl; // Пустая строка, для читабельности
plnr.Print(); // Вывод данных объекта класса Planer

cin>>z;
return 0;
}
//-------------------------------------------------------------------

elektra192
04-11-2007, 00:24
Спасибо...каким компилятором можна компилировать???и если можна файл выложы.... :) :)

Drongo
04-11-2007, 17:28
Borland C++ Builder 6 делал...

Drongo
05-11-2007, 18:58
Вот 1 задача, а вот о Матрицах, сам бы хотел увидеть правильное решение, особенно об умножении Вектора на Матрицу... И описание класса Вектор... Тем не менее я попробую решить,
Умножение Матрицы на Матрицу
Умножение Матрицы на Число

А вы раскритикуйте мой код, хотя я и сам понимаю что решил по-дилетантски, но я пробую решить, только в этом вопросе нет соответсвующих знаний, в следующий раз я выложу половину решения 3-го задания...


Код:

// Программа Задачи №1, о Функциях друзьях----------
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;

class MyClass{ // Класс MyClass
friend bool fr(const MyClass &mClass); // Функция друг, принимает ссылку на объект класс MyClass
friend void printResult(const MyClass &mClass); // Функция друг, принимает ссылку на объект класс MyClass
public:
MyClass(int x) { num = x; }; // Конструктор
private:
int num; // Число....
};

// Булевая функция, если число положительное вернуть - true, если отрицательное - false-------
bool fr(const MyClass &mClass)
{
return (mClass.num > 0) ? true : false;
}
// Печать результата, используя результат функции fr(const MyClass & mClass)--------------------------
void printResult(const MyClass &mClass)
{
if(true == fr(mClass.num)) // явное сравнение с возвращаемым результатом - true
cout<<" Num: "<<mClass.num<<". Number Positiv"<<endl;
else if(false == fr(mClass.num)) // явное сравнение с возвращаемым результатом - false
cout<<" Num: "<<mClass.num<<". Number Negativ"<<endl;
}
// Выполнение программы-------------------------------------------------------------------------
int main()
{
int z;
MyClass MC_1(-8); // Объект с отрицательным аргументом
MyClass MC_2(10); // Объект с положительным аргументом

printResult(MC_1); // Вызов функции проверки для объекта MC_1
printResult(MC_2); // Вызов функции проверки для объекта MC_2

cin>>z;
return 0;
}
//---------------------------------------------------------------------------

Drongo
06-11-2007, 17:57
Решил часть 3-й задачи... Пожалуйста, раскритикуйте мой код... Приму любые дельные замечания..
Кроме того хочу узнать, посоветуйте, как решается данная задачка, если можно попунктно, например: шаг 1... шаг 2... шаг 3... и т.д... от чего отталкиваться, приму любые ссылки. Но больше всего хочу узнать, как определить класс "Вектор" и умножить Вектор на Матрицу... Очень бы хотелось увидеть код, выполняющий это умножение, а не сухое определение Вектора... Поскольку считаю для себя проблему в том, что я не могу определить класс "Вектор"... Передаю файл, который у меня получился... Так что критикуйте, как пожелает сердце, ведь в споре рождается истина, всем благодарен, за советы и помощь, кто откликнется!

//---------------------------------------------------------------------------
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;

#include <iomanip>
using std::setw;

class Matrix{ // Класс Matrix
// Дружеская функция умножения Матрицы на Матрицу
friend void MultiplicationMatrix(Matrix &mMatrix);
// Дружеская функция умножения Матрицы на Число
friend void NumberMultiplicationMatrix(Matrix &mMatrix, int);
public:
Matrix(int height = 1, int width = 1); // Конструктор с аргументами по умолчанию
void setMatrix(int height, int width); // Установка размера матрицы
void UserFromKeyboards(); // Ввод данных с клавиатуры
void PrintTwoMatrix(); // Печать Значений Матриц
~Matrix(); // Деструктор
private:
int *Matrix_1; // Указатель на целое (Первая Матрица)
int *Matrix_2; // Указатель на целое (Вторая Матрица)
int SizeMatrix; // Размер Матрицы
int row; // Сколько строк в Матрице
int column; // Сколько столбцов в Матрице
};
// Конструктор--------------------------------------------------------------
Matrix::Matrix(int height, int width)
{
setMatrix(height, width);
}
// Установка размера Матрицы------------------------------------------------
void Matrix::setMatrix(int h, int w)
{
SizeMatrix = h * w;
}
// Ввод данных с клавиатуры-------------------------------------------------
void Matrix::UserFromKeyboards()
{
int counter_1 = 1,
counter_2 = 1;

cout<<" Enter size Column: ";
cin>>column; // Столбцы
cout<<" Enter size Row: ";
cin>>row; // Строки

setMatrix(row, column); // Определение размера Матрицы ( row * column )
Matrix_1 = new int[SizeMatrix]; // Матрица 1 в виде одномерного массива
Matrix_2 = new int[SizeMatrix]; // Матрица 2 в виде одномерного массива

// Циклический ввод в 1-ю Матрицу
for(int i = 0; i < SizeMatrix; i++){
cout<<" Enter value in 'Matrix_1', position "<<counter_1++<<" Value: ";
cin>>Matrix_1[i];
}

cout<<endl; // Пустая строка (для читабельности)

// Циклический ввод в 2-ю Матрицу
for(int j = 0; j < SizeMatrix; j++){
cout<<" Enter value in 'Matrix_2', position "<<counter_2++<<" Value: ";
cin>>Matrix_2[j];
}
}
// Вывод элементов обоих Матриц на экран------------------------------------
void Matrix::PrintTwoMatrix()
{
int control_1 = 0, // Для вывода знака '|' в начале 1-й Матрицы
control_2 = 0, // Для вывода знака '|' в начале 2-й Матрицы
counColumn_1 = column, // Для вывода знака '|' в конце 1-й Матрицы
counColumn_2 = column; // Для вывода знака '|' в конце 2-й Матрицы

// Вывод на экран 1-й Матрицы
for(int j = 0; j < SizeMatrix; j++){
if(control_1 == 0){
cout<<'|';
control_1++;
}
cout<<setw(7)<<Matrix_1[j];
if(j == counColumn_1-1){
counColumn_1 += column;
cout<<'|';
control_1 = 0;
cout<<endl;
}
}

cout<<"\n\n"; // Пару пустых строк (для читабельности)

// Вывод на экран 2-й Матрицы
for(int jj = 0; jj < SizeMatrix; jj++){
if(control_2 == 0){
cout<<'|';
control_2++;
}
cout<<setw(7)<<Matrix_2[jj];
if(jj == counColumn_2-1){
counColumn_2 += column;
cout<<'|';
control_2 = 0;
cout<<endl;
}
}
}
// Деструктор---------------------------------------------------------------
Matrix::~Matrix()
{
cout<<"Destructor"<<endl;
}
// Дружеская функция умножения Матрицы на Матрицу. В качестве---------------
// хранения результатов используется 2-я Матрица----------------------------
void MultiplicationMatrix(Matrix &mMatrix)
{
int control = 0,
counColumn = mMatrix.column;

// Умножение Матрицы на Матрицу.
// Циклическое умножение элемента 1-й Матрицы на элемент 2-й Матрицы
for(int i = 0; i < mMatrix.SizeMatrix; i++)
mMatrix.Matrix_2[i] *= mMatrix.Matrix_1[i];// * mMatrix.Matrix_2[i];

cout<<"\n\n Result Multiplication...\n\n";

// Вывод результата умножения Матрицы на Матрицу
for(int j = 0; j < mMatrix.SizeMatrix; j++){
if(control == 0){
cout<<'|';
control++;
}
cout<<setw(7)<<mMatrix.Matrix_2[j];
if(j == counColumn-1){
counColumn += mMatrix.column;
cout<<'|';
control = 0;
cout<<endl;
}
}
}
// Дружеская функция умножения Матрицы на Число. В качестве------------------
// хранения результатов используется 2-я Матрица-----------------------------
void NumberMultiplicationMatrix(Matrix &mMatrix, int number)
{
int control = 0,
counColumn = mMatrix.column;

// Умножение Матрицы на Число.
// Циклическое умножение элемента 1-й Матрицы на элемент 2-й Матрицы
for(int i = 0; i < mMatrix.SizeMatrix; i++)
mMatrix.Matrix_2[i] = number * mMatrix.Matrix_1[i];

cout<<"\n\n Result Multiplication Number "<<number<<" 'Matrix_1'\n\n";

// Вывод результата умножения Матрицы на Число
for(int j = 0; j < mMatrix.SizeMatrix; j++){
if(control == 0){
cout<<'|';
control++;
}
cout<<setw(7)<<mMatrix.Matrix_2[j];
if(j == counColumn-1){
counColumn += mMatrix.column;
cout<<'|';
control = 0;
cout<<endl;
}
}
}
// Выполнение программы------------------------------------------------------
int main()
{
int z, num;
Matrix matrx_1;

matrx_1.UserFromKeyboards(); // Ввод
matrx_1.PrintTwoMatrix(); // Печать

MultiplicationMatrix(matrx_1); // Функция умножения Матрицы на Матрицу

// Предложение ввести Число на которое будет умножена 1-я Матрица
cout<<"\n\n Enter Number Multiplication Matrix: ";
cin>>num;
cout<<endl;
NumberMultiplicationMatrix(matrx_1, num); // Функция умножения Матрицы на Число

cin>>z;
return 0;
}
//---------------------------------------------------------------------------

Drongo
06-11-2007, 18:02
Решённая задача о Матрицах (Код) (http://forum.oszone.net/post-685717-11.html)
и
Или так (http://forum.oszone.net/showthread.php?t=93303&page=all#post685717)

Drongo
06-11-2007, 18:03
Ребята, я чего то не могу отправить файл, нажал прикрепить, он загрузился, а дальше что делать - незнаю... Подскажите??

Drongo
14-11-2007, 20:43
Хлопцы, здоров! Вот тут в Сети нашёл, файл по Матрице и Вектору, но чего-то не доганяю... Там
#include - пустые, вы б не могли, сказать какие нужно подключить?! И ещё, похоже там есть, в этой проге какая то синктактическая ошибка, но найти я её не могу... Если кто может помочь в этом буду рад, мне б разобраться в этом, очень хочу решить тую задачу... Файл прикрепляю, гляньте если не будет трудно... Подскажите великодушно :dont-know :dont-know

Drongo
14-11-2007, 20:45
Ещё один код решения Матрицы (Расскрыть код) :yes:
// файл tmatr.cpp
#include <iostream.h>
//#include // для setmem()
//#include
//#include

typedef unsigned char dim;

template class Matrix {
typedef Matrix Vector;
private:
VARTYPE *matr; // указатель на массив матрицы
dim m,n; // размеры матрицы
public:

// конструкторы и деструкторы:
Matrix() { matr=(VARTYPE*)0; m=n=0; }
Matrix(dim,dim=1); // Обычный конструктор
Matrix(const Matrix&); // Конструктор копирования
~Matrix() { delete [ ]matr; }

// доступ к элементам матрицы
dim size_row() { return m; } // число строк
dim size_col() { return n; } // число столбцов
VARTYPE& operator() (dim x) const { return (*this)(x,0); } // элементу

// перегруженные операции и функции:
Matrix& operator=(const Matrix&);
Matrix& operator=(const VARTYPE&);
Matrix operator^(int); // возведение в степень
Matrix operator!(); // транспонирование

VARTYPE determ(); // определитель матрицы
VARTYPE vmodul(); // модуль вектора

Matrix& Gauss(dim,dim); // преобразование по Гауссу
// (для получ. обратной и единичной матрицы)
// (для получ. верхнетреугольной матрицы)
Matrix minor(dim,dim); // возвращает указ. минор матрицы
Vector line(dim i) // возвращает вектор-строку матрицы
{ return extract(1,n,i,0); }
Vector column(dim j) // возвращает вектор-столбец матрицы
{ return extract(m,1,0,j); }
VARTYPE& operator() (dim,dim) const; // доступ к
Matrix& operator<<=(const Matrix &A) { return newsize(A.m,A.n)=A;
}
// безусловное приравнивание матриц
Matrix& insert(const Matrix&, dim=0, dim=0); // вставить частьматрицы
Matrix extract(dim, dim, dim=0, dim=0); // извлечьчасть матрицы
Matrix& newsize(dim, dim=1); // установитьновые размеры
void swap_line(dim, dim); //обмен строкамиматрицы
void swap_column(dim, dim); // обмен столбцамиматрицы

friend Matrix operator+(const Matrix&,const Matrix&); //A-B
friend Matrix operator-(const Matrix&,const Matrix&); //A-B
friend Matrix operator*(const Matrix&,const Matrix&); //A*B
friend Matrix operator*(const double&,const Matrix&); //k*A
friend Matrix operator*(const Matrix&, const double&); //A*k
friend ostream& operator<<(ostream&,Matrix&);
// потоковый вывод матрицы
friend int operator>>(istream&,Matrix&);
// потоковый ввод существ. матрицы
// 0 - без. ошибок, 1 - была ошибка

dim read(ifstream&); // файловое чтение и запись матрицы
dim write(ofstream&); // в ее внутреннем, двоичном представлении.
friend VARTYPE operator %(const Matrix&,const Matrix&);

//Функция ошибок
void ERROR_MATRIX(dim) const;
};
// Реализация класса матриц
template
Matrix::Matrix(dim M, dim N)
{
m=M;
n=N;
matr=new VARTYPE[m*n];
if(!matr) ERROR_MATRIX(1);
setmem(matr,sizeof(VARTYPE)*m*n,0);
}

template
Matrix::Matrix(const Matrix &M_Obj) //Конструктор копирования
{
m=M_Obj.m;
n=M_Obj.n;
matr=new VARTYPE[m*n];
if(!matr) ERROR_MATRIX(1);
movmem(M_Obj.matr, matr, sizeof(VARTYPE)*m*n);
}
template
Matrix& Matrix::operator=(const Matrix &M_Obj)
{
m=M_Obj.m;
n=M_Obj.n;
matr=new VARTYPE[m*n];
if(!matr) ERROR_MATRIX(1);
movmem(M_Obj.matr,matr,sizeof(VARTYPE)*m*n);
return *this;
}
//Диагональ?
template
Matrix& Matrix::operator=(const VARTYPE &f)
{
for(int i=0,j;i
Matrix Matrix::operator^(int q) // Степень
{
if (q>0)
{
for(Matrix M=*this; q>1; q--)
M=M*(*this);
return M;
}
if (q!=-1) ERROR_MATRIX(3);
// вычисление обратной метoдом преобразований Гаусса
if (n!=m) ERROR_MATRIX(4);
Matrix M(m,2*n);
M.insert(*this);
for(int i=0;i
Matrix Matrix::operator!() // Транспозиция
{ Matrix A(n,m);
for(int i=0, j; i
VARTYPE Matrix::determ() // рекурсивно находит определитель матрицы
{
if (n!=m) ERROR_MATRIX(4);

if (n==1)
return (*this)(0,0);

for(int i=0; i M;
M <<= *this;
VARTYPE d=M(i,0)*(i%2?-1:1);
return d*M.Gauss(i,0).minor(i,0).determ();
}
return 0.0;
}
template
VARTYPE Matrix::vmodul() // Модуль вектора
{
VARTYPE d=0;
if (n!=1) ERROR_MATRIX(9);
static Matrix M;
M <<= *this;
for(int i=0; i
Matrix& Matrix::Gauss(dim M, dim N)
{
Matrix& A=*this;
if (!A(M,N)) ERROR_MATRIX(5);

for(int i=0,j;i
Matrix Matrix::minor(dim M, dim N) // возвращ. матрицу без
{ // строки y и столбца x
Matrix A(m-1,n-1);
for(int i=0,in=0,j,jn;i // вставка
Matrix& Matrix::insert(const Matrix &A, dim M, dim N)
{
if (M+A.m>m || N+A.n>n) ERROR_MATRIX(6);
for(int i=0, j; i // извлечение
Matrix Matrix::extract(dim LM, dim LN, dim M, dim N)
{
if (M+LM>m || N+LN>n) ERROR_MATRIX(7);
Matrix A(LM,LN);
for(int i=0, j; i
VARTYPE& Matrix::operator() (dim M, dim N) const
{ return *(matr+n*M+N); }

template
Matrix operator+(const Matrix &A, const
Matrix&B)
{
Matrix C=A;
for(int i=0,j; i
Matrix operator-(const Matrix &A, const Matrix &B)
{
Matrix C=A;
for(int i=0, j; i
Matrix operator*(const Matrix &A,const Matrix &B)
{
Matrix C(A.m,B.n);

if (A.n!=B.m)
{
if(A.m==3 && A.n==1 && B.m==3 && B.n==1)
{
C(0)=A(1)*B(2)-A(2)*B(1);
C(1)=A(2)*B(0)-A(0)*B(2);
C(2)=A(0)*B(1)-A(1)*B(0);
}
else
A.ERROR_MATRIX(2);
}
else
{
for(int i=0,j,k;i//умножение числа на матрицу
Matrix operator*(const double &f,const Matrix &A)
{
Matrix B=A;
for(int i=0,j;i// умножение матрицы на число
Matrix operator*(const Matrix &A, const double &f)
{
Matrix B=A;
for(int i=0,j;i
Matrix& Matrix::newsize(dim M, dim N)
{ delete [] matr;
m=M;
n=N;
if (N && M) { matr=new VARTYPE[m*n];
if (!matr) ERROR_MATRIX(1);
setmem(matr,sizeof(VARTYPE)*m*n,0); }
else { m=n=0; matr=(VARTYPE*)0; }
return *this;
}

template
ostream& operator<<(ostream &out,Matrix &A)
{ for(int i=0,j;i
int operator>>(istream &inp,Matrix &A)
{ for(int i=0,j;i>A(i,j)) ) return 1;
return 0;
}
template
void Matrix::swap_line(dim L1, dim L2)
{
if (L1==L2)
return;
double b;
for(int j=0;j
void Matrix::swap_column(dim C1, dim C2)
{
if (C1==C2)
return;
double b;
for(int i=0;i
dim Matrix::read(ifstream &finp)
{ (finp.get(m)).get(n); delete []matr; matr=new VARTYPE[m*n];
if(!matr) ERROR_MATRIX(1);
setmem(matr,sizeof(VARTYPE)*m*n,0);
finp.read((char *)matr,sizeof(VARTYPE)*m*n); return finp.fail();
}
template
dim Matrix::write(ofstream &fout)
{ (fout.put(m)).put(n);
(fout.write((char *)matr,sizeof(VARTYPE)*m*n))<
VARTYPE operator%(const Matrix &A, const Matrix&B)
{
if(A.n!=1 || B.n!=1) A.ERROR_MATRIX(9);
if(A.m!=B.m) A.ERROR_MATRIX(0);
VARTYPE scalarmul = 0;
for(int i=0; i
void Matrix::ERROR_MATRIX(dim E) const
{ static char *message[] = {
"Матрицы должны иметь одинаковую размерность", //0
"Не выделена память!", //1
"Матрицы не согласованы для умножения", //2
"Степень должна быть больше нуля или -1", //3
"Матрица должна быть квадратной", //4
"Нулевой ведущий элемент в преобразовании Гаусса", //5
"Вставка невозможна из-за перекрытия базовой матрицы", //6
"Извлекаемая матрица выходит за границы базовой", //7
"Выход за границы. Попытка доступа к несущ. элементу", //8
"Это не вектор!"}; //9
cerr<<"ERROR: "<< message[E] << endl; exit(1);
}
//----------------------------------------------------------------------------
// Демонстративно - тестирующая программа:
#include <iostream.h>
//#include
//#include
//#include "tmatr.cpp"
int main()
{
int z;
clrscr();
Matrix A(3,3), B(3,3), C(3,3);
Matrix V(3),X(3),H(3),U(3);
double d;
A(0,0)=1.1; A(0,1)=2.2; A(0,2)=3.3;
A(1,0)=2.4; A(1,1)=1.1; A(1,2)=4.4;
A(2,0)=1.3; A(2,1)=2.1; A(2,2)=4.1;

B(0,0)=2; B(0,1)=7; B(0,2)=2;
B(1,0)=4; B(1,1)=8; B(1,2)=1;
B(2,0)=6; B(2,1)=4; B(2,2)=1;

V(0)=2.1; V(1)=3.31; V(2)=1.4;
H(0)=1.1; H(1)=2.1; H(2)=3.1;

//******************************
C = A + B;
cout<<"A:\n"< D(3,3), E(3,3);

D(0,0) = 1; D(0,1) = 2; D(0,2) = 3;
D(1,0) = 2; D(1,1) = 5; D(1,2) = 6;
D(2,0) = 7; D(2,1) = 3; D(2,2) = 9;

ofstream fout("test.mtr");
if(!fout){
cout<<"file not open\n";
return 1;
}
D.write(fout);
fout.close();

ifstream fin("test.mtr");
if(!fin){
cout<<"file not open\n";
return 1;
}

E.read(fin); //й су«їtЎ«ј уїсС

cout<<"D:\n";
cout<<"Finish!";
cin>>z;
//-------------------------------------------------------------------------

Drongo
26-11-2007, 19:27
Таки решил, посмотрите пожалуйста код и расскритикуйте...

//3-я Задача... Создать два класса Матрица и Вектор.
// Определить конструкторы, деструкторы.
// Определить функцию умножения вектора на матрицу как дружескую.
// Определить дружескую функцию умножения матрицы на матрицу.
// Определить дружескую функцию умножения числа на матрицу.
// Продемонстрировать работу функций в програме.
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;

#include <iomanip.h>
using std::setw;

//******************************Класс Вектор***********************************/
class Vector{ // Класс Вектор
friend class Matrix; // класс Вектор друг класса Матрица
// Дружеская функция умножения Вектора на Матрицу. Принимает Матрицу, Вектор
// на который умножается и Вектор, где будет храниться результат умножения
friend void MultiplyVectorMatrix(Matrix &mMatrix, Vector &Vec2, Vector &Vec1);
public:
Vector(int size = 1); // конструктор по умолчанию
void setSizeVector(int size); // Установка размера Вектора
void setOrientationVector(); // Установка Вектора-столбца или Вектора-Строки. В столбец или в строку...
void UserFromKeyboardsVector(); // Ввод значений Вектора с клавиатуры
bool getOrientationVector() { return Orient; }; // Возвращение ориентации Вектора
int getSizeVector() { return SizeVector; }; // Возвращение размера Вектора
int &elementVector(int index) { return Vector[index]; } // Индексация. Для доступа к элементу Вектора
void PrintVector(); // Печать значений Вектора
~Vector(); // деструктор
private:
int *Vector; // Указатель на целое.
int SizeVector; // Размер Вектора
bool Orient; // Ориентация Вектора. true - Вертикально, false - Горизонатально...
};
//*******************************Класс Матрица*********************************/
class Matrix{ // Класс Matrix
// Дружеская функция умножения Матрицы на Матрицу
friend void MultiplicationMatrix(Matrix &mMatrix1, Matrix &mMatrix2, Matrix &mMatrix3);
// Дружеская функция умножения Матрицы на Число
friend void NumberMultiplicationMatrix(Matrix &mMatrix3, Matrix &mMatrix, int);
public:
Matrix(int height = 1, int width = 1); // Конструктор с аргументами по умолчанию
void setMatrix(int height, int width); // Установка размера матрицы
void UserFromKeyboardsMatrix(); // Ввод данных Матрицы с клавиатуры
int &elementMatrix(int index) { return Matrix[index]; } // Индексация. Для доступа к элементу Матрицы
int getSizeMatrix() { return SizeMatrix; }; // Получить размер Матрицы
int getSizeRow() { return row; }; // Получить количество строк Матрицы
int getSizeColumn() { return column; }; // Получить количество столбцов Матрицы
void PrintMatrix(); // Печать Значений Матриц
~Matrix(); // Деструктор
private:
int *Matrix; // Указатель на целое
int SizeMatrix; // Размер Матрицы
int row; // Сколько строк в Матрице
int column; // Сколько столбцов в Матрице
};
/*****************************************************************************/
// РЕАЛИЗАЦИЯ КЛАССА Matrix
/*****************************************************************************/
// Конструктор Матрицы--------------------------------------------------------
Matrix::Matrix(int height, int width)
{
setMatrix(height, width);
}
// Установка размера Матрицы--------------------------------------------------
void Matrix::setMatrix(int h, int w)
{
SizeMatrix = h * w;
row = h;
column = w;

Matrix = new int [SizeMatrix];
// Инициализация Матрицы нулями
for(int i = 0; i < SizeMatrix; i++)
Matrix[i] = 0;
}
// Ввод данных с клавиатуры, для Матрицы--------------------------------------
void Matrix::UserFromKeyboardsMatrix()
{
int counter = 1; // Счётчик вводимого элемента Матрицы...
static int countMatrix = 1;

// Циклический ввод в Матрицу
for(int i = 0; i < SizeMatrix; i++){
cout<<" Enter value in "<<countMatrix<<" 'Matrix', position "<<counter++<<" Value: ";
cin>>Matrix[i];
}
countMatrix++;
}
// Вывод элементов Матрицы на экран-------------------------------------------
void Matrix::PrintMatrix()
{
int control = 0, // Для вывода знака '|' в начале Матрицы
counColumn = column - 1; // Для вывода знака '|' в конце Матрицы

cout<<"\n"; // Пару пустых строк (для читабельности)

// Вывод на экран Матрицы
for(int j = 0; j < SizeMatrix; j++){
if(control == 0){
cout<<'|';
control++;
}
cout<<setw(7)<<Matrix[j];
if(j == counColumn){
counColumn += column;
cout<<'|';
control = 0;
cout<<endl;
}
}
// Вывод на экран символа '-' на всю ширину консоли, для читабельности...
for(int i = 0; i < 80; i++)
cout<<'-';
}
// Деструктор Матрицы---------------------------------------------------------
Matrix::~Matrix()
{
delete[] Matrix;
cout<<"Destructor"<<endl;
}
// Дружеская функция класса Matrix, умножения Матрицы на Матрицу. В качестве--
// хранения результатов используется 3-я Матрица------------------------------
void MultiplicationMatrix(Matrix &mMatrix1, Matrix &mMatrix2, Matrix &mMatrix3)
{
// Умножение Матрицы на Матрицу.
// Циклическое умножение элемента 1-й Матрицы на элемент 2-й Матрицы
for(int i = 0; i < mMatrix3.getSizeMatrix(); i++)
mMatrix3.Matrix[i] = mMatrix1.Matrix[i] * mMatrix2.Matrix[i];

cout<<"\n Result Multiplication...\n";
}
// Дружеская функция класса Matrix, умножения Матрицы на Число. В качестве----
// хранения результатов используется 3-я Матрица------------------------------
void NumberMultiplicationMatrix(Matrix &mMatrix3, Matrix &mMatrix, int number)
{
// Умножение Матрицы на Число.
// Циклическое умножение элемента 1-й Матрицы на элемент 2-й Матрицы
for(int i = 0; i < mMatrix3.getSizeMatrix(); i++)
mMatrix3.Matrix[i] = number * mMatrix.Matrix[i];

cout<<"\n Result Multiplication Number "<<"'"<<number<<"' to"<<" 'Matrix'\n";
}
/*****************************************************************************/
/*****************************************************************************/
// РЕАЛИЗАЦИЯ КЛАССА Vector
/*****************************************************************************/
/*****************************************************************************/
// Дружеская функция класса Vector, умножения Матрицы на Вектор. В качестве---
// хранения результатов используется 2-ой Вектор------------------------------
void MultiplyVectorMatrix(Matrix &mMatrix1, Vector &Vec2, Vector &Vec1)
{
int iMat = 0,
jMat = 0;

if(Vec1.Orient){ // Умножение Вектора-столбца на Матрицу
for(int i = 0; i < Vec1.getSizeVector(); i++){
jMat += mMatrix1.getSizeColumn();
for(; iMat < jMat; iMat++)
Vec2.Vector[i] += mMatrix1.elementMatrix(iMat) * Vec1.Vector[i];
}
cout<<" Result Multiply Vector-Column to a Matrix..."<<endl;
}
else if(!Vec1.Orient){ // Умножение Вектора-строки на Матрицу
for(int i = 0; i < mMatrix1.getSizeRow(); i++){
jMat += mMatrix1.getSizeColumn();
for(int j = 0; iMat < jMat; iMat++, j++)
Vec2.Vector[i] += mMatrix1.elementMatrix(iMat) * Vec1.Vector[j];
}
cout<<" Result Multiply Vector-String to a Matrix..."<<endl;
}
}
// Деструктор Вектора---------------------------------------------------------
Vector::~Vector()
{
delete[] Vector;
cout<<" Dectructor Vector"<<endl;
}
// Ввод данных с клавиатуры для Вектора---------------------------------------
void Vector::UserFromKeyboardsVector()
{
int counter = 1; // Счётчик вводимого элемента Вектора...

// Циклический ввод в Вектор
for(int i = 0; i < SizeVector; i++){
cout<<" Enter value in 'Vector', position "<<counter++<<" Value: ";
cin>>Vector[i];
}
}
// Конструктор Вектора--------------------------------------------------------
Vector::Vector(int size)
{
setSizeVector(size); // Функция установки размера Вектора
}
// Установка размера Вектора--------------------------------------------------
void Vector::setSizeVector(int size)
{
SizeVector = (size >= 0) ? size : 1;
// Выделение Вектора под заданный размер и инициализация нулями...
Vector = new int[size];
for(int i = 0; i < size; i++)
Vector[i] = 0;
}
// Вывод элементов Вектора на экран-------------------------------------------
void Vector::PrintVector()
{
cout<<"\n";
if(!getOrientationVector()){
cout<<"| ";
for(int a = 0; a < SizeVector; a++){
cout<<setw(7)<<Vector[a];
if(a == SizeVector - 1)
cout<<"|";
}
cout<<"\n\n Vector-String"<<endl;
}
else if(getOrientationVector()) {
for(int i = 0; i < SizeVector; i++){
cout<<"| "<<setw(7)<<Vector[i]<<"|"<<endl;
}
cout<<"\n Vector-Column"<<endl;
}

for(int j = 0; j < 80; j++)
cout<<'-';
}
// Установка ориентации Вектора. Вертикаль - true, Горизонталь - false--------
// 1 - Ветрикально, 2 - Горизонтально-----------------------------------------
void Vector::setOrientationVector()
{
int orientation;
cout<<" Enter number '1' Vector-Stolbez or number '2' Vector-Stroka [1/2]: ";
cin>>orientation;
// Проверка, чтобы введённое число было или 1 или 2...
while(orientation <= 0 || orientation >= 3){
cout<<" Enter number '1' Vector-Stolbez or number '2' Vector-Stroka [1/2]: ";
cin>>orientation;
}

if(orientation == 1)
Orient = true; // Вертикаль - true
else if(orientation == 2)
Orient = false; // Горизонталь - false
}
// Демонстрация программы. Тестирование========================================
int main()
{
int feature, // Выбор умножаемой Матрицы, 1-я или 2-я
num, // Число, на которое умножается выбранная Матрица
matrColumn, // Столбцы Матрицы (Ширина)
matrRow, // Строки Матрицы (Высота)
szVector, // Размер Вектора
z; // Чтобы окно не закрылось раньше срока...

Matrix matrx1, // 1-й объект класса Matrix (1-я Матрица)
matrx2, // 2-й объект класса Matrix (2-я Матрица)
matrx3; // 3-й объект класса Matrix (3-я Матрица. Используется в качестве хранения результатов расчёта)

Vector vec1, // 1-й объект класса Vector (1-й Вектор)
vec2; // 2-й объект класса Vector (2-й Вектор. Используется в качестве хранения результатов расчёта)

cout<<" Enter size Column: ";
cin>>matrColumn; // Столбцы (Ширина)
cout<<" Enter size Row: ";
cin>>matrRow; // Строки (Высота)

matrx1.setMatrix(matrRow, matrColumn); // Установка размера 1-й Матрицы (row * column)
matrx1.UserFromKeyboardsMatrix(); // Ввод значений в первую Матрицу

cout<<endl; // Для читабельности, пустая строка...

matrx2.setMatrix(matrRow, matrColumn); // Установка размера 2-й Матрицы (row * column)
matrx2.UserFromKeyboardsMatrix(); // Ввод значений во вторую Матрицу

for(int i = 0; i < 80; i++) // Для читабельности
cout<<'-';

cout<<"\n Print First (1-st) Matrix"<<endl;
matrx1.PrintMatrix(); // Печать 1-й Матрицы
cout<<"\n Print Second (2-nd) Matrix"<<endl;
matrx2.PrintMatrix(); // Печать 2-й Матрицы

matrx3.setMatrix(matrRow, matrColumn); // Установка размера 3-й Матрицы (row * column)

MultiplicationMatrix(matrx1, matrx2, matrx3); // Функция умножения Матрицы на Матрицу

matrx3.PrintMatrix(); // Печать результата умножения Матрицы на Матрицу

// Предложение ввести Число на которое будет умножена выбранная Матрица
cout<<"\n\n Enter Number Multiplication Matrix: ";
cin>>num;
cout<<endl;

// Выбор умножаемой Матрицы [1 - первая Матрица, 2 - вторая Матрица]
cout<<" Enter Number Vibor Multiplication Matrix [1/2]: ";
cin>>feature;
// Проверка выбора
while(feature >= 3 || feature <= 0){
cout<<" Enter Number Vibor Multiplication Matrix [1/2]: ";
cin>>feature;
}

if(feature == 1) // Если выбрана первая Матрица
NumberMultiplicationMatrix(matrx3, matrx1, num); // Функция умножения Матрицы на Число
else if(feature == 2) // Если выбрана вторая Матрица
NumberMultiplicationMatrix(matrx3, matrx2, num); // Функция умножения Матрицы на Число

matrx3.PrintMatrix(); // Печать результата умножения Матрицы на Число

// Установка ориентации Вектора (Вектор-столбец или Вектор-строка)
vec1.setOrientationVector();
// Размер 2-го Вектора должен быть равен кол-ву строк в Матрице
vec2.setSizeVector(matrRow);

if(vec1.getOrientationVector()) // Вертикальная ориентация Вектора
vec1.setSizeVector(matrRow); // Размер должен быть равен кол-ву строк в Матрице
else if(!vec1.getOrientationVector()) // Горизонтальная ориентация Вектора
vec1.setSizeVector(matrColumn); // Размер должен быть равен кол-ву столбцов в Матрице

cout<<"\n\n";
vec1.UserFromKeyboardsVector(); // Ввод данных с клавиатуры, для Вектора

for(int j = 0; j < 80; j++) // Для читабельности, вывод линии...
cout<<'-';

cout<<"\n Print Vector..."<<endl;
vec1.PrintVector(); // Печать 1-го Вектора

cout<<"\n Print First (1-st) Matrix"<<endl;
matrx1.PrintMatrix(); // Печать Матрицы, на которую будет умножаться Вектор...

MultiplyVectorMatrix(matrx1, vec2, vec1); // Функция умножения Вектора на 1-ю Матрицу

vec2.PrintVector(); // Печать результата умножения Вектора на Матрицу

cin>>z;
return 0;
}
//---------------------------------------------------------------------------
Привет Всем! В общем у меня получился такой "расклад", конечно было бы правильнее перегрузить операцию умножения, только у меня возникли сложности с возвращаемым результатом, не могу понять, для такого выражения:

Vec2 = Vec1 * Matrix;

Нужно ли реализовывать операцию присваивания? Или ещё как нужно или можно, подскажите
Правилен ли будет такой вариант:


Vector::Vector operator*(Vector &Vec, Matrix &Matr)
{
Vector tempVec;

...
// Здесь алгоритм умножения
...
return tempVec;
}

Или если не будет сложно, опишите как правильно возвратить или перегрузить эту операцию, чтобы во всю ширь использовать перегрузку операций, буду благодарен за любой совет...

elektra192
08-12-2007, 17:59
Задание №6.
а)Создайте функцию,которая обычно принимает один аргумент-адрес строки-и выводит эту строку на экран один раз.Но если задаеться второй аргумент типа int,который не равен нулю,то эта функция выводит строку столько раз,какое число было передано функции,а если ж этот переданный параметр равен нулю,-то столько раз,сколько было вызовов функции до момента ево вызова.Используйте эту функцию в програме,что б показать как она работает.
б)Перегрузить функцию,которая вычесляет обьемы кубка и шара,которые задаються классом figura.Покажите ее использование.
в)Допустим есть класс CandyBar,который содержит три закрытые элементы:1)фирменное название конфеты,2)вес(double),3)количество калорий(целое значение).Написать програму,в которой в даном классе перегружаеться конструктор:без параметров(закрытые члены класса должны получить значения "Millenium",2.85,350 соответственно за умолчанием),с двумя параметрами(один из параметров-как задано за умолчанием),со всеми(пользователь вводит данные с клавиатутры).Создайте базу данных про любимые конфеты(массив обьектов).Показать использование конструкторов.Перегрузить функцию,которая выводит на экран вес одной(данной)конфеты и вес того количества таких самых (данных)конфет,которую задаст пользователь(передаеться как параметр функции).
4.Перегрузить функцию изображения на экране веселого и грусного смайлика в графическом режиме.

elektra192
08-12-2007, 19:18
Задание 7.
а)Написать програму с использованием конструктора копирование.Обьявить класс myclass,который содержит функцию f1(),что будет возвращать обьект myclass,функцию f2(),что будет получать обьект типа myclass как параметр и выводить на экран значение закрытых переменных класса для данного обьекта,конструктор и конструктор копирование.В основной части программы присвойте обьекту класса результат выполнения фнгкции f1(),используйте функцию f2(),выполните явную инициализацию одного обьекта другим.Все конструкторы выводят на экран"В конструкторе" или "В конструкторе копирования".
б)Написать программу вычисления среднево арифметического 5 и 2-х чисел,в которой:
1.Перегрузить функцию в зависимости от количества аргументов.
2.Использовать арагументы по умолчанию
в)Создать класс StrType ,который содержит(закрытые переменные)саму строку p(char*) и длину этой строки len(целое число).Определить открытые функции получения строки и длины строки.
г)Перегрузить конструктор следующим образом.Первый-без параметров.Он должен выделять 255 байтов памяти (оператор new),инициализировать эту память строкой,которую вводит пользователь,и установить значение len 255.Другой конструктор-с двумя параметрами(не вводяться с клавиатуры):1-строка,которая используеться при инициализации,2-число байтов,что выделяеться.Во второй версии конструктора нужно выделить необходимое количество памяти,в которую должна размещаться передаванная строка.Реализуйте контроль границ массива(используя функцию strlen()).
д)Определить функцию с целым аргументом,который за умолчанием равен нулю,которая выводит строку,что сохраняеться в классе,на экран:когда ей не передаеться ни единого параметра,тогда функция выводит всю строку;если передаеться какое то число,которое не равно нулю,тогда эта функция выводит столько элементов строки,согласно числа,которое было передано функции.Показать что перегруженные конструкторы и функция работает так как нужно.

Drongo
12-12-2007, 15:23
По поводу задачи А) в шестом задание, не могу правильно вычислить второй тип, когда в функции есть переменными параметрами, почему-то код: выдаёт какое-то число десятизначное, число... Почему так, и как нужно правильно? Подскажите?!
void PrintString(const char *S, ...)
{
va_list ap;
va_start(ap, S); // раскрутка arg
// int COUNTER = va_arg(ap, int);
int COUNTER = 0;

// cout<<" COUNTER = "<<COUNTER<<endl;
if((COUNTER = va_arg(ap, int)) > 0){
....// code...
}
//----------------------------------

Задание №6. »
Задача "А")
//---------------------------------------------------------------------------
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;

#include <stdarg.h>
//#include <stdio.h>

void PrintString(const char *String, ...);

int main()
{
char *s = "Hello Anna!";
char *sPtr = &(*s);
int counter,
z;

cout<<" Enter String: ";
cin.getline(s, 100, '\n');

// PrintString(sPtr);

cout<<" Enter Number: ";
cin>>counter;
while(counter < 0){
cout<<" Enter Number: ";
cin>>counter;
}

PrintString(sPtr, counter);

cin>>z;
return 0;
}
//---------------------------------------------------------------------------
void PrintString(const char *S, ...)
{

va_list ap;
va_start(ap, S); // раскрутка arg
// int COUNTER = va_arg(ap, int);
int COUNTER = 0;

// cout<<" COUNTER = "<<COUNTER<<endl;
if((COUNTER = va_arg(ap, int)) > 0){

cout<<" Vono=="<<endl;
cout<<" COUNTER = "<<COUNTER<<endl;
for(int i = 0; i < COUNTER; i++)
cout<<" Num: "<<i<<"Output: "<<S<<endl;
va_end(ap);
}
// очистка arg
else{
cout<<" Ne vono"<<endl;
cout<<"Output: "<<S<<endl;
}
}
//----------------------------------------------------------------------
В чём я ошибся, или не так сделал?!

Задание 7. »
Задача "А")
// Написать програму с использованием конструктора копирования.
// Обьявить класс MyClass, который содержит функцию f1(), что будет возвращать обьект MyClass,
// функцию f2(), что будет получать обьект типа MyClass как параметр
// и выводить на экран значение закрытых переменных класса для данного обьекта,
// конструктор и конструктор копирования.
// В основной части программы присвойте обьекту класса результат выполнения функции f1(),
// используйте функцию f2(), выполните явную инициализацию одного обьекта другим.
// Все конструкторы выводят на экран "В конструкторе" или "В конструкторе копирования".
//----------------------------------------------------------------------------
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;

class MyClass{ // Класс MyClass
friend void fr2(MyClass MC);
public:
MyClass(int x = 1) { num = x; cout<<" Konstruktor = "<<num<<endl; } // Конструктор
MyClass(const MyClass &MC); // Копирующий конструктор
const MyClass fr1() { return *this; };
private:
int num; // Число....
};
// Копирующий конструктор-----------------------------------------------------
MyClass::MyClass(const MyClass &MC)
{
num = MC.num;
cout<<"\n Konstruktor Copy = "<<num<<endl;
}
// Функция fr2(), принимает однин параметр MyClass и выводит значения закрытых членов
void fr2(MyClass MC)
{
cout<<" Activation Function fr2(MyClass MC)"<<endl;
cout<<" Value = "<<MC.num<<endl;
}
// Выполнение программы-------------------------------------------------------
int main()
{
int z;
MyClass MC_1(-88),
MC_2(105),
MC_3(247),
MC_4(-578),
MC_5(MC_1),
MC_6,
MC_7;

MC_6 = MC_2; // Присваивание одного объекта другому
fr2(MC_6.fr1()); // Инициализация одного объекта другим, через вызов функции fr1()

fr2(MC_4); // Инициализация одного объекта другим
fr2(MC_5.fr1()); // Инициализация одного объекта другим, через вызов функции fr1()

cin>>z;
return 0;
}
//---------------------------------------------------------------------------
Задача "Б")
// Написать программу вычисления среднего арифметического 5 и 2-х чисел, в которой:
// 1.Перегрузить функцию в зависимости от количества аргументов.
// 2.Использовать арагументы по умолчанию--------------------------------------
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;

#include <iomanip.h>
using std::setprecision;
using std::setiosflags;

// Вычисление среднего арифметического с пятью параметром---------------------
double Average(double V1 = 2.0, double V2 = 5.0, double V3 = 7.0, double V4 = 9.0, double V5 = 8.0)
{ return (V1 + V2 + V3 + V4 + V5) / 5; };
// Вычисление среднего арифметического с двумя параметрами--------------------
double Average(int V1 = 4.0, int V2 = 7.0)
{ return (static_cast<double>(V1) + static_cast<double>(V2)) / 2; };
//----------------------------------------------------------------------------
int main()
{
int num6, // Число 6
num7, // Число 7
z;
double num1, // Число 1
num2, // Число 2
num3, // Число 3
num4, // Число 4
num5, // Число 5
average1, // Среднее 1
average2; // Среднее 2

// Форматирование потока...
cout<<setiosflags(ios::fixed | ios::showpoint)
<<setprecision(1);

// Ввод пяти чисел для функции с пятью аргументами (double)...
cout<<" Print Result Average 5 Arguments\n";
cout<<" Enter number 1: ";
cin>>num1;
cout<<" Enter number 2: ";
cin>>num2;
cout<<" Enter number 3: ";
cin>>num3;
cout<<" Enter number 4: ";
cin>>num4;
cout<<" Enter number 5: ";
cin>>num5;

// Функция вычисляет среднее для пяти параметров
average1 = Average(num1, num2, num3, num4, num5);
cout<<" Average s 5 Arguments = "<<average1<<endl<<endl;

// Ввод двух чисел для функции с двумя параметрами (int)...
cout<<" Print Result Average 2 Arguments\n";
cout<<" Enter number 1: ";
cin>>num6;
cout<<" Enter number 2: ";
cin>>num7;

// Функция вычисляет среднее для двух параметров
average2 = Average(num6, num7);
cout<<" Average s 2 Arguments = "<<average2<<endl<<endl;

// Печать результатов среднего по умолчанию для функции с пятью параметрами
cout<<" Print Result Average Default 5 Argument\n";
average1 = Average(3.3, 4.4, 7.7);
cout<<" Average Default 5 Argument = "<<average1<<endl<<endl;

// Печать результатов среднего по умолчанию для функции с двумя параметрами
cout<<" Print Result Average Default 2 Argument\n";
average2 = Average(55, 88);
cout<<" Average Default 2 Argument = "<<average2<<endl;

cin>>z;
return 0;
}
//---------------------------------------------------------------------------
Задача "В")
// Создать класс StrType, который содержит(закрытые переменные)
// саму строку (char* p;) и длину этой строки (int len;).
// Определить открытые функции получения строки и длины строки.----------------
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;

//#include "StrType.h"

class StrType{ // Класс StrType
public:
StrType(char *s = "Anna", int l = 8); // Конструктор с аргументами по умолчанию
int getLen() const { return len; }; // Получение длины строки
char *getString() { return p; }; // Получение строки
void Print(); // Печать объекта, вывод значений...
private:
char *p; // Строка
int len; // Длина строки
};
// Конструктор по умолчанию--------------------------------------------------
StrType::StrType(char *str, int lenght)
{
p = str;
len = lenght;
}
// Печать объекта, для проверки----------------------------------------------
void StrType::Print()
{
cout<<" Value Default\n\n";
cout<<" String (*p): "<<getString()<<endl;
cout<<" Lenght (len) = "<<getLen()<<endl;
}
// Демонстрация композиции. Тестирование-------------------------------------
int main()
{
int z;
StrType s;

s.Print();
cin>>z;
return 0;
}
//---------------------------------------------------------------------------
Задача "Г")
// Создать класс StrType, который содержит(закрытые переменные)
// саму строку (char* p;) и длину этой строки (int len;).
// Определить открытые функции получения строки и длины строки.----------------
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;

#include <cstring.h>
#include <cassert>

class StrType{ // Класс StrType
public:
StrType(); // Конструктор без аргументов
StrType(char *s, int l); // Конструктор с аргументами
int getLen() const { return len; }; // Получение длины строки
char *getString() { return p; }; // Получение строки
void Print(); // Печать объекта, вывод значений...
private:
char *p; // Строка
int len; // Длина строки
};
// Конструктор без параметров, с вводом с клавиатуры--------------------------
StrType::StrType()
{
char sTemp[255] = ""; // Временный символьный массив

len = 255;
p = new char[255 + 1]; // Выделение памяти в 255 байт плюс завершающий символ
assert(p != 0); // Проверка выделения памяти

cout<<" Enter String: "; // Предложение ввода
cin.getline(sTemp, 255, '\n'); // Ввод строки символов

strcpy(p, sTemp); // Копирование строки символов в "р"
delete []sTemp;
}
// Конструктор с параметрами, без ввода с клавиатуры--------------------------
StrType::StrType(char *str, int lenght)
{
len = strlen(str); // Вычисление длины строки

if(len >= 0 && len < 256){ // Проверка диапазона, должен быть меньше 255
p = new char[len + 1]; // Выделение памяти в 255 байт плюс завершающий символ
assert(p != 0); // Проверка выделения памяти
strcpy(p, str); // Копирование...
}
else // Вывод ошибки если диапазон массива меньше нуля и больше 256 байт...
cout<<" Error! Lenght > 256 bytes!";
}
// Печать объекта, для проверки----------------------------------------------
void StrType::Print()
{
cout<<endl;
cout<<" String (char *p): "<<getString()<<endl; // Печать строки...
cout<<" Lenght (int len) = "<<getLen()<<endl; // Печать длины строки...
}
// Демонстрация композиции. Тестирование-------------------------------------
int main()
{
int z;
StrType s1, // 1-й объект, без инициализации...
s2("Anna Kanaeva - programming and diasyner", 40); // 2-й объект, инициализирован...

s1.Print(); // Печать объекта...
s2.Print(); // Печать объекта...
cin>>z;
return 0;
}
//---------------------------------------------------------------------------
Задача "Д")
// Определить функцию с целым аргументом, который по умолчанию равен нулю,
// которая выводит строку, что сохраняеться в классе, на экран:
// когда ей не передаётся ни одного параметра, тогда функция выводит всю строку;
// если передаеться какое то число, которое не равно нулю, тогда эта функция
// выводит столько элементов строки, согласно числу, которое было передано функции.
// Показать что перегруженные конструкторы и функция работает так как нужно.
// А как нужно?!
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;

#include <cstring.h>
#include <cassert>
#include <stdarg.h>
#include <stdio.h>

class StrType{ // Класс StrType
public:
StrType(); // Конструктор без аргументов
StrType(char *s, int l); // Конструктор с аргументами
int getLen() const { return len; }; // Получение длины строки
char *getString() { return p; }; // Получение строки
void Function(int n = 1, ...);
void Print(); // Печать объекта, вывод значений...
private:
char *p; // Строка
int len; // Длина строки
};
// Конструктор без параметров, с вводом с клавиатуры--------------------------
StrType::StrType()
{
char sTemp[255] = ""; // Временный символьный массив

len = 255;
p = new char[255 + 1]; // Выделение памяти в 255 байт плюс завершающий символ
assert(p != 0); // Проверка выделения памяти

cout<<" Enter String: "; // Предложение ввода
cin.getline(sTemp, 255, '\n'); // Ввод строки символов

strcpy(p, sTemp); // Копирование строки символов в "р"
delete []sTemp;
}
// Конструктор с параметрами, без ввода с клавиатуры--------------------------
StrType::StrType(char *str, int lenght)
{
len = strlen(str); // Вычисление длины строки

if(len >= 0 && len < 256){ // Проверка диапазона, должен быть меньше 255
p = new char[len + 1]; // Выделение памяти в 255 байт плюс завершающий символ
assert(p != 0); // Проверка выделения памяти
strcpy(p, str); // Копирование...
}
else // Вывод ошибки если диапазон массива меньше нуля и больше 256 байт...
cout<<" Error! Lenght > 256 bytes!";
}
// Печать объекта, для проверки----------------------------------------------
void StrType::Print()
{
cout<<endl;
cout<<" String (char *p): "<<getString()<<endl;
cout<<" Lenght (int len) = "<<getLen()<<endl;
}
// Функция с перечислимыми параметрами---------------------------------------
void StrType::Function(int n, ...)
{
// int i = 0;
// va_list List1;
//va_start(List1, i);
// i = va_arg(List1, char *);
cout<<"\n\n Value parameters len for Function() = "<<n<<endl;

for(int i = 0; i < n; i++)
cout<<*p++;

//va_end(List1);
}
// Демонстрация композиции. Тестирование-------------------------------------
int main()
{
int z;
StrType s1, // 1-й объект...
s2("Anna Kanaeva - programmist and disayner", 40); // 2-й объект...

s1.Print(); // Печать объекта...
s2.Print(); // Печать объекта...

s2.Function(35); // Число, сколько символов вывести для 1-го объекта
s1.Function(8); // Число, сколько символов вывести для 2-го объекта

cin>>z;
return 0;
}
//---------------------------------------------------------------------------

bool
19-12-2007, 18:00
Создайте функцию,которая обычно принимает один аргумент-адрес строки-и выводит эту строку на экран один раз.Но если задаеться второй аргумент типа int,который не равен нулю,то эта функция выводит строку столько раз,какое число было передано функции,а если ж этот переданный параметр равен нулю,-то столько раз,сколько было вызовов функции до момента ево вызова.Используйте эту функцию в програме,что б показать как она работает »
#include <iostream>
using namespace std;
void func(char *p,int n=0);
int main()
{
char *s = "bla bla bla";
func(s);
cout <<endl << "1 string:" << endl;
func(s,5);
cout << "5 strings:" << endl;
return 0;
}
void func(char *p,int n)
{
if(n==0)
cout << p;
else
for(int i=0;i<n;i++)
cout << p << endl;
}




© OSzone.net 2001-2012