日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何设计函数?

發布時間:2023/12/19 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何设计函数? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

函數:

一段具有某項功能的代碼,是C語言中管理代碼的單位。 把代碼封裝成一個個函數,可以方便的管理和調用代碼。

函數分類:

標準庫函數:C語言標準為委員會為C語言以函數形式提供的一些基礎功能,被封裝在libc.so庫中,使用時需要包含頭文件,函數名(參數)即可以調用。int isalnum(int c);功能:當以是數字、字母字符返回真int isalpha(int c);功能:當c是字母時返回真int isdigit(int c);功能:當c是數字字符時返回真int islower(int c);功能:當c是小寫字母時返回真int isupper(int c);功能:當c是大寫字母時返回真int abs(int num);功能:返回num的絕對值以下函數被封裝在libm.so庫文件中。double sqrt(double x);功能:返回x的平方根double pow(double x, double y);功能:返回x的y次方double floor(double arg);功能:返回小于等于arg的最大整數double ceil( double num );功能:返回大于等于num的最小整數double fabs(double arg);功能:返回arg的給對值void srand(unsigned seed);功能:設置隨機種子int rand(void);功能:返回一個隨機數rand()%(b-a)+a time_t time( time_t *time);功能:返回自19701月1日 00:00:00 到當前時間過了多少秒。int system(const char *command);功能:調用系統命令練習4:獲取10個[100,1001)的隨機數。for(int i=0;i<10;i++){srand(time(NULL));rand()%(1001-100)+100; //相當于[100,1000]}練習5:隨機出一組雙色球彩票號。6紅:1~331藍:1~16 #include <stdio.h> #include <stdlib.h> #include <time.h>int main(int argc,const char* argv[]) {time_t t;time(&t); /*獲取time_t類型的當前時間*/srand(time(NULL));printf("紅:");for(int i=0; i<6; i++){printf("%d ",rand()%(33-1+1)+1);}printf("\n藍:");printf("%d ",rand()%(16-1+1)+1);/*用gmtime將time_t類型的時間轉換為struct tm類型的時間按,//沒有經過時區轉換的UTC時間然后再用asctime轉換為我們常見的格式 Fri Jan 11 17:25:24 2008*/printf("\n---- %s\n",asctime(gmtime(&t)));//轉化成常見字符串printf("---- %s\n",ctime(&t));return 0; } 系統函數:是操作系統以函數接口形式提供的一功能,這些功能包括:內存管理、信號處理、文件IO、文件管理、 進程管理、進程通信、線程管理、線程同步、網絡通信。第三庫函數:一些開源或收費的第三代碼。glog 日志記錄JSON 序列化反序列化MD5 驗證XML 配置文件解析 自定義函數:為了更好的管理代碼、減少冗余把代碼封裝成函數。函數聲明:函數聲明的目的是為了告訴其它代碼函數的調用格式。返回值類型 函數名(類型1 變量名1,類型2 變量名2,...);1、C語言中函數名一般全部小寫,用下劃線分隔。2、如果不需要參數建議寫void,不要空著。3、如果不需要返回值就寫void。隱式聲明:當調用函數時沒有定義,編譯器會猜測函數的格式,參數列表會根據調用時提供的數據(實參)猜測,返回值會猜成int類型。函數定義:返回值類型 函數名(類型1 變量名1,類型2 變量名2,...){函數休;return val;}函數調用:函數名(實參);返回值會放在調用的位置,可以立即顯示,也可以用變量記錄下來。

函數傳參:

1、形參變量屬于它所在的函數,出了該函數就不能再用。 2、實參與形參之間是以賦值的形式傳遞數據的(值傳遞)。 3、return 其實是把數據放置到一個公共區域(函數和函數調用者),如果不寫return語句,該區域中就是一個隨機的垃圾數據。 4、數組作為函數的參數時,長度會丟失,需要額外增加一個變量把數組的長度也傳遞過去。 5、數組的傳遞是"址傳遞",函數和函數調用者可以共享數組。 練習1:實現函數,找出數組中的最大值。 #include <stdio.h> #include <stdlib.h>int max_arr(int arr[],int len) {int max = arr[0];for(int i=1; i<len; i++){if(arr[i] > max){max = arr[i];}}return max; }int main(int argc,const char* argv[]) {int arr[10] = {};for(int i=0; i<10; i++){arr[i] = rand() % 1000;printf("%d ",arr[i]);}printf("\n%d\n",max_arr(arr,sizeof(arr)/sizeof(arr[0]))); } 練習2:實現一個函數,對數組進行排序。 練習3:實現一個函數,查找數組是否存在某個值,如果存在返回該值在數組中的下標。 int find_arr(int arr[],int len,int val); #include <stdio.h> #include <stdlib.h>void sort(int arr[],int len) {for(int i=0; i<len-1; i++){for(int j=i+1; j<len; j++){if(arr[i] > arr[j]){int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}}} }int find(int arr[],int len,int val) {/*for(int i=0; i<len; i++){if(arr[i] == val){return i;}}*/int l = 0 , r = len-1;while(l<=r){int p = (l+r)/2;if(arr[p] == val){return p;}if(arr[p] > val){r = p-1;}else{l = p+1;}}return -1; } int main(int argc,const char* argv[]) {int arr[10] = {};for(int i=0; i<10; i++){arr[i] = rand() % 100;printf("%d ",arr[i]);}printf("\n");sort(arr,10);for(int i=0; i<10; i++){printf("%d ",arr[i]);}printf("\n%d\n",find(arr,10,49)); }

設計函數的準則:

1、一個函數最好只解決一個問題,這樣可以降低出錯率,提高可讀性。 2、最好不依賴其它函數(降低耦合度)。 3、數據由調用者提供,結果也樣返回給調用者(通用性)。 4、要考慮調用者提供的非法數據,可以通過返回值方式告訴調用者,或者把可能出現的情況在注釋中寫明。

進程映像:

程序:存儲磁盤上的可執行文件(二進制文件、腳本文件)。 進程:正在系統中運行的程序。 進程映像指的就是進程的分布情況: text 代碼段 存儲是二進制指令,常量數據,權限是只讀,強制修改會產生段錯誤。 data 數據段 初始化過的全局變量 bss 靜態數據段 未初始化的全局變量,程序運行時會被清理為0。 stack 棧 局部變量、塊變量 會隨著程序運行不斷申請、釋放 由系統管理 heap 堆 由程序員手動管理 特點就是夠大

局部變量和全局變量:

局部變量:定義在函數內stack 函數調用開始到函數執行結束只能在函數內使用 全局變量:定義在函數外data(初始化)或bss(未初始化) main運行前定義完成程序結束才釋放程序的任何位置都可以使用 局部變量可以和全局變量同名,但會屏蔽同名的全局變量,建議全局變量首字母大寫。

存儲介質:

按數據讀取速度由慢到快:
硬盤-》內存-》高級緩存-》寄存器

速度上,寄存器>cache>RAM>ROM

類型限定符:

auto 用于定義自動分配、釋放內存的變量(局部變量),不加就代表加。注意:全局變量不能用它修飾。C11 標準中用于自動類型識別auto num = 3.14; extern聲明變量,意思是此變量在別處已經定義,請放心使用。但只臨時滿過編譯時間,鏈時如果找不到依然會報錯。 static改變存儲位置:改變局部變量的存儲位置,由stack改為data或bss。被它修飾過程的局部變量也叫靜態局部變量。延長生命周期:延長局部變量的生命周期。限制作用域:限制全局變量、函數只能在本文件內使用。可以全局變量、函數命名沖突,也可以防止被別人調用。 const"保護"變量不被顯式修改。但是,如果補初始化過的全局變量、靜態局部變量被const修飾,存儲位置就會變成text。volatile如果變量值沒有顯式的修改,在使用這個變量時不從內存中讀取,而繼續使用上次讀取的結果。變量被volatile修飾后,每次使用到這個變量時,都會從內存中讀取。一般硬件編程時或多線程編程時使用。 volatile int num = 10;if(num == num){}register申請把變量的存儲介質由內存改為寄存器,但由于寄存器有限不一定百分百成功。注意:寄存器變量不取地址。typedef類型重定義,定義變量時如果前面加上typedef變量名就變了這種類型(注意不是替換關系)。

函數遞歸:

函數自己調用自己的分行叫遞歸,會產生死循環。 遞歸可以實現分治這種算法,就是把一個復雜的大問題,分解成若干個相同的小分問題,直到問題全部解決。1、出口 2、解決一個小問題 3、調用自己如果計算第N項斐波那切數列。遞歸函數每調用一次都會在棧內存產生一份自己的拷貝,直到達到出口,才一層釋放,因此使用遞歸非常耗費內存,與循環相比速度非常慢,能用循環解決的問題不要使用遞歸。遞歸優缺點:1、耗費內存、速度慢2、就是好理解、思路清晰。3、可以解決非線性的執行過程。

小練:

1、使用遞歸模擬漢諾塔的移動過程。2、全排列0~9。3、輸入一個整數,計算0~9每個數字出現的次數。0 1 2 0 2 1 1 0 2 1 2 0 2 0 1 2 1 0

總結

以上是生活随笔為你收集整理的如何设计函数?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。