Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2009, 16:40   #1
aka_faith
Пользователь
 
Аватар для aka_faith
 
Регистрация: 15.05.2009
Сообщений: 74
Лампочка работа с классами, но трабл в функциях-методах

О ужас! Лето, хочется на море, а тут сидишь и пытаешься написать программку...
Доброе врремя суток Всем! Чудесного Вам дня и отличного настроения!!!)))

А теперь ближе к телу))) Очень нужна помощь...

Задание:
Создать два объекта с использованием разных конструкторов, вызвать необходимые методы для обработки объектов с выводом полученных результатов.

Методы для задания:
параметр Р определяется, как
Отношение произведения ненулевых элементов к сумме положительных элементов матрицы.(*)
если P>0, то
К максимальному элементу каждого столбца матрицы прибавить такое значение, чтобы сумма элементов в этом столбце стала равна 0.(**)

-- в написании этих методов и заключается проблемка, подскажите алгоритм этих ф-ций, плиз

Вот мой листинг:
Код:
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
#include<math.h>
#include<conio.h>

class matr
{
private:
float *x,*p;
int n,m;

public:
matr();//конструктор без параметров
matr(int,int,float,float,float);//с параметрами
~matr();// деструктор
void print();//печать
void otnosh(float *p);//определяет параметр Р (*)
void znach();//если Р>0, то определяем значение (**)
};

matr::matr()
{
 cout<<endl<<"Vvedite rasmernost"<<endl;
 cout<<"n="; cin>>n;
 cout<<endl<<"m="; cin>>m;
 x=new float [n*m];
 for (int  i=0; i<m; i++)
   for (int j=0; j<n; j++)
   *(x+i*n+j)=-20+40*(float)rand()/RAND_MAX;
 cout<<endl<<"Rabotal konstructor bes parametrov";
}

matr::matr(int M,int N, float A, float B, float C)
{
 m=M; n=N;
 x=new float[n*m];
 for (int i=0; i<m; i++)
   for (int j=0; j<n; j++)
   *(x+i*n+j)=A*tan(i+B)*asin(j+C)*asin(j+C);
 cout<<endl<<"Rabotal konstructor s parametrami";
}

matr::~matr()
{
 delete[]x;
 cout<<endl<<"Rabotal destructor";
 getch();
}

void matr::print()
{
 for (int i=0; i<m; i++, printf("\n"))
   for (int j=0; j<n; j++)
   printf("%10.3f",*(x+i*n+j));
}

void matr::otnosh(float *p)
{
 *p=1;
 float s=0, pr=1;

 printf("\n P=%9.2f\n",*p);
}

void matr::znach()
{
 float s, max, zn;

 printf("\n max=%9.2f\n",max);
 printf("\n zn=%9.2f\n",zn);
}

void main()
{
 clrscr();
 matr a;
 int m1, n1;
 float A,B,C;
 a.print();
 a.otnosh(&p);
 if (p>0)
 {a.znach();
 a.print();}
 else cout<<endl<<"P<0 - Uslovie ne vipolnyaensja";
 getch();

 clrscr();
 cout<<endl<<"Vvedite razmer matrici"<<endl;
 cout<<"n=";cin>>n1;
 cout<<endl<<"m="; cin>>m1;
 cout<<endl<<"Vvedite A"; cin>>A;
 cout<<endl<<"Vvedite B"; cin>>B;
 cout<<endl<<"Vvedite C"; cin>>C;
 matr b(m1,n1,A,B,C);
 b.print();
 b.otnosh(&p);
 if (p>0)
 {b.znach();
 b.print();}
 else cout<<endl<<"P<0 - Uslovie ne vipolnyaensja";
 getch();
}

Последний раз редактировалось aka_faith; 14.06.2009 в 16:43.
aka_faith вне форума Ответить с цитированием
Старый 14.06.2009, 18:50   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
-- в написании этих методов и заключается проблемка, подскажите алгоритм этих ф-ций, плиз
Если проблема только в этом, то пока листинг не смотрел )
Описываю алгоритм
Цитата:
параметр Р определяется, как
Отношение произведения ненулевых элементов к сумме положительных элементов матрицы.(*)
Пусть есть матрица A размером nxm в виде одномерного массива..

Код:
float Proiz = 1; // тут храним произведение
float Sum = 0; // а тут сумму
for(i=0; i<n; i++)
 for(j=0; j<m; j++)
  {
  if(A[i*n+j]!=0) Proiz *= A[i*n+j];
  if(A[i*n+j]>0) Sum += A[i*n+j];
  }
P = Proiz/Sum;
Цитата:
если P>0, то
К максимальному элементу каждого столбца матрицы прибавить такое значение, чтобы сумма элементов в этом столбце стала равна 0.(**)
Ищем сумму столбца (Summ), потом ищем максимум (max). Далее max = max - Summ.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 14.06.2009, 19:45   #3
aka_faith
Пользователь
 
Аватар для aka_faith
 
Регистрация: 15.05.2009
Сообщений: 74
По умолчанию

опять ошибки:
Код:
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
#include<math.h>
#include<conio.h>

class matr
{
private:
float *x,*p;
int n,m;

public:
matr();
matr(int,int,float,float,float);
~matr();
void print();
void otnosh(float *p);
void znach();
};

matr::matr()
{
 cout<<endl<<"Vvedite rasmernost"<<endl;
 cout<<"n="; cin>>n;
 cout<<endl<<"m="; cin>>m;
 x=new float [n*m];
 for (int  i=0; i<m; i++)
   for (int j=0; j<n; j++)
   *(x+i*n+j)=-20+40*(float)rand()/RAND_MAX;
 cout<<endl<<"Rabotal konstructor bes parametrov";
}

matr::matr(int M,int N, float A, float B, float C)
{
 m=M; n=N;
 x=new float[n*m];
 for (int i=0; i<m; i++)
   for (int j=0; j<n; j++)
   *(x+i*n+j)=A*tan(i+B)*asin(j+C)*asin(j+C);
 cout<<endl<<"Rabotal konstructor s parametrami";
}

matr::~matr()
{
 delete[]x;
 cout<<endl<<"Rabotal destructor";
 getch();
}

void matr::print()
{
 for (int i=0; i<m; i++, printf("\n"))
   for (int j=0; j<n; j++)
   printf("%9.2f",*(x+i*n+j));
}

void matr::otnosh(float *p)
{
 float s=0, pr=1;
 for(int i=0; i<m; i++)
   for(int j=0; j<n; j++)
    {
     if(*(x+i*n+j)!=0) pr *= *(x+i*n+j);
     if(*(x+i*n+j)>0) s += *(x+i*n+j);
     }
    *p=pr/s;
 printf("\n P=%9.2f\n",*p);
}

void matr::znach()
{
 float s, max, zn;
 for(int j=0;j<n;j++)
  {
   s=0;max=-100;
   for(int i=0;i<m;i++)
     {
       s+=*(x+i*n+j);
       if (*(x+i*n+j)>max) max=*(x+i*n+j);
       max=max-s  //Error V7.CPP 82: Statement missing ;
      }
   }
 printf("\n max=%9.2f\n",max);
 printf("\n summa=%9.2f\n",s);
}

void main()
{ //Error V7.CPP 89: Declaration syntax error
 clrscr();
 matr a;
 int m1, n1;
 float A,B,C;
 a.print();
 a.otnosh(&p);
 if (p>0)
 {a.znach();
 a.print();}
 else cout<<endl<<"P<0 - Uslovie ne vipolnyaensja";
 getch();

 clrscr();
 cout<<endl<<"Vvedite razmer matrici"<<endl;
 cout<<"n=";cin>>n1;
 cout<<endl<<"m="; cin>>m1;
 cout<<endl<<"Vvedite A"; cin>>A;
 cout<<endl<<"Vvedite B"; cin>>B;
 cout<<endl<<"Vvedite C"; cin>>C;
 matr b(m1,n1,A,B,C);
 b.print();
 b.otnosh(&p);
 if (p>0)
 {b.znach();
 b.print();}
 else cout<<endl<<"P<0 - Uslovie ne vipolnyaensja";
 getch();
}}//Error V7.CPP 118: Declaration missing ;
почему??

да и значение, чтобы сумма элементов в этом столбце стала равна 0, разве так надо найти? потом же надо распечатать матрицу с измененными максимумами, так разве не надо изменить максимум, т.е. добавить к нему найденое значение, чтоб сумма все же была нолик?? Как это правильно сделать??
aka_faith вне форума Ответить с цитированием
Старый 14.06.2009, 19:55   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
 max=max-s  //Error V7.CPP 82: Statement missing ;
Вообще-то, компилятор прямым текстом говорит, что пропущена точка с запятой.

Код:
 a.otnosh(&p);
p не объявлена.
Код:
}}//Error V7.CPP 118: Declaration missing ;
лишняя скобка.

Цитата:
потом же надо распечатать матрицу с измененными максимумами, так разве не надо изменить максимум, т.е. добавить к нему найденое значение, чтоб сумма все же была нолик?? Как это правильно сделать??
А вы перечитайте мой предыдущий пост. Я обо всем сказал.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 14.06.2009, 20:52   #5
aka_faith
Пользователь
 
Аватар для aka_faith
 
Регистрация: 15.05.2009
Сообщений: 74
По умолчанию

ой, а что с моим конструктором с параметрами, что это:
Цитата:
Vvedite C5
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error
asin: DOMAIN error

Rabotal konstructor s parametrami +NAN +NAN +NAN +NAN
+NAN +NAN +NAN +NAN
+NAN +NAN +NAN +NAN
+NAN +NAN +NAN +NAN
+NAN +NAN +NAN +NAN
Floating point error: Domain.
Abnormal program termination
??
aka_faith вне форума Ответить с цитированием
Старый 14.06.2009, 21:14   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

aka_faith, назовите значения, при которых возникает такое. Что вводить?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 14.06.2009, 21:20   #7
aka_faith
Пользователь
 
Аватар для aka_faith
 
Регистрация: 15.05.2009
Сообщений: 74
По умолчанию

при любых значения n,m,A,B,C!!

а ненулевые элементы матрицы - это просто элементы, которые не равны 0??
aka_faith вне форума Ответить с цитированием
Старый 14.06.2009, 21:30   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
а ненулевые элементы матрицы - это просто элементы, которые не равны 0??
Да.

У вас формула в конструкторе:
Код:
*(x+i*n+j)=A*tan(i+B)*asin(j+C)*asin(j+C);
Только вот аргументом арксинуса должно быть число от -1 до 1.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 14.06.2009, 22:11   #9
aka_faith
Пользователь
 
Аватар для aka_faith
 
Регистрация: 15.05.2009
Сообщений: 74
По умолчанию

Но сумма и максимальный элемент находятся не правильно:
Код:
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
#include<math.h>
#include<conio.h>

class matr
{
private:
float *x,*p;
int n,m;

public:
matr();
matr(int,int,float,float,float);
~matr();
void print();
void otnosh(float *p);
void znach();
};

matr::matr()
{
 cout<<endl<<"Vvedite rasmernost:"<<endl;
 cout<<"n="; cin>>n;
 cout<<endl<<"m="; cin>>m;
 x=new float [n*m];
 for (int  i=0; i<m; i++)
   for (int j=0; j<n; j++)
   *(x+i*n+j)=random(50)-15;
 cout<<endl<<"Rabotal konstructor bes parametrov"<<endl<<endl;
}

matr::matr(int M,int N, float A, float B, float C)
{
 m=M; n=N;
 x=new float[n*m];
 for (int i=0; i<m; i++)
   for (int j=0; j<n; j++)
   *(x+i*n+j)=A*tan(i+B)*sin(j+C)*sin(j+C);
 cout<<endl<<"Rabotal konstructor s parametrami"<<endl<<endl;
}

matr::~matr()
{
 delete[]x;
 cout<<endl<<"Rabotal destructor"<<endl;
 getch();
}

void matr::print()
{
 for (int i=0; i<m; i++, printf("\n"))
   for (int j=0; j<n; j++)
   printf("%9.2f",*(x+i*n+j));
}

void matr::otnosh(float *p)
{
 float s=0, pr=1;
 for(int i=0; i<m; i++)
   for(int j=0; j<n; j++)
    {
     if(*(x+i*n+j)!=0) pr *= *(x+i*n+j);
     if(*(x+i*n+j)>0) s += *(x+i*n+j);
     }
    *p=pr/s;
 cout<<endl<<"P="<<*p<<endl;
}

void matr::znach()
{
 float s, max, zn;
 for(int j=0;j<n;j++)
  {
   s=0;max=-100;
   for(int i=0;i<m;i++)
     {
       s+=*(x+i*n+j);
       if (*(x+i*n+j)>max) max=*(x+i*n+j);
       max=max-s;

	     }  cout<<endl<<"max="<<max<<endl;
   }
   }

void main()
{
 clrscr();
 matr a;
 int m1, n1;
 float A,B,C,p;
 a.print();
 a.otnosh(&p);
 if (p>0)
 {a.znach();
 cout<<endl<<"Preobrazovanaya matrica"<<endl<<endl;
 a.print();}
 else cout<<endl<<"P<0 - Uslovie ne vipolnyaensja";
 getch();

 clrscr();
 cout<<endl<<"Vvedite razmer matrici:"<<endl;
 cout<<"n=";cin>>n1;
 cout<<endl<<"m="; cin>>m1;
 cout<<endl<<"Vvedite koefisienti:"<<endl;
 cout<<endl<<"A="; cin>>A;
 cout<<endl<<"B="; cin>>B;
 cout<<endl<<"C="; cin>>C;
 matr b(m1,n1,A,B,C);
 b.print();
 b.otnosh(&p);
 if (p>0)
 {b.znach();
 cout<<endl<<"Preobrazovanaya matrica"<<endl<<endl;
 b.print();}
 else cout<<endl<<"P<0 - Uslovie ne vipolnyaensja";
 getch();
}
Например:
Цитата:
Vvedite razmer matrici:
n=3

m=3

Vvedite koefisienti:

A=3

B=3

C=4

Rabotal konstructor s parametrami

-0.24 -0.39 -0.03
1.99 3.19 0.27
-5.81 -9.33 -0.79

P=0.043569

max=4.309005

max=6.917999

max=0.587372

Preobrazovanaya matrica

-0.24 -0.39 -0.03
1.99 3.19 0.27
-5.81 -9.33 -0.79

Rabotal destructor

Rabotal destructor
как сделать, чтоб на экране бло такое:
Цитата:
Vvedite razmer matrici:
n=3

m=3

Vvedite koefisienti:

A=3

B=3

C=4

Rabotal konstructor s parametrami

-0.24 -0.39 -0.03
1.99 3.19 0.27
-5.81 -9.33 -0.79

P=0.043569

max=1.99

max=3.19

max=0.27


Preobrazovanaya matrica

-0.24 -0.39 -0.03
6.05 9.72 0.82
-5.81 -9.33 -0.79

Rabotal destructor

Rabotal destructor
??
aka_faith вне форума Ответить с цитированием
Старый 14.06.2009, 22:26   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Может, вы все-таки будете логически обдумывать алгоритм, вместо копи-пастинга?

Смотрим в цикл по строкам:
Код:
 for(int i=0;i<m;i++)
     {
       s+=*(x+i*n+j);
       if (*(x+i*n+j)>max) max=*(x+i*n+j);
       max=max-s;
Запоминаем максимальный элемент. А точнее, его значение.
Далее, зачем-то отнимаете от него сумму. Спрашивается: зачем?

И вообще, зачем вам значение максимального элемента, если вы собрались его изменять? Вам не кажется более логичным запоминать индекс?

Код:
void matr::znach()
{
 float s, zn;
 int max;
 for(int j=0;j<n;j++)
  {
   s=0;
   max=0;
   for(int i=0;i<m;i++)
     {
       s+=*(x+i*n+j);
       if (*(x+i*n+j)>*(x+max*n+j)) max = i;
     }  cout<<endl<<"max="<<*(x+max*n+j)<<endl;
      *(x+max*n+j)=*(x+max*n+j)-s;
   }
   }
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с классами и объектами Shavminator Общие вопросы Delphi 7 18.12.2009 04:11
Форматирование текста в функциях. shadrikoff Microsoft Office Excel 5 26.02.2009 08:13
Логические подстановки в формулах/функциях vprima Microsoft Office Excel 5 16.02.2009 16:42
Код в поцедурах и функциях! Jondeer Общие вопросы C/C++ 1 10.06.2008 18:16
Изменяемый диапазон массива в функциях slba Microsoft Office Excel 4 29.06.2007 19:10