APP下载

C语言在电气计算中的应用

2020-07-04罗智敏

科学与财富 2020年15期
关键词: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.亚历山大

作者简介:

罗智敏,从事水电自动化学习.

猜你喜欢

C语言高效
基于Visual Studio Code的C语言程序设计实践教学探索
基于C语言的计算机软件编程
C语言程序设计课程教学与学科专业相结合的探索
高职高专院校C语言程序设计教学改革探索
如何实现小学语文课堂教学的高效化
为小语课堂“瘦身”,为学生语文素养增“肥”
提高提问的有效性, 构筑高效的语文课堂
打造务实、创新、高效的语文课堂
高校三维动画课程教学方法研究
论子函数在C语言数据格式输出中的应用