❶ 用c語言編寫幾個子函數(至少四個子函數),用主函數來調用實現其功能,並對函數進行注釋
一、//調用函數事例
#include<stdio.h>
#include<string.h>
二、//計算加法函數
int add(int a, int b)
{
return a+b;
}
三、//計算減法函數
int subtract(int a, int b)
{
return a-b;
}
四、//計算乘法函數
int multiply(int a, int b)
{
return a*b;
}
(1)c語言寫函數注釋功能時標准寫法擴展閱讀:
函數作為另一個函數調用的實際參數出現。這種情況是把該函數的返回值作為實參進行傳送,因此要求該函數必須是有返回值的。例如: printf("%d",max(x,y)); 即是把max調用的返回值又作為printf函數的實參來使用的。在函數調用中還應該注意的一個問題是求值順序的問題。
❷ 求C語言編寫的一般格式
1,C語言程序的結構特點
一個C語言程序通常由一個預處理語句開始,如#include〉stdio.h〉,它表示,在編譯語言程序前,用指明的文件取代改預處理語句,通常文件名是帶有後綴為.h的磁碟文件.編譯時,它將從磁碟中讀出並插入到原來的預處理程序語句中.即預處理語句被指明的包含文件(頭文件)代替.
頭文件通常是在程序中被調用函數的說明語句和該函數用到的一些符號常量的宏定義.如在程序中經常調用一些標准庫函數時,系統提供了相應的頭文件,他們其中的一些內容是對該函數的說明及該函數用到的符號常量的宏定義等,如對fgets()的說明放在頭文件stdio.h中,再蓋頭文件包含了對fgets()函數的說明:
char *fgets(char *s,int n,FILE *stream)
對符號常量的定義:
#define NULL 0
當然還包含了一些其他的標准I/O函數的說明和宏定義等.用戶也可以建立自己的頭文件,在程序開頭用include進行包含就行了:
#include"文件名"
注意此時用" "符號來包括,它與 #include〉文件名〉的區別是查找的路徑不同.前者表示現在當前目錄中查找該文件,如果找不到,再到系統指定的目錄中查找.而後者只在系統的制定目錄中查找(一般是include\目錄),若找不到,便報錯.所以用#include"文件名"的形式常用於用戶自己寫的包含文件,他們通常放在和用戶程序同一個目錄下.當然在這種形式中,文件名也可用文件路徑代替,這時,編譯器就去用戶指定的目錄去查找包含文件.文件包含也可以用在程序行中,如:
main()
{
...
#include "myc.c"
...
}
其中myc.c時用戶的c文件,編譯時,它將從磁碟中取出,插入到該位置處.
一些在程序中常用到的常量也用編譯預處理命令#define來定義,如在真假判斷時,常用符號常量TURE和FALSE表示真和假,這時可以用一下定義:
#define TURE 1
#define FALSE 0
將以上代碼寫在程序的開頭,編譯時在程序中出現TURE的地方都用1代替,出現FALSE的地方用0代替.
一個完整的C程序,總是由main()函數開始,它像一個大型樂曲的引子,由此引出許多樂章(執行不同的功能的函數);main()函數又像一個大型建築的框架,它顯示了要完成這個建築的輪廓,這些輪廓就是由一個個函數調用勾畫出來的.因此可以說一個C程序是由一個個的模塊堆砌起來的,這些模塊的最小元素是函數.當然,模塊也可以是一個源程序,它又有許多的函數組成.所以c程序的設計是一種模塊化的設計,是許多的函數的堆砌.因此在應用程序的設計中,應將一個個的功能用一個個的函數來實現.下面就談談函數的使用.
turbo C的函數的使用
Turbo C2.0提供了400多個標準的庫函數,每個函數都完成一定的功能.當程序執行這些功能時,只要調用這些函數即可,用戶不必再自己寫這些函數了.這些庫函數包括輸入輸出函數,數學函數,字元串處理函數,內存函數,與BIOS和Dos有關的介面函數,屏幕函數和圖形函數,過程式控制制函數和目錄函數等.這些函數在我的主頁上都能查到,歡迎來查詢.
當標准庫函數中沒有用戶要用的函數時,就必須自己設計了,設計函數的原則是:
1,函數不應處理太多的功能,要保持函數的小型化,功能單一化.
2,一個函數要保持自己的獨立性,如同一個黑匣子一樣,有進有出.
3,在函數中多使用復合語句,使函數也具有結構化,並且可以提高執行效率和節省存儲空間.
4,在主函數前,要羅列出所有使用自定義函數的原型說明,這有利於在大型程序設計中追蹤要調用的函數設置是 否正確.
5,在程序適當的地方加入注釋(用/*...*/包含的語句)這便於程序的閱讀和調試.
6,採用層次的書寫程序格式,按程序的不同功能分層次.
這樣一個函數編譯後,其內部定義的程序代碼與數據與另一個函數的程序代碼和數據不會相互影響,因此在函數中要使用局部變數,即它的生存期指維持在調用該函數並執行時,也就是說函數被激活時.要盡量少用或不用全局變數,它將破壞函數的獨立性.函數的這種設計方法類似於面向對象設計方法中的封裝性.
C大型軟體程序的設計步驟
C語言作為結構化的程序設計語言,易採用自頂向下的設計方法,即開始咱不涉及問題的實質和具體的解決步驟,而只是從問題的全局出發,給出一個概括性的抽象描述.例如編寫一個信號處理程序,它要求對信號數據經過數字處理後進行圖形顯示並存檔.因而程序大輪廓應該是:
1,信號數據的輸入
2,信號預處理
3,信號進行數字處理
4,進行顯示
5,進行存檔
接著對各項功能進行細分,例如對於信號的輸入,又可分為:
1.通過com1或com2由RS-232介面進行輸入
2.由磁碟數據文件輸入
對信號預處理又可分為:
1.對信號進行反序排列
2.用窗函數預處理
對數字處理又可分為:
1.求快速傅立葉變換
2.求功率譜
對用窗函數處理又可分為:
1.海明窗處理函數
2.漢寧窗處理
3.布拉格曼窗處理
其他功能依此類推.
在此細化的基礎上再進行細化,以至於成為一個個單獨的功能,便於用一個個函數來實現.
下面就是設計一個個函數的實質性階段.要定義變數,要選區標准函數,要確定演算法,這是構造程序的基本單元.當一個個函數都設計完了以後,便可將這些函數在主函數中堆砌起來,並用主函數做總控程序,完成對他們的參數傳遞,控制選擇對這些函數的調用,形成一個完整的實用的信號處理程序.
大程序的設計風格
當一個程序較大時,可將一個程序分成幾個部分,每一個部分可單獨編成一個源文件,這些源文件可進行單獨編譯成.obj文件,然後將這些文件組合成一個較大的程序.通常可採用如下方法:
1.include方法
例如,一個程序分成兩個源文件,既由a1.c和a2.c兩個源程序組成,這時候可將a1.c寫成:
#include〉stdio.h〉
#include"a2.c"
main()
{
...
strcpy(s1,s2);
a2();
...
}
而a2.c可寫成:
#include〉string.h〉
void a2()
{
....
}
然後在製作一個project文件,內容為:a1.c a2.c
設這個工程文件名為:a1.prj,其中文件中各文件名的後綴可省略,先後順序也無關,它隻影響編譯時的順序.者可在Turbo c的編輯狀態下寫成,並存檔為a2.prj文件.然後用Alt+p選擇Project菜單中的Project_name項,填寫生成的a1.prj文件名.然後按F9,即可生成a1.exe可執行文件.
當用匯編語言與C語言混合編程時,則要將匯編語言子程序單獨編譯生成.obj文件,然後製作工程文件,再進行對C程序的編譯和連接.關於這方面的介紹可參考Turbo c2.0的命令行編譯.
若程序還需要一些其他的被編譯的程序或庫文件,這些文件時C語言的標准庫不能提供的,則也可將它們的名字放在Project文件中.如:
mymain
myfunc
secial.obj
other.lib
當用F9進行編譯連接時,對後綴為.obj的文件只進行連接,對後綴為.lib的庫文件不會進行編譯,只是進行連接,這樣當進行外部調用時,就只會對庫進行檢索.
當多個源文件製作成project 文件時,一個.c的源文件依賴於其他的.c源文件,若它們之間用一個頭文件來進行介面,這時應用括弧將這些頭文件擴起來(頭文件之間可用逗號,空格或分號間隔),這樣一旦頭文件改變時,它們將被重新編譯,例如:有一個主程序名為mymian.c,它包含頭文件為:myfuncs.h,而另一個文件是myfuncs.c
這樣當project文件的內容寫成如下形勢時:
mymain.c(myfuncs.h)
myfuncs.c(myfuncs.h)
若一旦myfuncs.h被修改,則對該project文件進行編譯時,mymain.c及myfuncs.h將被重新編譯
❸ c語言中,標准main函數的書寫規范是什麼
在最新的 C99 標准中,只有以下兩種定義方式是正確的:
int main( void ) /* 無參數形式 */
{
...
return 0;
}
int main( int argc, char *argv[] ) /* 帶參數形式 */
{
...
return 0;
}
int指明了main()函數的返回類型,函數名後面的圓括弧一般包含傳遞給函數的信息。void表示沒有給函數傳遞參數。關於帶參數的形式,我們等會討論。
瀏覽老版本的C代碼,將會發現程序常常以。
main()
這種形式開始。C90標准允許這種形式,但是C99標准不允許。因此即使你當前的編譯器允許,也不要這么寫。
你還可能看到過另一種形式。
void main()
有些編譯器允許這種形式,但是還沒有任何標准考慮接受它。C++ 之父 Bjarne Stroustrup 在他的主頁上的 FAQ 中明確地表示:void main( ) 的定義從來就不存在於 C++ 或者 C 。所以,編譯器不必接受這種形式,並且很多編譯器也不允許這么寫。
❹ 給c語言加註釋
)
在編寫C語言源代碼時,應該多使用注釋,這樣有助於對代碼的理解。在C語言中有兩種注釋方式:
一種是以/*開始、以*/結束的塊注釋(block comment);
另一種是以//開始、以換行符結束的單行注釋(line comment)。
可以使用/*和*/分隔符來標注一行內的注釋,也可以標注多行的注釋。例如,在下列的函數原型中,省略號的意思是 open() 函數有第三個參數,它是可選參數。注釋解釋了這個可選參數的用法:
int open( const char *name, int mode, … /* int permissions */ );
可以使用//插入整行的注釋,或者將源代碼寫成兩列分欄的格式,程序在左列,注釋在右列:
const double pi = 3.1415926536; // pi是—個常量
在 C99 標准中,單行注釋正式加入C語言,但是大部分編譯器在 C99 之前就已經開始支持這種用法。有時候,其被稱作「C++風格」的注釋,但實際上,其源自於C的前身 BCPL。
在引號中,如果採用/*或//分隔一個字元常量或字元串字面量(string literal),它們都不會被視為注釋的開始。例如,下面語句就沒有注釋:
printf("Comments in C begin with /* or //.\n" );
預處理器僅通過檢查注釋的結束符來檢測注釋中的字元,因此,不能嵌套塊注釋。然而,可以使用/*和*/注釋包含單行注釋的源代碼:
/* 暫時注釋掉這兩行:
const double pi = 3.1415926536; // pi是一個常量
area = pi * r * r; // 計算面積
暫時注釋到此 */
如果想要注釋掉包含塊注釋的部分程序,可以使用條件預處理命令:
#if 0
const double pi = 3.1415926536; /* pi是一個常量 */
area = pi * r * r ; /* 計算面積 */
#endif
預處理器會把每個注釋都替換成一個空格。因此,min/*max*/Value變成兩個標記min Value。
所有教程
❺ C語言書寫格式標準是什麼
你的錯誤是沒加頭文件,因為使用printf需要調用庫函數 stdio.h。
符號名包括模塊名、常量名、標號名、子程序名等。這些名字應該能反映它所代表的實際東西,具有一定的意義,使其能夠見名知義,有助於對程序功能的理解。命名採用匈牙利命名法。具體規則如下:
(1)所有宏定義、枚舉常數和const變數,用大寫字母命名。在復合詞里用下劃線隔開每個詞。
(2)復合詞中每個單詞的第一個字母大寫。除了規則5.1.1.1以外,避免使用下劃線。
(3)類、類型定義和枚舉型名的第一個字母大寫。
(4)函數名是復合詞的,第一個詞採用全部小寫,隨後每個單詞採用第一個字母大寫,其它字母小寫方式;如果是單個詞的,採用全部小寫方式。
(5)循環變數可採用i, j, k等,不受上述規則限制。
(6) 類的成員變數應採用m_開頭。
(7) 全局變數詞頭為g_ 。
(8) 臨時變數詞頭為tmp_ 。
(9) 對結構體內的變數命名, 遵循變數的具體含義命名原則
(10)用小寫字母的前綴表示變數的類型,前綴的下一個字母用大寫。
——文件之中不得存在無規則的空行,比如說連續十個空行。
一般來講函數與函數之間的空行為2-3行;
在函數體內部,在邏輯上獨立的兩個函數塊可適當空行,一般為1-2行。
——程序編寫首先應考慮清晰性,不要刻意追求技巧性而使得程序難以理解。
——每行長度盡量避免超過屏幕寬度,應不超過80個字元。
——除非對效率有特殊要求,編寫程序要作到清晰第一,效率第二。
——盡可能使用函數庫。
——盡量用公共過程或子程序去代替重復的功能代碼段。要注意,這個代碼應具有一個獨立的功能,不要只因代碼形式一樣便將其抽出組成一個公共過程或子程序。
——使用括弧清晰地表達算術表達式和邏輯表達式的運算順序。如將 x=a*b/c*d 寫成 x=(a*b/c)*d可避免閱讀者誤解為x=(a*b)/(c*d)。
——避免不必要的轉移。
——避免採用過於復雜的條件測試。
——避免過多的循環嵌套和條件嵌套。
——建議不要使?*=,^=, /=等運算符。
——一個函數不要超過200行。一個文件應避免超過2000行。
——盡量避免使用go to語句。
——避免採用多賦值語句,如x = y = z ;
——不鼓勵採用?:操作符,如z = (a>b)?a:b;
——不要使用空的if else 語句。
❻ C語言程序注釋
C語言編程規范-注釋
規則:
1:一般情況下,源程序有效注釋量必須在20%以上。
說明:注釋的原則是有助於對程序的閱讀理解,在該加的地方都加了,注釋不宜太多也不能太少,注釋語言必須准確、易懂、簡潔。
2:說明性文件(如頭文件.h文件、.inc文件、.def文件、編譯說明文件.cfg等)頭部應進行注釋,注釋必須列出:版權說明、版本號、生成日期、作者、內容、功能、與其它文件的關系、修改日誌等,頭文件的注釋中還應有函數功能簡要說明。
示例:下面這段頭文件的頭注釋比較標准,當然,並不局限於此格式,但上述信息建議要包含在內。
/*************************************************
Copyright (C), 1988-1999, Tech. Co., Ltd.
File name: // 文件名
Author:
Version:
Date: // 作者、版本及完成日期
Description: // 用於詳細說明此程序文件完成的主要功能,與其他模塊
// 或函數的介面,輸出值、取值范圍、含義及參數間的控
// 制、順序、獨立或依賴等關系
Others: // 其它內容的說明
Function List: // 主要函數列表,每條記錄應包括函數名及功能簡要說明
1. ....
History: // 修改歷史記錄列表,每條修改記錄應包括修改日期、修改
// 者及修改內容簡述
1. Date:
Author:
Modification:
2. ...
*************************************************/
3:源文件頭部應進行注釋,列出:版權說明、版本號、生成日期、作者、模塊目的/功能、主要函數及其功能、修改日誌等。
示例:下面這段源文件的頭注釋比較標准,當然,並不局限於此格式,但上述信息建議要包含在內。
/************************************************************
Copyright (C), 1988-1999, Tech. Co., Ltd.
FileName: test.cpp
Author:
Version :
Date:
Description: // 模塊描述
Version: // 版本信息
Function List: // 主要函數及其功能
1. -------
History: // 歷史修改記錄
<author> <time> <version > <desc>
David 96/10/12 1.0 build this moudle
***********************************************************/
說明:Description一項描述本文件的內容、功能、內部各部分之間的關系及本文件與其它文件關系等。History是修改歷史記錄列表,每條修改記錄應包括修改日期、修改者及修改內容簡述。
4:函數頭部應進行注釋,列出:函數的目的/功能、輸入參數、輸出參數、返回值、調用關系(函數、表)等。
示例:下面這段函數的注釋比較標准,當然,並不局限於此格式,但上述信息建議要包含在內。
/*************************************************
Function: // 函數名稱
Description: // 函數功能、性能等的描述
Calls: // 被本函數調用的函數清單
Called By: // 調用本函數的函數清單
Table Accessed: // 被訪問的表(此項僅對於牽扯到資料庫操作的程序)
Table Updated: // 被修改的表(此項僅對於牽扯到資料庫操作的程序)
Input: // 輸入參數說明,包括每個參數的作
// 用、取值說明及參數間關系。
Output: // 對輸出參數的說明。
Return: // 函數返回值的說明
Others: // 其它說明
*************************************************/
5:邊寫代碼邊注釋,修改代碼同時修改相應的注釋,以保證注釋與代碼的一致性。不再有用的注釋要刪除。
6:注釋的內容要清楚、明了,含義准確,防止注釋二義性。
說明:錯誤的注釋不但無益反而有害。
7:避免在注釋中使用縮寫,特別是非常用縮寫。
說明:在使用縮寫時或之前,應對縮寫進行必要的說明。
8:注釋應與其描述的代碼相近,對代碼的注釋應放在其上方或右方(對單條語句的注釋)相鄰位置,不可放在下面,如放於上方則需與其上面的代碼用空行隔開。
示例:如下例子不符合規范。
例1:
/* get replicate sub system index and net indicator */
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
例2:
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
/* get replicate sub system index and net indicator */
應如下書寫
/* get replicate sub system index and net indicator */
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
9:對於所有有物理含義的變數、常量,如果其命名不是充分自注釋的,在聲明時都必須加以注釋,說明其物理含義。變數、常量、宏的注釋應放在其上方相鄰位置或右方。
示例:
/* active statistic task number */
#define MAX_ACT_TASK_NUMBER 1000
#define MAX_ACT_TASK_NUMBER 1000 /* active statistic task number */
10:數據結構聲明(包括數組、結構、類、枚舉等),如果其命名不是充分自注釋的,必須加以注釋。對數據結構的注釋應放在其上方相鄰位置,不可放在下面;對結構中的每個域的注釋放在此域的右方。
示例:可按如下形式說明枚舉/數據/聯合結構。
/* sccp interface with sccp user primitive message name */
enum SCCP_USER_PRIMITIVE
{
N_UNITDATA_IND, /* sccp notify sccp user unit data come */
N_NOTICE_IND, /* sccp notify user the No.7 network can not */
/* transmission this message */
N_UNITDATA_REQ, /* sccp user's unit data transmission request*/
};
11:全局變數要有較詳細的注釋,包括對其功能、取值范圍、哪些函數或過程存取它以及存取時注意事項等的說明。
示例:
/* The ErrorCode when SCCP translate */
/* Global Title failure, as follows */ // 變數作用、含義
/* 0 - SUCCESS 1 - GT Table error */
/* 2 - GT error Others - no use */ // 變數取值范圍
/* only function SCCPTranslate() in */
/* this moal can modify it, and other */
/* mole can visit it through call */
/* the function GetGTTransErrorCode() */ // 使用方法
BYTE g_GTTranErrorCode;
12:注釋與所描述內容進行同樣的縮排。
說明:可使程序排版整齊,並方便注釋的閱讀與理解。
示例:如下例子,排版不整齊,閱讀稍感不方便。
void example_fun( void )
{
/* code one comments */
CodeBlock One
/* code two comments */
CodeBlock Two
}
應改為如下布局。
void example_fun( void )
{
/* code one comments */
CodeBlock One
/* code two comments */
CodeBlock Two
}
13:將注釋與其上面的代碼用空行隔開。
示例:如下例子,顯得代碼過於緊湊。
/* code one comments */
program code one
/* code two comments */
program code two
應如下書寫
/* code one comments */
program code one
/* code two comments */
program code two
14:對變數的定義和分支語句(條件分支、循環語句等)必須編寫注釋。
說明:這些語句往往是程序實現某一特定功能的關鍵,對於維護人員來說,良好的注釋幫助更好的理解程序,有時甚至優於看設計文檔。
15:對於switch語句下的case語句,如果因為特殊情況需要處理完一個case後進入下一個case處理,必須在該case語句處理完、下一個case語句前加上明確的注釋。
說明:這樣比較清楚程序編寫者的意圖,有效防止無故遺漏break語句。
示例(注意斜體加粗部分):
case CMD_UP:
ProcessUp();
break;
case CMD_DOWN:
ProcessDown();
break;
case CMD_FWD:
ProcessFwd();
if (...)
{
...
break;
}
else
{
ProcessCFW_B(); // now jump into case CMD_A
}
case CMD_A:
ProcessA();
break;
case CMD_B:
ProcessB();
break;
case CMD_C:
ProcessC();
break;
case CMD_D:
ProcessD();
break;
...
建議:
1:避免在一行代碼或表達式的中間插入注釋。
說明:除非必要,不應在代碼或表達中間插入注釋,否則容易使代碼可理解性變差。
2:通過對函數或過程、變數、結構等正確的命名以及合理地組織代碼的結構,使代碼成為自注釋的。
說明:清晰准確的函數、變數等的命名,可增加代碼可讀性,並減少不必要的注釋。
3:在代碼的功能、意圖層次上進行注釋,提供有用、額外的信息。
說明:注釋的目的是解釋代碼的目的、功能和採用的方法,提供代碼以外的信息,幫助讀者理解代碼,防止沒必要的重復注釋信息。
示例:如下注釋意義不大。
/* if receive_flag is TRUE */
if (receive_flag)
而如下的注釋則給出了額外有用的信息。
/* if mtp receive a message from links */
if (receive_flag)
4:在程序塊的結束行右方加註釋標記,以表明某程序塊的結束。
說明:當代碼段較長,特別是多重嵌套時,這樣做可以使代碼更清晰,更便於閱讀。
示例:參見如下例子。
if (...)
{
// program code
while (index < MAX_INDEX)
{
// program code
} /* end of while (index < MAX_INDEX) */ // 指明該條while語句結束
} /* end of if (...)*/ // 指明是哪條if語句結束
5:注釋格式盡量統一,建議使用"/* …… */"。
6:注釋應考慮程序易讀及外觀排版的因素,使用的語言若是中、英兼有的,建議多使用中文,除非能用非常流利准確的英文表達。
說明:注釋語言不統一,影響程序易讀性和外觀排版,出於對維護人員的考慮,建議使用中文。
❼ c語言中注釋的位置
1、可以使用/*和*/分隔符來標注一行內的注釋,也可以標注多行的注釋。例如,在下列的函數原型中,省略號的意思是 open() 函數有第三個參數,它是可選參數。注釋解釋了這個可選參數的用法:
int open( const char *name, int mode, … /* int permissions */ );
2、可以使用//插入整行的注釋,或者將源代碼寫成兩列分欄的格式,程序在左列,注釋在右列:
const double pi = 3.1415926536; // pi是—個常量
(7)c語言寫函數注釋功能時標准寫法擴展閱讀
在 C99 標准中,單行注釋正式加入C語言,但是大部分編譯器在 C99 之前就已經開始支持這種用法。有時候,其被稱作「C++風格」的注釋,但實際上,其源自於C的前身 BCPL。
1、在引號中,如果採用/*或//分隔一個字元常量或字元串字面量(string literal),它們都不會被視為注釋的開始。例如,下面語句就沒有注釋:
printf("Comments in C begin with /* or //. " );
2、預處理器僅通過檢查注釋的結束符來檢測注釋中的字元,因此,不能嵌套塊注釋。然而,可以使用/*和*/注釋包含單行注釋的源代碼:
/* 暫時注釋掉這兩行:
const double pi = 3.1415926536; // pi是一個常量
area = pi * r * r; // 計算面積
暫時注釋到此 */
❽ c語言函數注釋
不清楚你想問什麼,C語言的注釋通常有2個方法。1是在注釋的前面加 // 這樣是把//後面的這一行內容注釋。2 是/* 內容*/ 這樣是可以把1行或者多行/* */之間的內容注釋掉。