东北林业大学 大学物理实验(A1,B)空气比热容比的测定
实验目的,器材,原理,自行参考实验指导书。
数据处理部分,使用C语言完成,代码如下:
#include <stdio.h>
#include <math.h>//后面使用到了log()函数与fabs函数,需要引入math库
int main()
{
/*定义变量部分。其中p0是实验环境气压,后面会有详细说明。
u1,u2为实验中采集的原始数据。sum是对空气比热容比进行累和,ave是多次实验得到的sum取的平均值
delt是不确定度。
数组a[8]是用来存储空气比热容比的结果,因为答主做实验的时候是采集了8次数据,取平均值,
所以定义了a[8],如果次数不同,直接修改数组元素个数和循环控制语句即可。*/
double p0,u1,u2,r,p1,p2;
double sum,ave,delt;
double a[8];
int i;//循环控制变量
p0=0.9768;
/*p0为标准大气压,使用时务必注意是否与实验环境一致!
如不一致,请用仪器显示数值/100作为p0初值! */
sum=0.0;
printf("请输入u1,u2,每一组两个数字输入完后按enter键:"\n");
printf("请注意:每组输入u1和u2时,必须要用英文状态下逗号分开!否则无法得到数据!"\n");
for(i=0;i<8;i++)//循环操作8次,如果实验次数不同,请直接更改循环条件与数组容量即可
{
scanf("%lf,%lf",&u1,&u2);
/*每组输入u1和u2时,必须要用英文状态下逗号分开!
否则无法得到数据!*/
p1=p0+(u1/2000.0);//由u1计算p1
p2=p0+(u2/2000.0);//由u2计算p2
a[i]=(log10(p0)-log10(p1))/(log10(p2)-log10(p1)); //计算空气比热容比
printf("p1=%lf,p2=%lf,",p1,p2);//输出每一组计算出的p1,p2的值
printf("r[%d]=%lf\n",i,a[i]);//输出每一组计算出的空气比热容比
sum=sum+a[i];//空气比热容比累和
}
ave=sum/8; //求空气比热容比的平均值
delt=fabs(ave-1.402);//利用绝对值求出相对不确定度
printf("ave=%lf\ndelt=%lf",ave,delt);//输出平均值(最终结果)和不确定度
return 0;
}
几点说明:
1.数据类型问题:我没有记错的话,这个实验仪显示的电压值,应该是两位小数。(一年多了,记不清了)为了保证后面计算中间值的准确性,数据类型采用了double型(双精度类型)。
2.说到double型,就必须要注意几个问题:
C语言中常用的小数有两种类型,分别是float和double;float称为单精度浮点型,double称为双精度浮点型。float 始终占用4个字节,double 始终占用8个字节。
在输入double类型的时候,必须使用以下格式:
scanf(%lf,&a[i]);
只有使用%lf,才能正常的得到数据。
但是在输出的时候,使用以下两行语句其中之一都可以:
printf(%f,a[i]);
printf(%lf,a[i]);
根据“默认参数提升”规则(在printf这样的函数的可变参数列表中,不论作用域内有没有原型,都适用这一规则)float型会被提升为double型。因此printf()只会看到双精度数。
但需要注意的是,printf中没有定义%lf,但是很多系统可能会接受它。确保可移植性,还是要使用%f。
答主写这个代码的时候,用的是DEV C++,是可以正常运行的。
3.使用VS(Visual Studio)注意
由于答主使用的是DEV C++,可以正常运行。但是VS中使用scanf()函数会报错,scanf()在读取时不检查边界,可能会造成内存泄露,所以VS提供了scanf_s()来替代,在调用时,必须提供给scanf_s一个数字以表明读取多少位字符,用法为:
scanf_s(“%c”,&letter,sizeof(letter));
或者是在代码最前面,加上这样一条语句:
#define _CRT_SECURE_NO_WARNINGS
这样也不会让scanf()语句报错。
这个是去年当时做实验,因为不愿意算,也抱着玩一玩的心态,写了这个程序。有点草,比如不确定度和最终结果的有效数字,没有进行处理。分享一下,也是方便大家。
部分内容引用自
1.关于double的输入输出格式
2.在VS中使用scanf()不报错的方法
其中,第二个在VS中使用scanf()不报错的方法中,还提到了让每次创建的.c文件中都有#define _CRT_SECURE_NO_WARNINGS的方法,需要的请自行移步原文查阅。