

摘 要: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型?,F在我們需要從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.聲明時函數的變量與編寫時類型不符合?;蛉缏暶骱瘮禃r為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.亞歷山大 作者簡介: 羅智敏,從事水電自動化學習.