① 2017年計算機二級c語言考點解析:函數
7.1 庫函數的正確調用
1.C語言提供了豐富的庫函數,包括常用數學函數、對字元和字元串處理函數、輸入輸出處理函數等。在調用庫函數時要注意以下幾點:
(1)調用C語言標准庫函數時必須在源程序中用include命令,include命令的格式是:
#include″頭文件名″
include命令必須以#號開頭,系統提供的頭文件名都以.h作為後綴,頭文件名用一對雙引號″″或一對尖括弧〈〉括起來。
(2)標准庫函數的調用形式:
函數名(參數表)
2.在C語言中庫函數的調用可以以兩種形式出現:出現在表達式中;作為獨立的語句完成某種操作。
7.2 函數的定義方法
1.C語言函數的一般形式為:
函數返回值的類型名 函數名(類型名 形參1,類型名 形參2,…)
{
說明部分
語句部分
}
定義的第一行是函數的首部,{}中的是函數體。
2.在老的C語言版本中,函數的首部用以下形式:
函數返回值的類型名 函數名(形參1,形參2…)
形參類型說明;
新的ANSI標准C兼容這種形式的函數首部說明。
3.函數名和形參名是由用戶命名的標識符。在同一程序中,函數名必須。形式參數名只要在同一函數中即可,可以與函數中的變數同名。
4.C語言規定不能在一個函數內部再定義函數。
5.若在函數的首部省略了函數返回值的類型名,把函數的首部寫成:
函數名(類型名 形參1,類型名 形參2,…)
則C默認函數返回值的類型為int類型。
6.當沒有形參時,函數名後面的一對圓括弧不能省略。
7.3 函數的類型和返回值
1.函數的類型由函數定義中的函數返回值的類型名確定,函數的類型可以是任何簡單類型,如整型、字元型、指針型、雙精度型等,它指出了函數返回值的具體類型。當函數返回的是整型值時,可以省略函數類型名。當函數只完成特定的操作而沒有或不需要返回值時,可用類型名void(空類型)。
2.函數返回值就是return語句中表達式的值。當程序執行到return語句時,猛空程序的流程就返回到調用該函數的地方(通常稱為退出調用函數),並空胡帶回函數值。
7.4 形式參數與實際參數,參數值的傳遞
1.在函數定義中,出現的參數名稱為形參(形式參數),在調用函數時,使用的參數值稱為實參(實際參數)。
2.調用函數和被調用函數之間的參數值的傳遞是″按值″進行的,即數據只能從實參單向傳遞給形參。也就是說,當簡單變數作為實參時,用戶不能在函數中改變對應實參的值。
7.5 函數的正確調用(嵌套調用,遞歸調用)
1.調用函數時,函數名必須與被調用的函數名字完全一樣。實參的個數與類型和形參的個數與類型一致。
2.C語言規定:函數必須先定義,後調用,也就是被調用函數必須在調用之前加以說明,或被調用函數整個放在調用函數之前。但對返回值類型為int或char類型的函數可以放在調用函數的後面。
3.C語言中函數定義都是互相平行、獨立的,C語言不允許嵌套定義函數,但允許嵌套調用函數,也就是說,在調用一個函數的過程中,又調用另一個函數。
4.在C程序中,調用一個函數的過程中又出現直接或間接地調用該函數本身,稱為函數的遞歸調用。
5.遞歸調用函數是C語言的特點之一,有時遞歸調用會使求解的問題變得更簡單明了。
7.6 局部變數和全局變數
1.局部變數
在一函數內部所定義的變數稱為局部變數,局部變數只在本函數范圍內有效。
注意:
①不同函數可以使用相同的局部變數名,它們將代表不同的對象,互不幹擾;
②一個函數的形參也為局部變數;
③在函數內部,復合語句也可定義變數,這些變數也為局部變數,只在此復合語句中有效。
2.全局變數
在C語言中,程序的編譯單位是源程序文件,一個源程序文件中包含一個或多個函數。在函數之外所定義枝虧瞎的變數稱為外部變數,也稱為全局變數。全局變數可以被包含它的源程序文件中的其他函數所共用,作用域為從定義變數的位置開始到源程序文件結束,全局變數可以增加函數之間數據的聯系。
注意:當在同一個源程序文件中,全局變數與局部變數同名時,在局部變數的作用范圍內,全局變數不起作用,局部變數起作用。
7.7 變數的存儲類別、作用域及生存期
1.變數的存儲類別
在C語言中,有兩類存儲類別:自動類別及靜態類別。
有4個與兩種存儲類別有關的說明符:auto(自動)、register(寄存器)、static(靜態)和extern(外部),這些說明符一般與類型說明一起出現,一般放在類型名的左邊,例如:
auto long I,j;
也可寫成:
long auto I,j;
(1)自動變數:自動變數是C程序中使用最多的一種變數,這種變數的建立和撤消都是在系統中自動進行的。
格式:[auto]數據類型 變數名[=初始化表達式],…;
上面的說明格式中,方括弧中是可省略的部分,auto為自動類別標識符,若省略auto,系統預設的存儲類別也為自動類別。
注意:函數的形參也為自動類別,在定義時不必加存儲類別標識符。
(2)寄存器變數:寄存器變數與自動變數的性質相同,其區別只在於存儲的位置不同,寄存器變數存儲在CPU的寄存器中,而自動變數存儲在內存中的動態存儲區,寄存器變數的存取速度要快些。
格式:register數據類型,變數名[=初始化表達式],…;
上面的說明格式中,register為寄存器變數的存儲類別標識符。
說明:
①CPU中寄存器的數目是有限的,因此只能把少數的變數說明為寄存器變數;
②寄存器變數是存放在寄存器中的,而不是存放於內存中,所以,寄存器變數無地址;
③寄存器變數的說明應盡量放在靠近要使用的地方,用完後盡快釋放,這樣可提高使用效率。
(3)靜態變數:靜態類別變數的存儲空間在程序的整個運行期間是固定的。
格式:static數據類型 變數名[=初始化表達式],…;
在上面的說明格式中,static為靜態變數的存儲類別標識符。
靜態變數的初始化在編譯時進行,定義時可用常量或表達式進行顯式初始化。對於沒有初始化的靜態變數,自動初始化為0(整型)或0.0(實型)。
注意:靜態變數具有可繼承性,這與自動變數有所不同。
(4)外部變數:使用extern可使外部變數使用范圍擴充到需要使用它的函數。外部變數可作顯式的初始化,若不作初始化,系統將自動地初始化為0或0.0。
格式:[extern]數據類型,變數名[=初始化表達式],…;
上面的說明格式中,extern使外部變數的作用范圍擴大到其他源程序文件中。
注意:局部變數既可以說明為自動類別,也可以說明為靜態類別;全局變數只能說明為靜態類別。
2.變數的作用域及生存期
在C語言中,變數必須先說明後使用,在程序中一個已定義的變數的使用范圍就是此變數的作用域。經過賦值的變數在程序運行期間能保持其值的時間范圍為該變數的生存期。
(1)局部變數的使用域及生存期
①自動變數的使用域及生存期
自動變數的存儲單元被分配在內存的動態存儲區,每當進函數體(或復合語句)時,系統自動為自動變數分配存儲單元,退出時自動釋放這些存儲單元。自動變數的作用域為從定義的位置起,到函數體(或復合語句)結束為止。
自動變數在進入到定義它們的函數體(或復合語句)時生成,在退出所在的函數體(或復合語句)時消失,這就是自動變數的生存期。
使用自動變數的優點是使各函數之間造成信息分隔,不同函數中使用同名變數時不會相互影響。
②寄存器變數的使用域及生存期
寄存器變數的使用域及生存期與自動變數相同。
③靜態存儲類別的局部變數
在函數體(或復合語句)內部,用static說明的變數靜態存儲類別的局部變數,這種變數的作用域與自動(或寄存器)變數的作用域相同,但是生存期有所不同。
在整個程序運行期間,靜態局部變數在內存的靜態存儲區中占據著永久的存儲單元,甚至在退出函數後下次再進入函數時,靜態局部變數仍使用原來的存儲單元。由於不釋放存儲單元,所以這些存儲單元中的值將會被保留下來。靜態局部變數的生存期將一直延長到程序運行結束。
靜態局部變數適合於在函數調用之間必須保留局部變數值的獨立變數。
② C語言printf函數,這道題的解析
x*100能把x中的小數點右移2位。
x*100+0.5能把原x中小數點後第3位的數字實現「五入」的效果
(int)(x*100+0.5)對這結果進行知衡返「取整」後能實現把原x中小數點後第3位的數字實現「四舍」的效果
最後除以搭飢100.0就可以把小數點左移2位,還原點原來的位置。
所以,本題選擇攔攜答案C。
③ c語言函數遞歸調用問題(請高手幫忙詳細解釋)
確實,初學C的時候,漢諾塔的遞歸看起來確實是比較神奇的程序。
其中主要就在hanoi 這個遞歸函數,傳的參數裡面有一個n 代表是幾層遞歸。
如果n=1 代表只有一個,move(one,three); 就是把第一個移到第三個就行了。否則
第一個柱子上有n個(n>1) 要移到第三個。需要把上面的n-1個移到第二個,最下面的一個移到第三個,再把第二個柱子上的n-1個移到第三個。 要這三個步驟。
其中,第一個,和第三個步驟,和本身其實是一樣的。
就是把n-1個移到第二個,注意hanoi的參數
/* 定義hanoi函數,將n個盤搭飢從one座藉助two座,移到three座 */
two 即第二個參數,這是表示用來藉助的
就假設n=2 吧 hanoi(2,'A','B','C'); 變成了
hanoi(1,A,C,B); //這個代表A座上有一塊,需要藉助C座,移到B座
A--->C
hanoi(1,B,A,C); /知哪返/這個代表B座上有一塊,需要藉助A座,移到C座
最後會輸出
A-->B
A-->C
B-->C
假設n=3 hanoi(3,'A','B','C');
hanoi(2,A,C,B); //這個代表A座上有兩塊,需要藉助C座,移到B座
A--->C
hanoi(2,B,A,C); //這個代表B座上有兩塊,需要藉助A座,移到C座
A座上有兩塊,需要藉助C座,緩攜移到B座 會輸出
A-->C
A-->B
C-->B
B座上有兩塊,需要藉助A座,移到C座 會輸出
B-->A
B-->C
A-->C
④ C語言時間函數,求解析意思
#include <stdio.h>
#include <time.h>
int main()
{
time_t timep; //時間變數,從1970年1月1日0時起的秒數
struct tm * p; //時間結構,含年月日時分秒星期幾,一年中第幾天,夏時制等成員。年從1900起算,月從0起算,...
time(&timep); // 獲取當前時間,從1970年1月1日0時起的秒數
p = gmtime(&timep); // 獲取UTC時間 結構成員數值們
printf("%d %d %d\n",1900+p->tm_year, 1+p->tm_mon, p->tm_mday); //輸出UTC時間的年月日
p = localtime(&timep); // 獲取本地 時間 結構成員數值們
printf("%d %d %d\n",1900+p->tm_year, 1+p->tm_mon, p->tm_mday); //輸出本地時間年月日
return 0;
}
⑤ C語言函數的問題
因為c語言的函數默認返回值是高飢凱int型的。
當你的main函數調用enter()和print()時,這兩個函數還沒有定義,所以就會認為返回值是int。而到了後面又出現void enter()和void print(),這就會報類型不匹配的錯誤了。
正確的做法肢團是;
typedef struct student {...};
void enter(...); /* 函數聲明 */
void print(...); /* 函數聲明 */戚喚
main() {...} /* 函數定義 */
void enter(...) {...} /* 函數定義 */
void print(...) {...} /* 函數定義 */
⑥ 兩道c語言基礎題求解析,謝謝
這要察姿睜如何解析,第一題就敗歲是函數傳參問題,實參和形參類型一致
第二題就是結構體變數的三種定義方式 D選項只是結構體類型的定義,不是結構體變數的定冊凱義