标题 | C语言在电气计算中的应用 |
范文 | 摘 要:C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。因此学好C语言就显得特别重要,我根据自己学习实践心得写《C语言在电气计算中的应用》,告诉大家如何编好电气计算C语言程序,为同学们学習C语言提供新方法。 关键词:电气测量;电气计算; C语言;文件编译;全局变量;高效 一、 引言 本文着重阐述C语言程序编写及C语言程序实验所需的逻辑以及会面临的问题。在C语言编程中使用最多得就是变量,变量分为全局变量和局部变量。如果一个程序中大量使用的全局变量会造成程序复杂化,调试也变得很麻烦。而如果把他们改在不同的程序,作为局部变量,会使代码清晰,也可以更好地查找程序问题。这种多文件编译法在复杂程序编程中已大量的使用,所以掌握C语言编程及实验对以后的编复杂程序至关重要。其实只要掌握了编程思路,再找出易错的地方,编程就显得比较简单。 二、问题提出 近年来,随着计算机的不断发展,电气计算的方式也在不断地变化,我们只需要测量少量电气参数就能计算出其他电气参数,为电气测量的快捷、高效提供可能。 如何编写一个快捷高效的电气计算C程序呢?答案之一就是:程序中不要大量使用全局变量,而尽量使用的局部变量,就会避免造成程序复杂化,会使代码清晰,也可以更好地查找程序问题。 下面以一个电气计算C程序编写,来说明如何更好编写一个电气计算C程序。 1.程序目的 1. 高效实现多文件编译。 2. 了解头文件的作用。 2.程序内容 1. 编制程序计算阶梯型电阻电路的电流值。电路示意图如下: 此电路为一个电阻分压直流电路,但如果电源为交流电,电阻改为电感和电阻和电容组成的电路,那就是一个电网的简化电路,就可以用来计算电网短路电流,所以此电路的通用性非常大,编写的程序通用性也非常大。 2. 能接收用户输入的电压源电势 E 和所有电阻的电阻值。 3. 程序能判断输入值是否正确,不正确时能进行正确处理。输入数据不正确 情况包括:电阻输入 0 或负值,输入电阻的数目为奇数。 4. 输出计算结果:每个电阻上的电压和电流。 3.程序要求 1. 建立新项目,录入源代码,编辑,编译,运行,调试直至得出正确运行结果。 2. 将主函数 main、输入 input、计算 calculate、输出 output 共 4 个函数分配到 4 个源文件中,常量及函数原型声明放到头文件 def.h 中,进行编译。 不允许使用全局变量,而要采用函数参数传递,通过实参和形参的结合传递必要 的参数。 单向传递可用值传递,双向传递得用地址传递。 函数名 所属源文件 功能 main main.c 程序入口,声明所有程序中用到的变量、数组,并依次 调用其它 3 个子程序 input input.c 从键盘输入电压源电势、电阻个数及每个电阻的阻值, 并通过函数参数返回 main 函数 calculate calculate.c 接收主函数给定的梯形电路的相关参数,计算每一个电 阻上的电流和电压值并返回 main 函数 output output.c 接收主函数给定的相关参数,输出每个电阻的阻值、电流和电压 4.步骤 1. 进入编程环境,建立新项目。 2. 在项目中依次添加 5 个源文件:main.c, input.c, calculate.c, output.c(右键点击 源文件,新建,选择 C++文件),def.h 添加于头文件下(右键点击头文件,新建,选 择.h 文件)。 3. 编译和运行程序。 4. 如果编译或运行有错,修改错误或调试直至程序能给出正确的运行结果。 三、代码的准备及过程 1.完成前的准备 首先完成该实验需要四个源文件和一个头文件,并且要求不允许使用全局变量。按照要求主函数应调用其他源文件中的三个函数,相当于原来我们在主函数中需要完成的输入输出和计算过程的代码,把他们分别变成三个函数放到三个源文件中。既然主函数要调用其他三个函数,那其他三个函数就必须要先声明,然后在三个源文件中分别对这三个函数的代码进行编写,最后在主函数中调用这三个函数。在主函数中要确定的变量有总电压,电阻个数和每个电阻的大小以及每个电阻的电压电流。我们应该明确总电压e ,电阻个数n和每个电阻的阻值r,这些变量要在input 函数中输入进来,然后把这些变量传递到main 函数中。然后把这些变量输入到calculate 函数中,同时calculate 函数计算出每一个电阻对应的电压v,电流i,把电压v和电流i的值传递到主函数中。最后,把电压v和电流i为传递到output 函数中, output 函数再把每一个电阻对应的电压和电流显示出来。这是编写代码的基本思路。 2.main 函数代码编写 main函数中要定义电阻个数n总电压e及每一个电阻的阻值r及它对应的电压v和电流i大小。r和v及i 应定义为float型的数组,来存放每一个电阻的阻值,电压和对应的电流。n 应定义为整形,e 应定义为float型。现在我们需要从input 的函数中得到e,n, r 这三个变量的值。但如果用return,无法返回那么多变量的值,可以换一种思路。在这里我们采用指针,把e, n ,r的地址传递到input 函数中, input 函数中直接把e,n, r 的地址作为scanf 函数的参数,从而把输入的值赋值给e,n, r 这三个变量的地址对应的变量(其实就是e,n, r 这三个变量)这样就成功的把值赋值给了e,n, r 这三个变量,把函数定义为void,没有返回值,达到同样效果。r 是一个数组,其本身就代表着第0个元素的地址,所以input 函数只用把e, n 的地址和r作为函数的实参 。calculate函数应输入总电压e,电阻个数n, 电阻阻值r,返回每一个电阻对应的电压v和电流i。v 和i 也是数组,可以像input 函数一样把v, i 当做函数的实参,这样他们的地址就可以输入函数中,经过calculate 函数的计算,计算出每个电阻对应的电压和电流,直接把这些值存储在v, i 这两个数组中,从而其实就得到了v, i 的值。output 函数就只需要把v, i 作为实参传递进去,然后用printf 函数显示出来。 下面是参考代码 #include"def.h" #include #include int main() { float e, r[1000], v[1000], i[1000]; int n; input(&e,&n,r); calculate(e, n, r, v, i); output(i,v,n); system("pause"); return 0; } 3.其他函数编写 input函数,主要是输入函数,以下是参考代码 void input(float *e, int *n, float r[]) { printf("请输入电压"); scanf_s("%f",e); printf("请输入电阻个数"); scanf_s("%d",n); if (*n % 2 != 0) printf("电阻值必须为偶数"); printf("请输入各电阻值"); for (int i = 0; i < *n; i++) scanf_s("%f",&r[i]); for (int i = 0; i < *n; i++) { if (r[i] <= 0) printf("第%d个电阻值错误", i); } } calculate函数,主要是计算函数,如何計算在此不做说明,以下为参考代码 void calculate( float e,? int n, float r[], float v[], float i[]) { float ratio; int k = n-1; v[k] = 1.0; i[k] = v[k]/r[k]; k--; i[k] = i[k+1]; v[k] = r[k] * i[k]; k--; while(k > 0) { v[k] = v[k+1] + v[k+2]; i[k] = v[k]/r[k]; k--; i[k] = i[k+1] + i[k+2]; v[k] = r[k] * i[k]; k--; } ratio = e / (v[0] + v[1]); for(k=0; k { i[k] *= ratio; v[k] *= ratio; } } output函数为输出函数,以下为参考代码 void output(float i[], float v[], int n) { int a; for (a = 0; a < n; a++) { printf("第%d的电阻电流为%f", a + 1, i[a]); printf("第%d的电阻电压为%f\n", a + 1, v[a]); } } 此外,还需要在def.h中进行函数的声明,并在main.c文件中用#include"def.h"把这些声明添加进去,以下为参考代码 void input(float *,int *,float []); void calculate( float,? int ,? float [], float [], float []); void output(float[], float [], int ); 四、可能出现的问题 1.函数调用时的实际参数与形参不对应,造成编译通不过或得到的结果不对。如void calculate( float e,? int n, float r[], float v[], float i[]),但调用时却成了calculate(e, n, r,i,v);造成得到的电压v实际存储电流i,电流i实际存储为电压v。 2.声明时函数的变量与编写时类型不符合。或如声明函数时为void calculate( float,? int ,? float [], float [], float []);但编写时却成了void calculate( float e,? float n, float r[], float v[], float i[])声明时第二个参数n为int型,但编写时把它当作float型,造成编译错误。 3.没分清函数声明与调用,如 int main() { float e, r[1000], v[1000], i[1000]; int n; void input(float *e, int *n, float r[]); void calculate( float e,? int n,? float r[], float v[], float i[]); void output(float a[], float b[], int n); system("pause"); return 0; } main函数中应该调用函数,而这里却成了声明函数,声明应该在main函数前,这样就错了。 4.如下 void input(float *e, int *n, float r[]) { printf("请输入电压"); scanf_s("%f",&e); printf("请输入电阻个数"); scanf_s("%d",&n); if (*n % 2 != 0) printf("电阻值必须为偶数"); printf("请输入各电阻值"); for (int i = 0; i < *n; i++) scanf_s("%f",&r[i]); for (int i = 0; i < *n; i++) { if (r[i] <= 0) printf("第%d個电阻值错误", i); } } 这里scanf_s函数需要的是实参e和n的地址,input函数中形参e,n为指针,他们为实参e,n的地址,在scanf_s函数中直接用指针e,n,这样就能直接给形参e,n赋值,如果再对形参e,n取地址,那么scanf_s函数将把输入的值赋值给形参e,n,并没有实现对实参e,n赋值。 四、运行结果 五、结束语 应用C语言编写电气计算程序,可以实现用C语言计算电气参数,减少电气参数的测量,简化测量设备。并通过计算机实现电气参数的存储,转换,传输等功能。为进一步实现计算机在电气设备中的普及运用打下基础,更为设备的电气自动化、信息化等提供可能,同时又省去大量的测量仪表,为进一步提高电气控制自动化提供可能。 参考文献(References) [1]《C语言程序设计》? 彭慧卿 [2]《C程序设计语言》? 布莱恩?克尼汉 [3]电路基础 [美] 查尔斯K.亚历山大 作者简介: 罗智敏,从事水电自动化学习. |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。