// Функция вывода сообщений об ошибках (о нулевой или вырожденной матрице)
void Singular(int why, long iStr)
{
if( why == 0 )
printf("Zero string %d\n", iStr);
if( why == 1 )
printf("Degenerative matrix. Program will divide by zero\n");
// В случае ошибки немедленно выйти из программы
exit(1);
}
Файл Node.cpp - реализация класса узла
#include "stdafx.h"
// Подключение файла заголовка класса узла
#include "Node.h"
// Конструктор и деструктор класса CNode
CNode::CNode()
{
}
CNode::~CNode()
{
}
// Функция назначения координат узлу
void CNode::SetCoord(double xCoord, double yCoord)
{
x = xCoord;
y = yCoord;
}
// Функция назначения внешних связей узлу
void CNode::SetConnection(bool xConnection, bool yConnection)
{
supX = xConnection;
supY = yConnection;
}
// Функция проверки наличия связи узла по направлению numberDisplacement%2 (0 - // вдоль оси 0Х, 1 - вдоль оси 0Y)
bool CNode::ThereIsConnection(long numberDisplacement)
{
if( numberDisplacement%2 == 0 )
return supX;
else
return supY;
}
Файл Rod.cpp - реализация класса стержня
#include "stdafx.h"
// Подключение файлов заголовков классов стержня, узла
#include "Rod.h"
#include "Node.h"
// Подключение библиотеки математических функций
#include <math.h>
// Импортирование глобального указателя, объявленного в другом файле - в файле
// Ferma.cpp
extern CNode *node;
// Конструктор и деструктор класса CRod
CRod::CRod()
{
}
CRod::~CRod()
{
}
// Функция назначения номеров узлам стержня (номера в глобальной системе
// координат)
void CRod::SetNodesNumber(long node1Number, long node2Number)
{
node1 = node1Number;
node2 = node2Number;
}
// Функция назначения геометрических и физических параметров стержня - площадь
// и модуль упругости
void CRod::SetParam(double AkValue, double EValue)
{
Ak = AkValue;
E = EValue;
}
// Функция вычисления длины стержня по координатим двух его узлов. Зная
// глобальные номера узлов (переменные node1 и node2 класса CRod), можно,
// обращаясь к объектам node[i] класса CNode, узнать координаты этих узлов, а по
// координатам вычислить длину стержня. Поскольку здесь, в реализации класса
// CRod, используются объекты node[i] класса CNode, то необходимо было
// импортировать объекты node[i] строкой
// extern CNode *node;
// (см. выше в этом листинге) и для "пояснения" компилятору языка VC++, что из
// себя представляет класс CNode, выше импорта подключить заголовочный файл
// класса CNode строкой
// #include "Node.h" (также см. выше в этом листинге)
void CRod::GetLength()
{
// Вычисление квадрата проекции на ось 0Х расстояния между узлами. Быстрее
// воспользоваться умножением, чем функцией pow() возведения в степень
lk = (node[ node2 ].x-node[ node1 ].x)*(node[ node2 ].x-node[ node1 ].x);
// Теперь прибавление квадрата проекции на ось 0Y расстояния между узлами, в
// результате переменная lk содержит квадрат этого расстояния
lk += (node[ node2 ].y-node[ node1 ].y)*(node[ node2 ].y-node[ node1 ].y);
// Вычисление расстояния между узлами
lk = sqrt( lk );
}
// Функция вычисления угла наклона стержня к горизонтальной оси 0Х. Угол равен арктангенсу отношения проекций расстояния между узлами на оси 0Y и 0Х
void CRod::GetAngle()
{
// Если из выражения для omega убрать явное приведение величин проекций к
// вещественному числу, то при знаменателе равном нулю будет выдана ошибка о
// делении целого числа на ноль и программа завершится. Соответственно
// правильное значение угла наклона стержня в PI/2 радиан вычислено не будет
omega = atan2( double(node[ node2 ].y - node[ node1 ].y),
double(node[ node2 ].x - node[ node1 ].x) );
}
// Функция заполнения собственной матрицы жесткости стержня в глобальной системе // координат
void CRod::FillSelfMatrix()
{
// Вычисление повторяющегося коэффициента E*Ak/lk в матрице |k|, квадратов
// косинуса и синуса угла наклона стержня, произведения косинуса угла наклона
// на синус
double koef=E*Ak/lk, c2=cos(omega)*cos(omega), s2=sin(omega)*sin(omega),
sc=sin(omega)*cos(omega);
// Матрица |k| имеет размерность 4х4 элемента. Вычисляем ее коэффициенты по
// строкам
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.