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ừ đó.
ể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:
Phan2Chuong1_2.pdf

