『壹』 C語言中有哪些實用的編程技巧
這篇文章主要介紹了C語言高效編程的幾招小技巧,本文講解了以空間換時間、用數學方法解決問題以及使用位操作等編輯技巧,並給出若干方法和代碼實例,需要的朋友可以參考下
引言:
編寫高效簡潔的C語言代碼,是許多軟體工程師追求的目標。本文就工作中的一些體會和經驗做相關的闡述,不對的地方請各位指教。
第1招:以空間換時間
計算機程序中最大的矛盾是空間和時間的矛盾,那麼,從這個角度出發逆向思維來考慮程序的效率問題,我們就有了解決問題的第1招——以空間換時間。
例如:字元串的賦值。
方法A,通常的辦法:
代碼如下:
#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,「This is a example!!」);
方法B:
代碼如下:
const char string2[LEN] =「This is a example!」;
char * cp;
cp = string2 ;
(使用的時候可以直接用指針來操作。)
從上面的例子可以看出,A和B的效率是不能比的。在同樣的存儲空間下,B直接使用指針就可以操作了,而A需要調用兩個字元函數才能完成。B的缺點在於靈 活性沒有A好。在需要頻繁更改一個字元串內容的時候,A具有更好的靈活性;如果採用方法B,則需要預存許多字元串,雖然佔用了大量的內存,但是獲得了程序 執行的高效率。
如果系統的實時性要求很高,內存還有一些,那我推薦你使用該招數。
該招數的變招——使用宏函數而不是函數。舉例如下:
方法C:
代碼如下:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
int BIT_MASK(int __bf)
{
return ((1U << (bw ## __bf)) - 1) << (bs ## __bf);
}
void SET_BITS(int __dst, int __bf, int __val)
{
__dst = ((__dst) & ~(BIT_MASK(__bf))) | /
(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))
}
SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
方法D:
代碼如下:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
#define BIT_MASK(__bf) (((1U << (bw ## __bf)) - 1) << (bs ## __bf))
#define SET_BITS(__dst, __bf, __val) /
((__dst) = ((__dst) & ~(BIT_MASK(__bf))) | /
(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))
SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
函數和宏函數的區別就在於,宏函數佔用了大量的空間,而函數佔用了時間。大家要知道的是,函數調用是要使用系統的棧來保存數據的,如果編譯器里有棧檢查 選項,一般在函數的頭會嵌入一些匯編語句對當前棧進行檢查;同時,CPU也要在函數調用時保存和恢復當前的現場,進行壓棧和彈棧操作,所以,函數調用需要 一些CPU時間。而宏函數不存在這個問題。宏函數僅僅作為預先寫好的代碼嵌入到當前程序,不會產生函數調用,所以僅僅是佔用了空間,在頻繁調用同一個宏函 數的時候,該現象尤其突出。
D方法是我看到的最好的置位操作函數,是ARM公司源碼的一部分,在短短的三行內實現了很多功能,幾乎涵蓋了所有的位操作功能。C方法是其變體,其中滋味還需大家仔細體會。
第2招:數學方法解決問題
現在我們演繹高效C語言編寫的第二招——採用數學方法來解決問題。
數學是計算機之母,沒有數學的依據和基礎,就沒有計算機的發展,所以在編寫程序的時候,採用一些數學方法會對程序的執行效率有數量級的提高。
舉例如下,求 1~100的和。
方法E
代碼如下:
int I , j;
for (I = 1 ;I<=100; I ++){
j += I;
}
方法F
代碼如下:
int I;
I = (100 * (1+100)) / 2
這個例子是我印象最深的一個數學用例,是我的計算機啟蒙老師考我的。當時我只有小學三年級,可惜我當時不知道用公式 N×(N+1)/ 2 來解決這個問題。方法E循環了100次才解決問題,也就是說最少用了100個賦值,100個判斷,200個加法(I和j);而方法F僅僅用了1個加法,1 次乘法,1次除法。效果自然不言而喻。所以,現在我在編程序的時候,更多的是動腦筋找規律,最大限度地發揮數學的威力來提高程序運行的效率。
第3招:使用位操作
實現高效的C語言編寫的第三招——使用位操作,減少除法和取模的運算。
在計算機程序中,數據的位是可以操作的最小數據單位,理論上可以用「位運算」來完成所有的運算和操作。一般的位操作是用來控制硬體的,或者做數據變換使用,但是,靈活的位操作可以有效地提高程序運行的效率。舉例如下:
方法G
代碼如下:
int I,J;
I = 257 /8;
J = 456 % 32;
方法H
int I,J;
I = 257 >>3;
J = 456 - (456 >> 4 << 4);
在字面上好像H比G麻煩了好多,但是,仔細查看產生的匯編代碼就會明白,方法G調用了基本的取模函數和除法函數,既有函數調用,還有很多匯編代碼和寄存 器參與運算;而方法H則僅僅是幾句相關的匯編,代碼更簡潔,效率更高。當然,由於編譯器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 來看,效率的差距還是不小。相關匯編代碼就不在這里列舉了。
運用這招需要注意的是,因為CPU的不同而產生的問題。比如說,在PC上用這招編寫的程序,並在PC上調試通過,在移植到一個16位機平台上的時候,可能會產生代碼隱患。所以只有在一定技術進階的基礎下才可以使用這招。
第4招:匯編嵌入
高效C語言編程的必殺技,第四招——嵌入匯編。
「在熟悉匯編語言的人眼裡,C語言編寫的程序都是垃圾」。這種說法雖然偏激了一些,但是卻有它的道理。匯編語言是效率最高的計算機語言,但是,不可能靠著它來寫一個操作系統吧?所以,為了獲得程序的高效率,我們只好採用變通的方法 ——嵌入匯編,混合編程。
舉例如下,將數組一賦值給數組二,要求每一位元組都相符。
代碼如下:
char string1[1024],string2[1024];
方法I
代碼如下:
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I)
方法J
代碼如下:
#ifdef _PC_
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I);
#else
#ifdef _ARM_
__asm
{
MOV R0,string1
MOV R1,string2
MOV R2,#0
loop:
LDMIA R0!, [R3-R11]
STMIA R1!, [R3-R11]
ADD R2,R2,#8
CMP R2, #400
BNE loop
}
#endif
方法I是最常見的方法,使用了1024次循環;方法J則根據平台不同做了區分,在ARM平台下,用嵌入匯編僅用128次循環就完成了同樣的操作。這里有 朋友會說,為什麼不用標準的內存拷貝函數呢?這是因為在源數據里可能含有數據為0的位元組,這樣的話,標准庫函數會提前結束而不會完成我們要求的操作。這個 常式典型應用於LCD數據的拷貝過程。根據不同的CPU,熟練使用相應的嵌入匯編,可以大大提高程序執行的效率。
雖然是必殺技,但是如果輕易使用會付出慘重的代價。這是因為,使用了嵌入匯編,便限制了程序的可移植性,使程序在不同平台移植的過程中,卧虎藏龍,險象環生!同時該招數也與現代軟體工程的思想相違背,只有在迫不得已的情況下才可以採用。切記,切記。
『貳』 matlab 求公式編寫方法
給你舉一個求函數值的例子:
首先新建一個m文件,然後在里邊寫如下代碼(具體的函數體,代碼會不同):
function y=fff(x,z1,z2) %fff為函數名,當你保存m文件的時候最好也用這個名,這樣不會在運行時出錯,否則的話可能會出錯,其中y為輸出參數,即函數值,x,z1,z2為輸入參數,x為自變數,z1,z2為函數中的參數,當k1,k2不隨x的變化而變化的時候,可以只寫為「function y=fff(x)」,但是參數k1k2要在m文件中聲明。
for i=1:length(x)
p(i)=sqrt(x(i)^2+10)+z1(i)-z2(i); %x(i),z1(i),z2(i)分別為向量的第i的元素
y=p*2-5; %注意函數體中一定要要給y賦值,因為y是輸出參數,否則會出現錯誤。
end
到此為止,m文件編寫結束,要保存。
然後在matlab的command窗口輸入以下內容:
x=1:5;
z1=1:-0.1:0.6;
z2=0:0.5:2; %注意x,z1,z2的大小要一致,如果z1,z2已經在函數中聲明,這里就不用輸入了。
pp=fff(x,z1,z2) %注意輸入參數的順序要和函數的一樣
之後會出現以下結果:
pp =
3.6332 3.2833 3.3178 3.5980 4.0322
得知自變數x和因變數y的值後,就可以擬合了,但是你要做擬合的話最好用spss
matlab的曲線擬合並不是很好,但是給你介紹一下在命令窗口下輸入以下命令:
plot(x,y,'r:o') % 會出現一個figure,在菜單欄上的tools選擇basic fitting,以下你自己弄就可以了,可以看見圖像,又可以看見曲線的表達式,但據我所知matlab只能擬合冪函數。
你的程序太亂,沒看懂,不知我寫的是否對你有幫助
『叄』 你有哪些使用excle公式小竅門呀
使用excel的技巧就是一定要學會用wps,然後學會格式編輯,這些都比較好,有利於最後的工作做文件。
『肆』 LaTex排版小技巧介紹---在公式中輸入文本的竅門
方法/步驟
1、在公式中輸入文本,可以用\mbox{...}命令,例如
\begin{equation}
a_\mbox{最小值}
=
10,
\end{equation}
2、使用率較高的是amstext宏包中提供了\text{...}
命令,例如
\begin{equation}
a_\text{最小值}
=
10,
\end{equation}
3、示例如下(這里包含\mbox{}以及\text{}):
以上就是專題欄小編帶來的latex中文版教程,更多教程請看“http://www.zhuantilan.com/zt/latex/”
『伍』 數控編程技巧
循環鑽孔指令沒有深度Z,X是半徑Y是起始夾角。G90格式:後面依次寫每個孔與起始軸的夾角(用Y)就可以了,適用於非均勻分布的孔。用G91格式鑽均勻分布孔更方便,格式
……(相同,省略)
G91 Y(每孔之間夾角) K(孔數量);
G80 G15;
『陸』 玩轉魔方易懂公式 小技巧(圖)(新手入門)
最強大腦 王鷹豪 帶你玩轉魔方 基礎魔方課程30節
鏈接: https://pan..com/s/1MXzHZxmAN36PrxX2LSFaeQ 提取碼: z4wp 復制這段內容後打開網路網盤手機App,操作更方便哦
若資源有問題歡迎追問~
『柒』 EXCEL條件格式公式的編寫方法
選中A列,條件格式,兩個件條
第一個件條設為公式:=AND(MOD(ROW(),2),NOT(ISBLANK(A1)))
設為紅色
第二個條件設公式:=AND(NOT(MOD(ROW(),2)),NOT(ISBLANK(A1)))
設為藍色
『捌』 數學常用的公式和小技巧
1、理解題意,可以舉小例子,進行類比。
2、畫圖,標好數據,分析數量關系,使數量變化直觀。
3、可以用紙等製作模型。也可表演一下。
4、至於常用公式,可逐個寫出推導過程,明理後,編一小冊子,好記好用。
……
『玖』 EXCEL中公式編寫方法
公式是EXCEL工作表中進行數值計算的等式。公式輸入是以「=」開始的。簡單的公式有加、減、乘、除等計算。 例如=3*6-2 =A2+B16 =C4/A6
『拾』 十個Word公式編輯器使用技巧
①公式編輯器的啟動與退出
工具/自定義/鍵盤/插入/InsertEquation,把指針放在“請按新快捷鍵”下的空行內,按“Ctrl+Enter”(當然也可以用別的快捷鍵,不過這個最易操作),再順次點擊“指定”、“關閉”、“關閉”。以後在WORD中直接用按“Ctrl+Enter”即可啟動公式編輯器,退出公式編輯器時,按Esc即可。
②在Word公式編輯器編輯公式時添加空格
在Word公式編輯器編輯公式時無法直接通過按空格鍵來添加空格,此時可同時按下“Ctrl+Shift+空格鍵”即可加入空格,也可選擇公式編輯器工具欄中形如“a
b”的符號加入不同寬度的空格。
③採用復制的方法
對於相似相同的公式則可採取“復制”的方法,避免重復工作。這樣只要改動一點點不同之處就可以收到事半功倍的效果。方法有兩種:一種是在Word中直接復制整個公式,另一種是在“公式編輯器”復制公式的一部分,下一次啟動“公式編輯器”時再粘貼到其他公式中使用。
④公式編輯器中最常用的幾個快捷鍵
Ctrl+H:上標;
Crtl+L:下標
;Ctrl+J:上下標;
Crtl+R:根號;Ctrl+F:分號。
⑤在公式編輯器中通用的幾個快捷鍵
Ctrl+A:全選;Ctrl+X:剪切;Ctrl+C:復制;Ctrl+V:粘貼;Ctrl+B:加黑;Ctrl+S:保存;Shift+方向鍵:局部選擇。
⑥有時上下標為漢字,則顯得很小,看不清楚,可以對設置進行如下改變,操作為“尺寸/定義”,在出現的對話框中將上下標設為8磅。
⑦如果word正文選用五號字,則將公式編輯器中“尺寸/定義”對話框中的“標准”定為11磅最為適宜。
⑧在輸入法的全形狀態下,可以輸入空格,半形狀態下則不可以。
⑨在“樣式/定義”中可以對文字進行加黑或傾斜等設置。
⑩在公式編輯中,一些特殊符號無法直接輸入(如①、★、≌、∽、⊙等),可先在word正文中插入某個特殊符號,再通過“復制、粘貼”的方法將它移植到公式。