#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <windows.h>
/* 全局变量声明 */
int TNN; //节点总数
int NFIN; //固定节点数
int NFRN; //可动节点数
int NOR; //杆件数
int NOL; //载荷总数
int NOS; //截面数
float* XCN; //节点x方向的坐标
float* YCN; //节点y方向的坐标
int* BNR; //杆件始端节点号
int* ENR; //杆件末端节点号
float* EEE; //弹性模量E
float* AAA; //横截面积A
float* JJJ; //主惯性矩J
int* NRL; //加载杆件号
int* KOL; //载荷类型
float* VOL; //载荷大小
float* DLB; //载荷距始端的距离
int* NRS; //藏面所在的杆件编号
float* DSB; //截面距始端的距离
float** LCS; //杆件的长度、倾角余弦和倾角正弦
float* DON; //存放节点位移
float* IFS; //存放截面内力、
/*函数声明*/
void PGRead();//从文本文件中读取数据
float** PGBuildTotalStif();//组集总刚度阵
void PGLCosSin(int k);//求杆件的长度,倾角余弦和正弦
int* PGI0J0(int rod);//节点对号函数
void PGBuildUnitStif(int k, int flag, float us[3][3]);//求单根杆件的单元刚度阵
void PGBuildRD(int k, int flag, float rd[3][3]);//求单根杆件局部系下刚度阵
float* PGBuildLoadVector();//组集载荷向量
void PGReactionForce(int i, float rfb[3], float rde[3]);//计算支座反力
void PGCholesky(float** A, float* b, float* x, int n);//改进的平方根法求解方程组
void PGInternalForce(int ii, int k, float xq);//计算截面内力
void PGCtlInternalForce(int jm, int i, float rfe[3], float tinf[3]);//计算简支梁截面处内力
void PGDispRodEndForce(int k, float tref[3]);//计算由节点位移产生的截面内力
void PGaaa();//格式输出函数
void PGPrint();//结果输出函数
int main()
{
SetConsoleOutputCP(65001);
char value = 0; //存放用户输入的字符
int i; //循环控制变量
float** kk, * pp;//kk为指向总刚度阵的指针,pp为指向载荷向量的指针
printf("欢迎使用平面刚架求解器 \n");
printf("\n请在根目录中的参数输入.txt中输入结构数据,保存后返回该界面,按任意键继续操作。\n");
printf("需注意:\n1.节点编号时先编固定节点再编可动节点,杆件的小号端为始端,大号端为末端。\n");
printf("2.弹性模量单位为千牛/平方米, 荷载单位为千牛。\n");
printf("3.荷载类型7的“荷载距始端”距离对应“线膨胀系数”,类型8对应“线膨胀系数/杆件厚度”。\n");
printf("\n是否开始进行结构节点位移和指定截面内力进行计算?(Y/N): ");
scanf_s("%c", &value);//用户根据提示信息选择输入字符
if (value == 'Y' || value == 'y')//用户选择'y'或'Y'则进行以下计算
{
PGRead();//从数据文件读入数据
kk = PGBuildTotalStif();//组集总刚度阵并将其指针赋给kk
printf("f",kk[0][0]);
pp = PGBuildLoadVector();//组集载荷向量并将其指针赋给pp
PGCholesky(kk, pp, DON, 3 * NFRN);//改进的平方根法求解,结果存放在DON中
for (i = 0; i < NOS; i++)//对每一截面逐个求内力
PGInternalForce(3 * i, NRS[i], DSB[i]);//求局部系截面内力,结果存放在IFS中
printf("\n");
PGaaa();//输出间隔符号
printf("\n\n");
PGPrint();//结构参数以及计算结果的输出
}
printf("\n 感谢您的使用,再见! \n\n\n");
getchar();
system("pause");
return 0;
}
void PGRead()
{
FILE* fp;//定义文件指针
char c;//存放临时的字符型数据
int i, j;//循环控制变量
fopen_s(&fp,"F:\\FastWorkLand\\C\\structural mechanics\\ddd.txt", "r");//为读取数据打开文本文件
fseek(fp, 15L, 0);//将fp所指位置从初始位置向后移动15个字节
fscanf_s(fp, "%d", &TNN,1);//读取fp指向的整形数据,存放在TNN中
fseek(fp, 18L, 1);//将fp所指位置从当前位置向后移动17个字节
fscanf_s(fp, "%d", &NFIN,1);//读取fp指向的整形数据,存放在NFIN中
fseek(fp, 15L, 1);//将fp所指位置从当前位置向后移动17个字节
fscanf_s(fp, "%d", &NOR,1);//读取fp指向的整形数据,存放在NOR中
fseek(fp, 15L, 1);//将fp所指位置从当前位置向后移动17个字节
fscanf_s(fp, "%d", &NOL,1);//读取fp指向的整形数据,存放在NOL中
fseek(fp, 15L, 1);//将fp所指位置从当前位置向后移动17个字节
fscanf_s(fp, "%d", &NOS,1);//读取fp指向的整形数据,存放在NOS中
fseek(fp, 2L, 1);//将fp所指位置从当前位置向后移动2个字节
NFRN = TNN - NFIN;//计算可动节点数
XCN = (float*)calloc(TNN, sizeof(float));//为XCN分配TNN个长度等于float变量的内存空间,下同
YCN = (float*)calloc(TNN, sizeof(float));
BNR = (int*)calloc(NOR, sizeof(int));
ENR = (int*)calloc(NOR, sizeof(int));
EEE = (float*)calloc(NOR, sizeof(float));
AAA = (float*)calloc(NOR, sizeof(float));
JJJ = (float*)calloc(NOR, sizeof(float));
NRL = (int*)ca
07-26
04-28