大学物理实验数据处理程序
本文最后更新于200 天前,其中的信息可能已经过时,如有错误可以直接在文章下留言

大一下学期,突然要开始学大学物理了,这对我简直就是噩梦,高中物理真的学的我够呛,然后还要做物理实验,实验的数据还要进行复杂的数据处理,自己不想算,在网上找的感觉也不够方便。

作为专业是计算机的,我们就是要用代码来解决问题,所以就心血来潮自己用C语言来写了。其实也不难,就是写写公式来算数据,但是在写的过程中还是遇到了一些问题,对自己来说并没有想象的那么简单。

下面的图就是数据处理的公式

我在用代码来写这些公式的时候,并没有遇到什么问题,遇到问题主要是对合成不确定度进行修约的时候,修约规则如图。

修约规则看起来不难,但是用代码描述起来对我来说真有点小难度,自己写的时候,写着写着逻辑就乱了,只能不断调试,自己不会用Visual Studio 2022对代码进行调试,都是用printf来看某一步的数据进行了之后的数据改变的,逻辑乱有一部分原因也是因为自己写代码的时候没有注释的习惯。

也不知道有没有什么头文件包含特殊函数可以解决这个问题

自己写的C语言代码如下:

#include<stdio.h>
#include<math.h>
double Average(double arr[], int datalen)
{
	double sum = 0;
	for (int j = 0; j < datalen; j++)
	{
		sum += arr[j];
	}
	double aver = sum / datalen;
	printf("输入数据的平均数为:%.6f\n", aver);
	return aver;
}
double Ua(double arr[],int datalen, double average)
{
	double summ = 0;
	for (int h = 0; h < datalen; h++)
	{
		double a1 = arr[h] - average;
		double a2 = a1 * a1;
		summ += a2;
	}
	double a3 = summ / (datalen * (datalen - 1));
	double ua = sqrt(a3);
	printf("数据的A类不确定度为:%.9f\n", ua);
	return ua;
}
void xiu(double num,double av)
{
	double target;
	int first_digit = (int)num;
	int y = 1;
	while (!first_digit)
	{
		double v1 = num * 10;
		first_digit = (int)v1;
		y++;
		num = num * 10;
	}
	int tenn = pow(10, y - 1);
	double numm = (num - first_digit) * 10;
	double nummm = numm;
	double nu = (nummm - (int)nummm) * 10;
	numm = (int)numm;

	if (first_digit >= 3)
	{
		target = first_digit / (1.0 * tenn);
		if (numm != 0)
		{
			target = 1 / (1.0 * tenn) + target;
		}
		printf("数据的合成不确定度修约为%.*lf\n", y - 1, target);
		double xx = target * 2;
		printf("测量结果的完整表示为:x=%lf±%.*lf\n", av, y-1, xx);
		printf("\n");
	}
	else {
		target = first_digit / (1.0 * tenn);
		target = target + numm / (1.0 * tenn * 10);
		if ((int)nu != 0) {
			target = 1 / (1.0 * tenn * 10) + target;
		}
		printf("数据的合成不确定度修约为:%.*lf\n", y, target);
		double xx = target * 2;
		printf("测量结果的完整表示为:x=%lf±%.*lf\n", av, y, xx);
	}
	
	
	printf("\n");
}
int main()
{
	printf("所有不确定度均保留了9位小数,请自己进行修约\n");
	printf("请输入数据的个数(0-10个):");
	int n;
	double input, arr[10], delta;
	scanf_s("%d", &n);
	for (int i = 0; i <= n-1; i++)
	{
		
		printf("请输入第%d个数据:", i+1);
		scanf_s("%lf",&input);
		arr[i] = input;
	}
	double av=Average(arr, n);
	double ua = Ua(arr, n, av);
	printf("请输入Δ仪(注意统一单位):");
	scanf_s("%lf", &delta);
	double ub = delta / (sqrt(3));
	printf("B类不确定度为:%.9f\n", ub);
	double x = (ua * ua) + (ub * ub);
	double ux = sqrt(x);
	printf("数据的合成不确定度为:%.9f\n", ux);
	double eu = (ux / av) * 100;
	printf("数据的相对不确定度为:%.9f%%\n", eu);
	
	xiu(ux,av);
	
	printf("注:修约可能有误,请自己检查一下。\n提示:对于合成不确定度和相对不确定度,当数据的首位非零数字大于或等于三时,\n取一位有效数字;当数据的首位数字小于三时,取两位有效数字。且数据保留只进位,不舍位的原则\n");
    system("pause");
	return 0;
}

当然,自己写的时候,太乱了,自己输入数据实验了几遍,暂时还没有发现哪里有问题,写完还是很有成就感的。以后还是要多用代码来解决问题。

在Visual Studio 2022里面把C语言代码编译成.exe可执行文件会更方便,具体怎么做可以问度娘。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇