程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> TC編程手冊之二

TC編程手冊之二

編輯:關於C語言

函數與數組.由於時間和精力有限,故不能像譚浩強譚老那樣把C語言講的細致入微, 但我想簡單易懂的講解對初學者來說還是有很大幫助的.

函數:

幾乎所有的C語言教材都把函數部分單列一章, 可見函數在C語言中是十分重要的.當一位初學者試圖編寫一則上百行的程序時, 他會很快就被數不清的變量搞得暈頭轉向, 再看各條語句的邏輯關系, 恐怕連自己也看不懂了吧, 更不用說別人讀你的程序了. 這時你所需要的就是把一個較大的程序分為若干個程序模塊, 每一個模塊實現一個特定的功能. 所有函數都是平行的, 即在定義函數時是互相獨立的, 一個函數並不從屬於另一個函數, 即函數不能嵌套定義. 就是這樣一個一個平行關系的小模塊, 將一個復雜的程序分生了多個簡單的小程序. 這樣做可以使程序的條理更加的清晰, 不僅方便了程序員的工作, 也便於其他人對程序的閱讀.

從用戶使用的角度看,函數有兩種(以下援引譚老的話,不好意思,畢竟譚老的經驗要更豐富嘛^0^):

(1).標准函數, 即庫函數. 這是由系統提供的, 用戶不必自己定義這些函數, 可以直接使用他們. 應該說明, 不同的C系統提供的庫函數的數量和功能不同, 當然有一些基本的函數是共同的.

(2).用戶自己定義的函數, 用以解決用戶的專門需要.

從函數的形式看,函數分兩類:

(1).無參函數.例如:

printstar();
   print_message();
   main()
   {
     printstar();
     print_message();
     printstar();
   }
printstar()
   {
     printf("************\n");
   }
print_message()
   {
     printf("*green food*\n");
   }

運行結果如下:

************

* green food *

************

其中printstar和print_message都是無參函數.在調用無參函數時,主調函數並不將數據傳送給被調用函數.無參函數可帶回或不帶回函數值.

(2)有參函數. 在調用函數時,在主調函數與被調函數之間有數據傳遞. 也就是說主調函數可以將數據傳遞給被調函數使用, 被調函數的數據也可以傳回來共主調函數使用. 例如:

  #include
   print_add();
   main()
   {
     printf("the add is: %d",print_add());
   }
   print_add()
   {
     int a=1, b=2, c;
     c=a+b;
     return c;
   }

運行結果如下:

the add is: 3

以上我們對函數有了大致的了解, 下面我向大家介紹一下形式參數和實際參數.

首先從定義入手, 形式參數即在定義函數時函數後面括弧中的變量名. 而實際參數則是指在主調函數中調用一個函數時, 函數名後面括弧中的參數.(可以是一個表達式) 具體見下例:

  #include
   print_add(int, int);
   main()
   {
     int a, b, c;
     scanf("%d%d",&a,&b);
     c=print_add(a,b);
     printf("the add is :%d",c);//實際參數
   }
   print_add(int x, int y)//形式參數
   {
     int z;
     z=x+y;
     return(z);
   }

需要注意的幾點問題:

(1) 實參可以是常量,變量, 或表達式, 但必須要有確切的值.

(2) 在被定義的函數中, 必須指定形參的類型.

(3) 形參與實參的類型應相同或賦值兼容.

函數需要講的東西還有很多, 這裡只是一個簡略的介紹. 還有很多的內容沒有涉及到, 推薦大有時間可以看看譚浩強的書. 關於函數部分譚老的書要比老Delitel寫的有條理的多.(也許是翻譯工作做的不好)希望大家在看了上面的文章後, 能有所幫助. 有問題可以給我寫信, 我的郵箱是:[email protected].

數組:

數組在C語言中也是十分重要的一部分, 要展開講大概說上幾天也沒完, 所以這裡我們只從一些基礎概念入手, 分析一些基本的問題.

數組即是一組相關的存儲單元, 這些存儲單元具有相同的名字和數據類型. 要引用數組的某個特定的存儲單元(元素)需要說明數組名和該特定元素在數組中的序號. 見下例:

  #include
   main()
   {
     int i, c [3] ={1,2,3};//可以在聲明數組時初始化數組
     for(i=0;i<=2;i++)
     printf("%5d",c[i]);
   }

運行結果如下:

1 2 3

數組的聲明問題: 數組占用內存空間. 程序員聲明了數組元素的類型和個數後計算機才能為該數組保留合適的內存數量. 如上例中的int c[3] 即告知計算機保留了3個整形元素的空間. 除了int 形外, 還可以把數組定義為其他數據類型, 如類型為char的數組可用來存儲一個字符串. 在初始化數組時應注意, 初始化列表中的初始化值個數不能多於數組元素的個數.

預處理程序#define的用法: 先見下例:

  #include
   #define SIZE 3//符號常量
   main()
   {
     int i, c [SIZE];
     for(i=0;i<=SIZE-1;i++)
     {
       c [i] =i+1;
       printf("%5d",c[i]);
     }
   }

運行結果如下:

1 2 3

這個例子與上一道例題有相同的運行結果, 但用了預處理程序後, 可以方便的對程序進行修改. 例如需要打印1 2 3 4 5時, 只需將#define SIZE 3改為#define SIZE 5 即可實現. 要注意的是, 預處理程序不是C語言的一部分, 他只是對文本操作的程序, 所以萬不可用分號結束. 還要注意符號常量名都用大寫字母書寫. 這種寫法突出了程序中的符號常量, 同時也提醒程序員符號常量不是變量.

數組的排序: 數組的排序法有很多, 這裡只介紹冒泡排序法. 見下例:

# include
# define SIZE 10
main()
{
   int a [SIZE] = {2,6,4,8,10,12,89,68,45,37};
   int i, pass, hold;
   printf("Data items in oraginal order\n");
   for(i=0; i<=SIZE-1; i++)
   printf("%4d", a[i]);
   for(pass=1; pass<=SIZE-1; pass++)
   for(i=0; i<=SIZE-2; i++)
   if(a[i]>a[i+1])
   {
     hold=a[i];
     a[i]=a[i+1];
     a[i+1]=hold;
   }
   printf("\nData items in ascending order\n");
   for(i=0; i<=SIZE-1; i++)
   printf("%4d", a[i]);
   printf("\n");
   return 0;
}

運行結果如下:

Data items int oraginal order

2 6 4 8 10 12 89 68 45 327

Data items in ascending order

2 4 6 8 10 12 45 68 89 327

由上例可見, 合理的利用數組可以簡化許多問題。 這裡就不一一介紹了, 有興趣的同學可以參見H.M.Deitel的書, 其中還介紹了許多有趣的例題。 大家可以共同探討研究。

關於多維數組的介紹, 我想以二維數組為例, 重點介紹一下二維數組的應用。 二維數組實際就是有兩各下標的數組, 但要特別注意的是第一個下標表示元素所在的行, 第二個下標表示元素所在的列。(注意千萬不可顛倒)和一維數組一樣, 二維數組也能在聲明時被初始化。 例如:

int a [2] [2] = {{1,2}, {3,4}};

如果某行沒有足夠的初始化值, 則該行中的剩余元素都被初始化為零, 這點要特別注意。對二維數組來說, 第一個下標有時是不必要的, 但一定要給出第二個下標, 編譯器用第二個下標確定元素在內存中的位置。 幻方是二維數組應用的一個很典型的例子, 見下例:

#define N 5
void setmagic(int [][N]);
void outmagic(int [][N]);
main()
{
   int s[N][N] = {0};
   setmagic(s);
   outmagic(s);
}
void setmagic(int s[][N])
{
   int i, j, tryi, tryj, k;
   k = 1;
   i = 0;
   j = N / 2;
   s[i][j] = k;
   k++;
   while(k <= N*N)
   {
     tryi = i - 1; tryj = j - 1;
     if(tryi == -1) tryi += N;
     if(tryj == -1) tryj += N;
     if(s[tryi][tryj] != 0 || (tryi == -1 && tryj == -1))
     i = i + 1;
     else {
       i = tryi; j = tryj;
     }
     s[i][j] = k;
     k++;
   }
}
void outmagic(int s[][N])
{
   int i, j;
   for(i = 0; i < N; i++) {
     for(j = 0; j < N; j++)
     printf("%4d", s[i][j]);
     printf("\n");
   }
}

運行結果如下:

15 8 1 24 17

16 14 7 5 23

22 20 13 6 4

3 21 19 12 10

9 2 25 18 11

關於二維數組的討論就暫告一段落吧, 還是推薦大家如果要看理論知識可以看譚浩強的C語言設計第二版, 一些例題可以參H.M.Deitel的C程序設計教程。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved