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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2009, 18:15   #1
Wia
Пользователь
 
Регистрация: 06.12.2008
Сообщений: 79
Восклицание Функции и Указатели на С++

помогите исправить ошибки.
Заданы три квадратные матрицы A, B, С. Вычислить матрицу D=(A+B)k+(B+C)k+(C+A)k.
Функции:
1) вычисление суммы двух матриц.
2) вычисление произведения матрицы на вектор.


Код:
#include <cstdlib>
#include <iostream>

using namespace std;



int sum (double *A,double *B,double *C,double *y,double *l,double *x)
{
        const int n=3;
        int i,j;
    *(y+i*n+j)=*(A+i*n+j)+*(B+i*n+j);
    *(l+i*n+j)=*(B+i*n+j)+*(C+i*n+j);
    *(x+i*n+j)=*(C+i*n+j)+*(A+i*n+j);
}

int vektor (double *k,double *q,double *z,double *f,double *y,double *x,double *l)
{
        const int n=3;
        int i,j;
    *(q+j)=*(y+i*n+j)**(k+j);  
    *(z+j)=*(l+i*n+j)**(k+j);
    *(f+j)=*(x+i*n+j)**(k+j);
    
}    
  
      
int main(int argc, char *argv[])
{
        const int n=3;
        int i,j;
    double *A,*B,*C,*D,*k,*q,*l,*x,*y,*z,*f;
    A=new double[n*n];
    B=new double[n*n];
    C=new double[n*n];
    D=new double[n*n];
    k=new double[n*n];
    q=new double[n*n];
    l=new double[n*n];
    x=new double[n*n];
    y=new double[n*n];
    z=new double[n*n];
    f=new double[n*n];
    cout<<"Vvedite matricy A"<<endl;
                   for(i=0;i<n;i++)
                   for(j=0;j<n;j++)
                   cin>>*(A+i*n+j);
    cout<<"Vvedite matricy B"<<endl;
                   for(i=0;i<n;i++)
                   for(j=0;j<n;j++)
                   cin>>*(B+i*n+j);
    cout<<"Vvedite matricy C"<<endl;
                   for(i=0;i<n;i++)
                   for(j=0;j<n;j++)
                   cin>>*(C+i*n+j);       
                      int sum;
    cout<<"Vvedite vektor k["<<j<<"]"<<endl;
    for(i=0;i<1;i++)
    for(j=0;j<n;j++)
    cin>>*(k+j);
                      int vektor;         
    *(D+j)=*(q+j)+*(z+j)+*(f+j);
    cout<<"Matrica D"<<endl;
                   for(i=0;i<1;i++)
                   for(j=0;j<n;cout<<endl,j++)
    cout<<*(D+j);     



     delete[] A;
     delete[] B; 
     delete[] C; 
     delete[] D; 
     delete[] q; 
     delete[] l; 
     delete[] x; 
     delete[] y; 
     delete[] z; 
     delete[] f; 
     delete[] k;
     
    system("PAUSE");
    return EXIT_SUCCESS;
}
Wia вне форума Ответить с цитированием
Старый 17.04.2009, 08:55   #2
Wia
Пользователь
 
Регистрация: 06.12.2008
Сообщений: 79
По умолчанию

помогите пожалуйста!!!!!!!!
Wia вне форума Ответить с цитированием
Старый 17.04.2009, 13:14   #3
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Привожу общее решение. Код не тестировался.

Сначала надо было упростить выражение. Код можно было бы написать и аккуратнее(особенно такого размера).

Код:
#include <cstdlib>
#include <iostream>

using namespace std;

int n;

void sum(double *A , double *B , double *C){
   //A , B - слагаемые, С - результат
      
   for(int i = 0; i < n; i++)
      for(int j = 0; j < n ; j++)
         *(C + i * n + j) = *(A + i * n + j) + *(B + i * n + j);

}

void prod(double *A , double *k , double *B){
   /* произведение матрицы на вектор 
     A , k - множители , B - результат */
     
   for(int i = 0 ; i < n ; i++)
      for(int j = 0 ; j < n ; j++)
         *(B + i * n + j) += *(A + i * n + j) * *(k + i);
    
} 

void prod_dig(double *A , double d){

   for(int i = 0 ; i < n ; i++)
      for(int j = 0 ; j < n ; j++)
         *(A + i * n + j) *= d;

}
  
      
int main(){

   double *A , *B , *C , *D , *k;

   A = new double [n * n];
   B = new double [n * n];
   C = new double [n * n];
   D = new double [n * n];
   k = new double [n * n];
   

   cout << "Vvedite poryadok" << endl;
   cin >> n;

   cout << "Vvedite matricy A" << endl;
   for(int i = 0; i < n; i++)
      for(int j = 0; j < n; j++)
         cin >> *(A + i * n + j);
   
   cout << "Vvedite matricy B" << endl;
   for(int i = 0; i < n; i++)
      for(int j = 0; j < n; j++)
         cin >> *(B + i * n + j);
   
   cout << "Vvedite matricy C" << endl;
   for(int i = 0; i < n; i++)
      for(int j = 0; j < n; j++)
         cin >> *(C + i * n + j);       
   
   
   cout << "Vvedite vektor k" << endl;
   for(int i = 0; i < n; i++)
         cin >> *(k + i);
   
   //выносим 2 * k за скобки и ...
   sum(A , B , A);
   sum(A , C , A);
   prod_dig(A , 2);
   prod(A , k , D);
   
   cout << "Matrica D" << endl;
   for(int i = 0; i < 1; i++)
      for(int j = 0; j < n; cout << endl , j++)
         cout << *(D + j);     



   delete[] A;
   delete[] B; 
   delete[] C; 
   delete[] D; 
   delete[] k;
     
   system("PAUSE");
   return 0;
}
Надеюсь речь шла о векторе-столбце, иначе выражение не имеет смысла...
megachuhancer вне форума Ответить с цитированием
Старый 17.04.2009, 14:57   #4
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Здесь, конечно, ошибка.

Произведение матрицы на вектор - это вектор!

Исправленный код:
Код:
#include <cstdlib>
#include <iostream>

using namespace std;

int n;

void sum(double *A , double *B , double *C){
   //A , B - слагаемые, С - результат
      
   for(int i = 0; i < n; i++)
      for(int j = 0; j < n ; j++)
         *(C + i * n + j) = *(A + i * n + j) + *(B + i * n + j);

}

void prod(double *A , double *k , double *B){
   /* произведение матрицы на вектор 
     A , k - множители , B - результат */
     
   for(int i = 0 ; i < n ; i++)
      for(int j = 0 ; j < n ; j++)
         *(B + i) += *(A + i * n + j) * *(k + j);
    
} 

void prod_dig(double *A , double d){

   for(int i = 0 ; i < n ; i++)
      for(int j = 0 ; j < n ; j++)
         *(A + i * n + j) *= d;

}
  
      
int main(){

   double *A , *B , *C , *D , *k;

   A = new double [n * n];
   B = new double [n * n];
   C = new double [n * n];
   D = new double [n];
   k = new double [n];
   

   cout << "Vvedite poryadok" << endl;
   cin >> n;

   cout << "Vvedite matricy A" << endl;
   for(int i = 0; i < n; i++)
      for(int j = 0; j < n; j++)
         cin >> *(A + i * n + j);
   
   cout << "Vvedite matricy B" << endl;
   for(int i = 0; i < n; i++)
      for(int j = 0; j < n; j++)
         cin >> *(B + i * n + j);
   
   cout << "Vvedite matricy C" << endl;
   for(int i = 0; i < n; i++)
      for(int j = 0; j < n; j++)
         cin >> *(C + i * n + j);       
   
   
   cout << "Vvedite vektor k" << endl;
   for(int i = 0; i < n; i++)
         cin >> *(k + i);
   
   //выносим 2 * k за скобки и ...
   sum(A , B , A);
   sum(A , C , A);
   prod_dig(A , 2);
   prod(A , k , D);
   
   cout << "Vector D" << endl;
   for(int i = 0; i < n; cout << endl , i++)
         cout << *(D + i);     



   delete[] A;
   delete[] B; 
   delete[] C; 
   delete[] D; 
   delete[] k;
     
   system("PAUSE");
   return 0;
}
megachuhancer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C] лабораторка. Указатели на функции. Помогите исправить ошибку) KrL^^ Помощь студентам 2 11.03.2009 22:33
Указатели. Файлы. Функции Duleks Общие вопросы C/C++ 1 15.10.2008 13:53
Указатели в функции. _LEON_ Общие вопросы C/C++ 4 04.02.2008 10:38
Указатели Си JET_FLASH Общие вопросы C/C++ 2 31.01.2008 23:02