Sep 23, 2012

Tản mạn về C

Bài toán: Viết chương trình tính diện tích một hình tam giác khi biết chiều cao và cạnh đáy.

#include <stdio.h>
int main() {
 float height, base, area;                    /* variables definition */
 /*input data*/
 
 printf(" Hight :");
 scanf("%f", &height);
 printf(" Base :");
 scanf("%f", &base);
 
 /*calculate the area of a triangle*/
 area = 0.5 * ( height * base);
 /*output result */
 printf(" The area of triangle = %f \n", area);
 return 0;
}

Một chương trình C bao gồm rất nhiều module, được gọi là các hàm (function). Một hàm bắt buộc phải có trong chương trình C là main . Các vấn đề về hàm sẽ được đề cập sau.
Trong chương trình này gồm 2 thành phần: chỉ thị tiền xử lý và hàm main. Trong hàm main là tập hợp các câu lệnh và phép toán. Chỉ thị tiền xử lý ( preprocessor) là các lệnh được thực thi trước khi mã nguồn được dịch, nhờ đó, ta có thể thay đổi mã nguồn một cách tự động. Công dụng của preprocessor bao gồm:

  • Gọi các thư viện chuẩn, các file header, ...
  • Định nghĩa các macro
  • Dịch có điều kiện. Ví dụ: Đối với HĐH Linux hệ thống sẽ compile source cách này, nhưng với Win thì lại khác.
  • Định nghĩa lỗi do người dùng xác định
Bàn luận một chút về hàm main . Như đã biết, hoặc giả nếu chưa biết thì bây giờ biết, một hàm trong C thường có cấu trúc sau:
[Kiểu trả về] < tên hàm >([Các đối số])
Dường như với mọi hàm, thì kiểu trả về và tên hàm là các thông số bắt buộc ( các đối số có thể có hoặc không). Tuy nhiên với C, thì hàm main không nhất thiết phải có giá trị trả về. Thực tế, trong C, ta có thể khai báo hàm main theo 4 cách phổ biến sau:

  • void main()
  • int main()
  • void main(int argc, char** argv)
  • int main(int argc, char** argv)
Các được khuyến khích nhất là int main( int argc, char** argv) . Còn vì sao được khuyến khích thì sẽ được chém sau.
Trong một chương trình, thì hàm main chỉ được gọi một và chỉ một lần .
Trong hầu hết các tài liệu thì main là một hàm không thể thiếu. Vậy có khi nào trong chương trình của C không có main? Câu trả lời là có. Đối với các môi trường freestanding ( freestanding environment) thì không bắt buộc phải có main. Khác với freestanding environment, hosted environment yêu cầu phải có hàm main .
Vậy hosted và freestanding environment là cái gì gì? Nó có ăn được không?
Trả lời:

  • Hosted environment là một môi trường không chỉ hỗ trợ đầy đủ cho ngôn ngữ lập trình ( cụ thể ở đây là C), mà còn cung cấp các thư viện chuẩn ( STL - Standard Template Library). Ví dụ: Hệ điều hành Windows, Linux.
  • Freestanding environment là môi trường chỉ đơn thuần hỗ trợ C về ngôn ngữ và trình dịch mà không có các thư viện chuẩn. Ví dụ: Các hệ thống nhúng, di động ...
Hàm printf có chức năng hiển thị ra thiết bị xuất chuẩn ( stdout), ở đây là màn hình, dòng chữ Height: Base: . Hàm scanf có chức năng truyền dữ liệu đầu vào chuẩn ( stdin) theo format định sẵn vào các biến height và base. Các hàm này khá giống hàm Writeln, Readln trong Pascal. Những hàm này cũng rất thú vị, tuy nhiên có lẽ sẽ được đề cập trong I/O stream và các vấn đề xung quanh .