You are on page 1of 338

GIỚI THIỆU MÔN HỌC

Biên Soạn: ThS.Lương Hoài Thương


1
&
VC
BB MỤC TIÊU MÔN HỌC

 Đưa ra được Lưu đồ - Giải thuât.

 Lập trình được các ứng dụng trong điện - điện


tử.

Sử dụng ngôn ngữ C.

Biên Soạn: ThS.Lương Hoài Thương


2
&
VC
BB
MỘT SỐ HÌNH ẢNH

Biên Soạn: ThS.Lương Hoài Thương


3
&
VC
BB MỘT SỐ HÌNH ẢNH

Biên Soạn: ThS.Lương Hoài Thương


4
NỘI DUNG MÔN HỌC
&
VC
BB

CHƯƠNG 1 LƯU ĐỒ GIẢI THUẬT


CHƯƠNG 2 NGÔN NGỮ LẬP TRÌNH C/C++
CHƯƠNG 3 ĐIỀU KHIỂN CHỌN
CHƯƠNG 4 ĐIỀU KHIỂN LẬP
CHƯƠNG 5 MẢNG VÀ CON TRỎ
CHƯƠNG 6 XÂU KÝ TỰ
CHƯƠNG 7 HÀM VÀ CẤU TRÚC CHƯƠNG TRÌNH
CHƯƠNG 8 LÀM VIỆC VỚI FILE
CHƯƠNG 9 LẬP TRÌNH HỆ THỐNG

Biên Soạn: ThS.Lương Hoài Thương


5
TÀI LIỆU THAM KHẢO
&
VC
BB

Lập trình C trong kỹ thuật điện tử - Ngô Duyên Tập, Phạm Huy
Quỳnh – 1999.
Kỹ thuật lập trình C cơ sở và nâng cao – Phạm Văn Ất – 2006.
Bài giảng kỹ thuật lập trình - Học viện kỹ thuật quân sự - Hà Đại
Dương.
Bài giảng kỹ thuật lập trình – Học viện công nghệ bưu chính viễn
thông– Nguyễn Duy Phương.

Biên Soạn: ThS.Lương Hoài Thương


6
&
VC
BB
YÊU CẦU MÔN HOC – PHẦN MỀM HỌC TẬP

 Sinh viên sử dụng được máy vi tính.


Các kiến thức về chuyên ngành:
• Điện tử cơ bản.
• Kỹ thuật xung - số.
Phần mềm:
• Dev C, Turbo C, C free,….
• Protues: Mô phỏng mạch điện.
• Mikro C for 89, pic, avr, amr,…

Biên Soạn: ThS.Lương Hoài Thương


7
&
VC
BB
Thông tin liên hệ

Điện Thoại: 0975.300.667 – 094.666.9203

Email: thuonglh@vlute.edu.vn

Blog: thuonglh.blogtiengviet.net

Chưa học mà
cảm thấy rắc rối
quá ?!?!

Biên Soạn: ThS.Lương Hoài Thương


8
&
VC
BB

10
KỸ THUẬT LẬP TRÌNH

LƯU ĐỒ GIẢI THUẬT

Biên Soạn: ThS.Lương Hoài Thương


11
&
VC
BB
Nội dung

1 Các khái niệm cơ bản

2 Các bước xây dựng chương trình

3 Biểu diễn thuật toán

4 Cài đặt thuật toán bằng NNLT

Biên Soạn: ThS.Lương Hoài Thương


12
Các khái niệm cơ bản
&
VC
BB

Phương pháp tổng quát để giải một bài toán


trên máy tính
Xác định bài toán;
Xác định cấu trúc dữ liệu để mô tả bài toán;
Xây dựng thuật toán;
Soạn thảo văn bản chương trình, kiểm tra và
hoàn thiện chương trình.

Biên Soạn: ThS.Lương Hoài Thương


13
Các khái niệm cơ bản
&
VC
BB

Mọi bài toán đều có thể diễn đạt theo sơ đồ như sau:
A => B
 A là giả thiết, điều kiện ban đầu, thông tin đã cho
 B là kết luận, là mục tiêu cần đạt khi kết thúc bài toán;
 => là suy luận, giải pháp cần xác định để có được kết quả
B từ cái đã có A.
 Xác định bài toán có nghĩa là xác định A, B và nếu có thể
thì xác định luôn cả các bước thực hiện để “đi” được từ A
đến B

Biên Soạn: ThS.Lương Hoài Thương


14
Các khái niệm cơ bản
&
VC
BB

Bài toán trên máy tính


 A gọi là đầu vào (INPUT);
 B gọi là đầu ra (OUTPUT);
 => là CHƯƠNG TRÌNH MÁY TÍNH cho kết quả B với đầu vào
A
Khó khăn sau
Thông tin về A, B thường không rõ ràng, đầy đủ.
(=>) Thường không được nêu ra một cách minh bạch.
Ví dụ 1: Hãy viết chương trình cho phép giải phương trình bậc 2

Biên Soạn: ThS.Lương Hoài Thương


15
&
VC
BB
Các khái niệm cơ bản
Ví dụ 2: Giả sử người A có một số tiền X đem gửi tiết kiện, lãi xuất
tháng là L% hỏi rằng sau T tháng thì A có bao nhiêu tiền biết rằng
cứ 3 tháng thì tiền lãi được cộng vào gốc.
Ví dụ 3: Cho dãy số a1, a2, ..., an hãy sắp xếp dãy trên theo thứ
tự giảm dần.
Ví dụ 4: Hãy xây dựng hệ thống quản lý hồ sơ và kết quả học tập
của sinh viên

A ??? B???

Biên Soạn: ThS.Lương Hoài Thương


16
Các khái niệm cơ bản
&
VC
BB

Lập trình máy tính


 Gọi tắt là lập trình (programming).
 Nghệ thuật cài đặt một hoặc nhiều thuật toán trừu tượng có
liên quan với nhau bằng một ngôn ngữ lập trình để tạo ra
một chương trình máy tính.
Thuật toán
 Là tập hợp hữu hạn các chỉ thị được định nghĩa rõ ràng
nhằm giải quyết một bài toán cụ thể nào đó.

Biên Soạn: ThS.Lương Hoài Thương


17
&
VC
BB
Các tính chất của thuật toán

 Tính chính xác: quá trình tính toán hay các thao tác máy tính
thực hiện là chính xác.
 Tính rõ ràng: các câu lệnh minh bạch được sắp xếp theo thứ
tự nhất định.
 Tính khách quan: được viết bởi nhiều người trên máy tính
nhưng kết quả phải như nhau.
 Tính phổ dụng: có thể áp dụng cho một lớp các bài toán có
đầu vào tương tự nhau.
 Tính kết thúc: hữu hạn các bước tính toán.

Biên Soạn: ThS.Lương Hoài Thương


18
&
VC
BB
LƯU ĐỒ GIẢI THUẬT

Giải thuật là một trình tự thực hiện công việc nào đó.
Lưu đồ là sự biểu diễn đồ hoạ của giải thuật.
Lưu đồ chứa các ký hiệu biểu diễn các bước của giải thuật.
Mỗi ký hiệu biểu diễn một hoạt động.

Biên Soạn: ThS.Lương Hoài Thương


19
&
VC
BB

Ba cấu trúc suy luận cơ bản của giải thuật


 Tuần tự (Sequential): công việc này nối tiếp công việc kia.
 Cấu trúc lựa chọn (Selection) : Lựa chọn một công việc để
thực hiện căn cứ vào một điều kiện nào đó.
 Cấu trúc lặp (Repeating): Thực hiện lặp lại một công việc căn
cứ vào một dk nào đó.

Biên Soạn: ThS.Lương Hoài Thương


20
&
VC
BB
MỘT SỐ KÝ HIỆU THÔNG DỤNG

Bắt đầu/ Kết thúc CT. Đường Đi

Nhập/Xuất. Chương Trình Con

Điều Kiện Rẽ Nhánh.


Điểm Nối Liên Kết

Công Việc

Biên Soạn: ThS.Lương Hoài Thương


21
&
VC
BB
Các bước xây dựng chương trình

Xác định vấn đề Biểu diễn bằng:


- bài toán • Ngôn ngữ tự nhiên
• Lưu đồ - Sơ đồ khối
Lựa chọn • Mã giả
phương pháp giải
Xây dựng
thuật toán/ thuật giải
Cài đặt
chương trình
Lỗi cú pháp Hiệu chỉnh
Lỗi ngữ nghĩa chương trình
Thực hiện
chương trình
Biên Soạn: ThS.Lương Hoài Thương
22
&
VC
BB
Các khái niệm cơ bản

Ví dụ
 Thuật toán giải PT bậc nhất: ax + b = 0
(a, b là các số thực).
Đầu vào: a, b thuộc R
Đầu ra: nghiệm phương trình ax + b = 0
• Nếu a = 0
• b = 0 thì phương trình có nghiệm bất kì.
• b ≠ 0 thì phương trình vô nghiệm.
• Nếu a ≠ 0
• Phương trình có nghiệm duy nhất x = -b/a

Biên Soạn: ThS.Lương Hoài Thương


23
&
VC
BB
Sử dụng ngôn ngữ tự nhiên

Đầuvào: a, b thuộc R
Đầura: nghiệm phương trình ax + b = 0
1.Nhập 2 số thực a và b.
2.Nếu a = 0 thì
2.1. Nếu b = 0 thì
2.1.1. Phương trình vô số nghiệm
2.1.2. Kết thúc thuật toán.
2.2. Ngược lại
2.2.1. Phương trình vô nghiệm.
2.2.2. Kết thúc thuật toán.
3. Ngược lại
3.1. Phương trình có nghiệm.
3.2. Giá trị của nghiệm đó là x = -b/a
3.3. Kết thúc thuật toán.

Biên Soạn: ThS.Lương Hoài Thương


24
&
VC
BB
Sử dụng lưu đồ - sơ đồ khối

Bắt đầu

Đọc a,b

Đ S
a=0
Đ S
Tính
b=0
x = -b/a

Xuất Xuất
Xuất x
“VSN” “VN”

Kết thúc

Biên Soạn: ThS.Lương Hoài Thương


25
&
VC
BB
Sử dụng mã giả

Vay mượn ngôn ngữ nào đó (ví dụ Pascal) để biểu diễn thuật
toán.
Đầu vào: a, b thuộc R
Đầu ra: nghiệm phương trình ax + b = 0
If a = 0 Then
Begin
If b = 0 Then
Xuất “Phương trình vô số nghiệm”
Else
Xuất “Phương trình vô nghiệm”
End
Else
Xuất “Phương trình có nghiệm x = -b/a”

Biên Soạn: ThS.Lương Hoài Thương


26
&
VC
BB
Cài đặt thuật toán bằng C/C++

#include <stdio.h>
#include <conio.h>

void main()
{
int a, b;
printf(“Nhap a, b: ”);
scanf(“%d%d”, &a, &b);
if (a == 0)
if (b == 0)
printf(“Phương trình VSN”);
else
printf(“Phương trình VN”);
else
printf(“x = %.2f”, -float(b)/a);
}
Biên Soạn: ThS.Lương Hoài Thương
27
&
VC
BB
Vẽ lưu đồ giải thuật trong ví dụ sau

a. Giả sử có hai bình A và B đựng hai loại chất lỏng khác


nhau, A chứa dung dịch Da, B chứa dung dịch Db
b. Tìm số lớn nhất của hai số a và b là.
c. Nhập 2 cạnh của hình chữ nhật. Tính chu vi và diện
tích của hình chữ nhật đó.
d. Điều khiển phím ấn S1 thì đèn D1 đổi trạng thái.
e. Điều khiển phím ấn S1 thì 8 led đơn thay đổi trạng thái,
biết có ít nhất 3 hiệu ứng.

Biên Soạn: ThS.Lương Hoài Thương


28
&
VC
BB

Biên Soạn: ThS.Lương Hoài Thương


29
&
VC
BB
Bài tập

1. Thuật toán là gì? Trình bày các tính chất quan trọng của một
thuật toán?
2. Các bước xây dựng chương trình?
3. Các cách biểu diễn thuật toán? Ưu và khuyết điểm của từng
phương pháp?
Cho ví dụ minh họa.

Biên Soạn: ThS.Lương Hoài Thương


30
&
VC
BB
Bài tập

4. Nhập năm sinh của một người. Tính tuổi người đó.
5. Nhập 2 số a và b. Tính tổng, hiệu, tính và thương của hai số đó.
6. Nhập tên sản phẩm, số lượng và đơn giá. Tính tiền và thuế giá
trị gia tăng phải trả, biết:
a. tiền = số lượng * đơn giá
b. thuế giá trị gia tăng = 10% tiền

Biên Soạn: ThS.Lương Hoài Thương


31
&
VC
BB
Bài tập

7. Nhập điểm thi và hệ số 3 môn Toán, Lý, Hóa


của một sinh viên. Tính điểm trung bình của
sinh viên đó.
8. Nhập bán kính của đường tròn. Tính chu vi và
diện tích của hình tròn đó.
9. Nhập vào số xe (gồm 4 chữ số) của bạn. Cho
biết số xe của bạn được mấy nút?
10.Nhập vào 2 số nguyên.
Tính min và max của hai số đó.
11. Giải phương trình Ax2+Bx+C=0.
12. Nhập và xuất n ký tự a từ bàn phím 32
Biên Soạn: ThS.Lương Hoài Thương
KỸ THUẬT LẬP TRÌNH

NGÔN NGỮ LẬP


TRÌNH C/C++

Biên Soạn: ThS.Lương Hoài Thương


33
&
VC
BB
Nội dung
1 Giới thiệu

2 Bộ từ vựng của C

3 Cấu trúc chương trình C

4 Một số ví dụ minh họa

5 Các kiểu dữ liệu cơ sở

6 Biến, Hằng, Câu lệnh & Biểu thức

7 Các lệnh nhập xuất

Biên Soạn: ThS.Lương Hoài Thương


34
Giới thiệu
&
VC
BB

Caïc ngän ngæî láûp trçnh báûc cao:


 Ngän ngæî báûc cao cần: Mäüt trçnh biãn dëch âãø dëch caïc lãûnh cuía
ngän ngæî láûp trçnh báûc cao sang caïc lãûnh åí mæïc tháúp âãø maïy coï thãø
thæûc hiãûn âæåüc.

 Trçnh biãn dëch coï sæû tæång æïng 1-1 giæîa caïc lãûnh cuía håüp ngæî vaì
caïc lãûnh maïy.
 Ngæåüc laûi, mäüt lãûnh âån giaín cuía ngän ngæî báûc cao coï thãø âæa ra
nhiãöu lãûnh maïy.

Biên Soạn: ThS.Lương Hoài Thương


35
&
VC
BB
Giới thiệu

 Taïch mäüt ngän ngæî láûp trçnh xa khoíi ngän ngæî maïy ráút khoï khàn.
 Ngän ngæî báûc cao caìng taïch xa cáúu truïc maïy tênh mang âãún cho ta
hai âiãöu thuáûn låüi:
 Caïc ngän ngæî báûc cao taïch láûp trçnh viãn khoíi caïc âàûc tênh cuû thãø cuía
mäùi cáúu truïc maïy tênh.
 Caïc chæång trçnh viãút bàòng ngän ngæî báûc cao thç dãù âoüc vaì dãù baío trç.

Biên Soạn: ThS.Lương Hoài Thương


36
&
VC
BB
Giới thiệu

 Vê duû:
Chæång trçnh ngän ngæî báûc cao:
a=b+c-2
Chæång trçnh viãút bàòng håüp ngæî:
LW R1, b ASSEMBLY:
LW R2, c MOV AX, b
ADD R3, R1, R2 MOV BX, c
LW R4, 2 ADD AX, BX
SUB R5, R3, R4 SUB AX, 2
SW a, R5 MOV a, AX
Biên Soạn: ThS.Lương Hoài Thương
37
&
VC
BB
Giới thiệu

Giới thiệu
 Dennis Ritchie tại Bell Telephone năm 1972.
 Tiền thân của ngôn ngữ B, KenThompson, cũng tại Bell
Telephone.
 Là ngôn ngữ lập trình có cấu trúc và phân biệt chữ Hoa - thường
(case sensitive)

Biên Soạn: ThS.Lương Hoài Thương


38
&
VC
BB
Giới thiệu

Ưu điểm của C


 Rất mạnh và linh động, có khả năng thể hiện bất cứ ý tưởng
nào.
 Được sử dụng rộng rãi bởi các nhà lập trình chuyên nghiệp.
 Có tính khả chuyển, ít thay đổi trên các hệ thống máy tính
khác nhau.
 Rõ ràng, cô đọng.
 Lập trình đơn thể, tái sử dụng thông qua hàm.

Biên Soạn: ThS.Lương Hoài Thương


39
&
VC
BB
Giới thiệu

Môi trường phát triển tích hợp IDE (Integrated Development


Environment)
 Biên tập chương trình nguồn (Trình EDIT).
 Biên dịch chương trình (Trình COMPILE).
 Chạy chương trình nguồn (Trình RUNTIME).
 Sửa lỗi chương trình nguồn (Trình DEBUG).

.C/.CPP .OBJ .EXE

Biên Soạn: ThS.Lương Hoài Thương


40
&
VC
BB
Giới thiệu
Môi trường lập trình
 DEV-C++.
 Visual C++ 6.0, Win32 Console Application.

Biên Soạn: ThS.Lương Hoài Thương


41
&
VC
BB
Bộ từ vựng của C

Các ký tự được sử dụng


 Bộ chữ cái 26 ký tự Latinh A, B, C, …, Z, a, b, c, …, z
 Bộ chữ số thập phân : 0, 1, 2, …, 9
 Các ký hiệu toán học : + – * / = < > ( )
 Các ký tự đặc biệt : . , : ; [ ] % \ # $ ‘
 Ký tự gạch nối _ và khoảng trắng ‘ ’

Lưu ý chương trình phân biệt chữ hoa và chữ thường

Biên Soạn: ThS.Lương Hoài Thương


42
&
VC
BB
Bộ từ vựng của C
Từ khóa (keyword)
 Các từ dành riêng trong ngôn ngữ C với mục đích đã được
xác định trước.
Từ khóa int dùng để khai báo biến hoặc hàm với kiểu dữ liệu số nguyên
Từ khóa if dùng để xây dựng câu lệnh cấu trúc chọn
Từ khóa for dùng để xây dựng câu lệnh cấu trúc lặp
 Không thể sử dụng từ khóa để đặt tên cho biến, hàm, tên
chương trình con.

Biên Soạn: ThS.Lương Hoài Thương


43
&
VC
BB
Một số từ khóa thông dụng

Biên Soạn: ThS.Lương Hoài Thương


44
&
VC
BB
Bộ từ vựng của C
Tên (Identifier)
 Một dãy ký tự dùng để chỉ tên một hằng số, hằng ký tự, tên
một biến, một kiểu dữ liệu, một hàm một hay thủ tục.
 Không được trùng với các từ khóa và được tạo thành từ các
chữ cái và các chữ số nhưng bắt buộc chữ đầu phải là chữ
cái hoặc _.
 Số ký tự tối đa trong một tên là 255 ký tự và được dùng ký tự
_ chen trong tên nhưng không cho phép chen giữa các
khoảng trắng.

Biên Soạn: ThS.Lương Hoài Thương


45
&
VC
BB
Bộ từ vựng của C

Ví dụ Tên/Định danh (Identifier)


 Các tên hợp lệ: GiaiPhuongTrinh, Bai_Tap1
 Các tên không hợp lệ: 1A, Giai Phuong Trinh
 Phân biệt chữ hoa chữ thường, do đó các tên sau đây khác
nhau:
• A, a
• BaiTap, baitap, BAITAP, bAItaP, …

Biên Soạn: ThS.Lương Hoài Thương


46
&
VC
BB
Bộ từ vựng của C
Dấu chấm phẩy ;
 Dùng để phân cách các câu lệnh.
 Ví dụ: printf(“Hello World!”); printf(“\n”);
Câu chú thích
 Đặt giữa cặp dấu /* */ hoặc // (C++)
 Ví dụ: /*Ho & Ten: NVA*/, // MSSV: 0712078
Hằng ký tự và hằng chuỗi
 Hằng ký tự: ‘A’, ‘a’, …
 Hằng chuỗi: “Hello World!”, “Nguyen Van A”
 Chú ý: ‘A’ khác “A”
Biên Soạn: ThS.Lương Hoài Thương
47
&
VC
BB
Cấu trúc chương trình C

Biên Soạn: ThS.Lương Hoài Thương


48
&
VC
BB
Cấu trúc chương trình C
 Phần 1: Chức năng thông báo cho chương trình dịch biết là chương trình
có sử dụng những thư viện nào.
 Phần 2: Định nghĩa các kiểu dữ liệu mới dùng cho cả chương trình.
 Phần 3: Phần khai báo các hàm nguyên mẫu, giúp cho chương trình dịch
biết được những thông tin cơ bản của các hàm sử dụng trong chương
trình.
 Phần 4: Phần khai báo các biến toàn cục.
 Phần 5: (Bắt buộc phải có) Định nghĩa hàm main( ), chương trình sẽ bắt
đầu bằng việc thực hiện các lệnh trong hàm main( ).
 Phần 6: Định nghĩa các hàm đã khai báo nguyên mẫu, Ở phần 3

Biên Soạn: ThS.Lương Hoài Thương


49
&
VC
BB
Ví dụ

Biên Soạn: ThS.Lương Hoài Thương


50
&
VC
BB
Ví dụ

#include <stdio.h>
#include <conio.h>
int main()
{ int x, y, tong;
printf(“Nhap hai so nguyen: ”);
scanf(“%d%d”, &x, &y);
tong = x + y;
printf(“Tong hai so la %d”, tong);
getch();
return 0;
}

Biên Soạn: ThS.Lương Hoài Thương


51
&
VC
BB
Các kiểu dữ liệu cơ sở
Có 4 kiểu cơ sở như sau:
 Kiểu số nguyên: giá trị của nó là các số nguyên như 2912, -
1706, …
 Kiểu số thực: giá trị của nó là các số thực như 3.1415, 29.12,
-17.06, …
 Kiểu luận lý: giá trị đúng hoặc sai.
 Kiểu ký tự: 256 ký tự trong bảng mã ASCII.

Biên Soạn: ThS.Lương Hoài Thương


52
&
VC
BB
Kiểu số nguyên

Các kiểu số nguyên (có dấu)


 n bit có dấu: –2n – 1 … +2n – 1 – 1

Kiểu Độ lớn Miền giá trị


(Type) (Byte) (Range)
char 1 –128 … +127
int 2 –32.768 … +32.767
short 2 –32.768 … +32.767
long 4 –2.147.483.648 … +2.147.483.647

Biên Soạn: ThS.Lương Hoài Thương


53
&
VC
BB
Kiểu số nguyên

Các kiểu số nguyên (không dấu)


 n bit không dấu: 0 … 2n – 1

Kiểu Độ lớn Miền giá trị


(Type) (Byte) (Range)
unsigned char 1 0 … 255
unsigned int 2 0 … 65.535
unsigned short 2 0 … 65.535
unsigned long 4 0 … 4.294.967.295

Biên Soạn: ThS.Lương Hoài Thương


54
&
VC
BB
Kiểu số thực

Các kiểu số thực (floating-point)


 Ví dụ
• 17.06 = 1.706*10 = 1.706*101
Kiểu Độ lớn Miền giá trị
(Type) (Byte) (Range)
float (*) 4 3.4*10–38 … 3.4*1038
double (**) 8 1.7*10–308 … 1.7*10308

• (*) Độ chính xác đơn (Single-precision) chính xác đến 7 số lẻ.


• (**) Độ chính xác kép (Double-precision) chính xác đến 19 số lẻ.

Biên Soạn: ThS.Lương Hoài Thương


55
&
VC
BB
Kiểu luận lý

Đặc điểm
 C ngầm định một cách không tường minh:
• false (sai): giá trị 0.
• true (đúng): giá trị khác 0, thường là 1.
 C++: bool
Ví dụ
 0 (false), 1 (true), 2 (true), 2.5 (true)
 1 > 2 (0, false), 1 < 2 (1, true)

Biên Soạn: ThS.Lương Hoài Thương


56
&
VC
BB
Kiểu ký tự

Đặc điểm
 Tên kiểu: char
 Miền giá trị: 256 ký tự trong bảng mã ASCII.
 Chính là kiểu số nguyên do:
• Lưu tất cả dữ liệu ở dạng số.
• Không lưu trực tiếp ký tự mà chỉ lưu mã ASCII của ký tự đó.
Ví dụ
 Lưu số 65 tương đương với ký tự ‘A’…
 Lưu số 97 tương đương với ký tự ‘a’.

Biên Soạn: ThS.Lương Hoài Thương


57
&
VC
BB
Biến

Ví dụ
int i;
Biến int j, k;
unsigned char dem;
float ketqua, delta;

Cú pháp
<kiểu> <tên biến>;
<kiểu> <tên biến 1>, <tên biến 2>;

Biên Soạn: ThS.Lương Hoài Thương


58
&
VC
BB
Biến

Vị trí khai báo biến trong C


Khai báo biến ngoài

Khai báo biến trong

Biên Soạn: ThS.Lương Hoài Thương


59
&
VC
BB
Biến

Biên Soạn: ThS.Lương Hoài Thương


60
&
VC
BB
Hằng số

Cú pháp
<kiểu> <tênhằng> = <giá trị>;
Hằng
thường

Ví dụ
int a = 1506; // 150610
int b = 01506; // 15068
int c = 0x1506; // 150616 (0x hay 0X)
float d = 15.06e-3; // 15.06*10-3 (e hay E)
Biên Soạn: ThS.Lương Hoài Thương
61
&
VC
BB
Hằng số

Cú pháp
#define <tênhằng> <giá trị>
Hằng hoặc sử dụng từ khóa const.
ký hiệu

Ví dụ
#define MAX 100 // Không có ;
#define PI 3.14 // Không có ;
const int MAX = 100;
const float PI = 3.14;
Biên Soạn: ThS.Lương Hoài Thương
62
&
VC
BB
Hằng

Biên Soạn: ThS.Lương Hoài Thương


63
&
VC
BB
Hằng

Biên Soạn: ThS.Lương Hoài Thương


64
&
VC
BB
Biểu thức

Khái niệm
 Tạo thành từ các toán tử (Operator) và các toán hạng
(Operand).
 Toán tử tác động lên các giá trị của toán hạng và cho giá
trị có kiểu nhất định.
 Toán tử: +, –, *, /, %….
 Toán hạng: hằng, biến, lời gọi hàm...
Ví dụ
 2 + 3, a / 5, (a + b) * 5, …

Biên Soạn: ThS.Lương Hoài Thương


65
&
VC
BB
Toán tử gán

Khái niệm
 Thường được sử dụng trong lập trình.
 Gán giá trị cho biến.
Cú pháp
 <biến> = <giá trị>;
 <biến> = <biến>;
 <biến> = <biểu thức>;
 Có thể thực hiện liên tiếp phép gán.

Biên Soạn: ThS.Lương Hoài Thương


66
&
VC
BB
Toán tử gán

Ví dụ
void main()
{ int a, b, c, d, e, thuong;
a = 10;
b = a;
thuong = a / b;
a = b = c = d = e = 156;
e = 156;
d = e;
c = d;
b = c;
a = b;
}

Biên Soạn: ThS.Lương Hoài Thương


67
&
VC
BB
Các toán tử toán học

Toán tử 1 ngôi
 Chỉ có một toán hạng trong biểu thức.
 ++ (tăng 1 đơn vị), -- (giảm 1 đơn vị)
 Đặt trước toán hạng
• Ví dụ ++x hay --x: thực hiện tăng/giảm trước.
 Đặt sau toán hạng
• Ví dụ x++ hay x--: thực hiện tăng/giảm sau.
Ví dụ
 x = 10; y = x++; // y = 10 và x = 11
 x = 10; y = ++x; // x = 11 và y = 11
Biên Soạn: ThS.Lương Hoài Thương
68
&
VC
BB

Biên Soạn: ThS.Lương Hoài Thương


69
&
VC
BB
Các toán tử toán học

Toán tử 2 ngôi
 Có hai toán hạng trong biểu thức.
 +, –, *, /, % (chia lấy phần dư)
 x = x + y  x += y;
Ví dụ
 a = 1 + 2; b = 1 – 2; c = 1 * 2; d = 1 / 2;
 e = 1*1.0 / 2;
 h = 1 % 2;
 x = x * (2 + 3*5);  x *= 2 + 3*5;

Biên Soạn: ThS.Lương Hoài Thương


70
&
VC
BB
Các toán tử trên bit

Các toán tử trên bit


 Tác động lên các bit của toán hạng (nguyên).
 & (and), | (or), ^ (xor), ~ (not hay lấy số bù 1)
 >> (shift right), << (shift left)
 Toán tử gộp: &=, |=, ^=, ~=, >>=, <<=

& 0 1 | 0 1
0 0 0 0 0 1
1 0 1 1 1 1

^ 0 1 ~ 0 1
0 0 1 1 0
1 1 0 71
Biên Soạn: ThS.Lương Hoài Thương
&
VC
BB

Biên Soạn: ThS.Lương Hoài Thương


72
&
VC
BB
Các toán tử trên bit

Ví dụ
void main()
{
int a = 5; // 0000 0000 0000 0101
int b = 6; // 0000 0000 0000 0110

int z1, z2, z3, z4, z5, z6;


z1 = a & b; // 0000 0000 0000 0100
z2 = a | b; // 0000 0000 0000 0111
z3 = a ^ b; // 0000 0000 0000 0011
z4 = ~a; // 1111 1111 1111 1010
z5 = a >> 2;// 0000 0000 0000 0001
z6 = a << 2;// 0000 0000 0001 0100
}

Biên Soạn: ThS.Lương Hoài Thương


73
&
VC
BB
Các toán tử quan hệ

Các toán tử quan hệ


 So sánh 2 biểu thức với nhau
 Cho ra kết quả 0 (false) nếu sai hoặc 1 (true) nếu đúng
 ==, >, <, >=, <, <=, !=
Ví dụ
 s1 = (1 == 2); s2 = (1 != 2);
 s3 = (1 > 2); s4 = (1 >= 2);
 s5 = (1 < 2); s6 = (1 <= 2);

Biên Soạn: ThS.Lương Hoài Thương


74
&
VC
BB
Các toán tử luận lý

Các toán tử luận lý


 Tổ hợp nhiều biểu thức quan hệ với nhau.
 && (and), || (or), ! (not)
&& 0 1 || 0 1
0 0 0 0 0 1
1 0 1 1 1 1

 Ví dụ
• s1 = (1 > 2) && (3 > 4);
• s2 = (1 > 2) || (3 > 4);
• s3 = !(1 > 2);
Biên Soạn: ThS.Lương Hoài Thương
75
&
VC
BB

Biên Soạn: ThS.Lương Hoài Thương


76
&
VC
BB
Toán tử điều kiện

Toán tử điều kiện


 Đây là toán tử 3 ngôi (gồm có 3 toán hạng)
 <biểu thức 1> ? <biểu thức 2> : <biểu thức 3>
• <biểu thức 1> đúng thì giá trị là <biểu thức 2>.
• <biểu thức 1> sai thì giá trị là <biểu thức 3>.
Ví dụ
 s1 = (1 > 2) ? 2912 : 1706;
 int s2 = 0;
 1 < 2 ? s2 = 2912 : s2 = 1706;

Biên Soạn: ThS.Lương Hoài Thương


77
&
VC
BB
Toán tử phẩy

Toán tử phẩy
 Các biểu thức đặt cách nhau bằng dấu ,
 Các biểu thức con lần lượt được tính từ trái sang phải.
 Biểu thức mới nhận được là giá trị của biểu thức bên phải
cùng.
Ví dụ
 x = (a++, b = b + 2);
  a++; b = b + 2; x = b;

Biên Soạn: ThS.Lương Hoài Thương


78
&
VC
BB
Độ ưu tiên của các toán tử
Toán tử Độ ưu
tiên
() [] -> . 
! ++ -- - + * (cast) & sizeof 
* / % 
+ - 
<< >> 
< <= > >= 
== != 
& 
| 
^ 
&& 
|| 
?: 
= += -= *= /= %= &= … 
, 

Biên Soạn: ThS.Lương Hoài Thương


79
&
VC
BB
Độ ưu tiên của các toán tử

Quy tắc thực hiện


 Thực hiện biểu thức trong ( ) sâu nhất trước.
 Thực hiện theo thứ tự ưu tiên các toán tử.
=> Tự chủ động thêm ( )
Ví dụ
 n = 2 + 3 * 5;
=> n = 2 + (3 * 5);
 a > 1 && b < 2
=> (a > 1) && (b < 2)
Biên Soạn: ThS.Lương Hoài Thương
80
&
VC
BB
Viết biểu thức cho các mệnh đề

x lớn hơn hay bằng 3


x >= 3
a và b cùng dấu
((a>0) && (b>0)) || ((a<0) && (b<0))
(a>0 && b>0) || (a<0 && b<0)
p bằng q bằng r
(p == q) && (q == r) hoặc (p == q && q == r)
–5 < x < 5
(x > –5) && (x < 5) hoặc (x > –5 && x < 5)

Biên Soạn: ThS.Lương Hoài Thương


81
&
VC
BB

Biên Soạn: ThS.Lương Hoài Thương


82
&
VC
BB
Phép toán lấy địa chỉ biến (&)
 Biến thực chất là một vùng nhớ được đặt tên (là tên của biến) trên
bộ nhớ của máy tính.
 Mọi ô nhớ trên bộ nhớ máy tính đều được đánh địa chỉ. Do đó mọi
biến đều có địa chỉ
& <tên biến>;
 Ví dụ: int a = 2006;
 &a; // co gia tri la 158 hay 9E
1
.
..
..
. 157

a D6 158

07 159

160
.
.
.
Biên Soạn: ThS.Lương Hoài Thương
83
&
VC
BB
Phép toán chuyển đổi kiểu bắt buộc

Chương trình dịch sẽ tự động chuyển đổi kiểu


 char  int  long int  float  double 
long double
Ngược lại
 Số nguyên long int 50,000 không phải là một số nguyên kiểu
int vì phạm vi biểu diễn của kiểu int là từ (-32,768 đến 32,767).
 Phải ép kiểu
Cú pháp:
(<kiểu dữ liệu mới>) <biểu thức>;

Biên Soạn: ThS.Lương Hoài Thương


84
&
VC
BB
Ví dụ
#include <stdio.h>
#include <conio.h>
void main()
{
long int li; int i; float f; clrscr();
li = 0x123456; f = 123.456;
i = (int) li;
printf(“\n li = %ld; i = %d”,li, i);
i = (int) f;
printf(“\n f = %f; i = %d”,f, i);
getch();
}
• Kết quả
li = 1193046; i = 13398
f = 123.456001; i = 123
Biên Soạn: ThS.Lương Hoài Thương
85
&
VC
BB

Biên Soạn: ThS.Lương Hoài Thương


86
&
VC
BB
Câu lệnh

Khái niệm
 Là một chỉ thị trực tiếp, hoàn chỉnh nhằm ra lệnh cho máy tính
thực hiện một số tác vụ nhất định nào đó.
 Trình biên dịch bỏ qua các khoảng trắng (hay tab hoặc xuống
dòng) chen giữa lệnh.
Ví dụ
a=2912;
a = 2912;
a
=
2912;

Biên Soạn: ThS.Lương Hoài Thương


87
&
VC
BB
Câu lệnh

Phân loại
 Câu lệnh đơn: chỉ gồm một câu lệnh.
 Câu lệnh phức (khối lệnh): gồm nhiều câu lệnh đơn
được bao bởi { và }
Ví dụ
a = 2912; // Câu lệnh đơn

{ // Câu lệnh phức/khối lệnh


a = 2912;
b = 1706;
}

Biên Soạn: ThS.Lương Hoài Thương


88
&
VC
BB Các câu lệnh vào ra dữ liệu
Hàm vào ra cơ bản:
 printf()
 scanf()
Các lệnh vào ra khác
 gets()
 puts()
 getch()
Biên Soạn: ThS.Lương Hoài Thương
89
&
VC
BB
Câu lệnh xuất
Thư viện
 #include <stdio.h> (standard input/output)
 #include “stdio.h”
Cú pháp
printf (“<chuỗi định dạng>”[,<đs1>,<đs2>, …]);
chuỗi định dạng: là cách trình bày thông tin xuất và được đặt trong
cặp nháy kép “ ”.
• Văn bản thường (literal text)
• Ký tự điều khiển (escape sequence)
• Đặc tả (conversion specifier)

Biên Soạn: ThS.Lương Hoài Thương


90
&
VC
BB
Chuỗi định dạng
Văn bản thường (literal text)
 Được xuất y hệt như lúc gõ trong chuỗi định dạng.
Ví dụ
 Xuất chuỗi Hello World
 printf(“Hello ”); printf(“World”);
 printf(“Hello World”);
 Xuất chuỗi a + b
 printf(“a + b”);

Biên Soạn: ThS.Lương Hoài Thương


91
&
VC
BB
Chuỗi định dạng

Ký tự điều khiển (escape sequence)


 Gồm dấu \ và một ký tự như trong bảng sau:
Ký tự điều Ý nghĩa
khiển
\a Tiếng chuông
\b Lùi lại một bước
\n Xuống dòng
\t Dấu tab
\\ In dấu \
\? In dấu ?
\” In dấu “
Ví dụ
 printf(“\t”); printf(“\n”);
 printf(“\t\n”);
Biên Soạn: ThS.Lương Hoài Thương
92
&
VC
BB
Chuỗi định dạng

Đặc tả (conversion specifier)


 Gồm dấu % và một ký tự.
 Xác định kiểu của biến/giá trị muốn xuất.
 Các đối số chính là các biến/giá trị muốn xuất, được
liệt kê theo thứ tự cách nhau dấu phẩy.

Biên Soạn: ThS.Lương Hoài Thương


93
&
VC
BB
Chuỗi định dạng
Nhóm kí tự Kiểu dữ liệu Kết quả
định dạng
%c int, char Kí tự đơn lẻ

%i, %d int, char Số thập phân

%o int, char Số bát phân


(không có 0 đằng trước)

%x, %X int, char Số hexa


(chữ thường/chữ hoa)
%u unsigned int/char Số thập phân

Biên Soạn: ThS.Lương Hoài Thương


94
&
VC
BB
Chuỗi định dạng

Nhóm kí tự Kiểu dữ liệu Kết quả


định dạng
%ld, %li long Số thập phân

%lo long Số bát phân


(không có 0 đằng trước)

%lx, %LX long Số hexa


(chữ thường/chữ hoa)
%lu unsigned long Số thập phân

Biên Soạn: ThS.Lương Hoài Thương


95
&
VC
BB
Chuỗi định dạng
Nhóm kí tự Kiểu dữ liệu Kết quả
định dạng
%s char [] Hiển thị xâu kí tự kết
thúc bởi ‘\0’
%f float/double Số thực dấu phẩy tĩnh

%e, %E float/double Số thực dấu phẩy


động
% Hiển thị kí tự %

Biên Soạn: ThS.Lương Hoài Thương


96
&
VC
BB
Chuỗi định dạng
Ví dụ
 int a = 10, b = 20;
 printf(“%d”, a);  Xuất ra 10
 printf(“%d”, b);  Xuất ra 20
 printf(“%d %d”, a, b);  Xuất ra 10 20

 float x = 15.06;
 printf(“%f”, x);  Xuất ra 15.060000
 printf(“%f”, 1.0/3);  Xuất ra 0.333333

Biên Soạn: ThS.Lương Hoài Thương


97
&
VC
BB
Định dạng xuất
Cú pháp
 Định dạng xuất số nguyên: %nd
 Định dạng xuất số thực: %n.kd
int a = 1706;
float x = 176.8534;
printf(“%10d”, a);printf(“\n”);
printf(“%10.2f”, x);printf(“\n”);
printf(“%.2f”, x);printf(“\n”);

1 7 0 6

1 7 6 . 8 5

1 7 6 . 8 5

Biên Soạn: ThS.Lương Hoài Thương


98
&
VC
BB
Chuỗi định dạng
Phối hợp các thành phần
 int a = 1, b = 2;
 Xuất 1 cong 2 bang 3 và xuống dòng.
• printf(“%d”, a); // Xuất giá trị của biến a
• printf(“ cong ”); // Xuất chuỗi “ cong ”
• printf(“%d”, b); // Xuất giá trị của biến b
• printf(“ bang ”); // Xuất chuỗi “ bang ”
• printf(“%d”, a + b); // Xuất giá trị của a + b
• printf(“\n”); // Xuất điều khiển xuống dòng \n
 printf(“%d cong %d bang %d\n”, a, b, a+b);

Biên Soạn: ThS.Lương Hoài Thương


99
&
VC
BB
Câu lệnh xuất

Ngoài ra còn 2 lệnh xuất ra màn hình

puts(“ <xâu ký tự>”);

putchar (‘<ký tự>’);

Biên Soạn: ThS.Lương Hoài Thương


100
&
VC
BB
MỘT SỐ VÍ DỤ
Tính điện trở tương đương trong hình sau biết R1=1k, R2= 500, R3=250

#include <stdio.h>
int main(void)
{
float R1, R2, R3, R_equ;
R1=1.0e3; /* 1 kohms */
R2=500.0; /* 500 ohms */
R3=250.0; /* 250 ohms */
puts("Program to determine equivalent resistance of");
puts(“Three resistors connected in parallel");
R_equ=1/(1/R1+1/R2+1/R3);
printf("R1=%0.3f, R2=%0.3f, R3=%0.3f\n",R1,R2,R3);
printf("Equiv resistance is: %0.3f ohms\n",R_equ);
return(0);
}
Biên Soạn: ThS.Lương Hoài Thương
101
&
VC
BB
MỘT SỐ VÍ DỤ
Tính điện kháng của tụ điện trong hình sau biết C=1uF, f=10kHz
#include <stdio.h>
#define PI 3.14159
int main(void)
{
float freq, cap, X_c;
freq = 10.0e3; /* 1 kHz */
cap = 1.0e-6; /*1 micro F */
x_c = 1/(2.0*PI*freq*cap);
printf (“freq: %0.0f Hz, cap: %0.6f Farad\n” ,freq ,cap);
printf (“Cap Reactance is: %0.2f ohms\n”,x_c);
return (0);
}

Biên Soạn: ThS.Lương Hoài Thương


102
&
VC
BB
MỘT SỐ VÍ DỤ
Tính tần số cộng hưởng của mạch LC nối tiếp L=1mH, C= 1uF

#include <stdio.h>
#include <math.h> /* sqrt() */
#define PI 3.14159
int main(void)
{
float L=1e-3,C=1e-6,f_res; /* L is 1 mH, C is 1 uF */
puts("Program to calculate resonant frequency of a series");
puts("L-C circuit");
f_res=1/(2*PI*sqrt(L*C));
printf("C=%.3f F, L=%.6f H\n" ,C,L);
printf("Resonant frequency is: %.3f Hz\n",f_res);
return(0);
}
Biên Soạn: ThS.Lương Hoài Thương
103
&
VC
BB

Biên Soạn: ThS.Lương Hoài Thương


104
&
VC
BB
Câu lệnh nhập
Thư viện
 #include <stdio.h> (standard input/output)
Cú pháp
 scanf(“<chuỗi định dạng>”[,&<đs1>, &<đs1>, …]);
 chuỗi định dạng: giống định dạng xuất nhưng chỉ có các
đặc tả.
 Các đối số là tên các biến sẽ chứa giá trị nhập và được
đặt trước dấu &

Biên Soạn: ThS.Lương Hoài Thương


105
&
VC
BB
Câu lệnh nhập

Ví dụ, cho a và b kiểu số nguyên


 scanf(“%d”, &a); // Nhập giá trị cho biến a
 scanf(“%d”, &b); // Nhập giá trị cho biến b
  scanf(“%d%d”, &a, &b);
 Các câu lệnh sau đây sai
• scanf(“%d”, a); // Thiếu dấu &
• scanf(“%d”, &a, &b);// Thiếu %d cho biến b
• scanf(“%f”, &a); // a là biến kiểu số nguyên
• scanf(“%9d”, &a); // không được định dạng
• scanf(“a = %d, b = %d”, &a, &b”);

Biên Soạn: ThS.Lương Hoài Thương


106
&
VC
BB
Câu lệnh nhập

gets: đọc xâu ký tự từ bàn phím cho đến hết dòng.


getchar: đọc một ký tự từ bàn phím.

Biên Soạn: ThS.Lương Hoài Thương


107
&
VC
BB
MỘT SỐ VÍ DỤ
Ví dụ 2.11 trang 68 ( nhập các biến từ bàn phím dùng hàm scanf )
#include <stdio.h>
int main(void)
{
float val1, val2, val3, val4;
int i, j, k;
printf (“ Type in two float values followed by: ");
scanf (“ %f %f ",&val1, &val2 );
printf ("Type in two integer values followed by:");
scanf ("%d %d",&i, &j);
printf ("Type in an integer and two floats followed by:");
scanf ("%d %f %f",&k, &val3, &val4);
printf ("Floats entered were %6.2f %6.2f %6.2f %6.2f \n",val1,val2,val3,val4);
printf ("Integers entered were %6d %6d %6d\n",i,j,k);
return(0);
}

Biên Soạn: ThS.Lương Hoài Thương


108
&
VC
BB
MỘT SỐ VÍ DỤ
Tính R tương đương trong mạch 3 điện trở mắc song song biết các giá trị điện trở nhập từ bàn phím.
#include <stdio.h>
int main(void)
{
float R1,R2,R3,R_equ;
puts("Program to determine equivalent resistance");
puts("of three resistors connected in parallel");
puts("Enter three values of resistance >>");
scanf("%f %f %f",&R1,&R2,&R3);
R_equ=1.0/(1.0/R1+1/R2+1/R3);
printf ("R1=%6.3f, R2=%6.3f and R3=%6.3f ohms\n",R1,R2,R3);
printf ("Equivalent resistance is %6.3f ohms\n",R_equ);
return(0);
Biên Soạn: ThS.Lương Hoài Thương
109
}
&
VC
BB
MỘT SỐ VÍ DỤ

Viết chương trình tính giá vout biết Vin, R1, R2 nhập từ bàn phím
trong hình sau

Biên Soạn: ThS.Lương Hoài Thương


110
&
VC
BB
MỘT SỐ VÍ DỤ
Tính dung kháng của tụ C với thông số nhập từ bàn phím

#include <stdio.h>
#define PI 3.14159
int main (void)
{
float freq,cap,X_c;
puts("Enter frequency and Capacitance");
scanf("%f %f",&freq,&cap);
X_c=1.0/(2.0*PI*freq*cap);
printf("Capacitive Reactance is %6.3f ohms\n",X_c);
return(0);
}
Biên Soạn: ThS.Lương Hoài Thương
111
&
VC
BB
MỘT SỐ VÍ DỤ
Tính trở kháng của mạch RL nối tiếp với các thông số nhập từ bàn phím

#include <stdio.h>
#include <math.h> /* sqrt() */
#define PI 3.14159
int main(void)
{
float R,L,freq,Xl,Zin_mag;
printf("Enter R, L and frequency >>");
scanf("%f %f %f",&R,&L,&freq);
Xl= 2 * PI * freq * L;
Zin_mag = sqrt(R*R+Xl*Xl);
printf("Zin mag %6.2f ohm,\n",Zin_mag);
return(0); }
Biên Soạn: ThS.Lương Hoài Thương
112
&
VC
BB
MỘT SỐ VÍ DỤ
Viết chương trình thực hiện chức năng tương đương các cổng
logic sau: and, or, ex-or, nand, nor
#include <stdio.h>
int main(void)
{
int value1, value2;
printf("Enter two hex values >>> ");
scanf("%x %x",&value1,&value2);
printf("Values AND is %x\n",value1 & value2);
printf("Values OR is %x\n",value1 | value2);
printf("Values Ex-OR is %x\n",value1 ^ value2);
printf("Values NAND is %x\n",~(value1 & value2));
printf("Values NOR is %x\n",~(value1 | value2));
return(0);
}
Biên Soạn: ThS.Lương Hoài Thương
113
&
VC
BB
MỘT SỐ VÍ DỤ
Viết chương trình chuyễn đỗi từ thập phân sang Hex, bát phân.
#include <stdio.h>
int main(void)
{
int value;
puts("Enter integer value (-32768 to 32767) >> ");
scanf("%d",&value);
printf("Decimal = %d, Octal = %o, Hex = %x\n",value,value,value);
return(0);
}

Biên Soạn: ThS.Lương Hoài Thương


114
&
VC
BB
MỘT SỐ VÍ DỤ
Viết chương trình hiển thị giá trị thập phân ascii và các ký tự ascii
tương ứng.
#include <stdio.h>
int main(void)
{
int value;
puts("Enter ASCII code (greater than 33)>");
scanf("%d",&value);
printf("Code = %d, character = %c\n",value,value);
return(0);
}

Biên Soạn: ThS.Lương Hoài Thương


115
&
VC
BB
Một số hàm hữu ích khác

Các hàm trong thư việc toán học


 #include <math.h>
 1 đầu vào: double, Trả kết quả: double
• acos, asin, atan, cos, sin, …
• exp, log, log10
• sqrt
• ceil, floor
• abs, fabs
 2 đầu vào: double, Trả kết quả: double
• double pow(double x, double y)

Các kiểu dữ liệu cơ sở


116
&
VC
BB
Một số hàm hữu ích khác

Ví dụ
 int x = 4, y = 3, z = -5;
 float t = -1.2;
 float kq1 = sqrt(x1);
 int kq2 = pow(x, y);
 float kq3 = pow(x, 1/3);
 float kq4 = pow(x, 1.0/3);
 int kq5 = abs(z);
 float kq6 = fabs(t);

Các kiểu dữ liệu cơ sở


117
&
VC
BB

Biên Soạn: ThS.Lương Hoài Thương


118
&
VC
BB
Bài tập

1. Tên (định danh) nào sau đây đặt không hợp lệ, tại sao?
 Tin hoc co SO A, 1BaiTapKHO
 THucHaNH, NhapMon_L@pTrinH
2. Câu ghi chú dùng để làm gì? Cách sử dụng ra sao? Cho ví dụ
minh họa.
3. Trình bày cấu trúc của một chương trình C. Giải thích ý nghĩa
của từng phần trong
cấu trúc.

Biên Soạn: ThS.Lương Hoài Thương


119
&
VC
BB
Bài tập

1. Trình bày các kiểu dữ liệu cơ sở trong C và cho ví dụ.


2. Trình bày khái niệm về biến và cách sử dụng lệnh gán.
3. Phân biệt hằng thường và hằng ký hiệu.
Cho ví dụ minh họa.
4. Trình bày khái niệm về biểu thức.
Tại sao nên sử dụng cặp ngoặc đơn.
5. Trình bày cách định dạng xuất.

Biên Soạn: ThS.Lương Hoài Thương


120
&
VC
BB
Bài tập

6. Nhập năm sinh của một người và tính tuổi của người đó.
7. Nhập 2 số a và b. Tính tổng, hiệu, tính và thương của hai số đó.
8. Nhập tên sản phẩm, số lượng và đơn giá. Tính tiền và thuế giá
trị gia tăng phải trả, biết:
a. tiền = số lượng * đơn giá
b. thuế giá trị gia tăng = 10% tiền

Biên Soạn: ThS.Lương Hoài Thương


121
&
VC
BB
Bài tập

9. Nhập điểm thi và hệ số 3 môn Toán, Lý, Hóa của một sinh viên.
Tính điểm trung bình của sinh viên đó.
10.Nhập bán kính của đường tròn. Tính chu vi và diện tích của hình
tròn đó.
11.Nhập vào số xe (gồm 4 chữ số) của bạn. Cho biết số xe của bạn
được mấy nút?

Biên Soạn: ThS.Lương Hoài Thương


122
&
VC
BB
Bài tập
12. Cho mạch điện như hình vẽ hãy viết chương trình
a) Tính tần số dao động của mạch khi thay đổi R
và tụ điện C.
b) Tính hệ số khuyết đại của opamp khi thay đổi R

Biên Soạn: ThS.Lương Hoài Thương


123
&
VC
BB
Bài tập

13. Tính giá trị của tụ điện C trong các trường hợp
sau:

Biên Soạn: ThS.Lương Hoài Thương


124
&
VC
BB
Bài tập
14. Tính thời gian delay của ngõ ra IC555 khi thay đổi VR1, C1.

Biên Soạn: ThS.Lương Hoài Thương


125
&
VC
BB
Bài tập
15. Tính giá trị cuộn cảm được cho như hình vẽ sau đây

Thép : 8 × 75.10^(-4)
Ferrite: 2 × 10^(-5) -> 8 × 10^(-4)
Chân không: 1,26 × 10^(-6)

Biên Soạn: ThS.Lương Hoài Thương


126
&
VC
BB

16. Tính điện trở tương ứng khi biết số lượng led đơn được kết nối vào nhánh

Biên Soạn: ThS.Lương Hoài Thương


127
&
VC
BB

17. Tính công suất điện trở khi biết thay đổi điện áp đầu
vào như hình sau:

Biên Soạn: ThS.Lương Hoài Thương


128
KỸ THUẬT LẬP TRÌNH

CÂU LỆNH CHỌN

Biên Soạn: ThS.Lương Hoài Thương


129
&
VC
BB
Nội dung

1 Câu lệnh điều kiện if

2 Câu lệnh rẽ nhánh switch

3 Một số kinh nghiệm lập trình

4 Một số ví dụ minh họa

Biên Soạn: ThS.Lương Hoài Thương


130
&
VC PHÂN BIỆT CHƯƠNG TRÌNH TUẦN TỰ VÀ KHÔNG TUẦN TỰ
BB
Việc đi đến quyết định tuỳ
Bắt đầu Bắt đầu
thuộc vào các giá trị nhập
vào hay các giá trị được
Lệnh Lệnh
xử lý.

Các lệnh Các lệnh


Lệnh

Các lệnh Các lệnh


Lệnh

Kết thúc Lệnh đưa ra quyết


Kết thúc định: If, Switch
Chương trình tuần tự Chương trình không tuần tự

Đường dẫn chương trình không thay đổi


Một dãy lệnh thực hiện liên tiếp nhau Biên Soạn: ThS.Lương Hoài Thương
131
&
VC
BB
CÁC PHÉP TOÁN TRONG IF

Các phép toán so


sánh True/false
<,>,<=,>=,==,!=

True(khac 0)
Các phép toán xử
Các toán tử logic
lý bit
&&, ||
&,|,~,<<,>> False(bang 0) True/false

Các phép toán số


học
+,-,*,/,% False(bang 0)
True(khac 0)

Cấu trúc tổng thể của lệnh if


132
Biên Soạn: ThS.Lương Hoài Thương
&
VC
BB
Câu lệnh if (thiếu)

S
<BT Logic>

Đ
<Lệnh 1>
Trong ( ), cho kết quả
(sai = 0, đúng ≠ 0)

if (<BT Logic>)
<Lệnh 1>; Câu lệnh đơn hoặc
Câu lệnh phức (kẹp
giữa { và })

Biên Soạn: ThS.Lương Hoài Thương


133
&
VC
BB
Câu lệnh if (thiếu)

void main()
{
if (a == 0)
printf(“a bang 0”);

if (a == 0)
{
printf(“a bang 0”);
a = 2912;
}
}

Biên Soạn: ThS.Lương Hoài Thương


134
&
VC
BB
Câu lệnh if (đủ)

S
<BT Logic> <Lệnh 2>

Đ
<Lệnh 1>
Trong ( ), cho kết quả
(sai = 0, đúng ≠ 0)

if (<BT Logic>)
<Lệnh 1>; Câu lệnh đơn hoặc
Câu lệnh phức (kẹp
else giữa { và })
<Lệnh 2>;
Biên Soạn: ThS.Lương Hoài Thương
135
&
VC
BB
Câu lệnh if (đủ)

void main()
{
if (a == 0)
printf(“a bang 0”);
else
printf(“a khac 0”);

if (a == 0)
{
printf(“a bang 0”);
a = 2912;
}
else
printf(“a khac 0”);
}

Biên Soạn: ThS.Lương Hoài Thương


136
&
VC
BB
Câu lệnh if - Một số lưu ý

Câu lệnh if và câu lệnh if… else là một câu lệnh đơn.

{
if (a == 0)
printf(“a bang 0”);
}
{
if (a == 0)
{
printf(“a bang 0”);
a = 2912;
}
else
printf(“a khac 0”);
}
Biên Soạn: ThS.Lương Hoài Thương
137
&
VC
BB
Câu lệnh if - Một số lưu ý

Câu lệnh if có thể lồng vào nhau và else sẽ tương ứng với if gần
nó nhất.
if (a != 0)
if (b > 0)
printf(“a != 0 va b > 0”);
else
printf(“a != 0 va b <= 0”);

if (a !=0)
{
if (b > 0)
printf(“a != 0 va b > 0”);
else
printf(“a != 0 va b <= 0”);
}
Biên Soạn: ThS.Lương Hoài Thương
138
&
VC
BB
Câu lệnh if - Một số lưu ý

Nên dùng else để loại trừ trường hợp.


if (delta < 0)
printf(“PT vo nghiem”);
if (delta == 0)
printf(“PT co nghiem kep”);
if (delta > 0)
printf(“PT co 2 nghiem”);

if (delta < 0)
printf(“PT vo nghiem”);
else // delta >= 0
if (delta == 0)
printf(“PT co nghiem kep”);
else
printf(“PT co 2 nghiem”);
Biên Soạn: ThS.Lương Hoài Thương
139
&
VC
BB
Câu lệnh if - Một số lưu ý

Không được thêm ; sau điều kiện của if.


void main()
{
int a = 0;
if (a != 0)
printf(“a khac 0.”);

if (a != 0);
printf(“a khac 0.”);

if (a != 0)
{
};
printf(“a khac 0.”);
}
Biên Soạn: ThS.Lương Hoài Thương
140
&
VC
BB
Một số ví dụ

Viết chương trình máy tính đơn giản giống như hình sau

Biên Soạn: ThS.Lương Hoài Thương


141
&
VC
BB
Một số ví dụ
Viết chương trình thực hiện chức năng như sau:

Biên Soạn: ThS.Lương Hoài Thương


142
&
VC
BB
Một số ví dụ
Nhập x và tính hàm

 x 2  sin 4 2x  1 khi x  3



f ( x)  5 khi x  3

 x  3  log10 ( x  3) khi x  3
2

Biên Soạn: ThS.Lương Hoài Thương


143
&
VC
BB
MỘT SỐ VÍ DỤ
Viết chương trình đổi số thập phân sang nhị phân 8 bit (chương trình 3.1 tr.99)

Có nhiều cách: sử dụng mặt nạ che bit #include <stdio.h>


int main(void)
{
int i;
printf("Enter decimal value (0-255)>>> ");
scanf("%d",&i);
printf("Binary equivalent is ");
if (i & 0x80) printf("1"); else printf("0");
if (i & 0x40) printf("1"); else printf("0");
if (i & 0x20) printf("1"); else printf("0");
if (i & 0x10) printf("1"); else printf("0");
if (i & 0x08) printf("1"); else printf("0");
if (i & 0x04) printf("1"); else printf("0");
if (i & 0x02) printf("1"); else printf("0");
if (i & 0x01) printf("1"); else printf("0");
return(0);
}

Biên Soạn: ThS.Lương Hoài Thương


144
&
VC
BB
MỘT SỐ VÍ DỤ
Chương trình 3.2 khắc phục: Nhập lớn hơn 255 báo lổi, không in ra kết quả
#include <stdio.h> else
#define BIT0 0x01 {
#define BIT1 0x02 printf("Binary equivalent is ");
#define BIT2 0x04 if (i & BIT7) printf("1"); else printf("0");
#define BIT3 0x08 if (i & BIT6) printf("1"); else printf("0");
#define BIT4 0x10 if (i & BIT5) printf("1"); else printf("0");
#define BIT5 0x20 if (i & BIT4) printf("1"); else printf("0");
#define BIT6 0x40 if (i & BIT3) printf("1"); else printf("0");
#define BIT7 0x80 if (i & BIT2) printf("1"); else printf("0");
int main(void) if (i & BIT1) printf("1"); else printf("0");
{ int i; if (i & BIT0) printf("1\n"); else printf("0\n");
printf("Enter decimal value (0-255)>>> "); } return(0);
scanf("%d",&i); }
if ( (i<0) || (i>255))
puts("Invalid entered value");

Biên Soạn: ThS.Lương Hoài Thương


145
&
VC
BB
MỘT SỐ VÍ DỤ
Lưu đồ
start Chương trình 3.3 viết chương trình tính giá trị của and,
or,… biết các giá trị và cổng logic nhập từ bàn phím
Nhập số tính &
cổng logic

đ #include <stdio.h> if (option==OR)


OR Tính+ ht kq #define OR 1 printf("Ans is %x (hex)\n",value1 | value2);
#define AND 2 else if (option==AND)
#define EX_OR 3 printf("Ans is %x (hex)\n",value1 & value2);
s #define NOR 4 else if (option==EX_OR)
#define NAND 5 printf("Ans is %x (hex)\n",value1 ^ value2);
đ
else if (option==NOR)
AND Tính+ ht kq int main(void)
printf("Ans is %x (hex)\n",~(value1 | value2));
{
else if (option==NAND)
int value1,value2,option;
printf("Ans is %x (hex)\n",~(value1 & value2));
s puts("Program to determine bitwise
else puts("INVALID OPTION");
operation on two values");
đ return(0);
printf("Enter two hex values >>>");
EX-OR Tính+ ht kq scanf("%x %x",&value1,&value2);
}

puts("Enter function required");


printf("1-OR \n2-AND \n3-EX-OR \n");
s
printf("4-NOR \n5-NAND \nEnter >> ");
scanf("%d",&option);
đ
NOR Tính+ ht kq

s
đ
NAND Tính+ ht kq

end Biên Soạn: ThS.Lương Hoài Thương


146
&
VC
BB
MỘT SỐ VÍ DỤ
Chương trinh 3.4 tính giá trị điện trở song song và nối tiếp với các giá trị điện trở và cách ghép
được nhập từ bàn phím
#include <stdio.h>
#include <ctype.h> /* required for tolower() function */
int main(void)
{
float R1,R2,R_equ;
char ch;
printf("Enter two resistor values >>");
scanf("%f %f",&R1,&R2);
fflush(stdin); /* flush keyboard buffer */
printf("Do you require (s)eries or (p)arallel >>");
ch=getchar();
if (tolower(ch)=='s')/* convert character to lowercase */
{ R_equ=R1+R2;
printf("Equivalent series resistance is %8.2f ohms",R_equ);
}
else if (tolower(ch)=='p')
{ R_equ=(R1*R2)/(R1+R2);
printf("Equivalent parallel resistance is %8.2f ohms",R_equ);
}
else puts("Invalid entry");
return(0);
}
Biên Soạn: ThS.Lương Hoài Thương
147
&
VC
BB
MỘT SỐ VÍ DỤ
Chương trình 3.6 phân loại sóng điện từ theo bước sóng
#include <stdio.h>
int main(void)
{ float lamda;
printf("Enter wavelength>>>");
scanf("%f",&lamda);
printf("Electromagnetic wave is ");
if (lamda<1e-11) puts("Gamma Rays !!!");
else if (lamda<1e-9) puts("X-rays");
else if (lamda<400e-9) puts("Ultaviolet");
else if (lamda<700e-9) puts("LIGHT");
else if (lamda<1e-3) puts("Infrared");
else if (lamda<1e-1) puts("Microwave");
else puts("Radio wave");
return(0);
}

Biên Soạn: ThS.Lương Hoài Thương


148
&
VC LẬP TRÌNH CHO VI ĐIỀU KHIỂN DÙNG NGÔN NGỮ C
BB

Chuẩn bị

Lưu đồ giải thuật.

Phát thảo phần cứng.

Phần mềm lập trình C cho VĐK: Mikro C.

Phần mềm mô phỏng VĐK: Proteus.

Biên Soạn: ThS.Lương Hoài Thương


149
&
VC
BB
Lưu ý khi lập trình C cho VĐK
Các ứng dụng về điều khiển thiết bị: Đọc nhanh Datasheet, ưu tiên IO.
Các ứng dụng về điều khiển thời gian thực, PWM,… cần xem them các
thanh ghi thực hiện chức năng đó.

Biên Soạn: ThS.Lương Hoài Thương


150
&
VC
BB
Một số loại vi điều khiển thông dụng

Biên Soạn: ThS.Lương Hoài Thương


151
&
VC
BB
Ví dụ lập trình điều khiển led đơn
dùng ngôn ngữ ASM
mov p3,#0
mov p1,#255
main:
jnb p1.0,cv
jmp main
cv: cpl p3.0
jmp main
end
File HEX ( ngôn ngữ máy)
:0F00000075B0007590FF30900280FBB2B080F7B2
:00000001FF
Mô phỏng

Dùng delay Biên Soạn: ThS.Lương Hoài Thương


152
&
VC
BB
Câu lệnh switch (thiếu)
switch (<Biến/BT>)
{
Đ
<Biến/BT>
<Lệnh 1> case <GT1>:<L1>;break;
= <GT1>
case <GT2>:<L2>;break;
S …
Đ
<Biến/BT>
= <GT2>
<Lệnh 2> }
S <Biến/BT> là biến/biểu thức
cho giá trị rời rạc.
<Lệnh> : đơn hoặc khối lệnh
{}.

Biên Soạn: ThS.Lương Hoài Thương


153
&
VC
BB
Câu lệnh switch (thiếu)

void main()
{
int a;
printf(“Nhap a: ”);
scanf(“%d”, &a);

switch (a)
{
case 1 : printf(“Mot”); break;
case 2 : printf(“Hai”); break;
case 3 : printf(“Ba”); break;
}
}

Biên Soạn: ThS.Lương Hoài Thương


154
&
VC
BB
Câu lệnh switch (đủ)
switch (<Biến/BT>)
{
Đ
<Biến/BT>
<Lệnh 1> case <GT1>:<L1>;break;
= <GT1>
case <GT2>:<L2>;break;
S …
<Biến/BT> Đ default:
<Lệnh 2>
= <GT2>
<Lệnh n>;
S
}
<Lệnh n>

Biên Soạn: ThS.Lương Hoài Thương


155
&
VC
BB
Câu lệnh switch (đủ)

void main()
{
int a;
printf(“Nhap a: ”);
scanf(“%d”, &a);

switch (a)
{
case 1 : printf(“Mot”); break;
case 2 : printf(“Hai”); break;
case 3 : printf(“Ba”); break;
default : printf(“Ko biet doc”);
}
}

Biên Soạn: ThS.Lương Hoài Thương


156
&
VC
BB
Câu lệnh switch - Một số lưu ý

Câu lệnh switch là một câu lệnh đơn và có thể lồng nhau.

{
switch (a)
{
case 1 : printf(“Mot”); break;
case 2 : switch (b)
{
case 1 : printf(“A”); break;
case 2 : printf(“B”); break;
} break;
case 3 : printf(“Ba”); break;
default : printf(“Khong biet doc”);
}
}
Biên Soạn: ThS.Lương Hoài Thương
157
&
VC
BB
Câu lệnh switch - Một số lưu ý

Các giá trị trong mỗi trường hợp phải khác nhau.

switch (a)
{
case 1 : printf(“Mot”); break;
case 1 : printf(“MOT”); break;
case 2 : printf(“Hai”); break;
case 3 : printf(“Ba”); break;
case 1 : printf(“1”); break;
case 1 : printf(“mot”); break;
default : printf(“Khong biet doc”);
}

Biên Soạn: ThS.Lương Hoài Thương


158
&
VC
BB
Câu lệnh switch - Một số lưu ý

switch sẽ nhảy đến case tương ứng và thực hiện đến khi nào gặp
break hoặc cuối switch sẽ kết thúc.

switch (a)
{
case 1 : printf(“Mot”); break;
case 2 : printf(“Hai”); break;
case 3 : printf(“Ba”); break;
}

Biên Soạn: ThS.Lương Hoài Thương


159
&
VC
BB
Câu lệnh switch - Một số lưu ý

switch nhảy đến case tương ứng và thực hiện đến khi nào gặp
break hoặc cuối switch sẽ kết thúc.

switch (a)
{
case 1 : printf(“Mot”); break;
case 2 : printf(“Hai”); break;
case 3 : printf(“Ba”); break;
}
switch (a)
{
case 1 : printf(“Mot”); break;
case 2 : printf(“Hai”); break;
case 3 : printf(“Ba”); break;
} Biên Soạn: ThS.Lương Hoài Thương 160
&
VC
BB
Câu lệnh switch - Một số lưu ý

Tận dụng tính chất khi bỏ break;


switch (a)
{
case 1 : printf(“So le”); break;
case 2 : printf(“So chan”); break;
case 3 : printf(“So le”); break;
case 4 : printf(“So chan”); break;
}
switch (a)
{
case 1 :
case 3 : printf(“So le”); break;
case 2 :
case 4 : printf(“So chan”); break;
}
Biên Soạn: ThS.Lương Hoài Thương 161
&
VC
BB
Kinh nghiệm lập trình

 Câu lệnh if  Câu lệnh switch

if (a == 1) switch (a)
printf(“Mot”); {
if (a == 2) case 1: printf(“Mot”);
printf(“Hai”); break;
if (a == 3) case 2: printf(“Hai”);
printf(“Ba”); break;
if (a == 4) case 3: printf(“Ba”);
printf(“Bon”); break;
if (a == 5) case 4: printf(“Bon”);
printf(“Nam”); break;
case 5: printf(“Nam”);
}

Biên Soạn: ThS.Lương Hoài Thương


162
&
VC
BB
Kinh nghiệm lập trình

 Câu lệnh switch  Câu lệnh if

switch (a) if (a == 3.14)


{ printf(“OK”);
case 3.14: if (a < 10)
case <10: printf(“OK”);
case 1: printf(“OK”); if (a == 1)
break; printf(“OK”);
case 2: if (a == 2 || a == 3)
case 3: printf(“OK”); printf(“OK”);
break;
}

Biên Soạn: ThS.Lương Hoài Thương


163
&
VC
BB
MỘT SỐ VÍ DỤ

* Nhập vào số nguyên không âm, đưa ra ngày trong tuần tương
ứng (theo số dư khi chia cho 7).
* Trong một năm các tháng có 30 ngày là 4, 6, 9, 11 còn các
tháng có 31 ngày là 1, 3, 5, 7, 8, 10, 12. Riêng tháng hai có thể
có 28 hoặc 29 ngày. Hãy viết chương trình nhập vào 1 tháng,
sau đó đưa ra kết luận tháng đó có bao nhiêu ngày.

Biên Soạn: ThS.Lương Hoài Thương


164
&
VC
BB
MỘT SỐ VÍ DỤ

Viết chương trình đọc màu của điện trở

Biên Soạn: ThS.Lương Hoài Thương


165
&
VC
BB
MỘT SỐ VÍ DỤ
#include <stdio.h>
int main(void)
{
unsigned int colour;
/* char or unsigned char could also be used */
printf("Enter value of colour band(0-9)>>");
scanf("%u",&colour);
printf("Resistor colour band is ");
switch (colour)
{ case 0: printf("BLACK"); break;
case 1: printf("BROWN"); break;
case 2: printf("RED"); break;
case 3: printf("ORANGE"); break;
case 4: printf("YELLOW"); break;
case 5: printf("GREEN"); break;
case 6: printf("BLUE"); break;
case 7: printf("VIOLET"); break;
default: printf(“ko co mau dt"); break;
}
return(0); 166
Biên Soạn: ThS.Lương Hoài Thương
}
&
VC
BB
MỘT SỐ VÍ DỤ

Tính R biết các thông số l, r


nhập từ bàn phím. Hệ số điện
trở suất được cài đặt trong
chương trình

Biên Soạn: ThS.Lương Hoài Thương


167
&
VC
BB
MỘT SỐ VÍ DỤ
printf("Enter radius and length of conductor >>");
#include <stdio.h> scanf("%f %f",&radius,&length);
#include <math.h> area=PI*(radius*radius);
#include <ctype.h> switch (tolower(ch))
#include <stdlib.h> {
#define RHO_COPPER 17e-9 case 'c': rho=RHO_COPPER; break;
#define RHO_AL 25.4e-9 case 'a': rho=RHO_AL; break;
#define RHO_SILVER 16e-9 case 's': rho=RHO_SILVER; break;
#define RHO_MAGANESE 1400e-9 case 'm': rho=RHO_MAGANESE; break;
#define PI 3.14 default: puts("Invalid option"); exit(0); break;
int main(void) }
{ resistance= rho*length/area;
float radius,length,area,rho,resistance; printf("Resistance of conductor is %.3e ohm",resistance);
char ch; return(0);
puts("Type of conductor >>"); }
puts("(c)opper");
puts("(a)luminum");
puts("(s)ilver");
puts("(m)aganese");
ch=getchar();

Biên Soạn: ThS.Lương Hoài Thương


168
&
VC CÂU LỆNH RẼ NHÁNH KHÔNG ĐIỀU KIỆN
BB

label
 Lệnh goto chuyển điều khiển đến một câu lệnh bất kỳ
khác bên trong cùng một hàm trong một chương trình C
 Điều này thật ra vi phạm đến qui luật của một ngôn ngữ
lập trình cấu trúc.
 Chúng làm giảm độ tin cậy của chương trình và chương
trình khó bảo trì.

Biên Soạn: ThS.Lương Hoài Thương


171
&
VC CÂU LỆNH RẼ NHÁNH KHÔNG ĐIỀU KIỆN
BB

#include<stdio.h>
int m;
int main()
{ hi:
printf("dien dien tu tra vinh VLVH\n");
goto hi;
}

Biên Soạn: ThS.Lương Hoài Thương


172
&
VC CÂU LỆNH RẼ NHÁNH KHÔNG ĐIỀU KIỆN
BB

Hàm

 Hàm exit() được sử dụng để thoát khỏi chương trình


 Sử dụng hàm này sẽ kết thúc ngay chương trình và điều
khiển được chuyển về cho hệ điều hành
 Hàm exit thuộc thư viện stdlib.h

Biên Soạn: ThS.Lương Hoài Thương


173
&
VC
BB
Viết chương trình thực hiện chức năng sau

Biên Soạn: ThS.Lương Hoài Thương


174
&
VC
BB

Biên Soạn: ThS.Lương Hoài Thương


175
&
VC
BB
Bài tập

1. Nhập một số bất kỳ. Hãy đọc giá trị của số nguyên đó nếu nó có
giá trị từ 1 đến 9, ngược lại thông báo không đọc được.
2. Nhập một chữ cái. Nếu là chữ thường thì đổi sang chữ hoa,
ngược lại đổi sang chữ thường.
3. Giải phương trình bậc nhất ax + b = 0.
4. Giải phương trình bậc hai ax2 + bx + c = 0.

Biên Soạn: ThS.Lương Hoài Thương


176
&
VC
BB
Bài tập

5. Nhập 4 số nguyên a, b, c và d. Tìm số có giá trị nhỏ nhất (min).


6. Nhập 4 số nguyên a, b, c và d. Hãy sắp xếp giá trị của 4 số nguyên
này theo thứ tự tăng dần.
7. Tính tiền đi taxi từ số km nhập vào. Biết:
a. 1 km đầu giá 15000đ
b. Từ km thứ 2 đến km thứ 5 giá 13500đ
c. Từ km thứ 6 trở đi giá 11000đ
d. Nếu trên 120km được giảm 10% tổng tiền.

Biên Soạn: ThS.Lương Hoài Thương


177
&
VC
BB
Bài tập

8. Nhập vào tháng và năm. Cho biết tháng đó có bao nhiêu ngày.
9. Nhập độ dài 3 cạnh 1 tam giác. Kiểm tra đó có phải là tam giác không
và là tam giác gì?

Biên Soạn: ThS.Lương Hoài Thương


178
&
VC
BB

10. Viết chương trình khoá số điện tử, nếu nhấn đúng
phím cho đèn hiển thị sáng, nếu sai có đèn báo nhập lại
MK:123

Biên Soạn: ThS.Lương Hoài Thương


179
&
VC
BB

11. Viết chương trình mạch game trò chơi dành cho 3 đội chơi,
nếu đội nào nhấn trước thì các đội khác không tác động được, có
đèn hiển thị cho mỗi đội chơi đó.

Biên Soạn: ThS.Lương Hoài Thương


180
&
VC
BB
12. Viết chương trình điều khiển động quạt với 4 nút nhấn
sau:
S1 ấn thì động cơ on/off.
S2 ấn thì động cơ quay tốc độ 1.
S3 ấn thì động cơ quay tốc độ 2.
S4 ấn thì động cơ quay tốc độ 3.

Biên Soạn: ThS.Lương Hoài Thương


181
&
VC
BB

13. Viết chương trình tính giá trị của điện trở với 3 vòng
màu (bỏ qua sai số)

Biên Soạn: ThS.Lương Hoài Thương


182
KỸ THUẬT LẬP TRÌNH

CÂU LỆNH LẶP

Biên Soạn: ThS.Lương Hoài Thương


183
&
VC
BB
Nội dung

1 Câu lệnh for

2 Câu lệnh while

3 Câu lệnh do… while

4 Một số kinh nghiệm lập trình

Biên Soạn: ThS.Lương Hoài Thương


184
&
VC
BB
Đặt vấn đề
Ví dụ
 Viết chương trình xuất các số từ 1 đến 10
=> Sử dụng 10 câu lệnh printf
 Viết chương trình xuất các số từ 1 đến 1000
=> Sử dụng 1000 câu lệnh printf !

Giải pháp
 Sử dụng cấu trúc lặp lại một hành động trong khi còn
thỏa một điều kiện nào đó.
 3 lệnh lặp: for, while, do… while
Biên Soạn: ThS.Lương Hoài Thương
185
&
VC
BB
Câu lệnh for

<Khởi đầu>

<Bước nhảy>

Đ
<Đ/K lặp> <Lệnh>

for (<Khởi đầu>; <Đ/K lặp>; <Bước nhảy>)


<Lệnh>; <Khởi đầu>, <Đ/K lặp>, <Bước nhảy>:
là biểu thức C bất kỳ có chức năng riêng
<Lệnh>: đơn hoặc khối lệnh.
Biên Soạn: ThS.Lương Hoài Thương
186
&
VC
BB
Câu lệnh for

void main()
{
int i;
for (i = 0; i < 10; i++)
printf(“%d\n”, i);

for (int j = 0; j < 10; j = j + 1)


printf(“%d\n”, j);

for (int k = 0; k < 10; k += 2)


{
printf(“%d”, k);
printf(“\n”);
}
}

Biên Soạn: ThS.Lương Hoài Thương


187
&
VC
BB
Câu lệnh for - Một số lưu ý

Câu lệnh for là một câu lệnh đơn và có thể lồng nhau.

if (n < 10 && m < 20)


{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
printf(“%d”, i + j);
printf(“\n”);
}
}
}

Biên Soạn: ThS.Lương Hoài Thương


188
&
VC
BB
Câu lệnh for - Một số lưu ý

Trong câu lệnh for, có thể sẽ không có phần <Khởi đầu>

int i;
for (i = 0; i < 10; i++)
printf(“%d\n”, i); <Khởi đầu>

int i = 0; <Bước nhảy>


for (; i < 10; i++)
printf(“%d\n”, i); Đ
<Đ/K lặp> <Lệnh>

Biên Soạn: ThS.Lương Hoài Thương


189
&
VC
BB
Câu lệnh for - Một số lưu ý

Trong câu lệnh for, có thể sẽ không có phần <Bước nhảy>

int i;
for (i = 0; i < 10; i++)
printf(“%d\n”, i); <Khởi đầu>

for (i = 0; i < 10; ) <Bước nhảy>


{
printf(“%d\n”, i); Đ
<Đ/K lặp> <Lệnh>
i++;
}
S

Biên Soạn: ThS.Lương Hoài Thương


190
&
VC
BB
Câu lệnh for - Một số lưu ý

Trong câu lệnh for, có thể sẽ không có phần <Đ/K lặp>

int i;
for (i = 0; i < 10; i++)
printf(“%d\n”, i);

for (i = 0; ; i++)
printf(“%d\n”, i);

for (i = 0; ; i++)
{
if (i >= 10)
break;
printf(“%d\n”, i);
}
Biên Soạn: ThS.Lương Hoài Thương
191
&
VC
BB
Lệnh break làm kết thúc câu lệnh.
Lệnh continue bỏ qua lần lặp hiện tại.

Biên Soạn: ThS.Lương Hoài Thương


192
&
VC
BB
Câu lệnh for - Một số lưu ý

for (i = 0; i < 10; i++)


{
if (i % 2 == 0)
break;
printf(“%d\n”, i);
}

for (i = 0; i < 10; i++)


{
if (i % 2 == 0)
continue;
printf(“%d\n”, i);
}

193
Biên Soạn: ThS.Lương Hoài Thương
&
VC
BB
Câu lệnh for - Một số lưu ý

Không được thêm ; ngay sau lệnh lệnh for.


=> Tương đương câu lệnh rỗng.
for (i = 0; i < 10; i++);
{
printf(“%d”, i);
printf(“\n”);
}

for (i = 0; i < 10; i++)


{
};
{
printf(“%d”, i);
printf(“\n”);
}
Biên Soạn: ThS.Lương Hoài Thương
194
&
VC
BB
Câu lệnh for - Một số lưu ý

Các thành phần <Khởi đầu>, <Đ/K lặp>,


<Bước nhảy> cách nhau bằng dấu ;
Nếu có nhiều thành phần trong mỗi phần thì được cách nhau
bằng dấu ,
for (int i = 1, j = 2; i + j < 10; i++, j += 2)
printf(“%d\n”, i + j);

Biên Soạn: ThS.Lương Hoài Thương


195
&
VC
BB
MỘT SỐ VÍ DỤ

Viết chương trình in ra các số nguyên lẻ nhỏ hơn 100

Viết chương trình nhập vào số n và đưa ra n!

Nhap n : 6
Ket qua là 720

Biên Soạn: ThS.Lương Hoài Thương


196
&
VC
BB
MỘT SỐ VÍ DỤ
Viết chương in ra bảng cửu chương từ 2 đến 9 như hình sau

Biên Soạn: ThS.Lương Hoài Thương


197
&
VC
BB
MỘT SỐ VÍ DỤ
Có 3 loại giấy bạc 100đ, 200đ, 500đ. Viết chương trình in các
phương án kết hợp các loại giấy bạc trên cho ra 1000đ.

Biên Soạn: ThS.Lương Hoài Thương


198
&
VC
BB
MỘT SỐ VÍ DỤ
Hiển thị các ký tự mã ascii với ký bắt đầu #include <stdio.h>
và kết thúc nhập từ bàn phím int main(void)
{
int i,start,end;
Bắt đầu printf("Enter start and end for ASCII
characters >>");
scanf("%d %d",&start,&end);
Nhập start puts("INTEGER HEX ASCII");
end
for (i=start;i<=end;i++)
Đếm ++ printf("%5d %5x %5c\n",i,i,i);
return(0);
Đ }
Đếm<= end? In ký tự

S
Kết thúc

Biên Soạn: ThS.Lương Hoài Thương


199
&
VC
BB
MỘT SỐ VÍ DỤ
#include <stdio.h>
Đổi số thập phân sang nhị phân dùng lệnh for
int main(void)
{
Mặt nạ che bit int val, bit;
printf("Enter value >>");
scanf("%d",&val);
Số thập phân & mặt nạ printf("Binary value is ");
True for(bit=0x80;bit>0;bit>>=1)
{ if (bit & val) printf("1");
False else printf("0");
}
return(0);
Kiểm tra mặt nạ >0 đúng làm cv tiếp }
sai kết thúc cv

Khắc Phục khi số thập phân nhập lớn hơn 255

Biên Soạn: ThS.Lương Hoài Thương


200
&
VC
BB
Khảo sát quá trình quá độ của mạch RC

Điện áp ( sụt áp) trên điện trở và tụ điện là

Điện áp này phụ thuộc vào t

Để khảo sát quá trình quá độ của


mạch thì phải tinh Vr tai những thời
điểm khác nhau từ đó vẽ đồ thị

Biên Soạn: ThS.Lương Hoài Thương


201
&
VC
BB
MỘT SỐ VÍ DỤ
#include <math.h>
#include <stdio.h>
Int main(void)
{ float R,C,tend,t,E,Vr;
int tsteps;
puts("Program to determine voltage across");
puts("Resistor in an RC circuit ");
printf("Enter R,C >> ");scanf("%f %f",&R,&C);
printf("Enter number of time steps and end time>>");
scanf("%d %f",&tsteps,&tend);
printf("Enter voltage step applied>>");scanf("%f",&E);
puts(" TIME VOLTAGE");
for (t=0;t<tend;t+=tend/tsteps)
{ Vr=E*exp(-t/(R*C));
printf("%8.4f %8.2f\n",t,Vr);
}
return(0);
}

Biên Soạn: ThS.Lương Hoài Thương


202
&
VC
BB
MỘT SỐ VÍ DỤ

Các vòng lập lồng nhau

Ta thấy: C đổi trạng thái theo 2^0


B đổi trạng thái theo 2^1
A đổi trạng thái theo 2^2
Biên Soạn: ThS.Lương Hoài Thương
203
&
VC
BB

Lưu Đồ
START

A=0

A++ C++ Z
S
Đ Đ
B=0 B<=1 C=0 C<=1
A<=1
Đ
S
S
B++
END

Biên Soạn: ThS.Lương Hoài Thương


204
&
VC
BB
MỘT SỐ VÍ DỤ
#include <stdio.h>
int main(void)
{ int A,B,C,Z;
puts("Boolean function NOR (AND(A,B),C)");
puts(" A B C Z");
for (A=0;A<=1;A++)
for (B=0;B<=1;B++)
for (C=0;C<=1;C++)
{ Z=!( (A && B) || C);
printf("%4d %4d %4d %4d\n",A,B,C,Z);
}
return(0);
}

Biên Soạn: ThS.Lương Hoài Thương


205
&
VC
BB
Câu lệnh while

Đ
<Đ/K lặp> <Lệnh>

S Biểu thức C bất kỳ,


thường là biểu thức
quan hệ cho kết quả
0 (sai) và != 0 (đúng)
while (<Đ/K lặp>)
<Lệnh>;
Câu lệnh đơn hoặc
Câu lệnh phức (kẹp
giữa { và })

Biên Soạn: ThS.Lương Hoài Thương


208
&
VC
BB
Câu lệnh while

int i = 0;
while (i < 10)
{
printf(“%d\n”, i);
i++;
}

for (int i = 0; i < 10; i++)


printf(“%d\n”, i);

int i = 0;
for (; i < 10; )
{
printf(“%d\n”, i);
i++;
}
Biên Soạn: ThS.Lương Hoài Thương
209
&
VC
BB
Câu lệnh while - Một số lưu ý

Câu lệnh while là một câu lệnh đơn và có thể lồng nhau.

if (n < 10 && m < 20)


{
while (n >= 1)
{
while (m >= 1)
{
printf(“%d”, m);
m--;
}
n--;
}
}

Biên Soạn: ThS.Lương Hoài Thương


210
&
VC
BB
Câu lệnh while - Một số lưu ý

Câu lệnh while có thể không thực hiện lần nào do điều kiện lặp
ngay từ lần đầu đã không thỏa.
void main()
{
int n = 1;
while (n > 10)
{
printf(“%d\n”, n);
n--;
}

}

Biên Soạn: ThS.Lương Hoài Thương


211
&
VC
BB
Câu lệnh while - Một số lưu ý

Không được thêm ; ngay sau lệnh lệnh while.


int n = 0;
while (n < 10);
{
printf(“%d\n”, n);
n++;
}

while (n < 10)


{
};
{
printf(“%d\n”, n);
n++;
}
Biên Soạn: ThS.Lương Hoài Thương
212
&
VC
BB
Câu lệnh while - Một số lưu ý

Câu lệnh while có thể bị lặp vô tận (loop)


void main()
{
int n = 1;
while (n < 10)
{
printf(“%d”, n);
n--;
}

n = 1;
while (n < 10)
printf(“%d”, n);
}

Biên Soạn: ThS.Lương Hoài Thương


213
&
VC
BB
Ví dụ

Viết chương trình nhập vào số n và đưa tổng của n số nguyên


đầu tiên.

Nhap n : 96
Ket qua la: 4656

Biên Soạn: ThS.Lương Hoài Thương


214
&
VC
BB
Câu lệnh do… while

<Lệnh>

Đ
<Đ/K lặp>

S Câu lệnh đơn hoặc


Câu lệnh phức (kẹp
do giữa { và })

<Lệnh>;
Biểu thức C bất kỳ,
while (<Đ/K lặp>); thường là biểu thức
quan hệ cho kết quả
0 (sai) và != 0 (đúng)
Biên Soạn: ThS.Lương Hoài Thương
215
&
VC
BB
Câu lệnh do… while

int i = 0;
do
{
printf(“%d\n”, i);
i++;
}
while (i < 10);

int i = 0;
printf(“%d\n”, i);
i++;
for (; i < 10; )
{
printf(“%d\n”, i);
i++;
}
Biên Soạn: ThS.Lương Hoài Thương
216
&
VC
BB
Câu lệnh do… while - Một số lưu ý

Câu lệnh do… while là một câu lệnh đơn và có thể lồng nhau.

int a = 1, b;
do
{
b = 1;
do
{
printf(“%d\n”, a + b);
b = b + 2;
}
while (b < 20);
a++;
}
while (a < 20);
Biên Soạn: ThS.Lương Hoài Thương
217
&
VC
BB
Câu lệnh do… while - Một số lưu ý

Câu lệnh do… while sẽ được thực hiện ít nhất 1 lần do điều kiện
lặp được kiểm tra ở cuối.
void main()
{
int n;
do
{
printf(“Nhap n: ”);
scanf(“%d”, &n);
}
while (n < 1 || n > 100);
}

Biên Soạn: ThS.Lương Hoài Thương


218
&
VC
BB
Câu lệnh do… while - Một số lưu ý

Câu lệnh do… while có thể bị lặp vô tận (loop)



int n = 1;
do
{
printf(“%d”, n);
n--;
}
while (n < 10);

n = 1;
do
printf(“%d”, n);
while (n < 10);

Biên Soạn: ThS.Lương Hoài Thương
219
&
VC
BB
for, while, do… while

Đều có khả năng lặp lại nhiều hành động.


int n = 10;
for (int i = 1; i <= n; i++)
printf(“%d\n”, i);

int i = 1;
while (i <= n)
{
printf(“%d\n”, i); i++;
}

int i = 1;
do {
printf(“%d\n”, i); i++;
} while (i < n);
Biên Soạn: ThS.Lương Hoài Thương
220
&
VC
BB
for, while, do… while

Số lần lặp xác định ngay trong câu lệnh for
int n = 10;
for (int i = 1; i <= n; i++)
…;

int i = 1;
while (i <= n)
{
…;
}

int i = 1;
do {
…;
} while (i > n);
Biên Soạn: ThS.Lương Hoài Thương
221
&
VC
BB
while & do… while

while có thể không thực hiện lần nào.


do… while sẽ được thực hiện ít nhất 1 lần.
int n = 100;
while (n < 10)
{
…;
}

do
{
printf(“Nhap n: ”);
scanf(“%d”, &n);
}
while (n > 10);
Biên Soạn: ThS.Lương Hoài Thương
222
&
VC
BB
Một số ví dụ
 Nhập vào điểm của một sinh viên, nếu điểm đó không  [0, 10] thì thông
báo cho người dùng nhập lại.

 Cách làm:
 Nếu dùng lệnh if  Chỉ kiểm tra được 1 lần
 Không dùng for được vì chưa biết trước số lần lặp.
 Sử dụng vòng lặp while/ do while
Biên Soạn: ThS.Lương Hoài Thương
223
&
VC
BB
Một số ví dụ Bắt đầu

Viết chương trình thực hiện nhập vào


i¬0
một dãy số cho tới khi S¬0

 Tổng của dãy lớn hơn 1550 hoặc là


Nhập số a

 Số phần tử trong dãy lớn hơn 100 S ¬ S+a

i ¬ i+1

s s
i > 100 S > 1550
đ đ

Kết thúc

Biên Soạn: ThS.Lương Hoài Thương


224
&
VC
BB
Một số ví dụ

Viết chương trình tính tiền điện của khách hàng A sử dụng
trong tháng.
1-50 kWh : 500 tiền.
51-100 kWh : 1000 tiền.
Trên 100 kWh : 1500 tiền.
và có thêm dòng thông báo y/n để nhập lại hoặc thoát chương
trình.

Biên Soạn: ThS.Lương Hoài Thương


225
&
VC
BB
Một số ví dụ

Thực hiện lại ví dụ 3.4 tính giá trị điện trở tương đương trong 2 trường
hợp song song và nối tiếp.
Khi hiển thị kết quả điện trở tương đương, đồng thời có thêm dòng thông
báo y/n
Nếu chọn y tiếp tục tính giá trị điện trở tương đương. Nếu chon n kết thúc
chương trình.

Biên Soạn: ThS.Lương Hoài Thương


226
&
VC
BB
MỘT SỐ VÍ DỤ

Ví dụ 4.11 chương trình nhập vào các giá trị A, B, C


tính Z được cho bởi ( nếu A, B, C nhập vào khác 0
và 1 thi thông báo nhập lại giá trị)

Biên Soạn: ThS.Lương Hoài Thương


227
&
VC
BB

#include <stdio.h>
int main(void)
{ int A,B,C,Z;
do { printf("Enter A input (0 or 1) >>");
scanf("%d",&A);
if ( (A!=0) && (A!=1) ) puts("Invalid input");
} while ( (A!=0) && (A!=1)) ;
do { printf("Enter B input (0 or 1) >>");
scanf("%d",&B);
if ( (B!=0) && (B!=1) ) puts("Invalid input");
} while ( (B!=0) && (B!=1)) ;
do { printf("Enter C input (0 or 1) >>");
scanf("%d",&C);
if ( (C!=0) && (C!=1) ) puts("Invalid input");
} while ( (C!=0) && (C!=1)) ;
Z=!((A && B) || C);
printf("Output will be %d\n",Z);
return(0);
}
Biên Soạn: ThS.Lương Hoài Thương
228
&
VC
BB
MỘT SỐ VÍ DỤ

Biên Soạn: ThS.Lương Hoài Thương


229
&
VC
BB

Biên Soạn: ThS.Lương Hoài Thương


230
&
VC
BB
Bài tập

1. Nhập một số nguyên dương n (n > 0).


Hãy cho biết:
a. Có phải là số đối xứng? Ví dụ: 121, 12321, …
b. Có phải là số chính phương? Ví dụ: 4, 9, 16, …
c. Có phải là số nguyên tố? Ví dụ: 2, 3, 5, 7, …
d. Chữ số lớn nhất và nhỏ nhất?
e. Các chữ số có tăng dần hay giảm dần không?

Biên Soạn: ThS.Lương Hoài Thương


231
&
VC
BB
Bài tập

2. Nhập một số nguyên dương n. Tính:


a. S = 1 + 2 + … + n
b. S = 12 + 22 + … + n2
c. S = 1 + 1/2 + … + 1/n
d. S = 1*2*…*n = n!
e. S = 1! + 2! + … + n!
3. Nhập 3 số nguyên a, b và n với a, b < n. Tính tổng các số nguyên
dương nhỏ hơn n chia hết cho a nhưng không chia hết cho b.
4. Tính tổng các số nguyên tố nhỏ hơn n (0 < n < 50)

Biên Soạn: ThS.Lương Hoài Thương


232
&
VC
BB
Bài tập

5. Nhập một số nguyên dương n. Xuất ra số ngược lại. Ví dụ: Nhập


1706  Xuất 6071.
6. Tìm và in lên màn hình tất cả các số nguyên trong phạm vi từ 10 đến
99 sao cho tích của 2 chữ số bằng 2 lần tổng của 2 chữ số đó.
7. Tìm ước số chung lớn nhất của 2 số nguyên dương a và b nhập từ
bàn phím.

Biên Soạn: ThS.Lương Hoài Thương


233
&
VC A B C D
BB
0 0 0 0
0 0 0 1 8. In ra màn hình
0 0 1 0
0 0 1 1 bảng số nhị phân
0 1 0 0 4 bít.
0 1 0 1
0 1 1 0
0 1 1 1
1 0 0 0
1 0 0 1
1 0 1 0
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
234
1 1 1 1 Biên Soạn: ThS.Lương Hoài Thương
&
VC A B C D AND OR EX-OR NOR
BB
0 0 0 0
0 0 0 1
0 0 1 0
9. Dựa vào kết quả
0 0 1 1 ở câu 8 hãy in
0 1 0 0 ra bảng trạng
0 1 0 1 thái của cổng
0 1 1 0
AND
0 1 1 1
1 0 0 0 OR

1 0 0 1 EX-OX
1 0 1 0
NOR
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
235
1 1 1 1 Biên Soạn: ThS.Lương Hoài Thương
&
VC
BB
Bài tập

10. Viết chương trình in ra màn hình bảng trạng thái ABCD và giá trị
của hàm Y. Cuối dòng kết quả có thêm thông báo Y/N

Biên Soạn: ThS.Lương Hoài Thương


236
KỸ THUẬT LẬP TRÌNH

MẢNG MỘT CHIỀU

Biên Soạn: ThS.Lương Hoài Thương


257
&
VC
BB
Nội dung

1 Khái niệm

2 Khai báo

3 Truy xuất dữ liệu kiểu mảng

4 Một số bài toán trên mảng 1 chiều

Biên Soạn: ThS.Lương Hoài Thương


258
&
VC
BB
Đặt vấn đề
Ví dụ
 Chương trình cần lưu trữ 3 số nguyên?
=> Khai báo 3 biến int a1, a2, a3;
 Chương trình cần lưu trữ 100 số nguyên?
=> Khai báo 100 biến kiểu số nguyên!
 Người dùng muốn nhập n số nguyên?
=> Không thực hiện được!
Giải pháp
 Kiểu dữ liệu mới cho phép lưu trữ một dãy các số nguyên và
dễ dàng truy xuất.
Biên Soạn: ThS.Lương Hoài Thương
259
&
VC
BB
Dữ liệu kiểu mảng

Khái niệm
 Là một kiểu dữ liệu có cấu trúc do người lập trình định nghĩa.
 Biểu diễn một dãy các biến có cùng kiểu. Ví dụ: dãy các số
nguyên, dãy các ký tự…
 Kích thước được xác định ngay khi khai báo và không bao giờ
thay đổi.
 NNLT C luôn chỉ định một khối nhớ liên tục cho một biến kiểu
mảng.

Biên Soạn: ThS.Lương Hoài Thương


260
&
VC
BB
Khai báo mảng tường minh

Cú pháp: <kiểu> <tên> [<n>];


Lưu ý
 Tên: đây là một cái tên đặt đúng theo quy tắc đặt tên của danh biểu.
 n: là một hằng số nguyên, cho biết số lượng phần tử tối đa trong mảng
là bao nhiêu.
 Kiểu: mỗi phần tử của mảng có dữ liệu thuộc kiểu gì.
 Ở đây, ta khai báo một biến mảng gồm có n phần tử, phần tử thứ nhất
là tên [0], phần tử cuối cùng là tên [n -1].

Biên Soạn: ThS.Lương Hoài Thương


261
&
VC
BB
Khai báo biến mảng (tường minh)

Ví dụ
int Mang1Chieu[10];
0 1 2 3 4 5 6 7 8 9

Mang1Chieu

Biên Soạn: ThS.Lương Hoài Thương


262
&
VC
BB
Khai báo mảng không tường minh

Cú pháp <kiểu> <tên> [];


Ví dụ int Mang1Chieu[];

Khi khai báo, không cho biết rõ số phần tử của mảng.


kiểu khai báo này thường được áp dụng trong các trường
hợp: vừa khai báo vừa gán giá trị, khai báo mảng là tham
số hình thức của hàm.

Biên Soạn: ThS.Lương Hoài Thương


263
&
VC
BB
Vừa khai báo vừa gán giá trị

Cú pháp:
<Kiểu> <Tên> []= {Các giá trị cách nhau bởi dấu phẩy}
Ví dụ: int dayso[]={66,65,69,68,67,70};

Biên Soạn: ThS.Lương Hoài Thương


264
&
VC
BB Khởi tạo giá trị cho mảng lúc khai báo

Gồm các cách sau


 Khởi tạo giá trị cho mọi phần tử của mảng
int a[4] = {2912, 1706, 1506, 1904};
0 1 2 3

a 2912 1706 1506 1904

 Khởi tạo giá trị cho một số phần tử đầu mảng


int a[4] = {2912, 1706};

0 1 2 3
a 2912 1706 0 0

Biên Soạn: ThS.Lương Hoài Thương


265
&
VC
BB Khởi tạo giá trị cho mảng lúc khai báo

Gồm các cách sau


 Khởi tạo giá trị 0 cho mọi phần tử của mảng
int a[4] = {0};
0 1 2 3

a 0 0 0 0

 Tự động xác định số lượng phần tử


int a[] = {2912, 1706, 1506, 1904};

0 1 2 3
a 2912 1706 1506 1904

Biên Soạn: ThS.Lương Hoài Thương


266
&
VC
BB
Truy xuất đến một phần tử

Thông qua chỉ số


<tên> [<vị trí phần tử cần truy xuất>];
Ví dụ
 Cho mảng như sau 0 1 2 3

int a[4];
 Các truy xuất
• Hợp lệ: a[0], a[1], a[2], a[3]
• Không hợp lệ: a[-1], a[4], a[5], …
=> Cho kết thường không như mong muốn!

Biên Soạn: ThS.Lương Hoài Thương


267
&
VC
BB
Gán dữ liệu kiểu mảng

Không được sử dụng phép gán thông thường mà phải gán trực
tiếp giữa các phần tử tương ứng

<biến mảng đích> = <biến mảng nguồn>; //sai


<biến mảng đích>[<chỉ số thứ i>] = <giá trị>;
Ví dụ

#define MAX 3
typedef int MangSo[MAX];
MangSo a = {1, 2, 3}, b;

b = a; // Sai
for (int i = 0; i < 3; i++) b[i] = a[i];
Biên Soạn: ThS.Lương Hoài Thương
268
&
VC
BB
Một số lỗi thường gặp

 Khai báo không chỉ rõ số lượng phần tử


 int a[]; => int a[100];
 Số lượng phần tử liên quan đến biến hoặc hằng
 int n1 = 10; int a[n1]; => int a[10];
 const int n2 = 10; int a[n2]; => int a[10];
 Khởi tạo cách biệt với khai báo
 int a[4]; a = {2912, 1706, 1506, 1904};
=> int a[4] = {2912, 1706, 1506, 1904};
 Chỉ số mảng không hợp lệ
 int a[4];
 a[-1] = 1; a[10] = 0;
Biên Soạn: ThS.Lương Hoài Thương
269
&
VC
BB
Truyền mảng cho hàm

Truyền mảng cho hàm


 Tham số kiểu mảng trong khai báo hàm giống như khai báo
biến mảng
void SapXepTang(int a[100]);

 Tham số kiểu mảng truyền cho hàm chính là địa chỉ của
phần tử đầu tiên của mảng
• Có thể bỏ số lượng phần tử hoặc sử dụng con trỏ.
• Mảng có thể thay đổi nội dung sau khi thực hiện hàm.
void SapXepTang(int a[]);
void SapXepTang(int *a);

Biên Soạn: ThS.Lương Hoài Thương


270
&
VC
BB
Truyền mảng cho hàm

Truyền mảng cho hàm


 Số lượng phần tử thực sự truyền qua biến khác
void SapXepTang(int a[100], int n);
void SapXepTang(int a[], int n);
void SapXepTang(int *a, int n);

Lời gọi hàm


void NhapMang(int a[], int &n);
void XuatMang(int a[], int n);
void main()
{
int a[100], n;
NhapMang(a, n);
XuatMang(a, n);
} Biên Soạn: ThS.Lương Hoài Thương
271
&
VC
BB
Một số bài toán cơ bản

Viết hàm thực hiện từng yêu cầu sau


 Nhập mảng
 Xuất mảng
 Tìm kiếm một phần tử trong mảng
 Kiểm tra tính chất của mảng
 Tách mảng / Gộp mảng
 Tìm giá trị nhỏ nhất/lớn nhất của mảng
 Sắp xếp mảng giảm dần/tăng dần
 Thêm/Xóa/Sửa một phần tử vào mảng
Biên Soạn: ThS.Lương Hoài Thương
272
&
VC
BB
Một số ví dụ

* Viết chương trình nhập vào n giá trị điện trở:


- In ra giá trị các điện trở trên màn hình.
- In giá trị điện trở Max và Min.
- Tính giá trị điện trở tương đương trong trường hợp
ghép nối tiếp và song song.
- Cuối dòng có thông báo cho người dùng nhập lại hay
kết thúc chương trình.

Biên Soạn: ThS.Lương Hoài Thương


273
&
VC
BB
Một số ví dụ

• Viết chương trình cho 8 led đơn sáng dần rồi tắt dần.
• Viết chương trình cho led 7 đoạn đếm từ 0-9 sau đó đếm
ngược lại.
• Viết chương trình cho led ma trận hiển thị chữ A.

Biên Soạn: ThS.Lương Hoài Thương


274
KỸ THUẬT LẬP TRÌNH

MẢNG HAI CHIỀU

Biên Soạn: ThS.Lương Hoài Thương


275
&
VC
BB
Nội dung

1 Khái niệm

2 Khai báo

3 Truy xuất dữ liệu kiểu mảng

4 Một số bài toán trên mảng 2 chiều

Biên Soạn: ThS.Lương Hoài Thương


276
&
VC
BB
Khái niệm

Mảng nhiều chiều là mảng có từ 2 chiều trở lên. Người ta thường


sử dụng mảng nhiều chiều để lưu các ma trận, các tọa độ 2
chiều, 3 chiều…

Biên Soạn: ThS.Lương Hoài Thương


277
&
VC Khai báo kiểu mảng 2 chiều không tường minh
BB

Cú pháp <kiểu> <tên>[][<N2>];

 N2: số lượng phần tử chiều thứ 2


Ví dụ
int MaTran[][4];

0 1 2 3

0
Kiểu MaTran 1

2
… Biên Soạn: ThS.Lương Hoài Thương
278
&
VC Khai báo kiểu mảng 2 chiều tường minh
BB

Cú pháp
<kiểu> <tên>[<N1>][<N2>];
N1, N2: số lượng phần tử mỗi chiều

Ví dụ

0 1 2 3

0
Kiểu MaTran 1

Biên Soạn: ThS.Lương Hoài Thương


279
&
VC
BB
Truy xuất đến một phần tử

Thông qua chỉ số


<tên>[<giá trị hàng>][<giá trị cột>]

Ví dụ 0 1 2 3

0
 Cho mảng 2 chiều như sau
1
int a[3][4];
2
 Các truy xuất
• Hợp lệ: a[0][0], a[0][1], …, a[2][2], a[2][3]
• Không hợp lệ: a[-1][0], a[2][4], a[3][3]

Biên Soạn: ThS.Lương Hoài Thương


280
&
VC
BB
Gán dữ liệu kiểu mảng

Không được sử dụng phép gán thông thường mà phải gán trực
tiếp giữa các phần tử
<biến mảng đích> = <biến mảng nguồn>; //sai
<biến mảng đích>[<giá trị cs1>][giá trị cs2] =
<giá trị>;
Ví dụ
int a[5][10], b[5][10];

b = a; // Sai
int i, j;
for (i = 0; i < 5; i++)
for (j = 0; j < 10; j++)
b[i][j] = a[i][j];

Biên Soạn: ThS.Lương Hoài Thương


281
&
VC
BB
Truyền mảng cho hàm

Truyền mảng cho hàm


 Tham số kiểu mảng trong khai báo hàm giống như khai
báo biến mảng
void NhapMaTran(int a[50][100]);

 Tham số kiểu mảng truyền cho hàm chính là địa chỉ của
phần tử đầu tiên của mảng
• Có thể bỏ số lượng phần tử chiều thứ 2 hoặc con trỏ.
• Mảng có thể thay đổi nội dung sau khi thực hiện hàm.
void NhapMaTran(int a[][100]);
void NhapMaTran(int (*a)[100]);

Biên Soạn: ThS.Lương Hoài Thương


282
&
VC
BB
Truyền mảng cho hàm

Truyền mảng cho hàm


 Số lượng phần tử thực sự truyền qua biến khác
void XuatMaTran(int a[50][100], int m, int n);
void XuatMaTran(int a[][100], int m, int n);
void XuatMaTran(int (*a)[100], int m, int n);

Lời gọi hàm


void NhapMaTran(int a[][100], int &m, int &n);
void XuatMaTran(int a[][100], int m, int n);
void main()
{
int a[50][100], m, n;
NhapMaTran(a, m, n);
XuatMaTran(a, m, n);
} Biên Soạn: ThS.Lương Hoài Thương
283
&
VC
BB
Một số bài toán cơ bản

Viết chương trình con thực hiện các yêu cầu sau
 Nhập mảng
 Xuất mảng
 Tìm kiếm một phần tử trong mảng
 Kiểm tra tính chất của mảng
 Tính tổng các phần tử trên dòng/cột/toàn ma trận/đường
chéo chính/nửa trên/nửa dưới
 Tìm giá trị nhỏ nhất/lớn nhất của mảng
…

Biên Soạn: ThS.Lương Hoài Thương


284
&
VC
BB
Ví dụ

* Viết chương trình nhập vào một mảng gồm có nxm


điện trở:
- Tính giá trị điện trở tương đương trong trường hợp
ghép nối tiếp và song song.
- Sau đó in ra giá trị các điện trở trên màn hình.
- Cuối dòng có thông báo cho người dùng nhập lại hay
kết thúc chương trình.

Biên Soạn: ThS.Lương Hoài Thương


285
&
VC
BB

* Viết chương trình cho 8 led đơn sáng dần rồi tắt dần.

* Viết chương trình cho led 7 đoạn đếm từ 0-9 sau đó đếm
ngược lại.

* Viết chương trình cho led ma trận hiển thị chữ A.

Biên Soạn: ThS.Lương Hoài Thương


286
Xâu kí tự
&
VC
BB

Khái niệm xâu kí tự

Khai báo và sử dụng xâu

Các hàm xử lý kí tự

Các hàm xử lý xâu


287 287
&
VC
BB Khái niệm xâu kí tự
Xâu kí tự (string) là một dãy các kí tự viết liên
tiếp nhau
 Độ dài xâu là số kí tự có trong xâu
 Xâu rỗng là xâu không có kí tự nào
Ví dụ: “Tin hoc”, “String”
Lưu trữ: kết thúc xâu bằng kí tự ‘\0’ hay NUL
(mã ASCII là 0)

‘n ‘\0
‘T’ ‘i’ ‘ ‘ ‘h’ ‘o’ ‘c’
‘ ’
288
288
&
VC
BB Khái niệm xâu kí tự: Lưu ý
Xâu kí tự >< mảng kí tự
 Tập hợp các kí tự viết liên tiếp nhau
• Truy nhập một phần tử của xâu ký tự (là một ký tự) giống như truy
nhập vào một phần tử của mảng.
 Xâu kí tự có kí tự kết thúc xâu, mảng kí tự không có kí tự
kết thúc xâu

Xâu kí tự độ dài 1 >< kí tự (“A” =’A’ ?)


 ‘A’ là 1 kí tự, được lưu trữ trong 1 byte
 “A” là 1 xâu kí tự, ngoài kí tự ‘A’ còn có kí tự ‘\0’ =>
được lưu trữ trong 2 byte
289 289
&
VC
BB Khai báo
Cú pháp
char tên_xâu [số_kí_tự_tối_đa];
Lưu ý:
 Để lưu trữ một xâu có n kí tự chúng ta cần một mảng có
kích thước n+1
Ví dụ
 Để lưu trữ xâu “Tin hoc” chúng ta phải khai báo xâu có số
phần tử tối đa ít nhất là 8
char str [8];

290 290
&
VC
BB
Truy cập vào một phần tử của xâu

Giống như truy nhập tới một phần tử của mảng ký tự


Cú pháp:
tên_xâu [chỉ_số_của_kí_tự]
Ví dụ
char quequan[10];
Giả sử xâu này có nội dung là “Ha noi”
 quequan[0] lưu trữ ‘H’
quequan[1] ‘a’
quequan[5] ‘i’
quequan[6] ‘\0’
291 291
&
VC
BB Ví dụ: Nhập vào một xâu và đếm số ký tự ‘*’
#include <stdio.h>
void main(){
char Str[100];
int d=0, i=0;
printf("Nhap xau ky tu: ");
gets(Str);
while(Str[i] != '\0')
{ if(Str[i]=='*')
d++;
i++;
} Tính chiều dài của xâu
printf("Ket qua : %d",d); d=0;
}
while(Str[d] != '\0') d++;
292 292
&
VC
BB Các hàm xử lý kí tự

Tệp tiêu đề :
#include <ctype.h>

293 293
&
VC
BB
Hàm chuyển đổi chữ hoa/chữ thường
int toupper(int ch): chuyển kí tự thường thành
kí tự hoa
toupper(‘a’) => ‘A’
int tolower(int ch): chuyển kí tự hoa thành kí tự
thường
tolower(‘B’) => ‘b’
Ví dụ
do{
……….
printf(“Tiep tuc <C/K>? :”); fflush(stdin);
}while(toupper(getche()) !='K');
294 294
&
VC
BB
Các hàm kiểm tra chữ hoa/chữ thường

int islower(int ch):


 Kiểm tra chữ thường. Hàm trả về giá trị khác 0 nếu
ch là chữ thường, ngược lại trả về 0
• printf("%d ",islower('A'));  0
int isupper(int ch):
 Kiểm tra chữ hoa. Hàm trả về giá trị khác 0 nếu ch
là chữ hoa, ngược lại trả về 0
• printf("%d ",isupper('A'));  1

295 295
&
VC
BB Các hàm kiểm tra chữ cái/chữ số
int isalpha(int ch):
 Kiểm tra xem kí tự trong tham số có phải chữ cái hay
không (‘a’…’z’,’A’,..’Z’). Hàm trả về khác 0 nếu đúng,
ngược lại tả về giá trị bằng 0
• printf("%d ",isalpha('A'));  1
int isdigit(int ch):
 Kiểm tra kí tự trong tham số có phải chữ số (‘0‘,‘1‘,..‘9‘)
hay không. Hàm trả về khác 0 nếu đúng, ngược lại tả về
giá trị bằng 0
• printf("%d ",isdigit('A'));  0
296 296
&
VC
BB Các hàm kiểm tra ký tự đặc biệt
int iscntrl(int ch):
 Kiểm tra kí tự điều khiển (0-31). Hàm trả về khác
0 nếu đúng, ngược lại tả về giá trị bằng 0
int isspace(int ch):
 Kiểm tra kí tự dấu cách (mã 32), xuống dòng
(‘\n’ 10), đầu dòng (‘\r’ 13), tab ngang (‘\t’ 9),
tab dọc (‘\v’ 11). Hàm trả về khác 0 nếu đúng,
ngược lại trả về giá trị bằng 0

297 297
&
VC
BB Ví dụ: Nhập xâu và đếm từ
#include <stdio.h>
#include <ctype.h>
int main(){
char Str[100]; int d=0, i=0;
printf("Nhap xau ky tu: "); gets(Str);
if(Str[0] == '\0') printf(“ Xau rong ");
else{
if( ! isspace(Str[0]) ) d=1;
i=1;
while(Str[i] != '\0'){
if( isspace(Str[i-1] ) && (! isspace(Str[i])) ) d++;
i++;
}
printf("Ket qua : %d",d);
}
} 298 298
&
VC
BB Vào ra xâu kí tự
Tệp tiêu đề: stdio.h / conio.h
Nhập xâu kí tự
 gets(tên_xâu);
 scanf(“%s”,&tên_xâu);
Hiển thị xâu kí tự
 puts(tên_xâu);
 printf(“%s”,tên_xâu);
Sự khác nhau giữa gets và scanf?

299 299
&
VC
BB Các hàm xử lý xâu kí tự

Tệp tiêu đề: string.h


#include <string.h>

300 300
&
VC
BB Các hàm xử lý xâu kí tự
size_t strlen(char[] xâu)
 Trả về độ dài xâu
 printf("%d ",strlen("Hello world"));  11
char[] strcpy(char[] đích, char[] nguồn)
 sao chép xâu, trả về giá trị xâu nguồn
 printf("%s ",strcpy(Str,"Hello"));  Hello
 printf("%s", Str);  Hello
int strcmp(char[] xâu_1, char[] xâu_2)
 So sánh hai xâu.
 Trả về giá trị 0 nếu hai xâu giống nhau;
 Giá trị < 0: xâu_1 < xâu_2 /Giá trị >0: xâu_1 > xâu_2
301 301
&
VC
BB Các hàm xử lý xâu kí tự

char[] strcat(char[] xđích, char[] nguồn)


 Ghép nối xâu nguồn vào ngay sau xâu đích, trả lại xâu kết
quả
char Str[20];
strcpy(Str,"Hello ");
printf("%s ",strcat(Str,"world"));  Hello world
printf("\n%s",Str);  Hello world

302 302
&
VC
BB Các hàm xử lý xâu kí tự
 Khái niệm con trỏ
 Con trỏ là một biến chứa địa chỉ của biến khác
 Khai báo Type * tên_biến
 Toán tử & dùng để lấy địa chỉ của một biến

 Toán tử * dùng tham khảo tới giá trị biến mà con trỏ chỉ
tới
 Ví dụ
int N; int * ptr
ptr = & N;
* ptr  N (*ptr+=10  N+=10)
303 303
&
VC
BB Các hàm xử lý xâu kí tự
char * strchr (char * s, int c)
 Trả về con trỏ trỏ tới vị trí xuất hiện đầu tiên của ký tự c
trong s. Nếu không có trả về con trỏ null
strcpy(Str,"Hello world");
printf("%s ",strchr(Str,‘o'));  o world
char* strstr(char * s1, char * s2
 Trả về con trỏ trỏ tới vị trí xuất hiện đầu tiên của chuỗi s2
trong s1. Nếu không tồn tại, trả về con trỏ null
printf("%s ",strstr(Str,”llo”));  llo world

304 304
&
VC
BB Các hàm xử lý xâu kí tự (tiếp)
Tệp tiêu đề: stdlib.h
int atoi(char[] str):
 Chuyển một xâu kí tự thành một số nguyên tương ứng
int atol(char[] str):
 Chuyển thành số long int
float atof(char[] str):
 Chuyển thành số thực
Thất bại cả 3 hàm: trả về 0

305 305
&
VC
BB Ví dụ: Đảo ngược xâu ký tự
#include<stdio.h>
#include<conio.h>
#include<string.h>
main(){
char s[100],c;
int i, n;
printf("Nhap xau: ");gets(s);
n =strlen(s);
for(i=0;i <n/2;i++){
c = s[i];
s[i] = s[n-i-1];
s[n-i-1]=c;
}
printf("%s",s);
} 306 306
&
VC
BB Kiểm trả xâu ký tự đối xứng
#include<stdio.h>
#include<conio.h>
#include<string.h>
main(){
char s[20];
int i,n;
printf("Nhap vao xau ki tu: ");gets(s);
n=strlen(s);
for(i=0;i<n/2;i++)
if(s[i]!=s[n-1-i])
break;
if(i==n/2)
printf("Xau doi xung");
else
printf("Xau khong doi xung");
307 307
}
&
VC
BB
Đếm số lần xuất hiện chữ cái trong xâu
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#include<string.h>
main(){
char s[20];
int dem[26];
int i,n;
printf("Nhap vao xau ki tu: ");gets(s);
for(i=0;i<26;i++) dem[i]=0;
n=strlen(s);
for(i=0;i<n;i++)
if(isalpha(s[i]))
dem[ tolower(s[i ]) - 'a‘ ]++;
for(i=0;i<26;i++)
if(dem[i]!=0)
printf("Ki tu %c xuat hien %d lan\n",'a'+i,dem[i]);
} 308 308
&
VC
BB Mảng xâu ký tự
Xâu ký tự có thể là kiểu phần tử của mảng
Khai báo
char DS[100][30];
Mảng có tối đa 100 phần tử, các phần tử là
xâu có độ dài tối đa 30
Sử dụng
 Như một mảng bình thường
 Mỗi phần tử mảng được sử dụng như một xâu ký tự

309 309
Nhập vào DSSV cho tới khi gặp tên rỗng, in DS
&
VC
BB
#include <stdio.h>
#include <string.h>
void main(){
int i, n;
char DS[100][30];
printf("Nhap DSSV (<100), go Enter de thoat..\n");
n =0;
do{
printf("Ten sinh vien[%d]: ",n+1);
gets(DS[n]);
if(DS[n][0] !='\x0') n++;
else break; if(strcmp(DS[n],""))n++
if(n==100) break; if(strlen(DS[n])>0) n++
}while(1);
printf(" \n\n DS sinh vien vua nhap \n");
for(i=0;i<n;i++) printf("%s\n",DS[i]);
310 310
}
&
VC
BB

311 311
Nhập vào DS sinh viên, in ra DS đã sắp
&
VC
BB

#include <stdio.h>
#include <string.h>
void main(){
int i, j, N;
char DS[100][30], str[30];
//Nhap DS lop
printf("So sinh vien : "); scanf("%d",&N);
fflush(stdin);
for(i=0;i < N;i++){
printf("Ten sinh vien[%d]: ",i);
gets(DS[i]);
}
312 312
Nhập vào DSSV, in ra DS đã sắp (tiếp)
&
VC
BB

//sap xep theo phuong thuc noi bot


for(i = 0; i < N - 1; i ++)
for(j = i +1; j < N; j ++)
if(strcmp(DS[i],DS[j]) > 0){
strcpy(str,DS[i]);
strcpy(DS[i],DS[j]);
strcpy(DS[j],str);
}

printf("\nDS sinh vien vua nhap \n");


for(i=0;i < N;i++)
printf("%s\n",DS[i]);
} 313 313
&
VC
BB
Nhập vào DSSV, in ra DS đã sắp (tiếp)
//Sap xep theo tên, roi theo ho&dem ho
char ten_i[30],ten_j[30];
for(i = 0; i < N - 1; i ++)
for(j = i +1; j < N; j ++){
strcpy(ten_i,strrchr(DS[i],32));
strcpy(ten_j,strrchr(DS[j],32));
if(strcmp(ten_i,ten_j) > 0){
strcpy(str,DS[i]);
strcpy(DS[i],DS[j]);
strcpy(DS[j],str);
}
} 314 314
&
VC
BB

315 315
KỸ THUẬT LẬP TRÌNH

HÀM – CẤU TRÚC


CHƯƠNG TRÌNH

316
&
VC
BB
7.1. TỔ CHỨC CHƯƠNG TRÌNH

1. Chỉ thị tiền xử ký;

2. Định nghĩa kiểu dữ liệu;

3. Khái báo prototype;

4. Khai báo biến ngoài;

5. Chương trình chính và

6. Cài đặt hàm.


317
&
VC
BB
7.2. HÀM DO NGƯỜI DÙNG ĐỊNH NGHĨA
7.2.1 Mở đầu

7.2.2 Khái niệm và khai báo hàm

7.2.3 Các bước xây dựng hàm

7.2.4 Lời gọi hàm

7.2.5 Hàm Đệ quy

7.2.6 Một số ví dụ

318
&
VC
BB
7.1.1 MỞ ĐẦU

Viết chương trình tính S = a! + b! + c! với a, b, c là 3 số


nguyên dương nhập từ bàn phím.
Chương trình
chính

Nhập Tính Xuất


a, b, c > 0 S = a! + b! + c! kết quả S

Nhập Nhập Nhập Tính Tính Tính


a>0 b>0 c>0 s1=a! s2=b! s3=c!

319
&
VC
BB
7.1.1 MỞ ĐẦU
3 đoạn lệnh nhập a, b, c > 0
do{ printf(“Nhap mot so nguyen duong: ”);
scanf(“%d”,&a);
} while(a<=0);

do{ printf(“Nhap mot so nguyen duong: ”);


scanf(“%d”,&b);
} while(b<=0);

do{ printf(“Nhap mot so nguyen duong: ”);


scanf(“%d”,&c);
} while(c<=0);
320
&
VC
BB
7.1.1 MỞ ĐẦU
3 đoạn lệnh tính s1 = a!, s2 = b!, s3 = c!
for(i=1;i<=a;i++)
s1=s1*i;

for(i=1;i<=b;i++)
s2=s2*i;

for(i=1;i<=c;i++)
s3 = s3 * i;

321
&
VC
BB
7.1.1 MỞ ĐẦU
Giải pháp => Viết 1 lần và sử dụng nhiều lần
 Đoạn lệnh nhập tổng quát, với n = a, b, c
do{ printf(“Nhap mot so nguyen duong:”);
scanf(“%d”,&n);
} while (n<=0);
 Đoạn lệnh tính giai thừa tổng quát, n = a, b, c

for(i=1;i<=n;i++)
s=s*i;

322
&
VC
BB
7.2.2 KHÁI NIỆM

 Một đoạn chương trình có tên, đầu vào và đầu ra.


 Có chức năng giải quyết một số vấn đề chuyên biệt cho
chương trình chính.
 Được gọi nhiều lần với các tham số khác nhau.
 Được sử dụng khi có nhu cầu:
• Tái sử dụng.
• Sửa lỗi và cải tiến.

323
&
VC
BB
7.2.2 KHÁI NIỆM
<kiểu> <tên>([<danh sách tham số đầu vào>])
{ <các câu lệnh>
Cú pháp [return <danh sách giá trị đầu ra>;]
}
 Trong đó
• <kiểu>: Kiểu bất kỳ của C (char, int, long, float,…). Nếu không
trả về thì là void.
• <tên>: theo quy tắc đặt tên định danh.
• <danh sách tham số đầu vào> : Tham số hình thức đầu vào
giống khai báo biến, cách nhau bằng dấu ,
• < danh sách giá trị đầu ra > : Trả về cho hàm qua lệnh return.
324
&
VC
BB
7.2.3 CÁC BƯỚC XÂY DỰNG HÀM

Cần xác định các thông tin sau đây:


 Tên hàm.
 Hàm sẽ thực hiện công việc gì.
 Các đầu vào (nếu có).
 Đầu ra (nếu có).
Đầu vào 1
Tên hàm
Đầu vào 2 Các công việc Đầu ra (nếu có)
Đầu vào n sẽ thực hiện

325
&
VC
BB
7.2.3 CÁC BƯỚC XÂY DỰNG HÀM

Dùng NNLT C hãy xây dựng hàm


trong các trường hợp sau:
A. Viết hàm xuất tổng 2 số nguyên x và y.
B. Viết hàm tính tổng của 2 số nguyên x
và y, sau đó trả về tổng 2 số nguyên đó.
C. Viết hàm nhập xuất tổng 2 số nguyên.

326
&
VC
BB
7.2.3 CÁC BƯỚC XÂY DỰNG HÀM
A. Viết hàm xuất tổng 2 số nguyên x và y
 Tên hàm: XuatTong
 Công việc: tính và xuất tổng 2 số nguyên
 Đầu vào: hai số nguyên x và y
 Đầu ra: không có
void XuatTong(int x, int y)
{
int s;
s = x + y;
printf(“%d cong %d bang %d”, x, y, s);
}

327
&
VC
BB
7.2.3 CÁC BƯỚC XÂY DỰNG HÀM
B. Viết hàm tính tổng của 2 số nguyên x và y, sau đó trả về tổng 2
số nguyên đó.
 Tên hàm: TinhTong
 Công việc: tính và trả về tổng 2 số nguyên
 Đầu vào: hai số nguyên x và y
 Đầu ra: một số nguyên có giá trị x + y
int TinhTong(int x, int y)
{
int s;
s = x + y;
return s;
}

328
&
VC
BB
7.2.3 CÁC BƯỚC XÂY DỰNG HÀM

C. Viết hàm nhập xuất tổng 2 số nguyên.


 Tên hàm: NhapXuatTong
 Công việc: nhập và xuất tổng 2 số nguyên
 Đầu vào: không có
 Đầu ra: không có

void NhapXuatTong()
{
int x, y;
printf(“Nhap 2 so nguyen: ”);
scanf(“%d%d”, &x, &y);
printf(“%d cong %d bang %d”, x, y, x + y);
}
329
&
VC
BB
7.2.4 LỜI GỌI HÀM

Cú pháp
<tên> (<đầu vào 1>,… , <đầu vào n>);

Lưu ý: Gọi tên của hàm đồng thời truyền các đối số cho đầu
vào theo đúng thứ tự đã được khai báo trong hàm.

330
&
VC
BB
7.2.4 LỜI GỌI HÀM
Ví dụ 1
void main()
{ int n = 9;
XuatTong(1, 2);
XuatTong(1, n);
TinhTong(1, 2);
int tong = TinhTong(1, 2);
XuatTong(1);
XuatTong(n);
}
331
&
VC
BB
7.2.4 LỜI GỌI HÀM
#include<stdio.h>
int ham(int a, int b)
{ int s=a^b; return s; }
int c;
int main()
{ c=ham(3,3);
printf("Gia tri S: %d ",c);
}

332
&
VC
BB
7.2.5 HÀM ĐỆ QUY

Khái niệm
Một chương trình con có thể
gọi một chương trình con khác.
Nếu gọi chính nó thì được gọi
là sự đệ quy.
Số lần gọi này phải có giới hạn
(điểm dừng)

333
&
VC
BB
7.2.5 HÀM ĐỆ QUY
Ví dụ: Tính tổng n số nguyên được nhập từ bàn phím
#include <stdio.h>
int tong_n(int n) Giả sử n = 4
{ if(n == 0) return 0; 4 + tong_n(3)
return n + tong_n(n-1); } 4 + 3 + tong_n(2)
int main() 4 + 3 + 2 + tong_n(1)
{ int n; 4 + 3 + 2 + 1 + tong_n(0)
printf("\nNhap n = "); 4+3+2+1+0
scanf("%d", &n);
int tong = tong_n(n);
printf("\nTong n so nguyen: = %d", tong);
} 334
&
VC
BB
7.2.6 MỘT SỐ VÍ DỤ

1. Thực hiện 4.11 chương trình nhập vào các giá trị A, B, C,
tính Z được cho bởi (nếu A, B, C nhập vào khác 0 và 1 thì
thông báo nhập lại giá trị) bằng cách sử dụng hàm.
2. Viết chương trình nhập vào n giá trị điện trở, sau đó in ra giá
trị n điện trở vừa nhập, tìm giá trị max và min của các điện
trở vừa nhập vào, bằng cách sử dụng hàm.

335
&
VC
BB

3. Thực hiện lại ví dụ 3.4 tính giá trị điện trở tương đương trong
2 trường hợp song song và nối tiếp. Khi hiển thị kết quả điện trở
tương đương, đồng thời có thêm dòng thông báo y/n. Nếu chọn
y tiếp tục tính giá trị điện trở tương đương, n kết thúc chương
trình.
Sử dụng HÀM

336
&
VC
BB STRUCT – CẤU TRÚC

Khái niệm cấu trúc

Khai báo và sử dụng cấu trúc

Xử lý dữ liệu cấu trúc

337 337
&
VC
BB Khái niệm cấu trúc
 Một cấu trúc bao gồm các mẫu dữ liệu (không nhất thiết cùng kiểu)
được nhóm lại với nhau.
1 I I L L U S I O N B A C H 1
Biến L
L
U Tên sách Tác giả
Lần
S xuất bản
I
O
N Mảng
338
Khái niệm cấu trúc (tiếp)
&
VC
BB

Khai báo kiểu cấu trúc


struct tên_cấu_trúc
{
<khai báo các trường >
};

 Ví dụ: struct cat {


char bk_name [25];
char author [20];
int edn;
float price;
};
339
&
VC
BB Khai báo biến cấu trúc
Cú pháp:
struct tên_cấu_trúc tên_biến_cấu_trúc;
Ví dụ:
struct sinh_vien a, b, c;
Kết hợp khai báo
struct [tên_cấu_trúc] {
<khai báo các trường dữ liệu>;
} tên_biến_cấu_trúc;

340 340
&
VC
BB Khai báo biến cấu trúc
Các cấu trúc có thể được khai báo lồng nhau
struct diem_thi {
float dToan, dLy, dHoa;
}
struct thi_sinh{
char SBD[10];
char ho_va_ten[30];
struct diem_thi ket_qua;
} thi_sinh_1, thi_sinh_2;
341 341
&
VC
Định nghĩa kiểu dữ liệu với typedef
BB

Với kiểu cấu trúc


typedef struct tên_cũ tên_mới
typedef struct [tên_cũ] {
<khai báo các trường >;
} danh_sách_các_tên_mới;
Chú ý:
 cho phép đặt tên_mới trùng tên_cũ

342 342
&
VC
BB Xử lý dữ liệu cấu trúc

Truy cập các trường dữ liệu

Phép gán giữa các biến cấu trúc

343 343
&
VC
BB Truy cập các trường dữ liệu
Cú pháp
tên_biến_cấu_trúc.tên_trường
Lưu ý
 Dấu “.” là toán tử truy cập vào trường dữ liệu trong
cấu trúc
 Nếu trường dữ liệu là một cấu trúc => sử dụng tiếp
dấu “.” để truy cập vào thành phần mức sâu hơn

344 344
&
VC
BB Ví dụ
#include <stdio.h>
void main(){
struct{
char Ten[20];
struct Date{
int day;
int month;
int year;
} NS;
} SV = {"Tran Anh", 20,12, 1990 };

printf(" Sinh vien %s (%d/%d/%d)",


SV.Ten,SV.NS.day,SV.NS.month,SV.NS.year);
}
345 345
&
VC
BB Phép gán giữa các biến cấu trúc
Muốn sao chép dữ liệu từ biến cấu trúc này sang
biến cấu trúc khác cùng kiểu
 gán lần lượt từng trường trong hai biến cấu trúc => “thủ
công”
 C cung cấp phép gán hai biến cấu trúc cùng kiểu:
biến_cấu_trúc_1 = biến_cấu_trúc_2;

346 346
VC
&

BB
Một số ví dụ

347
&
VC
BB Một số ví dụ
1. Lập trình đọc vào một danh sách không quá 100
sinh viên gồm: Họ tên, năm sinh
1. Đưa ra DS những sinh viên sinh năm 1990
2. Đưa ra DSSV đã sắp xếp theo thứ tự ABC
2. Lập trình đọc vào DS thí sinh gồm Họ tên, điểm
thi 3 môn Toán, Lý,Hóa, kết thúc nhập khi gặp
sinh viên có tên rỗng
1. Đọc tiếp vào một điểm chuẩn; đưa ra danh sách thí sinh
trúng tuyển (không có điểm liệt - 0)
2. Đưa ra thí sinh cao điểm nhất
3. Tìm điểm chuẩn, nếu chỉ lấy K SV, K nhập vào. Nếu có nhiều
người bằng điểm nhau; loại cả
348 348
&
VC
BB
TỆP TIN

KHÁI NIỆM
PHÂN LOẠI
SỬ DỤNG BIẾN TỆP TIN
THAO TÁC TRÊN TỆP TIN

349
Khái niệm
&
VC
BB

Các biến: int, char, struct,.. được lưu trong RAM nên khi kết
thúc chương trình thì dữ liệu cũng bị mất.
Kiểu tệp tin (file) cho phép lưu trữ dữ liệu ở bộ nhớ ngoài. Khi
kết thúc chương trình thì dữ liệu vẫn còn.
Kiểu tệp tin có kích thước và các phần tử không hạn chế, chỉ
phụ thuộc vào dung lượng của bộ nhớ ngoài.

350
Phân loại tệp tin
&
VC
BB

Tệp tin định kiểu (Typed File): gồm nhiều phần tử có cùng
kiểu: char, int, long, cấu trúc… và được lưu trữ trên đĩa dưới
dạng một chuỗi các byte liên tục.
Tệp tin không định kiểu (Untyped File): gồm các cấu trúc dữ
liệu mà không quan tâm đến nội dung hoặc kiểu của nó, chỉ
lưu ý đến các yếu tố vật lý của tệp tin như độ lớn và các yếu
tố tác động lên tệp tin.

351
&
VC
BB
Sử dụng biến loại tệp tin

Biến tệp tin: Dữ liệu chứa trong một tệp tin được truy xuất qua
các thao tác với thông số là biến tệp tin đại diện cho tệp tin đó.
Con trỏ tệp tin: Khi một tệp tin được mở ra để làm việc, tại mỗi
thời điểm, sẽ có một vị trí của tệp tin mà tại đó việc đọc/ghi
thông tin sẽ xảy ra.

352
&
VC
BB
Thao tác trên tệp tin

 Khai báo biến tệp tin


 Cú pháp: FILE <Danh sách các biến con trỏ>
 Các biến là các con trỏ và được phân cách bởi dấu phẩy (,).
 Ví dụ: FILE *f1,*f2;
 Mở tệp tin
 Cú pháp: FILE *fopen(Path, Mode)
 Path: chuỗi chỉ đường dẫn đến tệp tin trên đĩa.
 Mode: chuỗi xác định cách thức mà tệp tin sẽ mở.

353
Mode
&
VC
BB

Chế độ Ý nghĩa
r Mở tệp tin văn bản để đọc
w Tạo ra tệp tin văn bản mới để ghi
a Nối vào tệp tin văn bản
rb Mở tệp tin nhị phân để đọc
wb Tạo ra tệp tin nhị phân để ghi
ab Nối vào tệp tin nhị phân
r+ Mở một tệp tin văn bản để đọc/ghi
w+ Tạo ra tệp tin văn bản để đọc ghi
a+ Nối vào hay tạo mới tệp tin văn bản để đọc/ghi
r+b Mở ra tệp tin nhị phân để đọc/ghi
w+b Tạo ra tệp tin nhị phân để đọc/ghi
a+b Nối vào hay tạo mới tệp tin nhị phân 354
&
VC
BB
Thao tác trên tệp tin

Đóng tệp tin


 Cú pháp: fclose(FILE *f)
 Giá trị trả về của hàm là 0 khi đóng tệp tin thành công.
 Kiểm tra đến cuối tập tin
 Cú pháp: feof(FILE *f)
 Giá trị trả về của hàm là 0 báo rằng đến cuối tệp tin.

355
Ghi dữ liệu vào tệp văn bản
&
VC
BB

 Hàm putc()
• Dùng để ghi một ký tự lên một tệp tin.
• Cú pháp: putc(“nội dung ký tự cần ghi”, tên biến tệp tin)
 Hàm fputs()
• Dùng để ghi một chuỗi ký tự lên tệp tin.
• Cú pháp: int puts((“nội dung chuỗi ký tự cần ghi”, tên biến
tệp tin)

356
&
VC
BB
Ghi dữ liệu vào tệp văn bản
 Hàm fprintf()
• Dùng để ghi dữ liệu có định dạng lên tệp tin.
• Cú pháp: fprintf (tên biến tiệp tin, chuỗi định dạng)
format: chuỗi định dạng giống dạng của hàm printf()
%s, %d,…..

357
&
VC
BB
Đọc dữ liệu từ tệp văn bản
 Hàm getc()
 Dùng để đọc dữ liệu từ tệp tin, trả về mã Ascii của một ký tự
nào đó.
 Cú pháp: getc(tên biến tiệp tin)
 Hàm fgets()
 Dùng để đọc một chuỗi ký tự từ tệp tin cho đến khi đọc đủ n
ký tự hoặc gặp ký tự xuống dòng ‘\n’
 Cú pháp: fgets(char *buffer, int n, FILE *f)

358
Đọc dữ liệu từ tệp văn bản
&
VC
BB

Hàm fscanf()
Dùng để đọc dữ liệu từ tệp tin vào danh sách các biến theo định dạng.
Cú pháp:
fscanf(tên biến tệp tin, chuỗi định dạng)
chuỗi định dạng giống hàm scanf().

359
&
VC
BB

Ví dụ: Viết chương trình ghi chuỗi ký tự lên


#include<stdio.h> tệp tin văn bản D:\\Baihat.txt
#include<conio.h>
int main()
{ FILE *f;
f=fopen("D:\\Baihat.txt","r+");
if (f!=NULL)
{ fputs("Em oi Ha Noi pho.\n",f);
fputs("Ta con em, mui hoang lan; ta con em, mui hoa
sua.",f);
fclose(f);
}return 0;} 360
&
VC
BB

Ví dụ: Viết chương trình chép tệp tin D:\Baihat.txt ở


trên sang tệp tin D:\Baica.txt
#include<stdio.h> { int ch=fgetc(f1);
#include<conio.h> while (! feof(f1))
int main() { fputc(ch,f2);
{ ch=fgetc(f1);
FILE *f1,*f2; }
f1=fopen("D:\\Baihat.txt","rt"); fcloseall();
f2=fopen("D:\\Baica.txt","wt"); } return 0;
if (f1!=NULL && f2!=NULL) }
361
&
VC
BB

Ví dụ: thực hiện lại ví dụ 1 chương 12 nhưng có thêm


chức năng ghi dữ liệu lên tập tin file Baihat.txt

362
&
VC
BB Bài tập
Viết chương trình quản lý một tệp tin quản lý thiết bị theo các yêu cầu:
A. Nhập từ bàn phím nội dung tên TB, nước SX, Phòng quản lý, Thời gian
bảo hành.
B. Hiển thị danh sach thiết bị vừa nhập.
C. Lưu danh sách vừa nhập vào ổ cứng.
D. Hiển thị danh sách được đọc từ ổ cứng.
E. Tìm kiếm và in ra các thiết bị trong cùng phòng.
F. Tìm kiếm và in ra các thiết bị có cùng nhà sản xuất.
G. Tìm kiếm và in ra các thiết bị còn 10 ngày bảo hành.
……

363

You might also like