摘 要:C語言提供了許多低級(jí)處理的功能,但仍然保持著良好跨平臺(tái)的特性,以一個(gè)標(biāo)準(zhǔn)規(guī)格寫出的C語言程序可在許多電腦平臺(tái)上進(jìn)行編譯,甚至包含嵌入式處理器(單片機(jī)或稱MCU)以及超級(jí)電腦等作業(yè)平臺(tái)。因此學(xué)好C語言就顯得特別重要,我根據(jù)自己學(xué)習(xí)實(shí)踐心得寫《C語言在電氣計(jì)算中的應(yīng)用》,告訴大家如何編好電氣計(jì)算C語言程序,為同學(xué)們學(xué)習(xí)C語言提供新方法。
關(guān)鍵詞:電氣測(cè)量;電氣計(jì)算; C語言;文件編譯;全局變量;高效
一、 引言
本文著重闡述C語言程序編寫及C語言程序?qū)嶒?yàn)所需的邏輯以及會(huì)面臨的問題。在C語言編程中使用最多得就是變量,變量分為全局變量和局部變量。如果一個(gè)程序中大量使用的全局變量會(huì)造成程序復(fù)雜化,調(diào)試也變得很麻煩。而如果把他們改在不同的程序,作為局部變量,會(huì)使代碼清晰,也可以更好地查找程序問題。這種多文件編譯法在復(fù)雜程序編程中已大量的使用,所以掌握C語言編程及實(shí)驗(yàn)對(duì)以后的編復(fù)雜程序至關(guān)重要。其實(shí)只要掌握了編程思路,再找出易錯(cuò)的地方,編程就顯得比較簡單。
二、問題提出
近年來,隨著計(jì)算機(jī)的不斷發(fā)展,電氣計(jì)算的方式也在不斷地變化,我們只需要測(cè)量少量電氣參數(shù)就能計(jì)算出其他電氣參數(shù),為電氣測(cè)量的快捷、高效提供可能。
如何編寫一個(gè)快捷高效的電氣計(jì)算C程序呢?答案之一就是:程序中不要大量使用全局變量,而盡量使用的局部變量,就會(huì)避免造成程序復(fù)雜化,會(huì)使代碼清晰,也可以更好地查找程序問題。
下面以一個(gè)電氣計(jì)算C程序編寫,來說明如何更好編寫一個(gè)電氣計(jì)算C程序。
1.程序目的
1. 高效實(shí)現(xiàn)多文件編譯。
2. 了解頭文件的作用。
2.程序內(nèi)容
1. 編制程序計(jì)算階梯型電阻電路的電流值。電路示意圖如下:
此電路為一個(gè)電阻分壓直流電路,但如果電源為交流電,電阻改為電感和電阻和電容組成的電路,那就是一個(gè)電網(wǎng)的簡化電路,就可以用來計(jì)算電網(wǎng)短路電流,所以此電路的通用性非常大,編寫的程序通用性也非常大。
2. 能接收用戶輸入的電壓源電勢(shì) E 和所有電阻的電阻值。
3. 程序能判斷輸入值是否正確,不正確時(shí)能進(jìn)行正確處理。輸入數(shù)據(jù)不正確
情況包括:電阻輸入 0 或負(fù)值,輸入電阻的數(shù)目為奇數(shù)。
4. 輸出計(jì)算結(jié)果:每個(gè)電阻上的電壓和電流。
3.程序要求
1. 建立新項(xiàng)目,錄入源代碼,編輯,編譯,運(yùn)行,調(diào)試直至得出正確運(yùn)行結(jié)果。
2. 將主函數(shù) main、輸入 input、計(jì)算 calculate、輸出 output 共 4 個(gè)函數(shù)分配到 4 個(gè)源文件中,常量及函數(shù)原型聲明放到頭文件 def.h 中,進(jìn)行編譯。
不允許使用全局變量,而要采用函數(shù)參數(shù)傳遞,通過實(shí)參和形參的結(jié)合傳遞必要 的參數(shù)。
單向傳遞可用值傳遞,雙向傳遞得用地址傳遞。
函數(shù)名 所屬源文件 功能
main main.c
程序入口,聲明所有程序中用到的變量、數(shù)組,并依次 調(diào)用其它 3 個(gè)子程序
input input.c
從鍵盤輸入電壓源電勢(shì)、電阻個(gè)數(shù)及每個(gè)電阻的阻值, 并通過函數(shù)參數(shù)返回 main 函數(shù)
calculate calculate.c
接收主函數(shù)給定的梯形電路的相關(guān)參數(shù),計(jì)算每一個(gè)電 阻上的電流和電壓值并返回 main 函數(shù)
output output.c
接收主函數(shù)給定的相關(guān)參數(shù),輸出每個(gè)電阻的阻值、電流和電壓
4.步驟
1. 進(jìn)入編程環(huán)境,建立新項(xiàng)目。
2. 在項(xiàng)目中依次添加 5 個(gè)源文件:main.c, input.c, calculate.c, output.c(右鍵點(diǎn)擊 源文件,新建,選擇 C++文件),def.h 添加于頭文件下(右鍵點(diǎn)擊頭文件,新建,選 擇.h 文件)。
3. 編譯和運(yùn)行程序。
4. 如果編譯或運(yùn)行有錯(cuò),修改錯(cuò)誤或調(diào)試直至程序能給出正確的運(yùn)行結(jié)果。
三、代碼的準(zhǔn)備及過程
1.完成前的準(zhǔn)備
首先完成該實(shí)驗(yàn)需要四個(gè)源文件和一個(gè)頭文件,并且要求不允許使用全局變量。按照要求主函數(shù)應(yīng)調(diào)用其他源文件中的三個(gè)函數(shù),相當(dāng)于原來我們?cè)谥骱瘮?shù)中需要完成的輸入輸出和計(jì)算過程的代碼,把他們分別變成三個(gè)函數(shù)放到三個(gè)源文件中。既然主函數(shù)要調(diào)用其他三個(gè)函數(shù),那其他三個(gè)函數(shù)就必須要先聲明,然后在三個(gè)源文件中分別對(duì)這三個(gè)函數(shù)的代碼進(jìn)行編寫,最后在主函數(shù)中調(diào)用這三個(gè)函數(shù)。在主函數(shù)中要確定的變量有總電壓,電阻個(gè)數(shù)和每個(gè)電阻的大小以及每個(gè)電阻的電壓電流。我們應(yīng)該明確總電壓e ,電阻個(gè)數(shù)n和每個(gè)電阻的阻值r,這些變量要在input 函數(shù)中輸入進(jìn)來,然后把這些變量傳遞到main 函數(shù)中。然后把這些變量輸入到calculate 函數(shù)中,同時(shí)calculate 函數(shù)計(jì)算出每一個(gè)電阻對(duì)應(yīng)的電壓v,電流i,把電壓v和電流i的值傳遞到主函數(shù)中。最后,把電壓v和電流i為傳遞到output 函數(shù)中, output 函數(shù)再把每一個(gè)電阻對(duì)應(yīng)的電壓和電流顯示出來。這是編寫代碼的基本思路。
2.main 函數(shù)代碼編寫
main函數(shù)中要定義電阻個(gè)數(shù)n總電壓e及每一個(gè)電阻的阻值r及它對(duì)應(yīng)的電壓v和電流i大小。r和v及i 應(yīng)定義為float型的數(shù)組,來存放每一個(gè)電阻的阻值,電壓和對(duì)應(yīng)的電流。n 應(yīng)定義為整形,e 應(yīng)定義為float型?,F(xiàn)在我們需要從input 的函數(shù)中得到e,n, r 這三個(gè)變量的值。但如果用return,無法返回那么多變量的值,可以換一種思路。在這里我們采用指針,把e, n ,r的地址傳遞到input 函數(shù)中, input 函數(shù)中直接把e,n, r 的地址作為scanf 函數(shù)的參數(shù),從而把輸入的值賦值給e,n, r 這三個(gè)變量的地址對(duì)應(yīng)的變量(其實(shí)就是e,n, r 這三個(gè)變量)這樣就成功的把值賦值給了e,n, r 這三個(gè)變量,把函數(shù)定義為void,沒有返回值,達(dá)到同樣效果。r 是一個(gè)數(shù)組,其本身就代表著第0個(gè)元素的地址,所以input 函數(shù)只用把e, n 的地址和r作為函數(shù)的實(shí)參 。calculate函數(shù)應(yīng)輸入總電壓e,電阻個(gè)數(shù)n, 電阻阻值r,返回每一個(gè)電阻對(duì)應(yīng)的電壓v和電流i。v 和i 也是數(shù)組,可以像input 函數(shù)一樣把v, i 當(dāng)做函數(shù)的實(shí)參,這樣他們的地址就可以輸入函數(shù)中,經(jīng)過calculate 函數(shù)的計(jì)算,計(jì)算出每個(gè)電阻對(duì)應(yīng)的電壓和電流,直接把這些值存儲(chǔ)在v, i 這兩個(gè)數(shù)組中,從而其實(shí)就得到了v, i 的值。output 函數(shù)就只需要把v, i 作為實(shí)參傳遞進(jìn)去,然后用printf 函數(shù)顯示出來。
下面是參考代碼
#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.其他函數(shù)編寫
input函數(shù),主要是輸入函數(shù),以下是參考代碼
void input(float *e, int *n, float r[])
{
printf("請(qǐng)輸入電壓");
scanf_s("%f",e);
printf("請(qǐng)輸入電阻個(gè)數(shù)");
scanf_s("%d",n);
if (*n % 2 != 0)
printf("電阻值必須為偶數(shù)");
printf("請(qǐng)輸入各電阻值");
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個(gè)電阻值錯(cuò)誤", i);
}
}
calculate函數(shù),主要是計(jì)算函數(shù),如何計(jì)算在此不做說明,以下為參考代碼
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函數(shù)為輸出函數(shù),以下為參考代碼 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中進(jìn)行函數(shù)的聲明,并在main.c文件中用#include"def.h"把這些聲明添加進(jìn)去,以下為參考代碼 void input(float *,int *,float []); void calculate( float,? int ,? float [], float [], float []); void output(float[], float [], int ); 四、可能出現(xiàn)的問題 1.函數(shù)調(diào)用時(shí)的實(shí)際參數(shù)與形參不對(duì)應(yīng),造成編譯通不過或得到的結(jié)果不對(duì)。如void calculate( float e,? int n, float r[], float v[], float i[]),但調(diào)用時(shí)卻成了calculate(e, n, r,i,v);造成得到的電壓v實(shí)際存儲(chǔ)電流i,電流i實(shí)際存儲(chǔ)為電壓v。 2.聲明時(shí)函數(shù)的變量與編寫時(shí)類型不符合。或如聲明函數(shù)時(shí)為void calculate( float,? int ,? float [], float [], float []);但編寫時(shí)卻成了void calculate( float e,? float n, float r[], float v[], float i[])聲明時(shí)第二個(gè)參數(shù)n為int型,但編寫時(shí)把它當(dāng)作float型,造成編譯錯(cuò)誤。 3.沒分清函數(shù)聲明與調(diào)用,如 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函數(shù)中應(yīng)該調(diào)用函數(shù),而這里卻成了聲明函數(shù),聲明應(yīng)該在main函數(shù)前,這樣就錯(cuò)了。 4.如下 void input(float *e, int *n, float r[]) { printf("請(qǐng)輸入電壓"); scanf_s("%f",&e); printf("請(qǐng)輸入電阻個(gè)數(shù)"); scanf_s("%d",&n); if (*n % 2 != 0) printf("電阻值必須為偶數(shù)"); printf("請(qǐng)輸入各電阻值"); 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個(gè)電阻值錯(cuò)誤", i); } } 這里scanf_s函數(shù)需要的是實(shí)參e和n的地址,input函數(shù)中形參e,n為指針,他們?yōu)閷?shí)參e,n的地址,在scanf_s函數(shù)中直接用指針e,n,這樣就能直接給形參e,n賦值,如果再對(duì)形參e,n取地址,那么scanf_s函數(shù)將把輸入的值賦值給形參e,n,并沒有實(shí)現(xiàn)對(duì)實(shí)參e,n賦值。 四、運(yùn)行結(jié)果 五、結(jié)束語 應(yīng)用C語言編寫電氣計(jì)算程序,可以實(shí)現(xiàn)用C語言計(jì)算電氣參數(shù),減少電氣參數(shù)的測(cè)量,簡化測(cè)量設(shè)備。并通過計(jì)算機(jī)實(shí)現(xiàn)電氣參數(shù)的存儲(chǔ),轉(zhuǎn)換,傳輸?shù)裙δ堋檫M(jìn)一步實(shí)現(xiàn)計(jì)算機(jī)在電氣設(shè)備中的普及運(yùn)用打下基礎(chǔ),更為設(shè)備的電氣自動(dòng)化、信息化等提供可能,同時(shí)又省去大量的測(cè)量儀表,為進(jìn)一步提高電氣控制自動(dòng)化提供可能。 參考文獻(xiàn)(References) [1]《C語言程序設(shè)計(jì)》? 彭慧卿 [2]《C程序設(shè)計(jì)語言》? 布萊恩?克尼漢 [3]電路基礎(chǔ) [美] 查爾斯K.亞歷山大 作者簡介: 羅智敏,從事水電自動(dòng)化學(xué)習(xí).