函數(shù)的基本知識
-
函數(shù)是對一系列計算或操作的過程的抽象
函數(shù)可以把大的計算任務分解成若干個較小的任務,程序設計人員可以基于函數(shù)進一步構造程序启具。函數(shù)可以把程序中不需要了解的具體操作細節(jié)隱藏起來本讥,從而使整個程序結構更加清晰笋熬,并降低修改程序的難度逻卖。
程序可以看成是變量定義和函數(shù)定義的集合。函數(shù)之間的通信可以通過參數(shù)、函數(shù)返回值以及外部變量進行邦危。
-
函數(shù)的定義形式
返回值類型 函數(shù)名(參數(shù)聲明表) { 聲明和語句 }
-
例子:打印輸入中包含特定字符串的行(grep特例)
//打印輸入中包含特定字符串的行 #include <stdio.h> #define MAXLINE 1000 //最行輸入行長度 int getline(char line[], int max); int stringdex(char source[], char searchfor[]); char pattern[]="ould"; //帶查找的字符串 int main() { char line[MAXLINE]; int found = 0; //符合行總數(shù) while (getline(line, MAXLINE) > 0) { if (getline(line, MAXLINE) >=0) { printf("%s\n", line); found++; } } return found; } // getline函數(shù):將行保存在s中,并返回該行的長度方庭。lim為行限制長度 int getline(char s[], int lim) { int c; //讀取字符 int l = 0; //存儲長度 while (--lim > 0 && (c=getchar()) != EOF && c != '\n') { s[l++]=c; } s[l] = '\0'; return l; } //strindex函數(shù):返回目標字符串t中s中的位置翩瓜, 未找到則返回-1 int strindex(char s[], char t[]) { int i, j, k; for (i =0; s[i] != '\0'; i++) { for (j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++) ; if (k > 0 && t[k] == '\0') { return i; } } return -1; }
-
例子:atof 函數(shù)
#include <ctype.h> // atof 函數(shù):把字符串s轉換為相應的雙精度浮點數(shù) double atof(char s[]) { double int_part; //整數(shù)部分 double fra_part; //小數(shù)部分 int sign; //符號 int power; int i; for (i = 0; isspace(s[i]); i++) //跳過空白符 ; sign = (s[i] == '-') ? -1 : 1; if (s[i] == '+' || s[i] == '-') //跳過符號 i++; //整數(shù)部分 for (int_part = 0; isdigit(s[i]); i++) { int_part = 10.0 * int_part + (s[i] - '0'); } //跳過小數(shù)點 if (s[i] == '.') i++; //小數(shù)部分 for(power = 1, fra_part = 0.0; isdigit(s[i]); i++) { fra_part = fra_part * 10.0 + (s[i] - '0'); power *= 10; } fra_part = fra_part / power; return int_part + fra_part; } main() { //pass }
遞歸
-
遞歸是指函數(shù)可以直接或間接調用自身。
C語言中的函數(shù)可以遞歸調用勤庐,即函數(shù)可以直接或間接調用自身示惊。遞歸調用過程須維護一個處理值得棧,開銷較大愉镰,執(zhí)行速度不快米罚;但遞歸代碼比較緊湊,比相應非遞歸代碼更易編寫與理解丈探。
-
例子:將一個數(shù)作為字符串打印
#include<stdio.h> //pirntd函數(shù):將一個數(shù)作為字符串打印 void printd(int n) { if (n < 0) { putchar('-'); n = -n; } if (n / 10) printd(n /10); putchar(n % 10 + '0'); } //test main() { int num; scanf("%d",&num); printd(num); }
?
-
例子:快速排序
快速排序算法是C.A.R. Hoare于1962年發(fā)明的录择。對于一個給定的數(shù)組,從中選擇一個元素碗降,以該元素為界將其余元素劃分為兩個子集隘竭,一個子集中所有元素都小于該元素,另一個子集中所有元素都大于或等于該元素讼渊。對這兩個子集遞歸執(zhí)行這一過程动看,當某個子集中的元素小于2時,這個子集就不需要再次排序爪幻,終止遞歸菱皆。
// qsort函數(shù):以遞增順序對 v[left] ... v[right]進行排序 void qsort(int v[], int left, int right) { int i; int last; void swap(int v[], int i, int j); //遞歸邊界 if(left >= right) return; //劃分子集 swap(v, left, (left + right) / 2); last = left; for (i = left=1; i <= right; i++) { if (v[i] < v[left]) swap(v, ++last, i); } swap(v, left, last); //遞歸 qsort(v, left, last-1); qsort(v, last+1, right); } // swap函數(shù):交換 v[i]與 v[j]的值 void swap(int v[], int i, int j) { int temp; temp = v[i]; v[i] = v[j]; v[j] = temp; }
變量
- 外部變量、內部變量挨稿、寄存器變量
- 靜態(tài)變量
- 用
static
聲明外部變量和函數(shù)仇轻,可以將其后的聲明對象的作用域限定為被編譯源文件的剩余部分,可以達到隱藏外部對象的目的奶甘。 -
static
也可用于聲明內部變量篷店。static
內部變量是一種只能賊某個特定函數(shù)中使用但一直占據(jù)存儲空間的變量。
- 用
初始化
- 在不進行顯示初始化的情況下臭家,外部變量和靜態(tài)變量都將被初始化為
0
疲陕,而自動變量和寄存器變量的處置沒有定義。 - 外部變量和靜態(tài)變量的初始化表達式必須是常量表達式钉赁。
作用域規(guī)則
- 名字的作用域指的是程序中可以使用該名字的部分蹄殃。
- 對于在函數(shù)開頭聲明的自動變量,其作用域是聲明該變量的函數(shù)橄霉。
- 外部變量或函數(shù)的作用域從聲明它的地方開始窃爷,到其所在的文件的末尾結束邑蒋。
- 如果要在外部變量的定義之前使用該變量,或者外部變量的定義與變量的使用不在同一個源文件中按厘,則必須在相應的變量聲明中強制性地使用關鍵字
extern
程序塊結構
變量的聲明除了可以緊隨在函數(shù)開始的花括號之后医吊,還可以緊跟在任何其他標識復合語句開始的左花括號之后。
四則運算計算器程序
-
實現(xiàn)方法:為了更容易實現(xiàn)逮京,我們使用逆波蘭表示法代替中綴表示法卿堂。計算器程序的實現(xiàn)過程:每個操作數(shù)都被依次壓入到棧中;當一個運算符到達時懒棉,從棧中彈出相應數(shù)目的操作數(shù)草描,把該運算符作用于彈出的操作數(shù),并把運算結果壓入到棧中策严。到達輸入行的末尾時穗慕,彈出棧頂值并打印。
中綴表示法: ( 1 - 2 ) * ( 4 + 5 ) 逆波蘭表示法:1 2 - 4 5 + *
頭文件
C預處理
- 文件包含
- 宏替換
- 條件替換