Использование классов при работе с векторами и матрицами (Лабораторная работа № 2), страница 2

       cin>>n;

}

     for (i=1; i<=n; i++)

       {

       cout<<"Введите "<<i<<"-тыйкомпонент ";

       cin>>V[i];

       }

}

void TVector::OutVec(int key, int w, int p)

// метод (функция) для вывода вектора на дисплей

{

// описаниеданных

     int i;

     string F,S;

// формирование формата

     strcpy(F,"%");

     itoa(w,S,10);

strcat(F,S);

     strcat(F,".");

     itoa(p,S,10);

     strcat(F,S);

     if (key==0) strcat(F,"f  ");

     else        strcat(F,"f\n");

// выводвектора

     for (i=1; i<=n; i++)

       printf(F,V[i]);

     if (key==0) printf("\n");

}

void TVector::SetVec(int comp, Vector X)

// метод (функция) для программного задания вектора

{

// описание данных

     int i;

// передача данных

n=comp;

     for (i=1; i<=n; i++)

       V[i]=X[i];

}

void TVector::GetVec(int& comp, Vector X)

// метод (функция) для программного получения вектора

{

// описание данных

     int i;

// передача данных

comp=n;

     for (i=1; i<=n; i++)

       X[i]=V[i];

}

TVector TVector::AddVec(TVector X, TVector Y)

// метод (функция) для сложения двух векторов

{

// описание данных

     int i;

     TVector R;

// сложение

     if (X.n==Y.n)  // векторы одинаковой длины

{

       R.n=X.n;

       for (i=1; i<=R.n; i++)

   R.V[i]=X.V[i]+Y.V[i];

       }

     else           // векторы разной длины

{

       R.n=1;

       R.V[1]=0;

       }

     return R;

}

TVector TVector::SubVec(TVector X, TVector Y)

// метод (функция) для вычитания двух векторов

{

// описание данных

     int i;

     TVector R;

// вычитание

     if (X.n==Y.n)  // векторы одинаковой длины

{

       R.n=X.n;

       for (i=1; i<=R.n; i++)

R.V[i]=X.V[i]-Y.V[i];

       }

     else           // векторы разной длины

{

       R.n=1;

       R.V[1]=0;

       }

     return R;

}

double TVector::MultVec(TVector X, TVector Y)

// метод (функция) для вычисления скалярного произведения двух векторов

{

// описаниеданных

     int i;

     double S;

// умножение

     if (X.n==Y.n)  // векторы одинаковой длины

{

       S=0;

       for (i=1; i<=X.n; i++)

         S+=X.V[i]*Y.V[i];

}

     else           // векторы разной длины

       S=0;

     return S;

}

При анализе текста следует обратить внимание на следующие моменты.

Заголовок каждой функции имеет сложный идентификатор, состоящий из имени класса и имени метода (функции), разделенных двумя двоеточиями :: - символаоперации разрешения области действия.

Входной параметр comp функции InpVec используется таким образом. Если его задали равным нулю, то происходит запрос числа компонентов вектора с клавиатуры, а если он имеет ненулевое положительное значение, то это значение сразу передается переменной n и начинается цикл запроса и ввода компонентов вектора. Это обеспечивает большую универсальность функции.

Первый параметр функции OutVec– переменная key – представляет собой ключ вывода: при key = 0 происходит вывод в строку, при других значениях – в столбец. Параметром w задается полное число полей вывода компоненты вектора, а параметром p – число полей для вывода ее дробной части. Формат вывода формируется в виде строковой переменной F, которая затем используется в функции printf(). Формирование строки формата выполняется с помощью строковых функций strcpy() и strcat(), а также функции преобразования целого в символьное представление itoa().

Методы класса непосредственно обращаются к переменным класса по их идентификаторам, что хорошо видно в первых четырех функциях. Но если объявленная переменная имеет тип данного же класса, обращение к ней осуществляется через сложный идентификатор, состоящий из имени самой этой переменной и имени переменной в данных класса, например, X.n, Y.V[i] и т.д. (см. тексты трех последних функций).