III. Chương trỡnh C
b. Cỏc khai bỏo nguyờn mẫu và định nghĩa hàm của người dựng
Trong phần này chỳng tụi nờu một số thụng tin về khai bỏo nguyờn mẫu và định nghĩa hàm để giải thớch cấu trỳc chương trỡnh chứ khụng cú ý định trỡnh bày về hàm, chi tiết về hàm sẽđược trỡnh bày trong phần về hàm.
• Cỏc nguyờn mẫu (dũng 2)
Nguyờn mẫu một hàm là dũng khai bỏo cung cấp cỏc thụng tin: tờn hàm, kiểu hàm, số đối số và kiểu từng đối số của hàm.
Cỳ phỏp khai bỏo nguyờn mẫu
<kiểu_hàm> <tờn_hàm> ([ khai bỏo đối ]);
Vớ dụ:
int min (int, int);
float binhphuong (float y); float giatri(int , float);
Lưu ý: Phần khai bỏo đối của nguyờn mẫu, mục đớch là xỏc định số đối số và kiểu của từng đối số, do vậy bạn cú thể khụng viết tờn của đối số nhưng kiểu của chỳng thỡ phải cú và bạn phải liệt kờ đầy đủ kiểu của từng đối.
• Cỏc định nghĩa hàm của người dựng (dũng 10)
Trong phần này chỳng ta định nghĩa cỏc hàm của người dựng, một định nghĩa hàm bao gồm dũng tiờu đề của hàm và thõn của hàm, với cỳ phỏp như sau:
<kiểu_hàm> <tờn_hàm> ([ khai bỏo đối ]) {
< thõn hàm > }
Vớ dụ:
int min(int a, int b) { if(a>=b)
return b; else return a; }
Lưu ý:
- Tiờu đề hàm trong định nghĩa hàm phải tương ứng với nguyờn mẫu hàm
- Nếu trong chương trỡnh định nghĩa hàm xuất hiện trước khi gặp lời gọi hàm đú thỡ cú thể khụng nhất thiết phải cú dũng khai bỏo nguyờn mẫu hàm.
c. Định nghĩa kiểu mới (dũng 4)
Ngoài những kiểu chuẩn đó được cung cấp sẵn của ngụn ngữ, người lập trỡnh cú thể định nghĩa ra cỏc kiểu mới từ những kiểu đó cú bằng cỏch sử dụng từ khoỏ typedef (type define) Với cỳ phỏp như sau
typedef <mụ_tả_kiểu> <tờn_kiểu_mới>;
Trong đú <tờn_kiểu_mới> là tờn kiểu cần tạo do người lập trỡnh đặt theo quy tắc về tờn của ngụn ngữ, và <mụ_tả_kiểu> là phần chỳng ta định nghĩa cỏc thành phần cấu thành lờn kiểu mới.
Vớ dụ:
typedef unsigned char byte; typedef long nguyendai;
Sau định nghĩa này cỏc tờn mới byte được dựng với ý nghĩa là tờn kiểu dữ liệu nú tương tự như unsigned char, và nguyendai tương tự như long.
Vớ dụ: chỳng ta cú thểđịnh nghĩa biến a, b kiểu byte như sau
byte a,b;
d. Định nghĩa macro (dũng 5)
Khỏi niệm macro là gỡ? Giả sử như bạn cú một nội dung (giỏ trị) nào đú và bạn muốn sử dụng nú nhiều lần trong chương trỡnh, nhưng bạn khụng muốn viết trực tiếp nú vào chương trỡnh lỳc bạn soạn thảo vỡ một vài lý do nào đú (chẳng hạn như nú sẽ làm chương trỡnh khú đọc, khú hiểu, hoặc khi thay đổi sẽ khú,..). Lỳc này bạn hóy gỏn cho nội dung đú một ‘tờn’ và bạn sử dụng ‘tờn’ đú để viết trong chương trỡnh nguồn. Khi biờn dịch chương trỡnh, chương trỡnh dịch sẽ tự động thay thế nội dung của ‘tờn’ vào đỳng vị trớ của ‘tờn’ đú. Thao tỏc này gọi là phộp thế macro và chỳng ta gọi ‘tờn’ là tờn của macro và nội dung của nú được gọi là nội dung của macro.
Một macro được định nghĩa như sau:
#define tờn_macro nội_dung
Trong đú tờn macro là một tờn hợp lệ, nội dung (giỏ trị) của macro được coi thuần tuý là 1 xõu cần thay thế vào vị trớ xuất hiện tờn của macro tương ứng, giữa tờn và nội dung cỏch nhau 1 hay nhiều khoảng trống (dấu cỏch). Nội dung của macro bắt đầu từ kớ tự khỏc dấu trống đầu tiờn sau tờn macro cho tới hết dũng.
Vớ dụ :
# define SOCOT 20
# define max(a,b) (a>?b a:b)
Với hai vớ dụ trờn, khi gặp tờn SOCOT chương trỡnh dịch sẽ tự động thay thế bởi 20 và max(a,b) sẽđược thay thế bởi (a>b?a:b)
Chỳ ý:
− Phộp thay thế macro đơn giản chỉ là thay nội dung macro vào vị trớ tờn của nú do vậy sẽ khụng cú cơ chế kiểm tra kiểu.
− Khi định nghĩa cỏc macro cú ‘tham số’ cú thể sau khi thay thế biểu thức mới thu được cú trật tự tớnh toỏn khụng như bạn mong muốn. Vớ dụ ta cú macro tớnh bỡnh phương 1 số như sau:
# define bp(a) a*a
và bạn cú cõu lệnh bp(x+y) sẽđược thay là x+y*x+y và kết quả khụng như ta mong đợi. Trong trường hợp này bạn nờn sử dụng dấu ngoặc cho cỏc tham số của macro
# define bp(a) ( a)*(a)
e. Định nghĩa biến, hằng (dũng 5)
Cỏc biến và hằng được định nghĩa tại đõy sẽ trở thành biến và hằng toàn cục. í nghĩa về biến, hằng, cỳ phỏp định nghĩa đó được trỡnh bày trong mục biến và hằng.
f. Hàm main (dũng 6-9)
Đõy là thành phần bắt buộc duy nhất trong một chương trỡnh C, thõn của hàm main bắt đầu từ sau dấu mở múc { (dũng 7) cho tới dấu đúng múc } (dũng 8). Khụng giống như
chương trỡnh của Pascal luụn cú phần chương trỡnh chớnh, chương trỡnh trong C được phõn thành cỏc hàm độc lập cỏc hàm cú cỳ phỏp như nhau và cựng mức, và một hàm đảm nhiệm phần thõn chớnh của chương trỡnh, tức là chương trỡnh sẽ bắt đầu được thực hiện từ dũng lệnh đầu tiờn và kết thỳc sau lệnh cuối cựng trong thõn hàm main .
Trong định nghĩa một hàm núi chung đều cú hai phần đú là tiờu đề của hàm, dũng này bao gồm cỏc thụng tin : Tờn hàm, kiểu hàm (kiểu giỏ trị hàm trả về), cỏc tham số hỡnh thức (tờn tham số và kiểu của chỳng). Phần thứ hai là thõn của hàm, đõy là tập cỏc lệnh (hoặc khai bỏo) thực hiện cỏc thao tỏc theo yờu cầu về chức năng của hàm đú. Hàm main cũng chỉ là một trường hợp riờng của hàm nhưng cú tờn cố định là main, cú thể cú hoặc khụng cú cỏc đối số, và cú thể trả về giỏ trị cho hệ điều hành, kiểu của giỏ trị này được xỏc định bởi <kiểu_hàm> (dũng 6) – chi tiết vềđối, kiểu của hàm main sẽđược đề cập kỹ
hơn trong cỏc phần sau.
Thõn hàm main được bao bởi cặp {(dũng 7), và } (dũng 9) cú thể gồm cỏc lệnh, cỏc khai bỏo hoặc định nghĩa biến, hằng, kiểu, cỏc thành phần này trở thành cục bộ trong hàm main - vấn đề cục bộ, toàn cục sẽđề cập tới trong phần phạm vi.
ắ Lưu ý:
• Cỏc thành phần của chương trỡnh mà chỳng ta vừa nờu trừ hàm main là thành phần phải cú và duy nhất trong một chương trỡnh C, cũn cỏc thành phần khỏc là tuỳ chọn, cú thể khụng cú hoặc cú nhiều.
• Thứ tự cỏc thành phần khụng bắt buộc theo trật tự như trờn mà chỳng cú thể xuất hiện theo trật tự tuỳ ý nhưng phải đảm bảo yờu cầu mọi thành phần phải được khai bỏo hay định nghĩa trước khi sử dụng.
• Cỏc biến, hằng khai bỏo ngoài mọi hàm cú phạm vi sử dụng là toàn cục (tức là cú thể sử dụng từ sau lệnh khai bỏo cho tới hết file chương trỡnh). Cỏc hằng, biến khai bỏo trong 1 hàm (hoặc trong 1 khối) là thành phần cụ bộ (cú phạm vi sử dụng trong hàm hoặc trong khối đú mà thụi). • Cỏc hàm trong C là một mức (tức là trong hàm khụng chứa định nghĩa hàm khỏc). Vớ dụ: chương trỡnh nhập bỏn kớnh từ bàn phớm, tớnh và in diện tớch hỡnh trũn #include <stdio.h> #include <conio.h> #define PI 3.1415
float r; // Khai bỏo biến r cú kiểu float
void main()
{ printf("\nNhap ban kinh duong tron r =");
scanf("%f",&r); //nhập số thực từ bàn phớm vào r
printf("Dien tich = %5.2f", r*r*PI); //tớnh và in diện tớch
getch(); }