第四章 函數(shù)與程序結構[TCPL]

函數(shù)的基本知識

  1. 函數(shù)是對一系列計算或操作的過程的抽象

    函數(shù)可以把大的計算任務分解成若干個較小的任務,程序設計人員可以基于函數(shù)進一步構造程序启具。函數(shù)可以把程序中不需要了解的具體操作細節(jié)隱藏起來本讥,從而使整個程序結構更加清晰笋熬,并降低修改程序的難度逻卖。

    程序可以看成是變量定義和函數(shù)定義的集合。函數(shù)之間的通信可以通過參數(shù)、函數(shù)返回值以及外部變量進行邦危。

  2. 函數(shù)的定義形式

    返回值類型 函數(shù)名(參數(shù)聲明表)
    {
      聲明和語句
    }
    
  3. 例子:打印輸入中包含特定字符串的行(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;
    } 
     
    
  4. 例子: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
     } 
    

遞歸

  1. 遞歸是指函數(shù)可以直接或間接調用自身。

    C語言中的函數(shù)可以遞歸調用勤庐,即函數(shù)可以直接或間接調用自身示惊。遞歸調用過程須維護一個處理值得棧,開銷較大愉镰,執(zhí)行速度不快米罚;但遞歸代碼比較緊湊,比相應非遞歸代碼更易編寫與理解丈探。

  2. 例子:將一個數(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);
    }
    

    ?

  3. 例子:快速排序

    快速排序算法是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;
    }
    

變量

  1. 外部變量、內部變量挨稿、寄存器變量
  2. 靜態(tài)變量
    • static聲明外部變量和函數(shù)仇轻,可以將其后的聲明對象的作用域限定為被編譯源文件的剩余部分,可以達到隱藏外部對象的目的奶甘。
    • static也可用于聲明內部變量篷店。static內部變量是一種只能賊某個特定函數(shù)中使用但一直占據(jù)存儲空間的變量。

初始化

  1. 在不進行顯示初始化的情況下臭家,外部變量和靜態(tài)變量都將被初始化為0疲陕,而自動變量和寄存器變量的處置沒有定義。
  2. 外部變量和靜態(tài)變量的初始化表達式必須是常量表達式钉赁。

作用域規(guī)則

  1. 名字的作用域指的是程序中可以使用該名字的部分蹄殃。
  2. 對于在函數(shù)開頭聲明的自動變量,其作用域是聲明該變量的函數(shù)橄霉。
  3. 外部變量或函數(shù)的作用域從聲明它的地方開始窃爷,到其所在的文件的末尾結束邑蒋。
  4. 如果要在外部變量的定義之前使用該變量,或者外部變量的定義與變量的使用不在同一個源文件中按厘,則必須在相應的變量聲明中強制性地使用關鍵字extern

程序塊結構

變量的聲明除了可以緊隨在函數(shù)開始的花括號之后医吊,還可以緊跟在任何其他標識復合語句開始的左花括號之后。

四則運算計算器程序

  1. 實現(xiàn)方法:為了更容易實現(xiàn)逮京,我們使用逆波蘭表示法代替中綴表示法卿堂。計算器程序的實現(xiàn)過程:每個操作數(shù)都被依次壓入到棧中;當一個運算符到達時懒棉,從棧中彈出相應數(shù)目的操作數(shù)草描,把該運算符作用于彈出的操作數(shù),并把運算結果壓入到棧中策严。到達輸入行的末尾時穗慕,彈出棧頂值并打印。

    中綴表示法: ( 1 - 2 ) * ( 4 + 5 )
    逆波蘭表示法:1 2 - 4 5 + *
    

頭文件

C預處理

  1. 文件包含
  2. 宏替換
  3. 條件替換
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末妻导,一起剝皮案震驚了整個濱河市逛绵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌倔韭,老刑警劉巖术浪,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寿酌,居然都是意外死亡胰苏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門醇疼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硕并,“玉大人,你說我怎么就攤上這事僵腺±鸱酰” “怎么了壶栋?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵辰如,是天一觀的道長。 經(jīng)常有香客問我贵试,道長琉兜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任毙玻,我火速辦了婚禮豌蟋,結果婚禮上,老公的妹妹穿的比我還像新娘桑滩。我一直安慰自己梧疲,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著幌氮,像睡著了一般缭受。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上该互,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天米者,我揣著相機與錄音,去河邊找鬼宇智。 笑死蔓搞,一個胖子當著我的面吹牛,可吹牛的內容都是我干的随橘。 我是一名探鬼主播喂分,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼机蔗!你這毒婦竟也來了妻顶?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤蜒车,失蹤者是張志新(化名)和其女友劉穎讳嘱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酿愧,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡沥潭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嬉挡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钝鸽。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖庞钢,靈堂內的尸體忽然破棺而出拔恰,到底是詐尸還是另有隱情,我是刑警寧澤基括,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布颜懊,位于F島的核電站,受9級特大地震影響风皿,放射性物質發(fā)生泄漏河爹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一桐款、第九天 我趴在偏房一處隱蔽的房頂上張望咸这。 院中可真熱鬧,春花似錦魔眨、人聲如沸媳维。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侄刽。三九已至执虹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唠梨,已是汗流浹背袋励。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留当叭,地道東北人茬故。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像蚁鳖,于是被迫代替她去往敵國和親磺芭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容