Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Ken Thompson và Dennis Ritchie để dùng trong hệ điều hành UNIX. Từ đó, ngôn ngữ này đã lan rộng ra nhiều hệ điều hành khác và trở thành một những ngôn ngữ phổ dụng nhất.
Trang 1CHƯƠNG 1:
Trong chương này trình bày:
# Liệt kê các bước giải quyết vấn đề
# Thuật toán
# Vẽ lưu đồ
# Ký hiệu sử dụng trong lưu đồ
# Biến
# Kiểu dữ liệu
# Kiểm tra chương trình bằng cách chạy thô
# Cấu trúc một chương trình C
1.1 Giới thiệu:
Máy tính được dùng để giải quyết vấn đề và thực hiện các phép tính Tuy nhiên ,để thực hiện được điều này ,chúng ta phải cung cấp giải pháp dưới các câu lệnh cần thiết để giải quyết vấn đề cụ thể.Nói cách khác,chúng ta phải cung cấp cho máy tính dãy lệnh để giải quyết bài toán Dãy lệnh này đượcgọi là chương trình Khi viết một chương trình để giải quyết vấn đề cụ thể,thì chương trình có thể được sử dụng đề giải quyết vấn đề tương tự
VD:viết chương trình tính điểm cho 100 sinh viên trong một lớp ,thì chương thình này cũng có thể sử dụng để tính điểm cho 100 sinh viên khác
1.2 Phương pháp giải quyết vấn đề:
Giải quyết vấn đề là một quá trình phức tạp đòi hỏi phải suy nghĩ ,lên kế hoạch ,lập luận chính xác ,kiên trì và chú ý tới từng chi tiết
Máy tính không thể tự giải quyết được vấn đề nếu lập trình viên không cung cấp giải pháp Giải pháp này được gọi là thuật toán(algorithm)
Các bước giải quyết vấn đề:
1 Nghiên cứu chi tiết vấn đề
2 Tập hợp các thông tin thích hợp
3 Xử lý các thông tin
Trang 24 Đi đến kết quả.
VD 1:để kiểm tra một số chẵn hay lẻ ,cần thực hiện các bước sau:
* đọc vào một số
* chia số đó cho 2
* nếu phần dư là 0 thì đó là số chẵn
* ngược lại đó là số lẻ
Với các bước theo thứ tự trên ,chúng ta tiến hành biểu diễn chúng thành các lệnh bằng một ngôn ngữ lập trình cụ thể
1.3 Thuật toán(Algorithm): thuật toán là bước đầu tiên để giải quyết vấn đề
Thuật toán là gì?
Thuật toán là các bước súc tích và hợp logic cần thiết để giải quyết một vấn đề
Ở ví dụ 1 ,danh sách các bước để kiểm tra một số là chẵn hay lẻ chính là thuật toán
VD 2: một hành khách đi xe lửa từ Oxford đến London :
Các bước cần thực hiện :
# thông tin về hành khách Ngày đăng kí chỗ ,nơi xuất phát ,nơi đến
# người bán vé ghi nhận các thông tin về khách hàng,kiểm tra chỗ còn trống
# nếu còn đủ thì cho đặt vé,ngược lại sẽ đưa vé chờ
# vé chờ sẽ thành vé chính thức nếu có hành khách khác hủy vé
# nếu không nhận được trả lời thì hành khách này không đặt được vé chính thức
Phân tích như trên sẽ dễ dàng cho việc lập trình
1.4 Lưu đồ (flowchart):là công cụ dùng để mô tả thuật toán
Lưu đồ là gì?
Lưu đồ là một biểu đồ minh họa cho dãy các thao tác cần tiến hành để giải quyết một vấn đề
Các câu lệnh được mô tả bằng các kí hiệu cụ thể Các kí hiệu này được nối với nhau bằng mũi tên để chỉ rõ thứ tự thực hiện
Lưu đồ là công cụ dễ sử dụng để viết chương trình và để phục vụ cho các mục đích sau:
# Mô tả trực quan dễ hiểu hơn mô tả bằng tường thuật
# Dựa vào lưu đồ ta có thể xem lại và gỡ rối chương trình một cách dễ dàng
# Cung cấp tài liệu chương trình
# Nhờ vẽ lưu đồ ,dễ dàng hiểu được chương trình hoặc thảo luận giải pháp
Trang 31.5 Rẽ nhánh (branching):
Rẽ nhánh là một quá trình chọn ra một trong hai hay nhiều con đường cho việc thực hiện tính toán sau đó
Lặp là việc sử dụng nhiều lần một hoặc nhiều bước
Có hai loại vòng lặp:cố định và thay đổi
Vòng lặp cố định nếu các thao tác được lặp lại với một số lần cố định
Vòng lặp thay đổi nếu các thao tác được lặp lại nhiều lần cho tới khi thoã mãn điều kiện.Số lần lặp có thể thay đổi
1.7 Kết nối (connector) :
Một lưu đồ phức tạp thường :có thể không vừa trên một trang giấy ,có thể khó nối liền nhau trực tiếp Trong các trường hợp này ,lưu đồ có thể được chia cắt thành nhiều phần và chúng ta sẽ kết hợp chúng lại với nhau bằng các điểm kết nối
Một điểm kết nối được đánh số (số duy nhất cho một trang),một mũi tên vẽ điểm đến nối tại vị trí chia cắt của biểu đồ Một kết nối khác có số tương tự (trên trang khác ) và mũi tên đi ra được vẽ từ nơi biểu đồ được chia cắt ,thể hiện sự nối liền với phần kia của biểu đồ
1.8 Hướng dẫn vẽ lưu đồ:
Cần ghi nhớ các điểm sau đây khi vẽ lưu đồ:
# Lúc đầu tập trung vào các logic tổng quát của bài toán và vẽ các đường chính của lưu đồ
# Sau khi đã hoàn tất các đường chính ,vẽ thêm các đường phụ ,nhánh va vòng lặp
# Một lưu đồ chỉ có duy nhất một điểm bắt đầu và một điểm kết thúc
# Để cho lưu đồ có tính độc lập với chương trình ,càng ít các thuật ngữ liên quan tới máy tính càng tốt
# Không cần thiết phải mô tả từng bước của bài toán trong lưu đồ Chỉ mô tả các bước có ý nghĩa # Sử dụng các thuật ngữ mô tả thích hợp để trình logic của vấn đề Không dùng các thuật ngữ mơ hồ,khó hiểu
# Người sử dụng hoặc lập trình viên khác phải hiểu được lưu đồ này
Trang 4# Vị trí cấp phát cho từng dữ liệu phải được ghi nhận.
Chương trình có thể sử dụng nhiều vị trí bộ nhớ được đại diện bời các tên biến
1.9.1 Các quy tắc đặt tên biến:
Ở mỗi ngôn ngữ lập trình có cách đặt tên biến khác nhau Có vài quy ước đặt tên biến sau:
# Tên biến phải bắt đầu bằng một chữ cái
# Ký tự theo sau có thể là chữ hay số và cũng có thể là các ký tự đặt biệt
# Tránh sử dụng mẫu tự o (chữ o) vì dễ nhầm với số 0 (số không),hay chữ i dể nhầm với số 1 # Tên biến phân biệt chữ hoa ,chữ thường
# Tên biến phải mô tả được ý nghĩa nó lưu trữ
1.9.2 Biến đếm (counter variable):
Biến được sử dụng thường xuyên khi viết chương trình liên quan tới vòng lặp gọi là biến đếm.Biến đếm dùng để theo dõi số lần thực hiện vòng lặp.Nó được khởi tạo bằng giá trị 0,và tăng dần lên sau đó Biến này thường đặt tên là cnt
1.10 Giới thiệu các kiểu dữ liệu:
Kiểu dữ liệu là gì?
Các loại dữ liệu khác nhau được lưu trữ trong các biến :numbers (123456,số âm,số
dương ),names(Jones) ,các giá trị logic(yes,no).Dữ liệu được lưu trữ tronh các biến có các kiểu khác nhau và do đó chúng cần dung lượng bộ nhớ khác nhau Kiểu dữ liệu quyết định dung lượng bộ nhớ được cấp để biến lưu trữ kiểu dữ liệu cụ thể.Để chỉ định vùng nhớ cho từng loại dữ liệu chúng ta phải :khai báo biến thuộc một kiểu dữ liệu cụ thể
Thuật ngữ khai báo biến có nghĩa là một vùng nhớ được cấp và được tham chiếu bằng tên biến.Dạng tổng quát để khai báo biến là:data type (tên biến),Numeric:chứa các giá trị
số;Alphanumeric:chứa các thông tin mô tả
1.10.3 Kiểu char:
Kiểu char được dùng để chứa một ký tự
1.10.4 Kiểu double:
Trang 5Kiểu double được sử dụng khi cần lưu trữ dữ liệu có độ chính xác cao hơn mà kiểu float không đáp ứng được.
1.10.5 Kiểu dữ liệu cơ bản và kiểu dẫn xuất:
Bốn kiểu dữ liệu trên được dùng để biễu diễn dữ liệu thực sự trong bộ nhớ máy tính Các kiểu dữ liệu này có thể được thay đổi cho phù hợp với các tình huống biễu diễn khác nhau Kiểu dữ liệu có
được do sự thay đổi trên một kiểu cơ bản gọi là kiểu dẫn xuất (derived data type)
Một số từ bổ nghĩa (modifier)được sử dụng để thay đổi kiểu dữ liệu cơ bản gồm:unsigned ,long, short1.01.6 Kiểu unsigned:
unsigned cho biết biến chỉ chứa được số dương,unsigned có thể được sử dụng với kiểu dự liệu int và float Sử dụng int với unsigned ,miền số dương có thể gấp đôi
1.10.7 Kiểu long và short:
Từ long và short được sử dụng khi chiều dài của số nguyên dài hơn hoặc ngắn hơn chiều dài
chuẩn.Long integer được kí hiệu là long int và short integer là short int
Bảng liệt kê miền giá trị của biến
1.10.8 Từ khóa(keyword):
Mặc dù chúng ta có thể đặt tên bất kỳ,nhưng có một số tên được dành riêng cho mục đích riêng biệt và các lập trình viên không được sử dụng Tất cả các kiểu dữ liệu chúng ta biết được xem như các từ khoá.Sẽ không xảy ra vấn đề gì nếu từ khoá và tên biến phân biệt được
1.11 Chạy thử chương trình:
Chạy thử chương trình là phương pháp thử bằng tay để kiểm tra tính đúng đắn của thuật toán
Trang 61.12 Một chương trình C mẫu:
Một chương trình C gồm:
Void main():dòng này cho biết bắt đầu chương trình mà mỗi chương trình C phải có
Dấu mở ngoặc móc {}phần giữa hai ngoặc móc là các lệnh của chương trình Các lệnh này tạo thành phần thân cho chương trình
Các câu lệnh đầu tiên trong chương trình là các câu lênh khai báo biến Tất cảcác lệnh phải được khai báo trứơc khi sử dụng trong chương trình Khai báo biến chỉ rõ cho chương trình sử dụng các biến như thế nào
Các câu lệnh nằm dưới phần khai báo biến chỉ ra các thao tác cần thực thi bởi chương trình Các câu lệnh trong lập trình C phải được kết thúc bằng dấu chấm phẩy ;
CHƯƠNG 2:
Trong chương này sẽ trình bày:
# Các kiểu dữ liệu
# Sự khác nhau giữa các kiểu dữ liệu
# Các toán tử
2.1
Dữ liệu kiểu số :
Dữ liệu kiểu số biểu diễn mọi loại số Các số có thể là số nguyên hay số thực Dữ liệu kiểu số có thể chứa :
* Các số từ 0 đến 9
* Dấu thập phân
Kiểu dữ liệu int ,float,double được trình bày ở chương 1 là các kiểu dữ liệu số
Trang 7Có thể thực hiện các phép toán số học trên dữ liệu kiểu số
2.2
Các kiểu dữ liệu số quan trọng:
Không chứa số âm,số thập phân
không chứa số thập phân
Long chứa các số từ-2,147,483,648tới2,147,483,648
Không chứa số thực
-3.402823E38tới -1.401298E-451.401298E-45 tới 3.402823E38cho số dương2.3
Dữ liệu kiểu ký tự:
Dữ liệu ký tự có thể chứa bất kỳ ký tự nào :
* Chữ số từ 0 đến 9
* Chữ cái từ A đến Z, a đến z
*Các ký tự đặt biệt:#,$,&
Kiểu này dùng để mô tả các dữ liệu như tên ,địa chỉ, Dữ liệu kiểu ký tự được đặt trong dấu nháy Ta có “1234”được xem như dữ liệu kiểu ký tự chứ không phải là dữ liệu số Nếu là dữ liệu số ,thì nó không có dấu nháy “”.Các phép tính số học không thể thực hiện trên loại dữ liệu ký tự này
Kiểu char được nhận biết bởi một ký tự chứa trong dấu nháy đơn ‘ ’.Ngoài ra kiểu char còn có thể
chứa các ký tự như là chuỗi ký tự Chuỗi ký tự có thể chứa một ký tư và luôn được chứa trong cặp dấu nháy đôi “”
Đa số các ngôn ngữ lập trình quy định kich thước cực đại cho chuỗi Giới hạn này thay đổi với các ngôn ngữ ,có thể từ 1024 byte đến 2 triệu byte
2.4
Ngày và giờ:
Các giá trị về ngày và giờ có các kiểu dữ liệu cho riêng chúng Kiểu này cần thiết vì ngày tháng gồm : *Ngày (day)
*Tháng (month)
*Năm (year)
Các giá trị về giờ gồm :
Trang 8* Giờ (hour)
* Phút(minute)
* Giây(second)
Đây là kiểu dữ liệu đặt biệt dành cho các giá trị ngày tháng :
Date trong vài ngôn ngữ lập trình ,kiểu dữ liệu này có thể chứa cả các giá trị ngày giờ ,trong khi các ngôn ngữ khác chỉ chứa ngày tháng
Time chứa giá trị thời gian
Không có quy tắc chung về biến kiểu này.Nó tuỳ thuộc vào từng ngôn ngữ
2.5
Dữ liệu logic:
Dữ liệu logic chỉ có hai giá trị:true (đúng) và false (sai)
Con số đại diện cho false là 0 ,các số khác không (cả số âm)được hiểu là true
2.6
Các kiểu dữ liệu đặt biệt:
Một số ngôn ngữ lâïp trình hỗ trợ các kiểu dữ liệu đặt biệt như:số liệu văn bản ,âm thanh phim ảnh.Các dữ liệu này không xử lý được bằng các kiểu dữ liệu cơ bản nói trên ,cần có kiểu dữ liệu đặt biệt Mọi ngôn ngữ đều cung cấp loại dữ liệu đặt biệt Các loại này có ten khác nhau
Toán tử là các ký hiệu tác động lên dữ liệu.
Chúng đại diện cho các phép toán cụ thể được thực hiện trên dữ liệu.Dựa vào bản chất phép ,các toán tử được phân loại như sau:
*Toán tử số học:
Trang 9#Nhỏ hơn
#Lớn hơn hoặc bằng
#Nhỏ hơn hoặc bằng
# Câu lệnh if else
# Câu lệnh if lồng nhau
# Câu lệnh do case
# Vòng lặp while
# Vòng lặp for
# Vòng lặp repeat until
3.1
Các câu lệnh điều kiện:
Câu lệnh điều kiện là gì ?
Câu lệnh điều kiện cho phép chúng ta thay đổi luồng thực thi của chuổi lệnh tronh chương
trình.Dựa vào điều kiện, câu lệnh hoặc một dãy các câu lệnh sẽ được quyết địh thực thi hay không.Phần lớn các nôn ngữ lập trình sử dụng lệnh if để ra quyết định Một trong những khái niệm cơ bản của khoa học máy tính là :nếu một điều kiện nào đó là đúng thì nó sẽ thực hiện câu lệnh nhất định ,còn nếu điều kiện sai ,thì nó sẽ thực hiện một câu lệnh khác
3.2
Câu lệnh if:
Câu lệnh if cho phép ra quyết định nhờ đánh giá một điều kiện là đúng hoặc sai Các điều kiện như vậy chứa các toán tử logic và so sánh Mỗi câu lệnh if phải kết thúc bằng câu lệnh endif
Trang 10Dạng đơn giản của câu lệnh if là:
VD if tên là Ben
Hiển thị”tìm thấy Ben”
endif
3.3
Câu lệnh if…else:
Xét lại VD trên Nếu muốn xuất ra mộtcâu thông báo “không tìm thấy Ben”thì ta thêm vào dòng lệnh if khác:
Start
if tên là Ben
Hiển thị “tìm thấy Ben”
endif
if tên không phải là Ben
Hiển thị”không tìm thấy Ben”
endif
End
Chỉ có 1 trong 2 câu lệnh if trên là đúng ,do đó chỉ có một dòng thông báo được hiển thị Tuy nhiên không cần thực hiện hai lần so sánh nếu ta biết chắc rằng chỉ có 1 trong 2 biểu thức là đúng Có thể sửdụng tuỳ chọn của câu lệnh if là mệnh đề else Chức năng này cho phép lập trình viên chỉ viết ra một toán tử so sánh và từ đó thực hiện các bước tương ứng tuỳ thuộc vào kết quả của câu lệnh là đúng hay sai
Dạng tổng quát của câu lệnh if…else là:
Trang 11Nếu kết quả của condition là đúng thì statement 1 được thực hiện ,ngược lại thì statement 2 được thực hiện,nhưng không thể thực hiện cả hai.
Lệnh if…else làm giảm độ phức tạp của chương trình ,làm cho chương trình dễ hiểu hơn
Câu lệnh if mà chúng ta sử dụng là phép so sánh đơn giản Đôi khi chúng cũng được sử dụng để kiểm tra điều kiện
Điều kiện trong câu lệnh if ở trên gồm hai phần tử so sánh được kết hợp bởi toán tử AND Chúng
ta cũng có thể có các điều kiện vô cùng phức tạp với nhiều toán tử phức hợp ,các điều kiện đó kết hợp nhiều toán tử so sánh và logic
Khi sử dụng các điều kiện phức hợp phải chú ý :phải dùng dấu ngoặc đơn để đọc và tránh nhầm lẫn độ ưu tiên của các toán tử
3.4
Câu lệnh if lồng nhau:
Câu lệnh if có thể chứa câu lệnh if…else khác ,nhằm nâng cao tính linh hoạt của ngôn ngữ lập trình Phương pháp này được gọi là lồng các lệnh if Mệnh đề else cũng có thể chứa câu lệnh if else khác
Dạng tổng quát của câu lệnh if lồng nhau là:
Trang 12Việc xác định else thuộc câu lệnh if nào rất quan trọng
Các nguyên tắc cần chú ý:
# Mỗi else thuộc về một lệnh if nào gần nó nhất với điều kiện if đó chưa thuộc về lệnh else khác
#Câu lệnh if lồng nhau trong câu lệnh if khác có thể được viết lại bằng toán tử AND
# Câu lệnh if được lồng trong mệnh đề else có thể được viết lại bằng toán tử OR
3.5
Câu lệnh do case:
Câu lệnh do case được dùng khi một biến được so sánh liên tiếp với các giá trị khác nhau
Dạng tổng quát của do case là :
Trang 13Vòng lặp la ømột khối lệnh được lặp đi lặp lại nhiều lần cho đến khi một điều kiện là đúng hoặc sai.
Các lệnh lặp được hỗ trợ ở một số ngôn ngữ lập trình :
# Vòng lặp while
# Vòng lặp for
# Vòng lặp repeat until
Cú pháp của mỗi vòng lặp ở các ngôn ngữ lập trình có thể khác nhau nhưng chức năng thì giống nhau
3.7
Vòng lặp while:
Vòng lặp while lặp lại một câu lệnh hoặc một chuỗi lệnh nào đó cho đến khi điều kiện không còn đúng.Dạng tổng quát :
while Text expression
do
Statements
Enddo
Vòng lặp while được thực hiện như sau:
Biểu thức được viết sau từ khoá while sẽ được kiểm tra Các câu lệnh được viết giữa từ khoá enddo Nếu biểu thức kiểm tra đúng thì các câu lệnh nằm giữa do-enddo được thực hiện
do-Để tránh trường hợp lặp vô hạn ,cần chú ý:
#Giá trị của biến được sử dụng trong biểu thức phảiđược thiết lập trước khi vòng lặp while thực hiện Đây là bước khởi tạo giá trị Lệnh này chỉ thực hiện một lần trước khi thực hiện vòng lặp
#Thân vòng lặp phải làm thay đổi giá trị của biến trong biểu thức kiểm tra Biến này được gọi là biến tăng (incremented) nếu giá trị trong thân vòng lặp tăng ,và được gọi là biến giảm(decremented) nếu giá trị giảm
3.8
Vòng lặp for:
Vòng lặp for là phiên bản rút gọn của vòng lặp while Ở vòng lặp while ,biến sử dụng trong biểu thức kiểm tra được khởi tạo đầu tiên.Tiếp theo ,biểu thức này được xét và vòng lặp được thực hiện
Thân của vòng lặp được kết thúc bởi lệnh thay đổi giá trịcủa biến được sử dụng trong biểu thức kiểm tra Tất cả các bước này được kết hợp lại thành một câu lệnh duy nhất trong vòng lặp for Vòng lặp for được sử dụng khi biết trứơc số lần lặp thực hiện
VD:
Start
for cnt in range 1 to 10
Trang 14Display “đây là một vòng lặp”
endfor
End
Biến cnt được gán giá trị 1 Kế đó nó kiểm tra nếu cnt nhỏ hơn hoặc bằng 10.Nếu đúng thì các câu lệnh theo sau câu lệnh for sẽ được thực hiện.Vòng lặp for tự động tăng giá trị biến cnt.Khi biến này lớnhơn 10 thì vòng lặp chấm dứt
Dạng tổng quát của vòng lặp for:
for (variable) in range start_value to end_value
Statement
…
endfor
3.8.1 Mệnh đề increment:
Xem lại VD trên ,vòng lặp for tự động tăng giá trị biến cnt.Xem tiếp VD sau:
VD:
Start
for cnt in range 1 to 10 increment 2
Display”Đây là một vòng lặp ”
endfor
End
3.8.2 Các vòng lặp for lồng nhau:
Trang 15Chúng ta có thể có vòng lặp for nằm trong vòng lặp for khác tương tự như câu lệnh if trong câu lệnh
if khác
Dạng tổng quát :
for var 1 in range start_value to end_value
Vòng lặp repeat…until:
Hai câu lệnh lặp được giới thiệu ở phần trên sẽ kiểm tra biểu thức trước khi vòng lặp thực hiện ,Do đó ,thân vòng lặp có thể không bao giờ được thực hiện trước khi điuề kiện không được thoã mãn Khi phát triển chương trình ,có khi chúng ta muốn kiểm tra biểu thức ở cuối vòng lặp Vòng lặp
repeat until sẽ giải quyết vấn đề trên Điều kiện chỉ được kiểm tra sau khi thân vòng lặp thực hiện một lần
Dạng tổng quát:
Chọn vòng lặp thích hợp:
Chọn vòng lặp nào khi viết chương trình là một công việc của mỗi lập trình viên.Bất kỳ vòng lặp nào được viết dưới dạng while cũng được viết dưới dạng for và ngược lại.Vòng lặp repeat…until cũng có thể được viết lại theo cách của hai vòng lặp kia nhưng sẽ có mức độ phức tạp hơn vì vòng lặp repeat…until thực hiện các câu lệnh một lần trước khi kiểm tra điều kiện
CHƯƠNG 4:
Trong chương này trình bày:
# Mảng một chiều