目錄
10年積累的做網(wǎng)站、成都做網(wǎng)站經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有平山免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。1、函數(shù)是什么?
2、C語言中函數(shù)的分類:
1、庫函數(shù)
2、自定義函數(shù)
3、函數(shù)的參數(shù)
4、函數(shù)的調(diào)用
5、練習(xí)
1、打印100~200之間的素數(shù)
2、打印100~200之間的閏年
3、寫一個函數(shù),實現(xiàn)一個整形有序數(shù)組的二分查找
6、函數(shù)的嵌套調(diào)用和鏈?zhǔn)皆L問
7、函數(shù)的聲明和定義
1、函數(shù)聲明:
2、函數(shù)定義:
8、函數(shù)遞歸
1、什么是遞歸?
2、遞歸的兩個必要條件
3、練習(xí)
1、接收一個整型值(無符號),按照順序打印它的每一位。 例如:輸入:1234,輸出 1 2 3 4
2、編寫函數(shù)不允許創(chuàng)建臨時變量,求字符串的長度
3、求n的階乘(不考慮溢出)
4、求第n個斐波那契數(shù)(不考慮溢出)
9、函數(shù)棧幀創(chuàng)建和銷毀
維基百科中對函數(shù)的定義:子程序
在計算機(jī)科學(xué)中,子程序(英語:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一個大型程序中的某部分代碼,由一個或多個語句塊組成。它負(fù)責(zé)完成某項特定任務(wù),而且相較于其他代碼,具備相對的獨立性。一般會有輸入?yún)?shù)并有返回值,提供對過程的封裝和細(xì)節(jié)的隱藏。這些代碼通常被集成為軟件庫。
2、C語言中函數(shù)的分類:1. 庫函數(shù)
2. 自定義函數(shù)
1、庫函數(shù)1、為什么會有庫函數(shù)?
答:在我們學(xué)習(xí)C語言編程的時候,總是在一個代碼編寫完成之后迫不及待的想知道結(jié)果,想把這個結(jié)果打印到屏幕上看看。這個時候我們會頻繁的使用一個功能:將信息按照一定的格式打印到屏幕上(printf)。像這種我們描述的基礎(chǔ)功能,它們不是業(yè)務(wù)性的代碼。我們在開發(fā)的過程中每個程序員都可能用的到,為了支持可移植性和提高程序的效率,所以C語言的基礎(chǔ)庫中提供了一系列類似的庫函數(shù),方便程序員進(jìn)行軟件開發(fā)。
2、如何學(xué)習(xí)庫函數(shù)?
可通過網(wǎng)站學(xué)習(xí):https://cplusplus.com/reference/
使用庫函數(shù),必須包含 #include 對應(yīng)的頭文件
2、自定義函數(shù)函數(shù)的組成:
例1:寫一個函數(shù)可以找出兩個整數(shù)中的大值
#includeint get_max(int x, int y)
{
return (x >y) ? (x) : (y);
}
int main()
{
int num1 = 10;
int num2 = 20;
int max = get_max(num1, num2);
printf("max = %d\n", max);
return 0;
}
例2:寫一個函數(shù)可以交換兩個整形變量的內(nèi)容
#includevoid Swap(int* x,int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
Swap(&a, &b);
printf("a=%d b=%d\n", a, b);
return 0;
}
注意:這里不能用傳值傳參,需要用傳址傳參。當(dāng)函數(shù)調(diào)用的時候,實參傳給形參,形參是實參的一份臨時拷貝,對形參的修改是不影響實參的。
3、函數(shù)的參數(shù)1、實際參數(shù)(實參):真實傳給函數(shù)的參數(shù),叫實參。實參可以是:常量、變量、表達(dá)式、函數(shù)等。無論實參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時,它們都必須有確定的值,以便把這些值傳送給形參。
2、形式參數(shù)(形參):形式參數(shù)是指函數(shù)名后括號中的變量,因為形式參數(shù)只有在函數(shù)被調(diào)用的過程中才實例化(分配內(nèi)存單元),所以叫形式參數(shù)。形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動銷毀了。因此形式參數(shù)只在函數(shù)中有效。
4、函數(shù)的調(diào)用1、傳值調(diào)用:函數(shù)的形參和實參分別占有不同內(nèi)存塊,對形參的修改不會影響實參。
2、傳址調(diào)用:傳址調(diào)用是把函數(shù)外部創(chuàng)建變量的內(nèi)存地址傳遞給函數(shù)參數(shù)的一種調(diào)用函數(shù)的方式。這種傳參方式可以讓函數(shù)和函數(shù)外邊的變量建立起真正的聯(lián)系,也就是函數(shù)內(nèi)部可以直接操 作函數(shù)外部的變量。
5、練習(xí) 1、打印100~200之間的素數(shù)分析:判斷素數(shù)n,用試除法,從2到根號n即可。根號函數(shù)sqrt(),頭文件#include
#include#includeint is_primer(int n)
{
for (int j = 2; j<= sqrt(n); j++)
{
if (n % j == 0)
return 0;
}
return 1;
}
int main()
{
for (int i = 100; i<= 200; i++)
{
if (is_primer(i) == 1)
printf("%d ", i);
}
return 0;
}
2、打印100~200之間的閏年分析:判斷閏年,4年一閏且百年不閏,或400年一閏。
注意:邏輯與、或的結(jié)果為真、假,即真對應(yīng)1,假對應(yīng)0。
#includeint is_leap_year(int year)
{
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
return 1;
else
return 0;
}
int main()
{
int count = 0;
for (int i = 100; i<= 200; i++)
{
if (is_leap_year(i) == 1)
{
count++;
printf("%d ", i);
}
}
printf("\ncount=%d\n", count);
return 0;
}
3、寫一個函數(shù),實現(xiàn)一個整形有序數(shù)組的二分查找分析:每次取中間元素進(jìn)行比較,然后重復(fù)
注意:數(shù)組在傳參的時候,不會將整個數(shù)組傳過去,傳遞的是數(shù)組首元素的地址。形參那里可以寫數(shù)組形式 int arr[ ] 或者指針形式?int* arr 來接收,但本質(zhì)會變成 int* arr,為了可讀性,一般建議寫int arr[ ],即數(shù)組形式。所以數(shù)組傳參時,應(yīng)再傳一個參數(shù),即數(shù)組元素個數(shù)。
#includeint binary_search(int arr[], int n, int k)
{
int left = 0;
int right = n - 1;
while (left<= right)
{
int mid = (left + right) / 2;
if (arr[mid] >k)
right = mid - 1;
else if (arr[mid]< k)
left = mid + 1;
else
return mid;
}
return -1;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int key = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
scanf("%d", &key);
int ret = binary_search(arr, sz, key);
if (ret >= 0)
printf("找到了,下標(biāo)是%d\n", ret);
else
printf("沒找到\n");
return 0;
}
6、函數(shù)的嵌套調(diào)用和鏈?zhǔn)皆L問1、函數(shù)和函數(shù)之間可以根據(jù)實際的需求進(jìn)行組合的,也就是互相調(diào)用的。
2、函數(shù)可以嵌套調(diào)用,但是不能嵌套定義。
3、把一個函數(shù)的返回值作為另外一個函數(shù)的參數(shù)。
7、函數(shù)的聲明和定義 1、函數(shù)聲明:1、告訴編譯器有一個函數(shù)叫什么,參數(shù)是什么,返回類型是什么。但是具體是不是存在,函數(shù)聲明決定不了。
2、函數(shù)的聲明一般出現(xiàn)在函數(shù)的使用之前。要滿足先聲明后使用。
3、函數(shù)的聲明一般要放在頭文件中的。
2、函數(shù)定義:函數(shù)的定義是指函數(shù)的具體實現(xiàn),交待函數(shù)的功能實現(xiàn)。
8、函數(shù)遞歸 1、什么是遞歸?遞歸:遞(遞推),歸(回歸)。
程序調(diào)用自身的編程技巧稱為遞歸( recursion)。一個過程或函數(shù)在其定義或說明中有直接或間接調(diào)用自身的一種方法,它通常把一個大型復(fù)雜的問題層層轉(zhuǎn)化為一個與原問題相似的規(guī)模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復(fù)計算,大大地減少了程序的代碼量。遞歸的主要思考方式在于:把大事化小。
2、遞歸的兩個必要條件1、存在限制條件,當(dāng)滿足這個限制條件的時候,遞歸便不再繼續(xù)。
2、每次遞歸調(diào)用之后越來越接近這個限制條件。
3、練習(xí)注意:
1、stack overflow是棧溢出。
2、函數(shù)調(diào)用,會建立棧幀,會在棧區(qū)申請內(nèi)存空間。
3、%d 指有符號整數(shù);%u 指無符號整數(shù);%f 指單精度浮點型;%lf 指雙精度浮點型。
1、接收一個整型值(無符號),按照順序打印它的每一位。 例如:輸入:1234,輸出 1 2 3 4分析:用循環(huán)時的做法是1234/10 得到123,1234%10 得到4,然后循環(huán)即可。
#includevoid print(unsigned int n)
{
if (n< 10)
printf("%d ", n);
else
{
print(n / 10);
printf("%d ", n % 10);
}
}
int main()
{
unsigned int num = 0;
scanf("%u", &num);
print(num);
return 0;
}
2、編寫函數(shù)不允許創(chuàng)建臨時變量,求字符串的長度1、編寫函數(shù),求字符串長度
#includeint my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abc";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
2、不允許創(chuàng)建臨時變量,求字符串的長度
遞歸方法:
#includeint my_strlen(char* str)
{
if (*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
int main()
{
char arr[] = "abc";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
3、求n的階乘(不考慮溢出)1、遞歸方法:
#includeint Fac(int n)
{
if (n<= 1)
return 1;
else
return n * Fac(n - 1);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fac(n);
printf("%d\n", ret);
return 0;
}
2、循環(huán)方法:
#includeint Fac(int n)
{
int ret = 1;
for (int i = 1; i<= n; i++)
ret *= i;
return ret;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fac(n);
printf("%d\n", ret);
return 0;
}
4、求第n個斐波那契數(shù)(不考慮溢出)1、遞歸(有大量重復(fù)的計算,效率低)
#includeint Fib(int n)
{
if (n<= 2)
return 1;
else
return Fib(n - 1) + Fib(n - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d\n", ret);
return 0;
}
2、循環(huán)
#includeint Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while (n >2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d\n", ret);
return 0;
}
9、函數(shù)棧幀創(chuàng)建和銷毀esp、ebp 這兩個寄存器中存放的是地址,這兩個地址是用來維護(hù)函數(shù)棧幀的。
棧區(qū)的使用習(xí)慣是先使用高地址,再使用低地址。
main()函數(shù)也是被調(diào)用的,函數(shù)調(diào)用會建立棧幀,在棧區(qū)開辟內(nèi)存空間,大片的內(nèi)存申請,建議移步到堆區(qū)。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
本文標(biāo)題:函數(shù)(6)-創(chuàng)新互聯(lián)
文章地址:http://www.rwnh.cn/article34/essse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、移動網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、商城網(wǎng)站、App開發(fā)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容