=0){x1=(-" />

温度传感器C++代码

#include "stdio.h"
#include "stdlib.h"
#include "math.h"

//求解一元二次方程的函数, a, b, c分别是二次项, 一次项, 常数项的系数
double quadratic(double a, double b, double c)
{
double x1, x2, d;//d即为方程有无实根的判别式Δ
d = b * b - 4 * a * c;
if ( d >= 0 )
{
x1 = ( -b + sqrt(d) ) / ( 2 * a );
x2 = ( -b - sqrt(d) ) / ( 2 * a );
return x1 > 0 ? x1 : x2;//返回两根中大于零的一个
}
}

void main()
{
printf("**温度传感器研究中Rs和Rf的计算**\n\n");

int i=0;
float Rt[9]={0};//测量所得的九个电阻值

//以下数据要求输入测量所得的电阻值
printf("请依次输入25℃~65℃的电阻值(单位: kΩ):\n");
for(i=0;i<9;i++)
{
printf("%d℃时的电阻值: ", 5 * ( i + 1 ) + 20);
scanf("%f",&Rt[i]);
}

//将以下所得的计算所得的结果输出到answer.txt中
FILE *result;
result=fopen("answer.txt","w");

//将所测电阻打印出来
fprintf(result,"┌────┬───┬───┬───┬───┬───┬───┬───┬───┬───┐\n");
fprintf(result,"│t(℃) │ 25 │ 30 │ 35 │ 40 │ 45 │ 50 │ 55 │ 60 │ 65 │\n");
fprintf(result,"├────┼───┼───┼───┼───┼───┼───┼───┼───┼───┤\n");
fprintf(result,"│Rt(kΩ) │%5.2f │%5.2f │%5.2f │%5.2f │%5.2f │%5.2f │%5.2f │%5.2f │%5.2f │\n",Rt[0],Rt[1],Rt[2],Rt[3],Rt[4],Rt[5],Rt[6],Rt[7],Rt[8]);
fprintf(result,"└────┴───┴───┴───┴───┴───┴───┴───┴───┴───┘\n");

//定义R1,R2,R3,Rg12,Rg13,Rg2,Es12,Es13,Es2, 根据所输入的电阻值计算各自的值
double R1, R2, R3;
R1 = Rt[0];
R2 = Rt[0];
R3 = Rt[0];
double Rg12, Rg13, Rg2;
Rg12 = R1 * Rt[4] / ( R1 + Rt[4] );
Rg13 = R1 * Rt[8] / ( R1 + Rt[8] );
Rg2 = R2 * R3 / ( R2 + R3 );
double Es12, Es13, Es2;
Es12 = Rt[4] / ( R1 + Rt[4] ) * 1.0;
Es13 = Rt[8] / (R1 + Rt[8] ) * 1.0;
Es2 = R3 / ( R2 + R3 ) * 1.0;
//将计算结果打印出来
fprintf(result,"┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐\n");
fprintf(result,"│ R1 │ R2 │ R3 │ Rg12 │ Rg13 │ Rg2 │ Es12 │ Es13 │ Es2 │ V3 │\n");
fprintf(result,"├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤\n");
fprintf(result,"│%5.3f │%5.3f │%5.3f │%5.3f │%5.3f │%5.3f │%5.3f │%5.3f │%5.3f │2.000 │\n",R1,R2,R3,Rg12,Rg13,Rg2,Es12,Es13,Es2);
fprintf(result,"└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘\n");

//以下a1, b1, c1, d1, e1, f1; a2, b2, c2, d2, e2, f2为方程组两个式子化简后Rs

2, Rf*Rs, Rs, Rf2, Rf, 常数项的系数
double Rs, Rf;
double a1, b1, c1, d1, e1, f1;
double a2, b2, c2, d2, e2, f2;

a1 = 2.0;
b1 = 2.0 - Es2 + Es13;
c1 = 2.0 * ( Rg13 + Rg2 );
d1 = Es13 - Es2;
e1 = 2.0 * Rg13 - Es2 * Rg13 + Es13 * Rg2;
f1 = 2.0 * Rg13 * Rg2;

a2 = 1.0;
b2 = 1.0 - Es2 + Es12;
c2 = 1.0 * ( Rg12 + Rg2 );
d2 = Es12 - Es2;
e2 = 1.0 * Rg12 - Es2 * Rg12 + Es12 * Rg2;
f2 = 1.0 * Rg12 * Rg2;


Rs = 0;
int val = 0, flg = 1;
//将Rs, Rf的值存入临时变量中, 与前一次的值比较看是否达到要求的精度范围
double temp1=0;
double temp2=0;
//A1, B1, C1; A2, B2, C2方程化为标准形式后各自二次项, 一次项, 常数项的系数
double A1, B1, C1;
double A2, B2, C2;
fprintf(result,"┌─────┬─────┬─────┐\n");
fprintf(result,"│ 迭代次数 │ Rs │ Rf │\n");
fprintf(result,"├─────┼─────┼─────┤\n");
//以下为调用函数quadratic(a, b, c)进迭代计算的过程
do
{
temp1 = Rs;

A2 = d2;
B2 = b2 * Rs + e2;
C2 = a2*Rs*Rs + c2*Rs + f2;
Rf = quadratic(A2, B2, C2);
temp2 = Rf;
fprintf(result,"│ %-2d │%9f │%9f │\n",val,Rs,Rf);
fprintf(result,"├─────┼─────┼─────┤\n");


A1 = a1;
B1 = b1 * Rf + c1;
C1 = d1*Rf*Rf + e1*Rf + f1;
Rs = quadratic(A1, B1, C1);

//判断是否达到精度要求, 并将结果输出
if ( fabs ( Rs - temp1) < 0.01 && fabs ( Rf - temp2) < 0.01 )
{
flg = 0;
fprintf(result,"│共迭代%2d次│ Rs=%-5.2f │ Rf=%5.2f │\n",++val,Rs,Rf);
fprintf(result,"└─────┴─────┴─────┘\n");
}

val++;
}
while ( flg );


printf("计算已经完成,查看结果请到程序文件所在的目录下查看“answer.txt”。\n");
system("pause");

fclose(result);
}

相关文档
最新文档