Lập trình căn bản - Phần 2: Giới thiệu về một ngôn ngữ lập trình - Ngôn ngữ lập trình C - Chương 1 và 2

C là ngôn ngữlập trình cấp cao, được sửdụng rất phổbiến đểlập trình hệthống

cùng với Assembler vàphát triển các ứng dụng.

Vào những năm cuối thập kỷ60 đầu thập kỷ70 của thếkỷXX, DennishRitchie

(làm việc tại phòng thí nghiệm Bell) đã phát triển ngôn ngữlập trình C dựa trên ngôn

ngữBCPL (do Martin Richards đưa ra vào năm 1967) và ngôn ngữB (do Ken

Thompson phát triển từngôn ngữBCPL vào năm 1970 khi viết hệ điều hành UNIX

đầu tiên trên máy PDP-7) và được cài đặt lần đầu tiên trên hệ điều hành UNIX của

máy DEC PDP-11.

Năm 1978, Dennish Ritchie và B.W Kernighan đã cho xuất bản quyển “Ngôn

ngữlập trình C” và được phổbiến rộng rãi đến nay.

Lúc ban đầu, C được thiết kếnhằm lập trình trong môi trường của hệ điều hành

Unixnhằm mục đích hỗtrợcho các công việc lập trình phức tạp. Nhưng vềsau, với

những nhu cầu phát triển ngàymột tăng của côngviệc lập trình, C đã vượt qua khuôn

khổcủa phòng thí nghiệmBell và nhanh chóng hội nhập vào thếgiới lập trình đểrồi

các công ty lập trình sửdụng một cách rộng rãi. Sau đó, các công ty sản xuất phần

mềm lần lượt đưa ra các phiên bản hỗtrợcho việc lập trình bằng ngôn ngữC và chuẩn

ANSI C cũng được khai sinh từ đó.

pdf26 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 1674 | Lượt tải: 2download
Tóm tắt nội dung Lập trình căn bản - Phần 2: Giới thiệu về một ngôn ngữ lập trình - Ngôn ngữ lập trình C - Chương 1 và 2, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
ểu phức tạp khác. 
Toán tử Ý nghĩa 
& AND 
| OR 
^ XOR 
~ NOT 
>> Dịch phải 
<< Dịch trái 
 Bảng chân trị của toán tử ^ (XOR) 
 p q p^q 
0 0 0 
0 1 1 
1 0 1 
1 1 0 
VI.2.4 Toán tử ? cùng với : 
 C có một toán tử rất mạnh và thích hợp để thay thế cho các câu lệnh của If-
Then-Else. Cú pháp của việc sử dụng toán tử ? là: 
 E1 ? E2 : E3 
 Trong đó E1, E2, E3 là các biểu thức. 
 Ý nghĩa: Trước tiên E1 được ước lượng, nếu đúng E2 được ước lượng và nó trở 
thành giá trị của biểu thức; nếu E1 sai, E2 được ước lượng và trở thành giá trị của biểu 
thức. 
 Ví dụ: 
 X = 10 
 Y = X > 9 ? 100 : 200 
Trang 31 
Lập trình căn bản 
 Thì Y được gán giá trị 100, nếu X nhỏ hơn 9 thì Y sẽ nhận giá trị là 200. 
Đoạn mã này tương đương cấu trúc if như sau: 
 X = 10 
 if (X < 9) Y = 100 
 else Y = 200 
VII.2.5 Toán tử con trỏ & và * 
 Một con trỏ là địa chỉ trong bộ nhớ của một biến. Một biến con trỏ là một biến 
được khai báo riêng để chứa một con trỏ đến một đối tượng của kiểu đã chỉ ra nó. 
Ta sẽ tìm hiểu kỹ hơn về con trỏ trong chương về con trỏ. Ở đây, chúng ta sẽ đề 
cập ngắn gọn đến hai toán tử được sử dụng để thao tác với các con trỏ. 
 Toán tử thứ nhất là &, là một toán tử quy ước trả về địa chỉ bộ nhớ của hệ số 
của nó. 
 Ví dụ: m = &count 
 Đặt vào biến m địa chỉ bộ nhớ của biến count. 
 Chẳng hạn, biến count ở vị trí bộ nhớ 2000, giả sử count có giá trị là 
100. Sau câu lệnh trên m sẽ nhận giá trị 2000. 
 Toán tử thứ hai là *, là một bổ sung cho &; đây là một toán tử quy ước trả về 
giá trị của biến được cấp phát tại địa chỉ theo sau đó. 
 Ví dụ: q = *m 
 Sẽ đặt giá trị của count vào q. Bây giờ q sẽ có giá trị là 100 vì 100 được 
lưu trữ tại địa chỉ 2000. 
VI.2.6 Toán tử dấu phẩy , 
 Toán tử dấu , được sử dụng để kết hợp các biểu thức lại với nhau. Bên trái của 
toán tử dấu , luôn được xem là kiểu void. Điều đó có nghĩa là biểu thức bên phải 
trở thành giá trị của tổng các biểu thức được phân cách bởi dấu phẩy. 
 Ví dụ: x = (y=3,y+1); 
 Trước hết gán 3 cho y rồi gán 4 cho x. Cặp dấu ngoặc đơn là cần thiết vì 
toán tử dấu , có độ ưu tiên thấp hơn toán tử gán. 
VI.2.7 Xem các dấu ngoặc đơn và cặp dấu ngoặc vuông là toán tử 
 Trong C, cặp dấu ngoặc đơn là toán tử để tăng độ ưu tiên của các biểu thức bên 
trong nó. 
 Các cặp dấu ngoặc vuông thực hiện thao tác truy xuất phần tử trong mảng. 
VI.2.8 Tổng kết về độ ưu tiên 
Cao nhất () [] 
 ! ~ ++ -- (Kiểu) * & 
 * / % 
 + - 
 > 
 >= 
 & 
 ^ 
Trang 32 
Lập trình căn bản 
 | 
 && 
 || 
 ?: 
 = += -= *= /= 
Thấp nhất , 
VI.2.9 Cách viết tắt trong C 
 Có nhiều phép gán khác nhau, đôi khi ta có thể sử dụng viết tắt trong C nữa. 
Chẳng hạn: 
 x = x + 10 được viết thành x +=10 
 Toán tử += báo cho chương trình dịch biết để tăng giá trị của x lên 10. 
 Cách viết này làm việc trên tất cả các toán tử nhị phân (phép toán hai ngôi) của 
C. Tổng quát: 
 (Biến) = (Biến) (Toán tử) (Biểu thức) 
 có thể được viết: 
 (Biến) (Toán tử)= (Biểu thức) 
VII. CẤu trúc củaA một chương trình C 
VII.1. Tiền xử lý và biên dịch 
Trong C, việc dịch (translation) một tập tin nguồn được tiến hành trên hai bước 
hoàn toàn độc lập với nhau: 
- Tiền xử lý. 
- Biên dịch. 
Hai bước này trong phần lớn thời gian được nối tiếp với nhau một cách tự động 
theo cách thức mà ta có ấn tượng rằng nó đã được thực hiện như là một xử lý duy nhất. 
Nói chung, ta thường nói đến việc tồn tại của một bộ tiền xử lý (preprocessor?) nhằm 
chỉ rõ chương trình thực hiện việc xử lý trước. Ngược lại, các thuật ngữ trình biên dịch 
hay sự biên dịch vẫn còn nhập nhằng bởi vì nó chỉ ra khi thì toàn bộ hai giai đoạn, khi 
thì lại là giai đoạn thứ hai. 
Bước tiền xử lý tương ứng với việc cập nhật trong văn bản của chương trình 
nguồn, chủ yếu dựa trên việc diễn giải các mã lệnh rất đặc biệt gọi là các chỉ thị dẫn 
hướng của bộ tiền xử lý (destination directive of preprocessor); các chỉ thị này được 
nhận biết bởi chúng bắt đầu bằng ký hiệu (symbol) #. 
Hai chỉ thị quan trọng nhất là: 
- Chỉ thị sự gộp vào của các tập tin nguồn khác: #include 
- Chỉ thị việc định nghĩa các macros hoặc ký hiệu: #define 
Chỉ thị đầu tiên được sử dụng trước hết là nhằm gộp vào nội dung của các tập 
tin cần có (header file), không thể thiếu trong việc sử dụng một cách tốt nhất các hàm 
của thư viện chuẩn, phổ biến nhất là: 
#include 
Trang 33 
Lập trình căn bản 
Chỉ thị thứ hai rất hay được sử dụng trong các tập tin thư viện (header file) đã 
được định nghĩa trước đó và thường được khai thác bởi các lập trình viên trong việc 
định nghĩa các ký hiệu như là: 
#define NB_COUPS_MAX 100 
#define SIZE 25 
VII.2 Cấu trúc một chương trình C 
Một chương trình C bao gồm các phần như: Các chỉ thị tiền xử lý, khai báo biến 
n
L
 goài, các hàm tự tạo, chương trình chính (hàm main). 
Cấu trúc có thể như sau: 
Các chỉ thị tiền xử lý (Preprocessor directives) 
#include 
#define …. Định nghĩa kiểu dữ liệu (phần này không bắt buộc): dùng để đặt tên lại cho một kiểu 
dữ liệu nào đó để gợi nhớ hay đặt 1 kiểu dữ liệu cho riêng mình dựa trên các kiểu dữ 
liệu đã có. 
Cú pháp: typedef 
 Ví dụ: typedef int SoNguyen; // Kiểu SoNguyen là kiểu int 
Khai báo các prototype (tên hàm, các tham số, kiểu kết quả trả về,… của các hàm sẽ 
cài đặt trong phần sau, phần này không bắt buộc): phần này chỉ là các khai báo đầu 
hàm, không phải là phần định nghĩa hàm. 
Khai báo các biến ngoài (các biến toàn cục) phần này không bắt buộc: phần này khai 
báo các biến toàn cục được sử dụng trong cả chương trình. 
Chương trình chính phần này bắt buộc phải có 
 main() 
{ 
 Các khai báo cục bộ trong hàm main: Các khai báo này chỉ tồn tại trong hàm 
mà thôi, có thể là khai báo biến hay khai báo kiểu. 
 Các câu lệnh dùng để định nghĩa hàm main 
 return ; // Hàm phải trả về kết quả 
} 
ưu ý: Một số tập tin header thường dùng: 
Trang 34 
Cài đặt các hàm 
 function1( các tham số) 
{ 
 Các khai báo cục bộ trong hàm. 
 Các câu lệnh dùng để định nghĩa hàm 
 return ; 
} 
… 
Lập trình căn bản 
 Một chương trình C bắt đầu thực thi từ hàm main (thông thường là từ câu lệnh đầu 
tiên đến câu lệnh cuối cùng). 
VII.3 Các tập tin thư viện thông dụng 
Đây là các tập tin chứa các hàm thông dụng khi lập trinh C, muốn sử dụng các 
hàm trong các tập tin header này thì phải khai báo #include ở phần đầu 
của chương trình 
1) stdio.h: Tập tin định nghĩa các hàm vào/ra chuẩn (standard input/output). 
Gồm các hàm in dữ liệu (printf()), nhập giá trị cho biến (scanf()), nhận ký tự từ bàn 
phím (getc()), in ký tự ra màn hình (putc()), nhận một dãy ký tự từ bàm phím (gets()), 
in chuỗi ký tự ra màn hình (puts()), xóa vùng đệm bàn phím (fflush()), fopen(), 
fclose(), fread(), fwrite(), getchar(), putchar(), getw(), putw()… 
2) conio.h : Tập tin định nghĩa các hàm vào ra trong chế độ DOS (DOS 
console). Gồm các hàm clrscr(), getch(), getche(), getpass(), cgets(), cputs(), putch(), 
clreol(),… 
3) math.h: Tập tin định nghĩa các hàm tính toán gồm các hàm abs(), sqrt(), 
log(). log10(), sin(), cos(), tan(), acos(), asin(), atan(), pow(), exp(),… 
4) alloc.h: Tập tin định nghĩa các hàm liên quan đến việc quản lý bộ nhớ. Gồm 
các hàm calloc(), realloc(), malloc(), free(), farmalloc(), farcalloc(), farfree(), … 
5) io.h: Tập tin định nghĩa các hàm vào ra cấp thấp. Gồm các hàm open(), 
_open(), read(), _read(), close(), _close(), creat(), _creat(), creatnew(), eof(), 
filelength(), lock(),… 
6) graphics.h: Tập tin định nghĩacác hàm liên quan đến đồ họa. Gồm 
initgraph(), line(), circle(), putpixel(), getpixel(), setcolor(), … 
Còn nhiều tập tin khác nữa. 
VII.4 Cú pháp khai báo các phần bên trong môt chương trình C 
VII.4.1. Chỉ thị #include để sử dụng tập tin thư viện 
Cú pháp: 
#include // Tên tập tin được đạt trong dấu 
hay #include “Tên đường dẫn” 
Menu Option của Turbo C có mục INCLUDE DIRECTORIES, mục này dùng 
để chỉ định các tập tin thư viện được lưu trữ trong thư mục nào. 
Nếu ta dùng #include thì Turbo C sẽ tìm tập tin thư viện trong thư 
mục đã được xác định trong INCLUDE DIRECTORIES. 
Ví dụ: include 
Nếu ta dùng #include”Tên đường dẫn” thì ta phải chỉ rõ tên ở đâu, tên thư mục 
và tập tin thư viện. 
Ví dụ: #include”C:\\TC\\math.h” 
 Trong trường hợp tập tin thư viện nằm trong thư mục hiện hành thì ta chỉ 
cần đưa tên tập tin thư viện. Ví dụ: #include”math.h”. 
Ví dụ: 
Trang 35 
Lập trình căn bản 
#include 
#include 
#include “math.h” 
VII.4.2. Chỉ thị #define để định nghĩa hằng số 
Cú pháp: 
#define 
Ví dụ: 
#define MAXINT 32767 
VII.4.3. Khai báo các prototype của hàm 
Cú pháp: 
 Tên hàm (danh sách đối số) 
Ví dụ: 
long giaithua( int n); //Hàm tính giai thừa của số nguyên n 
double x_mu_y(float x, float y); /*Hàm tính x mũ y*/ 
VII.4.4. Cấu trúc của hàm “bình thường” 
Cú pháp: 
 Tên hàm (các đối số) 
{ 
 Các khai báo và các câu lệnh định nghĩa hàm 
 return kết quả; 
} 
Ví dụ: 
int tong(int x, int y) /*Hàm tính tổng 2 số nguyên*/ 
{ 
 return (x+y); 
} 
float tong(float x, float y) /*Hàm tính tổng 2 số thực*/ 
{ 
 return (x+y); 
} 
VII.4.5. Cấu trúc của hàm main 
Hàm main chính là chương trình chính, gồm các lệnh xử lý, các lời gọi các hàm 
khác. 
Cú pháp: 
 main( đối số) 
{ 
 Các khai báo và các câu lệnh định nghĩa hàm 
return ; 
} 
Ví dụ 1: 
int main() 
{ 
 printf(“Day la chuong trinh chinh”); 
 getch(); 
Trang 36 
Lập trình căn bản 
 return 0; 
} 
Ví dụ 2: 
int main() 
{ 
 int a=5, b=6,c; 
 float x=3.5, y=4.5,z; 
printf(“Day la chuong trinh chinh”); 
c=tong(a,b); 
printf(“\n Tong cua %d va %d la %d”,a,b,c); 
z=tong(x,y); 
printf(“\n Tong cua %f và %f là %f”, x,y,z); 
 getch(); 
 return 0; 
} 
VIII. BÀI TẬP 
Bài 1: Biểu diễn các hằng số nguyên 2 byte sau đây dưới dạng số nhị phân, bát phân, 
thập lục phân 
a)12 b) 255 c) 31000 d) 32767 e) -32768 
Bài 2: Biểu diễn các hằng ký tự sau đây dưới dạng số nhị phân, bát phân. 
a) ‘A’ b) ’a’ c) ‘Z’ d) ’z’ 
Trang 37 

File đính kèm:

  • pdfPhan2Chuong1_2.pdf
Tài liệu liên quan