當前位置:首頁 » 編程語言 » 編寫高質量c語言代碼

編寫高質量c語言代碼

發布時間: 2022-09-06 15:17:31

① 用c程序編程,求兩個正整數的最小公倍數。

#include<stdio.h>

intmain()

{

inta,b;

scanf("%d%d",&a,&b);

inttemp;

if(a>b){temp=a;a=b;b=temp;}//保證a是較小的那個數

for(inti=a;i>=0;i--)

if(a%i==0&&b%i==0)//求最大公約數

{

temp=i;

break;

}

printf("%d ",a*b/temp);//輸出最小公倍數

}

c語言題目:輸出所有的「水仙花數」,並輸出其總個數。所謂「水仙花數」是指一個3位數,其各位數字的立...

具體程序如下:

#include<stdio.h>

voidmain()

{

inti,a,b,c,count=0;//count是計數器

printf("水仙花數有 ");

for(i=100;i<=999;i++)

{

a=i/100;//取百位數字

b=(i-a*100)/10;//取十位數字

c=i%10;//取個位數字

if(a*a*a+b*b*b+c*c*c==i)//如果是水仙花數

{

printf("%d ",i);

count++;//如果是水仙花數計數器就加1

}

}

printf(" 水仙花數的個數為 %d",count);

printf(" ");

}

運行結果如下

③ 用c語言編寫程序求漢諾塔的移動步驟

#include<stdio.h>
void move(char a,char b)
{
printf("%c->%c\n",a,b);
}
void f(int n,char a,char b,char c)
{
if(n==1) move(a,c);
else
{
f(n-1,a,c,b);
move(a,c);
f(n-1,b,a,c);
}
}
void main()
{
int n;
scanf("%d",&n);
f(n,'a','b','c');
}
這是我的代碼 前面的是定義一個函數 這里遞歸體現在函數裡面還有函數 於是會一次又一次的計算 直到最後把N-1以前的都移到B,最下面的移到C,再把其他的從B移到C。。 無返回的話 應該是這里用void 沒有return返回數值

④ 51行代碼的matlab腳本,改成可以運行的C語言,高質量完成另有高分懸賞

啦啦啦啦啦啦啦

⑤ 如何編寫高質量的代碼!

載選<編程思想>

非程序員 編 著

代碼永遠會有BUG,在這方面沒有最好只有更好。高效是程序員必須作到的事情,無錯是程序員一生的追求。復用、分而治之、折衷是代碼哲學的基本思想。模塊化與面向對象是實現高效無錯代碼的方法。高效無錯代碼需要思想與實踐的不斷反復。
1.2.1 命名約定
命令規范基本上採用了微軟推薦的匈牙利命名法,略有簡化。
1. 常量
常量由大寫字母和數字組成,中間可以下劃線分隔,如 CPU_8051。
2. 變數
變數由小寫(變數類型)字母開頭,中間以大寫字母分隔,可以添加變數域前綴(變數活動域前綴以下劃線分隔)。如: v_nAcVolMin(交流電壓最小值)。
變數域前綴見下表
局部變數,如果變數名的含義十分明顯,則不加前綴,避免煩瑣。如用於循環的int型變數 i,j,k ;float 型的三維坐標(x,y,z)等。
3. 函數名一般由大寫字母開頭,中間以大寫字母分隔,如SetSystemPara。函數命名採用動賓形式。如果函數為最底層,可以考慮用全部小寫,單詞間採用帶下劃線的形式。如底層圖形函數:pixel、lineto以及讀鍵盤函數get_key 等。
4. 符號名應該通用或者有具體含義,可讀性強。尤其是全局變數,靜態變數含義必須清晰。C++中的一些關鍵詞不能作為符號名使用,如class、new、friend等。符號名長度小於31個,與ANSI C 保持一致。命名只能用26個字母,10個數字,以及下劃線『_』來組成,不要使用『$』『@』等符號。下劃線『_』使用應該醒目,不能出現在符號的頭尾,只能出現在符號中間,且不要連續出現兩個。
5. 程序中少出現無意義的數字,常量盡量用宏替代。
1.2.2 使用斷言
程序一般分為Debug版本和Release版本,Debug版本用於內部調試,Release版本發行給用戶使用。
斷言assert是僅在Debug版本起作用的宏,它用於檢查「不應該」發生的情況。以下是一個內存復製程序,在運行過程中,如果assert的參數為假,那麼程序就會中止(一般地還會出現提示對話,說明在什麼地方引發了assert)。
//復制不重疊的內存塊
void memcpy(void *pvTo, void *pvFrom, size_t size)
{
void *pbTo = (byte *) pvTo;
void *pbFrom = (byte *) pvFrom;
assert( pvTo != NULL && pvFrom != NULL );
while(size - - > 0 )
*pbTo + + = *pbFrom + + ;
return (pvTo);
}
assert不是一個倉促拼湊起來的宏,為了不在程序的Debug版本和Release版本引起差別,assert不應該產生任何副作用。所以assert不是函數,而是宏。程序員可以把assert看成一個在任何系統狀態下都可以安全使用的無害測試手段。
以下是使用斷言的幾個原則:
1)使用斷言捕捉不應該發生的非法情況。不要混淆非法情況與錯誤情況之間的區別,後者是必然存在的並且是一定要作出處理的。
2)使用斷言對函數的參數進行確認。
3)在編寫函數時,要進行反復的考查,並且自問:「我打算做哪些假定?」一旦確定了的假定,就要使用斷言對假定進行檢查。
4)一般教科書都鼓勵程序員們進行防錯性的程序設計,但要記住這種編程風格會隱瞞錯誤。當進行防錯性編程時,如果「不可能發生」的事情的確發生了,則要使用斷言進行報警。
1.2.3 優化/效率
規則一:對於在中斷函數/線程和外部函數中均使用的全局變數應用volatile定義。例如:
volatile int ticks;
void timer(void) interrupt 1 //中斷處理函數
{
ticks++
}
void wait(int interval)
{
tick=0;
while(tick<interval);
}
如果未用volatile,由於while循環是一個空循環,編譯器優化後(編譯器並不知道此變數在中斷中使用)將會把循環優化為空操作!這就顯然不對了。
規則二:不要編寫一條過分復雜的語句,緊湊的C++/C代碼並不見到能得到高效率的機器代碼,卻會降低程序的可理解性,程序出錯誤的幾率也會提高。
規則三:變數類型編程中應用原則:盡量採用小的類型(如果能夠不用「Float」就盡量不要去用)以及無符號Unsigned類型,因為符號運算耗費時間較長;同時函數返回值也盡量採用Unsigned類型,由此帶來另外一個好處:避免不同類型數據比較運算帶來的隱性錯誤。

1.2.4 其他
規則一:不要編寫集多種功能於一身的函數,在函數的返回值中,不要將正常值和錯誤標志混在一起。
規則二:不要將BOOL值TRUE和FALSE對應於1和0進行編程。大多數編程語言將FALSE定義為0,任何非0值都是TRUE。Visual C++將TRUE定義為1,而Visual Basic則將TRUE定義為-1。例如:
BOOL flag;

if(flag) { // do something } // 正確的用法
if(flag==TRUE) { // do something } // 危險的用法
if(flag==1) { // do something } // 危險的用法
if(!flag) { // do something } // 正確的用法
if(flag==FALSE) { // do something } // 不合理的用法
if(flag==0) { // do something } // 不合理的用法
規則三:小心不要將「= =」寫成「=」,編譯器不會自動發現這種錯誤。
規則四:建議統一函數返回值為無符號整形,0代表無錯誤,其他代表錯誤類型。

1.3 模塊化的C編程

C語言雖然不具備C++的面向對象的成分,但仍應該吸收面向對象的思想,採用模塊化編程思路。面向對象的思想與面向對象的語言是兩個概念。非面向對象的語言依然可以完成面向對象的編程,想想C++的誕生吧!
C++沒有理由對C存在傲慢與偏見,不是任何場合C++方法都是解決問題的良葯,譬如面對嵌入式系統效率和空間的雙重需求。注意我們談的是方法,而不是指編譯器。
C在軟體開發上存在的首要問題是缺乏對數據存取的控制(封裝),C編程者樂而不疲的使用著大量extern形式的全局變數在各模塊間交換著數據,「多方便啊」編程者樂曰,並傳授給下一個編程者。這樣多個變數出現在多個模塊中,剪不斷理還亂,直到有一天終於發現找一個「人」好難。一個東西好吃,智者淺嘗之改進之,而愚者只會直至撐死。
這世上本沒有什麼救世主,應在C上多下功夫,程序員和C締造者早就有過思考,相信野百合也有春天,還是看看C語言如何實現模塊化編程方法,在部分程度上具備了OO特性封裝與多態。
在具體闡述之前,需要明確生存期與可見性的概念。生存期指的是變數在內存的生存周期,可見性指的是變數在當前位置是否可用。兩者有緊密聯系,但不能混為一談。一個人存在但不可見只能解釋成上帝或靈魂,一個變數存在但不可見卻並非咄咄怪事,模塊化方法正是利用了靜態函數、靜態變數這些「精靈」們特殊的生存期與可見性。
最後需要明確一點的是這里的模塊是以一個.C文件為單位。
規則一:利用函數命名規則和靜態函數
模塊中不被其他模塊調用的內部函數採用以下命名規則:用全部小寫,單詞間採用帶下劃線的形式。如底層圖形函數:pixel、lineto以及讀鍵盤函數get_key等。這些函數應定義為static靜態函數,這樣在其他模塊錯誤地調用這些函數時編譯器能給出錯誤(如BC編譯器)。(注意:有些編譯器不能報告錯誤,但為了代碼風格一致和函數層次清晰,仍建議這樣作)。
規則二:利用靜態變數
模塊中不能被其他模塊讀寫的全局變數應採用static聲明,這樣在其他模塊錯誤地讀寫這些變數時編譯器能給出警告(C51編譯器)或錯誤(BC編譯器)。
規則三:引入OO介面概念和指針傳參
模塊間的數據介面(也就是函數)應該事先較充分考慮,需要哪些介面,通過介面需要操作哪些數據,盡量作到介面的不變性。
模塊間地數據交換盡量通過介面完成,方法是通過函數傳參數,為了保證程序高效和減少堆棧空間,傳大量參數(如結構)應採用傳址的方式,通過指針作為函數參數或函數返回指針,盡量杜絕extern形式的全局變數,請注意是extern形式的全局變數,模塊內部的全局變數是允許和必須的。
傳指針參數增加的開銷主要是作參數的指針和局部指針的數據空間(嵌入式系統(如C51)往往由於堆棧空間有限,函數參數會放到外部RAM的堆棧中),增加的代碼開銷僅是函數的調用,帶來的是良好的模塊化結構,而且使用介面函數會比在代碼中多處直接使用全局變數大大節約代碼空間。
需注意一點的事物總有他的兩面性,水能載舟,也能覆舟。對於需要頻繁訪問的變數如果仍採用介面傳遞,函數調用的開銷是巨大的,這時應考慮仍採用extern全局變數。
以下演示了兩個C模塊交換數據:
//Mole1.C
OneStruct* void GetOneStruct(void); //獲取模塊1數據介面
void SetOneStruct(OneStruct* pOneStruct); //寫模塊1數據介面

struct OneStruct
{
int m¬_imember;
//……
}t1; //模塊1的數據

//t1初始化代碼…..

OneStruct* void GetOneStruct(void)
{
OneStruct* pt1; //只需定義一個局部變數
t1.imember=15;
pt1=&t1;
return pt1;
}

void SetOneStruct(OneStruct* pOneStruct)
{
t1.imember=pOneStruct->imember;
//…….
}

//Mole2.C
void OperateOneStruct(void); //模塊2通過模塊1提供的介面操作模塊1的數據
OneStruct* void GetOneStruct(void);
void SetOneStruct(OneStruct* pOneStruct);

void OperateOneStruct(void)
{
OneStruct* pt2; //只需定義一個局部變數
pt2=GetOneStruct(); //讀取數據
SetOneStruct(pt2); //改寫數據
}
採用介面訪問數據可以避免一些錯誤,因為函數返回值只能作右值,全局變數則不然。
例如 cOneChar == 4; 可能被誤為cOneChar = 4;
規則四:有限的封裝與多態
不要忘記C++的class源於C的struct,C++的虛函數機制實質是函數指針。為了使數據、方法能夠封裝在一起,提高代碼的重用度,如對於一些與硬體相關的數據結構,建議採用在數據結構中將訪問該數據結構的函數定義為結構內部的函數指針。這樣當硬體變化,需要重寫訪問該硬體的函數,只要將重寫的函數地址賦給該函數指針,高層代碼由於使用的是函數指針,所以完全不用動,實現代碼重用。而且該函數指針可以通過傳參數或全局變數的方式傳給高層代碼,比較方便。例如:
struct OneStruct
{
int m¬_imember;
int (*func)(int,int);
//……
}t2;

⑥ 如果我不做底層 需要深入學習c語言嗎 怎麼寫出不很佔用資源的好代碼

兄弟,編譯原理現在不懂沒關系,以後學就行。。高質量的代碼不一定懂編譯原理。去看演算法,與數據結構把,,因為高層語言將編譯封閉了。。然後工作時,也可以不懂,真正懂編譯原理的我想10個中只有1個不到。。

⑦ 編寫一個C程序,運行時輸入a,b,c三個值,輸出其中值最大者

#include<stdio.h>

int main()

{

int a,b,c,max;

printf("請輸入三個數: ");

scanf("%d%d%d",&a,&b,&c);

if(a>b)

max=a;

if(c>max)

max = c;

printf("三個數中最大的數為:%d",max);

return 0;

}

(7)編寫高質量c語言代碼擴展閱讀:

主要特點:

1,簡潔的語言

C語言包含有各種控制語句僅有9種,關鍵字也只有32 個,程序的編寫要求不嚴格且多以小寫字母為主,對許多不必要的部分進行了精簡。

2,具有結構化的控制語句

C語言是一種結構化的語言,提供的控制語句具有結構化特徵,如for語句、if⋯else語句和switch語句等。可以用於實現函數的邏輯控制,方便麵向過程的程序設計。

3,豐富的數據類型

C語言包含的數據類型廣泛,不僅包含有傳統的字元型、整型、浮點型、數組類型等數據類型,還具有其他編程語言所不具備的數據類型,其中以指針類型數據使用最為靈活,可以通過編程對各種數據結構進行計算。

4,豐富的運算符

c語言包含34個運算符,它將賦值、括弧等均視作運算符來操作,使C程序的表達式類型和運算符類型均非常豐富。

5,可對物理地址進行直接操作

C語言允許對硬體內存地址進行直接讀寫,以此可以實現匯編語言的主要功能,並可直接操作硬體。

6,代碼具有較好的可移植性

c語言是面向過程的編程語言,用戶只需要關注所被解決問題的本身,而不需要花費過多的精力去了解相關硬體,且針對不同的硬體環境。

7,可生成的高質量目標代碼,高執行效率的程序

與其他高級語言相比,C語言可以生成高質量和高效率的目標代碼,故通常應用於對代碼質量和執行效率要求較高的嵌入式系統程序的編寫。



⑧ 如何使用C語言來編寫MSP430的高質量代碼

微處理器一般用於特定環境和特定用途,出於成本、功耗和體積的考慮,一般都要求盡量節省使用資源,並且,由於微處理器硬體一般都不支持有符號數、浮點數的運算,且運算位有限,因此,分配變數時必須仔細。另外要說明的是,速度和存儲器的消耗經常是2個不可兼顧的目標,在多數情況下,編程者必須根據實際情況作出權衡和取捨。

需要注意的事項如下:
1) 通常在滿足運算需求的前提下,盡量選擇為變數定義位元組少的數據類型。
比如最常用的int和char,int是16位的,char是8位的,如果沒有必要,不要使用int,而且使用char也最好使用unsigned char。運行時,可以在變數窗口看到,使用類型為unsigned char的變數是16進制的格式,而使用int的是十進制格式,如果char沒有定義為unsigned,會出現負號,如果沒有必要的話,在430中是不需要負數的。
2) 盡量不用過長的數據類型,如long、long long和double
3) MSP430的C編譯器不支持位定址,所以運算中盡量減少位操作,對於只有「是」和「否」的變數,如果RAM容量允許,則可分配為unsigned char類型,可提高運算速度。如果分配為某位元組的某個位,可以減少存儲器的消耗,但是會降低運算速度
4) 避免使用浮點數,盡量使用定點數進行小數運算。如果必須使用浮點數,則盡量用32位的float,而不是64位的double
5) 盡量將變數分配為無符號數據類型
6) 對於指針變數,如果聲明後其值不再改變,則聲明為const類型,這樣編譯器編譯時能更好的優化生成的代碼
7) 盡可能的使用局部變數而非全局變數或者靜態變數(static)。這樣有利於編譯器編譯時更好的優化生成的代碼
8)避免對局部變數使用 &取地址符。因為這樣會使編譯器無法把此變數放在CPU的寄存器中,而是放在RAM中,從而失去了優化的機會
9) 僅在模塊內使用的變數聲明為static,有利於優化代碼
10) 如果堆棧空間有限,盡量減少函數調用的層次和遞歸調用

11) 如果傳送參數過多,可將參數組成一個數組或者結構體,然後用指針傳遞
12) 某些變數在中斷程序和普通級別程序中都會被用到,所以必須加以保護。
將變數聲明為volatile類型,編譯器優化時就不會移動它,對它的訪問不會被延遲。
為保證對volatile的變數不被打斷,為此,可以在訪問它的部分(即訪問它的函數)前面加上__moniter的聲明

熱點內容
python中或者怎麼表示 發布:2025-01-13 16:32:33 瀏覽:288
易達加密鎖 發布:2025-01-13 16:27:23 瀏覽:514
前端編譯工具配置 發布:2025-01-13 16:26:43 瀏覽:585
資料庫百度雲 發布:2025-01-13 16:19:38 瀏覽:539
java連接sqlite資料庫 發布:2025-01-13 16:19:36 瀏覽:768
htmlajax上傳文件 發布:2025-01-13 16:19:33 瀏覽:514
安卓怎麼時間顯秒 發布:2025-01-13 16:19:33 瀏覽:474
我的世界java伺服器管理員設置 發布:2025-01-13 16:18:44 瀏覽:493
大秦國之裂變ftp 發布:2025-01-13 15:59:01 瀏覽:371
谷能壓縮機 發布:2025-01-13 15:44:30 瀏覽:413