<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
函數的概念
函數的型別
通過某種規則將 x處理成 y,如: y = 2x +1
(根據資料)執行一系列動作,進而完成某種功能,如:螢幕列印
C語言中函數的組成部分
函數名:函數的唯一標識
函數引數定義:資料輸入(資料→資料,資料→動作)
函數返回型別:
廣義函數範例:
返回型別 函數名(引數1,引數2)
{
程式語句1;
程式語句2;
......;
程式語句n;
}
C語言中的函數範例
函數的呼叫
下面看一段函數呼叫的程式碼:
#include <stdio.h> int func_demo( int x ) { int y = 0; y = 2 * x - 1; return y; } int main() { int r1 = func_demo(1); int r2 = func_demo(5); int r3 = func_demo(10); printf("r1 = %dn", r1); printf("r2 = %dn", r2); printf("r3 = %dn", r3); return 0; }
下面為輸出結果:
下面再看一段編寫函數計算累加和的程式碼:
#include <stdio.h> int sum (int n) { int r = 0; int i = 0; for(i=1; i<=n; i++) { r += i; } return r; } int main() { int o[10] = {10, 20, 30, 40, 50, 100}; int r[10]; int i = 0; for(i=0; i<10; i++) { r[i] = sum(o[i]); } for(i=0; i<10; i++) { printf("sum(%d) = %dn", o[i], r[i]); } return 0; }
下面為輸出結果:
採用陣列可以便捷的求出從1加到指定的數。
小結
再論C語言程式的入口
深入理解main()
應用程式的執行
應用程式執行流程
下面看一段程式碼,實際感受一下吧:
#include<stdio.h> #include<stdlib.h> int main() { printf("Hello World!n"); system("pause"); return 0; }
沒錯,就是這個簡單的不能再簡單的程式碼,開啟Test.exe,得到下圖:
下面來證明一下 返回值 0 是返回給作業系統,首先開啟命令提示字元,如下:
然後在命令提示字元上切換到這個目錄,採用 cd 命令,如下:
然後執行 Test.exe,如下:
按下回車,輸入echo %errorlevel%
,如下:
可以看到輸出 0 ,這是 main 函數中的返回值。如果把 return 0那裡換成 return 666,那麼執行 echo %errorlevel% 會輸出 666。這就說明返回值成功返回給作業系統。
核心本質
工具包的本質
小結
函數定義與函數呼叫
函數在被呼叫前必須完整定義
函數可以先被宣告,再被定義
特殊的基礎型別
void 深入理解
所以說,下面程式的寫法就是錯誤的。
#include <stdio.h> void demo(void i) { return i; } int main() { void v; void x = v; demo(x); return 0; }
注意事項
C語言中的函數如果確定不需要引數,那麼用 void 定義引數,而不是不寫引數。
#include <stdio.h> void f( ) { printf("void f() n"); } void g(void) { printf("void g() n"); } int main() { f(); f(1, 2); g(); // g(1); // ERROR return 0; }
下面為輸出結果:
可以看出,f 函數的輸入引數是沒有限制的,而g 函數沒有輸入引數,這點要特別注意。
關於函數返回
return 語句直接返回主調函數,後續程式碼不再執行
對於無返回值函數
對於有返回值的函數
小結
深入函數引數
下面看一段程式碼:
#include <stdio.h> int test(int n); int main() { int i = 3; int j = test(i); printf("i = %d, j = %dn", i, j); return 0; } int test(int n) { n = n * 10; return n; }
下面為輸出結果:
特殊的陣列引數
注意事項
void func (int a[ ])
等價於void func (int a[1])
等價於void func (int a[10])
等價於void func (int a[100])
下面看一段程式碼,加深印象:
#include <stdio.h> void demo(int a[3]) { a[0] = 50; } int sum(int a[], int len) { int ret = 0; int i = 0; while( i < len ) { ret += a[i]; i++; } return ret; } int main() { int arr1[5] = {0, 1, 2, 3, 4}; // arr1[0] -> 0 int arr2[10] = {0, 10, 20, 30, 40}; // arr2[0] -> 0 demo(arr1); demo(arr2); printf("arr1[0] = %dn", arr1[0]); printf("arr2[0] = %dn", arr2[0]); printf("sum(arr1) = %dn", sum(arr1, 5)); printf("sum(arr2) = %dn", sum(arr2, 10)); return 0; }
下面為輸出結果:
這裡注意一下這句話:在函數內部修改陣列形參,將影響陣列實參,所以當呼叫 demo 函數後,實參的 arr1[0] 和 arr2[0] 都變成了50。
小結
排序的一般定義
排序中的關鍵操作
比較
交換
核心思想
解決方案
編寫函數 int Min(int a[], int b, int e) 選擇最小元素
迴圈遍歷陣列,將每次找到的最小元素交換就位
下面看一下範例程式碼:
#include <stdio.h> int Min(int a[], int b, int e) { int r = b; int i = 0; for(i=b; i<=e; i++) if( a[r] > a[i] ) r = i; return r; } void Sort(int a[], int n) { int i = 0; int j = 0; int k = 0; for(i=0; i<n; i++) { j = Min(a, i, n-1); if( i != j ) { k = a[i]; a[i] = a[j]; a[j] = k; } } } void Print(int a[], int n) { int i = 0; while( i < n ) printf("%d ", a[i++]); printf("n"); } int main() { int a[5] = {20, 30, 10, 40, 50}; printf("Origin: n"); Print(a, 5); Sort(a, 5); printf("After: n"); Print(a, 5); return 0; }
下面為輸出結果:
小結
C語言中變數的分類
區域性變數
全域性變數
同名變數的問題
同名變數規則
下面看一段程式碼,感受一下:
#include <stdio.h> int var = 100; // 全域性變數 void f(int var) // var <==> 區域性變數 { var++; printf("var = %dn", var); } int main() { int var = 10; // 區域性變數 f(var); // f(10); printf("var = %dn", var); // var = 10; return 0; }
下面為輸出結果:
變數的作用域
區域性變數的作用域
全域性變數的作用域
下面看一段程式碼,感受一下:
#include <stdio.h> int var = 100; // 全域性變數 int main() { int var = 10; // 區域性變數 { int var = 1; // 區域性變數 printf("var = %dn", var); } printf("var = %dn", var); // var = 10; return 0; }
下面為輸出結果:
注意:存在多個同名變數時,優先使用最近定義的變數
小結
不同變數的物理儲存區域
生命期:變數從建立到銷燬的時間(即:合法可用的時間)
不同變數的生命期
全域性資料區中的變數
棧空間中的變數
區域性變數在函數呼叫返回後銷燬
下面看一段程式碼,感受一下變數生命期:
#include <stdio.h> int var = 1; void func() { printf("var = %dn", var); } int main() { int var = 2; int i = 0; for(i=0; i<5; i++) { int var = 4; var += i; printf("var = %dn", var); } func(); printf("var = %dn", var); return 0; }
下面為輸出結果:
這個例子充分展示了變數的生命週期,值得仔細體會。
作用域與生命期無本質聯絡
作用域規則是語法層面對變數是否可存取的規定
生命期是二進位制層面上變數存在於記憶體中的時間
可能的情況
靜態變數
變數的生命期由變數儲存位置決定
不同型別變數範例
#include <stdio.h> int g_var = 1; static int g_sVar = 2; int main() { static int s_var = 3; auto int v = 4; register int rv = 5; printf("g_var = %dn", g_var); printf("g_sVar = %dn", g_sVar); printf("s_var = %dn", s_var); printf("v = %dn", v); printf("rv = %dn", rv); return 0; }
下面為輸出結果:
下面看一段程式碼,感受一下 static 關鍵詞:
#include <stdio.h> int global; int func(int x) { static int s_var; // 全域性資料區中的變數,預設初始化為 0 // 並且,只做一次初始化 s_var += x; return s_var; } int main() { int i = 0; for(i=1; i<=5; i++) { printf("func(%d) = %dn", i, func(i)); } printf("func(0) = %dn", func(0)); printf("global = %dn", global); return 0; }
下面為輸出結果:
這裡注意:全域性資料區中的變數,預設初始化為 0 ,並且,只做一次初始化
小結
static | auto(預設) | register | |
區域性變數 | 全域性資料區 | 棧空間 | 暫存器(可能) |
全域性變數 | 全域性資料區 | --- | --- |
題目:編寫函數,將字串轉換為整型數
函數原型:int str2int(char s[]);
引數:可以代表整型數的字串
返回值:整型值
注意事項:
演演算法流程
上程式碼:
#include <stdio.h> int getNumber(char c) { int ret = -1; if( ('0' <= c) && (c <= '9') ) ret = c - '0'; return ret; } int str2int(char str[]) { int ret = 0; int sign = 0; int i = 0; if( getNumber(str[0]) != -1 ) { sign = 1; i = 0; } else if( str[0] == '+' ) { sign = 1; i = 1; } else if( str[0] == '-' ) { sign = -1; i = 1; } while( sign && str[i] ) { int n = getNumber(str[i]); if( n != -1 ) ret = ret * 10 + n; else break; i++; } ret = sign * ret; return ret; } int main() { printf("%dn", str2int("123")); printf("%dn", str2int("-12345")); printf("%dn", str2int("567xyz89")); printf("%dn", str2int("abc")); printf("%dn", str2int("-xyz")); return 0; }
下面為輸出結果:
在程式設計中,將函數自呼叫稱為遞迴呼叫
遞迴是一種數學上分而自治的思想
遞迴模型的一般表示法
遞迴在程式設計中的應用
遞迴函數
遞迴思想的應用:
自然數列求和:sum( n ) = 1 +2 +3 + ... + n
斐波拉契數列:1,1,2,3,5,8,13,21,...
上程式碼:
#include <stdio.h> int sum(int n) { int ret = 0; if( n == 1 ) ret = 1; else ret = n + sum(n-1); return ret; } int fac(int n) { int ret = 0; if( n == 1 ) ret = 1; else if( n == 2 ) ret = 1; else if( n >= 3 ) ret = fac(n-1) + fac(n-2); else ret = -1; return ret; } int main() { int i = 0; printf("sum(1) = %dn", sum(1)); printf("sum(10) = %dn", sum(10)); printf("sum(100) = %dn", sum(100)); for(i=1; i<=10; i++) { printf("%d, ", fac(i)); } printf("n"); return 0; }
下面為輸出結果:
小結
到此這篇關於C語言從零探索函數的知識的文章就介紹到這了,更多相關C語言函數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45