Tải bản đầy đủ (.pdf) (134 trang)

giáo trình môn kỹ thuật lập trình ngành điện tự động

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (715.41 KB, 134 trang )

Kỹ thuật lập trì nh
1
CHƯƠNG i ĐạI CƯƠNG Về LậP TRìNH

I. Khái niệm thuật toán:
I.1. Khái niệ m
:
Thuậ t toá n là tậ p hợp cá c quy tắ c có logic nhằ m giả i một lớp bà i toá n nà o
đó để đ! ợc một kế t quả xá c định.
I.2. Các tí nh chất đặc tr!ng của thuật toán
:
I.2.1. Tí nh tổng quát :
Thuậ t toá n đ!ợc lậ p không phả i chỉ để giả i một bà i toán cụ thể mà thôi mà
còn phả i giả i đ! ợc một lớp cá c bà i toá n có dạ ng t! ơng tự.
I.2.2. Tí nh giới hạn :
Thuậ t toá n giả i một bà i toá n phả i đ! ợc thực hiệ n qua một số giới hạn các
thao tá c để đạ t đế n kế t quả .
I.2.3. Tí nh duy nhất :
Toà n bộ quá trì nh biế n đổi, cũng nh! trậ t tự thực hiệ n phả i đ!ợc xác định
và là duy nhấ t. Nh! vậ y khi dùng thuậ t toá n cùng một dữ liệ u ban đầ u phả i cho
cùng một kế t quả .
I.3. Phân loại:

Theo cấ u trúc, ta có thể phâ n thà nh ba loạ i thuậ t toá n cơ bả n sau :
- Thuậ t toá n không phâ n nhá nh.
- Thuậ t toá n có phâ n nhá nh.
- Thuậ t toá n theo chu trì nh có b! ớc lặ p xá c định và có b! ớc lặ p không
xá c định.
II. Mô tả thuật toán bằng l!u đồ
:
II.1. L!u đồ


:
L! u đồ là một dạ ng đồ thị dùng để mô tả quá trì nh tí nh toá n một cá ch có
hệ thống. Ng! ời ta th! ờng thể hiệ n thuậ t toá n bằ ng l! u đồ.
II.2. Các ký hiệu trên l!u đồ
:
Tê n khối Ký hiệ u
ý nghĩ a
Khối mở đầ u hoặ c kế t
thúc

Dùng mở đầ u hoặ c kế t
thúc ch! ơng trì nh
Khối và o ra

Đ!a số liệ u và o hoặ c in
kế t quả
Kỹ thuật lập trì nh
2
Khối tí nh toá n


Biể u diễ n cá c công thức
tí nh toá n và thay đổi giá
trị của cá c biế n
Khối điều kiện


Dùng để phâ n nhá nh
ch! ơng trì nh
Ch! ơng trì nh con



Dùng để gọi ch! ơng trì nh
con
Mũi tê n

Chỉ h! ớng truyề n thông
tin, liê n hệ cá c khối
II.3. Một số ví dụ biể u diễ n thuật toán bằng l!u đồ
II.3.1. Thuật toán không phân nhánh:
Ví dụ 1
: Tí nh A = x
2
+ y
2

Begin
Nhaọp (x,y)
A = x
2
+ y
2
Xuaỏt (A)
End

Ví dụ 2
: Tí nh
y
x
CByAx

S
2
2
+
++
=
; biế t A,B,C,x,y
Begin
Nhaọp (A, B, C, x,y)
S = (Ax + By + C) / SQRT (x*x + y*y)
Xuaỏt S
End

Kỹ thuật lập trì nh
3
II.3.2. Thuật toán có phân nhánh:
Ví dụ 1
: Tì m giá trị max của ba số thực a,b,c
Begin
Nhaọp (a, b, c)
Max = a
Xuaỏt (Max)
End
a > b
Max < c
Max = c
S
S
Max = b




Ví dụ 2
: Giả i ph! ơng trì nh bậ c nhấ t Ax+B =0 với cá c nghiệ m thực.
Begin
Nhaọp (a, b)
Xuaỏt (PTVẹ)
End
a = 0
S
S
Xuaỏt (-b/a)
b = 0 Xuaỏt (PTVN)



Kü tht lËp tr× nh
4
VÝ dơ 3 : Gi¶ i ph! ¬ng tr× nh bË c hai Ax
2
+Bx+C =0 víi c¸ c nghiƯ m thùc.
Begin
Nhập (a, b, c)
Xuất (‘X
1
= ’,(-b + SQRT(Delta)) / (2*a))
Xuất (‘X
2
= ’,(-b - SQRT(Delta)) / (2*a))
End

a = 0
Đ
Đ
PTB1 (b, c)
Delta < 0
Xuất (‘PTVN’)
S
S
Delta = b*b - 4*a*c
Đ
Delta = 0
Xuất (-b / (2*a))
S

II.3.3. Tht to¸n cã chu tr× nh:
Th t to¸ n cã chu tr× nh víi c¸c b!íc lỈ p x¸c ®Þnh th!êng ®! ỵc thĨ hiƯ n
b» ng l! u ®å sau :
i = giá trò ban đầu
Lệnh S;
Tăng i
i <= n
S
Đ

víi n lµ gi¸ trÞ kÕ t thóc.
Kỹ thuật lập trì nh
5
Ví dụ 4: Tí nhS=
i
i

n
x
=

1
, với cá c x
i
do ta nhậ p và o.
Begin
Nhaọp (n)
i = 1
S = 0
Nhaọp (x
i
)
End
i = i+1
S = S+x
i
i <= n
Xuaỏt (S)
S


III. CáC NGôN NGữ LậP TRìNH & CH!ơNG TRìNH DịCH
:
III.1. Ngôn ngữ lập trì nh:

III.1.1. Giới thiệ u: Con ng!ời muốn giao tiế p với má y tí nh phả i thông qua
ngôn ngữ. Con ng!ời muốn má y tí nh thực hiệ n công việ c, phả i viế t cá c yêu cầ u

đ! a cho má y bằ ng ngôn ngữ má y hiể u đ! ợc. Việ c viế t cá c yê u cầ u ta gọi là lậ p
trì nh (programming). Ngôn ngữ dùng để lậ p trì nh đ!ợc gọi là ngôn ngữ lậ p trì nh.
Nế u ngôn ngữ lậ p trì nh gầ n với vấ n đề cầ n giả i quyế t, gầ n với ngôn ngữ tự
nhiê n thì việ c lậ p trì nh sẽ đơn giả n hơn nhiề u. Những ngôn ngữ lậ p trì nh có tí nh
chấ t nh! trê n đ!ợc gọi là ngôn ngữ cấ p cao. Nh!ng má y tí nh chỉ hiể u đ!ợc ngôn
ngữ riê ng của mì nh, đó là cá c chuỗi số 0 với 1 và nh! vậ y rõ rà ng là khó khă n
cho lậ p trì nh viê n, vì nó không gầ n gũi với con ng! ời.
Hiệ n tạ i, ngôn ngữ lậ p trì nh đ! ợc chia ra là m cá c loạ i sau:
III.1.2. Phân loại ngôn ngữ lập trì nh:
- Ngôn ngữ má y (machine language)
Kü tht lËp tr× nh
6
- Hỵp ng÷ (assembly language)
- Ng«n ng÷ cÊ p cao (higher-level language)
Do m¸ y tÝ nh chØ hiĨ u ®!ỵc ng«n ng÷ m¸ y, cho nª n mét ch!¬ng tr× nh viÕ t
trong ng«n ng÷ cÊ p cao ph¶ i ®! ỵc biª n dÞch sang ng«n ng÷ m¸ y. C«ng cơ thùc
hiƯ n viƯ c biª n dÞch ®ã ®! ỵc gäi lµ ch! ¬ng tr× nh dÞch.
III.2. Ch!¬ng tr× nh dÞch:

Ch! ¬ng tr× nh dÞch ®!ỵc chia ra lµ m 2 lo¹ i : tr× nh biª n dÞch (compiler) vµ tr× nh
th«ng dÞch (interpreter)
III.2.1. Tr× nh biª n dÞch: lµ viƯ c chu n mét ch! ¬ng tr× nh trong ng«n ng÷
cÊ p cao nµ o ®ã (ch! ¬ng tr× nh ngn) sang ng«n ng÷ m¸y (ch! ¬ng tr× nh ®Ý ch).
- Thêi gian chu n mét ch! ¬ng tr× nh ngn sang ch!¬ng tr× nh ®Ý ch ®! ỵc
gäi lµ thêi gian dÞch.
- Thêi gian mµ ch! ¬ng tr× nh ®Ý ch thùc thi ®! ỵc gäi lµ thêi gian thùc thi.
Nh! vË y, ch!¬ng tr× nh ngn vµ d÷ liƯ u ®Ĩ ch!¬ng tr× nh thùc thi ®!ỵc xư
lý trong c¸ c thêi ®iĨ m kh¸ c nhau, ®! ỵc gäi lµ thêi gian dÞch (compile time) vµ
thêi gian thùc thi (run-time)
Chương trình

nguồn
Trình biên
dòch
Chương trình
đích
Máy tính
thực hiện
Kết quả
Dữ liệu

H× nh I.1. Ch! ¬ng tr× nh thùc thi theo c¬ chÕ dÞch cđa tr× nh biª n dÞch
III.2.2. Tr× nh th«ng dÞch: qu¸ tr× nh dÞch vµ thùc thi x¶ y ra cïng 1 thêi
gian, dÞch ®Õ n ®© u thi hµ nh lƯ nh ®Õ n ®ã.
Chương trình
nguồn
Chương trình
thông dòch
Kết quả
Dữ liệu

H× nh I.2. Ch! ¬ng tr× nh thùc thi theo c¬ chÕ dÞch cđa tr× nh th«ng dÞch
Kỹ thuật lập trì nh
7
CH!ơNG 2 LàM QUEN VớI NGôN NGữ C

* Giới thiệu ngôn ngữ C
Ngôn ngữ C do Dennis Ritchie là ng!ời đầu tiên đề xuất, đ thiế t kế và cài
đặ t C trong môi tr! ờng UNIX. Nó có nguồn gốc từ ngôn ngữ BCPL do Martin
Richards đ! a ra và o nă m 1967 và ngôn ngữ B do Ken Thompson phá t triể n từ
ngôn ngữ BCPL nă m 1970 khi viế t hệ điề u hà nh Unix.

C là ngôn ngữ lậ p trì nh đa dụng, cấ p cao nh! ng lạ i có khả nă ng thực hiệ n
cá c thao tá c nh! của ngôn ngữ Assembly. Vì thế ngôn ngữ C nhanh chóng đ!ợc
cà i đặt, sử dụng trê n má y vi tí nh và đ trở thà nh một công cụ lậ p trì nh khá mạ nh,
hiệ n nay đang có khuynh h!ớng trở thà nh một ngôn ngữ lậ p trì nh chí nh cho má y
vi tí nh trê n thế giới.
* Đặc điể m ngôn ngữ C

Ngôn ngữ C có những đặ c điể m cơ bả n sau :
- Tí nh cô đọng
(compact) : Ngôn ngữ C chỉ có 32 từ khoá chuẩ n, 40 toán
tử chuẩ n mà hầ u hế t đ! ợc biể u diể n bởi cá c d y ký tự ngắ n gọn.
- Tí nh cấ u trúc
(structured) : Ngôn ngữ C có một tậ p hợp cá c phát biể u lậ p
trì nh cấ u trúc nh! phá t biể u quyế t định hoặ c lặ p. Do đó, nó cho phép chúng ta
viế t ch! ơng trì nh có tổ chức và dể hiể u.
- Tí nh t!ơng thí ch
(compactable) : Ngôn ngữ C có bộ lệ nh tiề n xử lý và
cá c th! việ n chuẩ n là m cho cá c ch! ơng trì nh viế t bằ ng ngôn ngữ C có thể t!ơng
thí ch khi chuyể n từ má y tí nh nà y sang má y tí nh kiể u hoà n toà n khá c.
- Tí nh linh động
(flexible) : Ngôn ngữ C là một ngôn ngữ rấ t linh động về
ngữ phá p, nó có thể chấ p nhậ n rấ t nhiề u cách thể hiệ n mà không có ở ngôn ngữ
khá c nh! Pascal, nó giúp cho kí ch th! ớc m lệ nh có thể thu gọn lạ i để ch!ơng
trì nh thực thi nhanh chóng hơn.
- Biê n dịch
: Ngôn ngữ C đ! ợc biê n dịch bằ ng nhiề u b! ớc và cho phép
biê n dịch nhiề u tậ p tin ch! ơng trì nh riê ng rẽ thà nh cá c tậ p tin đối t!ợng (object)
và nối cá c đối t! ợng đó lạ i với nhau (link) thà nh một ch!ơng trì nh thực thi thống
nhấ t.
I. CáC KHáI NIệM Cơ BảN


I.1. Cấu trúc cơ bản của một ch!ơng trì nh C

[tiề n xử lý]
[Cá c hà m]
main()
Kỹ thuật lập trì nh
8
{ [khai bá o biế n;]
[nhậ p dữ liệ u ;]
[xử lý ;]
[xuấ t ;]
}
Ví dụ
: Ch! ơng trì nh hiệ n trê n mà n hì nh câ u Chao cac ban
void main()
{ printf(Chao cac ban\n);
}
Một và i nhậ n xét quan trọng
:
- Ch! ơng trì nh C bao giờ cũng có một hay nhiề u hà m, trong đó có một
hà m chí nh bắ t buộc phả i có là hà m main(). Đâ y chí nh là hà m đ!ợc thực hiệ n
đầ u tiê n trong ch! ơng trì nh.
- Cặ p dấ u { } để xá c định một khối lệ nh.
- Hà m printf( Chao cac ban \n) là hà m chuẩ n của C dùng để xuấ t câ u
thông bá o Chao cac ban ra mà n hì nh. Ký tự \n là ký tự đặ c biệ t dùng để
xuống dòng.
- Dấ u ; để chấ m dứt một lệ nh.
- Ch! ơng trì nh C có phâ n biệ t chữ th! ờng với chữ hoa. Đa số cá c từ khoá
của C đ! ợc viế t bằ ng chữ th!ờng, còn một số í t đ! ợc viế t bằ ng chữ hoa mà ta

phả i tuâ n thủ chặ t chẽ , nế u không thì ch! ơng trì nh dịch sẽ không hiể u.
* Một vài ví dụ

Ví dụ 1
: In bả ng lũy thừa 2 của cá c số nguyê n từ 10 đế n 50
/* Ch! ơng trì nh in bì nh ph! ơng cá c số từ 10 đế n 50*/
#include <stdio.h>
void main()
{int n; /*Khai bá o biế n n kiể u nguyê n */
n=10; /*Gá n n=10 */
while (n<=50) /*Lặ p từ 10 đế n 50 bằ ng while */
{ printf(%3d \t %5d\n,n,n*n); /*in dạng 5d là dà nh 5 vị trí để in n và n
2
*/
n++; /* Tă ng n lê n 1 */
} /*Hế t while*/
} /*Hế t main*/
Kỹ thuật lập trì nh
9
Ví dụ 2 : T! ơng tự nh! ví dụ 1 nh! ng viế t cá ch khá c :
#include <stdio.h>
#define max 50 /*Tiề n xử lý, định nghĩ a max =50*/
void main()
{ int n; /*Khai bá o biế n n kiể u nguyê n*/
for (n=10; n<=max; n++) /*Lặ p từ 10 đế n 50 bằ ng for*/
printf(%3d \t %5d\n,n,n*n); /*in n và n
2
dạ ng 5d là nă m chữ số*/
} /*Hế t main*/
Ví dụ 3

: Ch! ơng trì nh in lũy thừa 2, 3, 4, 5; có dùng hà m để tí nh lũy thừa :
#include <stdio.h>
#define max 50 /*Tiề n xử lý, định nghĩ a max =50*/
float luythua(int n, int m) /*Hà m luythua với 2 thông số*/
{ float s=1; /*Khai bá o và khởi tạ o biế n s*/
for ( ;m>0;m ) /*Lặp giả m dầ n từ m tới 1*/
s=s*n;
return s; /*Trả kế t quả về */
}
void main()
{ int n,n2,n3,n4,n5; /*Khai bá o biế n kiể u nguyê n*/
for (n=10;n<=50;n++) /*Lặ p từ 10 đế n 50 bằ ng for*/
{ n2= luythua(n,2); /*Gọi hà m luythua*/
n3= luythua(n,3);
n4= luythua(n,4);
n5= luythua(n,5);
printf(%3d \t %5.2f \t %5.2f\t %5.2f\t %5.2f\t %5.2f\n,
n,n2,n3,n4,n5); /*in n và n
m
dạ ng 5 chữ số với 2 số lẻ */
}
} /*Hế t main*/
* Hàm xuất chuẩn printf()

Cú pháp
:
printf(chuỗi-địnhdạ ng,thamso1,thamso2, )
ý nghĩ a
:
Hà m printf() sẽ xem xét chuỗi-địnhdạ ng, lấ y giá trị các tham số (nế u cầ n)

để đặ t và o theo yê u cầ u của chuỗi-địnhdạ ng và gởi ra thiế t bị chuẩ n.
Chuỗi-địnhdạ ng là một chuỗi ký tự, trong đó có những ký tự xuấ t ra
nguyê n vẹ n hoặ c xuấ t ở dạ ng đặ c biệ t, và có thể có những chuỗi điề u khiển
cầ n lấ y giá trị của cá c tham số để thay và o đó khi in ra.
Kỹ thuật lập trì nh
10
- Những ký tự đặc biệ t :
Ký tự Tác dụng Mã ASCII
\n Xuống hà ng mới 10
\t Tab 9
\b Xóa ký tự bê n trá i 8
\r Con trỏ trở về đầ u hà ng 13
\f Sang trang 12
\a Phá t tiế ng còi 7
\\ Xuấ t dấ u chéo ng! ợc 92
\ Xuấ t dấ u nhá y đơn 39
\ Xuấ t dấ u nhá y kép 34
\xdd Xuấ t ký tự có m ASCII dạ ng Hex là dd
\ddd Xuấ t ký tự có m ASCII dạ ng Dec là
ddd

\0 Ký tự NULL 0
- Chuỗi định dạng :
% [ flag][width][.prec][F

N

h

l] type

Type : định kiể u của tham số theo sau chuỗi-địnhdạ ng để lấ y giá trị ra
Type
ý nghĩ a
d,i Số nguyê n cơ số 10
u Số nguyê n cơ số 10 không dấ u
o Số nguyê n cơ số 8
x Số nguyê n cơ số 16, chữ th! ờng(a,b, ,f)
X Số nguyê n cơ số 16, chữ in (A,B, ,F)
f Số thực dạ ng [-]dddd.ddd
e Số thực dạ ng [-]d.ddd e[+/-]ddd
E Số thực dạ ng [-]d.ddd E[+/-]ddd
g,G Số thực dạ ng e(E) hay f tùy theo độ chí nh xá c
c Ký tự
s Chuỗi ký tự tậ n cùng bằ ng \0
% Dấ u % cầ n in

Kỹ thuật lập trì nh
11
Flag : Dạ ng điề u chỉ nh
Flag
ý nghĩ a
nế u không có in dữ liệ u ra với canh phả i
- in dữ liệ u ra với canh trá i
+ Luôn bắ t đầ u số bằ ng + hay -
# in ra tùy theo type, nế u:
0 : Chè n thê m 0 đứng tr! ớc giá trị >0
x,X : Chè n thê m 0x hay 0X đứng tr!ớc số nà y
e,E,f : Luôn luôn có dấ u chấ m thậ p phâ n
G,g : Nh! trê n nh! ng không có số 0 đi sau
Width : định kí ch th! ớc in ra

Width
ý nghĩ a
n Dà nh í t nhấ t n ký tự , điề n khoả ng trắ ng các ký tự còn trống
0n Dà nh í t nhấ t n ký tự , điề n số 0 cá c ký tự còn trống
* Số ký tự í t nhấ t cầ n in nằ m ở tham số t! ơng ứng
Prec : định kí ch th! ớc phầ n lẽ in ra
Prec
ý nghĩ a
không có độ chí nh xá c nh! bì nh th! ờng
0 d,i,o,u,x độ chí nh xá c nh! cũ
e,E,f Không có dấ u chấ m thậ p phâ n
n nhiề u nhấ t là n ký tự (số)
* Số ký tự í t nhấ t cầ n in nằ m ở tham số t! ơng ứng
Các chữ bổ sung :
F Tham số là con trỏ xa XXXX:YYYY
N Tham số là con trỏ gầ n YYYY
h Tham số là short int
l Tham số là long int (d,i,o,u,x,X)
double (e,E,f,g,G)
Ví dụ 1: char c=A;
char s[]=Blue moon! ;
Kỹ thuật lập trì nh
12
Dạng Thông số
t!ơng ứng
Xuất Nhận xét
%c c A độ rộng 1
%2c c A độ rộng 2, canh phả i
%-3c c A độ rộng 3, canh trá i
%d c 65 M ASCII của A

%s s Blue moon! độ rộng 10
%3s s Blue moon! Nhiề u ký tự hơn cầ n thiế t
%.6s s Blue m Chí nh xá c 6 ký tự
%-11.8s s Blue moo Chí nh xá c 8, canh trá i
Ví dụ 2: int i = 123;
float x = 0.123456789;
Dạng Thông số
t!ơng ứng
Xuất Nhận xét
%d i 123 độ rộng 3
%05d i 00123 Thê m 2 số 0
%7o i 123 Hệ 8, canh phả i
%-9x i 7b Hệ 16, canh trá i
%c i { Ký tự có m ASCII 123
%-#9x i 0x7b Hệ 16, canh trá i
%10.5f x 0.12346 độ rộng 10, có 5 chữ số thậ p
phâ n
%-12.5e x 1.23457e-01 Canh trá i, in ra d! ới dạ ng
khoa học
Ví dụ 3: Viế t ch! ơng trì nh in hì nh chữ nhậ t kép bằ ng cá c ký tự ASCII
C9 CD BB


C8 CD BC
void main()
{ printf(\n\xC9\xCD\xBB);
printf(\n\xC8\xCD\xBC\n);
}
Kỹ thuật lập trì nh
13

I.2. Kiể u dữ liệ u cơ bản
I.2.1. định nghĩ a:
Kiể u dữ liệ u cơ bả n là kiể u dữ liệ u có giá trị đơn, không phâ n chia đ! ợc
nữa nh! số, ký tự
I.2.2. Phân loại:
Tê n kiể u
ý nghĩ a
Kí ch
th!ớc
Phạm vi
char Ký tự 1 byte
-128

127
unsigned char Ký tự không dấ u 1 byte
0

255
unsigned short Số nguyê n ngắ n không dấ u 2 bytes
0

65535
enum Số nguyê n có dấ u 2 bytes
-32768

32767
short int Số nguyê n có dấ u 2 bytes
-32768

32767

int Số nguyê n có dấ u 2 bytes
-32768

32767
unsigned int Số nguyê n không dấ u 2 bytes
0

65535
long Số nguyê n dà i có dấ u 4 bytes
-2147483648
2147483647
unsigned long Số nguyê n dà i không dấ u 4 bytes
0

4294967295
float Số thực độ chí nh xá c đơn 4 bytes
3.4 E-38

3.4 E+38
double Số thực độ chí nh xá c kép 8 bytes
1.7 E-308

1.7
E+308
long double Số thực độ chí nh xá c hơn
double
10 bytes
3.4 E-4932

1.1

E+4932
Chú ý
:
1. Ngôn ngữ C không có kiể u logic (boolean nh! Pascal) mà quan niệ m
0 là false ; Khá c 0 là true
2. Ngôn ngữ C không có kiể u chuỗi nh! kiể u string trong Pascal
3. Cá c kiể u đồng nhấ t:
int = short int = short = signed int = signed short int
long int = long
signed long int = long
unsigned int = unsigned = unsigned short = unsigned short int
unsigned long int = unsigned long
Kỹ thuật lập trì nh
14
I.3. Biế n
I.3.1. Tê n biế n : Tê n biế n là một chuỗi ký tự bắ t đầ u bằ ng ký tự chữ, ký tự
kế tiế p là ký tự chữ (dấ u gạ ch d!ới _ đ!ợ c xem là ký tự chữ ) hoặ c số và khô ng
đ! ợc trùng với cá c từ khóa của C.
Chú ý
: - Ngôn ngữ C phâ n biệ t chữ th! ờng với chữ hoa nê n biế n chữ
th! ờng với chữ hoa là khá c nhau.
Ví dụ
: Bien_1 _bien2 là hợp lệ
bi&en 2a a b là không hợp lệ
- Ngôn ngữ C chỉ phâ n biệ t hai tê n hợp lệ với nhau bằ ng n ký tự đầ u tiê n
của chúng. Thông th!ờng n=8, nh!ng hiệ n nay nhiề u ch!ơng trì nh dịch cho phép
n=32, nh! Turbo C cho phép thay đổi số ký tự phâ n biệ t từ 8-32)
Ví dụ
:Hai biế n sau bị xem là cùng tê n
bien_ten_dai_hon_32_ky_tu_dau_tien_1

bien_ten_dai_hon_32_ky_tu_dau_tien_2
I.3.2. Khai báo biế n
Các biến phải đ! ợc khai bá o tr!ớc khi sử dụng nhằ m giúp cho ch! ơng
trì nh dịch có thể xử lý chúng.
Khai bá o biế n có dạ ng :
Kiể udữliệ u tê nbiế n1 [,tenbiế n2 ] ;
Ví dụ: int a,b,c;
float x,y,delta;
char c;
* Khai bá o và khởi tạ o biế n
:
Kiể u dữ liệ u tê nbiế n = giá trị ;
I.3.3. Hàm nhập dữ liệ u chuẩn
a) Hàm scanf()
Cú pháp
: scanf(chuỗi-địnhdạng,điạ chỉ thamsố1, điạ chỉ thamsố2, )
- Chuỗi-địnhdạ ng của scanf() gồm có ba loại ký tự :
+ Chuỗi điề u khiể n
+ Ký tự trắ ng
+ Ký tự khá c trắ ng
! Chuỗi điề u khiể n có dạ ng :
%[width][h/l] type
Kỹ thuật lập trì nh
15
Với type: xá c định kiể u của biế n địa chỉ tham số sẽ nhậ n giá trị nhậ p và o
Type
ý nghĩ a
d,i Số nguyê n cơ số 10 (int)
o Số nguyê n cơ số 8 (int)
u Số nguyê n cơ số 10 không dấ u (unsigned)

x Số nguyê n cơ số 16 (int)
f,e Số thực (float)
c Ký tự (char)
s Chuỗi ký tự
p Con trỏ (pointer)
lf Số thực (double)
Lf Số thực (long double)
Width : xá c định số ký tự tối đa sẽ nhậ n và o cho vùng đó.
Hà m scanf() chỉ nhậ n cho đủ width ký tự hoặ c cho đế n khi gặ p ký tự trắ ng
đầ u tiê n. Nế u chuỗi nhậ p và o nhiề u hơn thì phầ n còn lạ i sẽ dành lại cho lầ n gọi
scanf() kế tiế p.
Ví dụ 1
: scanf(%3s,str);
Nế u nhậ p chuỗi ABCDEFG


thì scanf() sẽ nhậ n tối đa 3 ký tự cấ t và o mả ng str, còn DEFG sẽ đ!ợc lấ y
nế u sau đó có lầ n gọi sanf(%s,str) khá c.
Ví dụ 2
: unsigned long money;
scanf(%lu,&money);
L! u ý
: Nế u scanf(%ul, &money) thì giá trị nhậ p và o sẽ không đ!ợc l! u
trữ trong biế n money, nh! ng ch! ơng trì nh dịch không bá o lỗi.
Ví dụ 3
: Nhậ p và o tê n và bị giới hạ n trong khoả ng [A-Z,a-z]
char name[20];
printf(Name : ) ;
scanf(%[A-Za-z],&name);
Trong tr!ờng hợp nà y, nế u ta gõ sai dạ ng thì name =

! Ký tự trắ ng: nế u có trong chuỗi-dạ ng sẽ yê u cầ u scanf() bỏ qua một hay
nhiề u ký tự trắ ng trong chuỗi nhậ p và o. Ký tự trắ ng là ký tự khoả ng trắ ng ( ),
tab (\t), xuống hà ng (\n). Một ký tự trắ ng trong chuỗi-địnhdạ ng sẽ đ!ợc hiể u
là chờ nhậ p đế n ký tự khá c trắ ng tiế p theo.
Kỹ thuật lập trì nh
16
Ví dụ 4: scanf(%d ,&num);
Hà m scanf() cho ta nhậ p một ký tự khác trắ ng nữa thì mới thoá t ra. Ký tự
đó sẽ nằ m trong vùng đệ m và sẽ đ! ợc lấ y bởi hà m scanf() hoặ c gets() tiế p theo.
! Ký tự khá c trắ ng: nế u có trong chuỗi-địnhdạng sẽ khiế n cho scanf() nhậ n
và o đúng ký tự nh! thế .
Ví dụ 5
: scanf(%d/%d/%d,&d,&m,&y);
Hà m scanf() chờ nhậ n một số nguyê n, cấ t và o d, kế đế n là dấ u /, bỏ dấ u
nà y đi và chờ nhậ n số nguyê n kế tiế p để cấ t và o m. Nế u không gặ p dấ u / kế
tiế p số nguyê n thì scanf() chấ m dứt.
Chú ý
: Hà m scanf() đòi hỏi cá c tham số phải là cá c địa chỉ của các biế n
hoặ c là một con trỏ.
* Toá n tử địa chỉ &
: Lấ y địa chỉ của một biế n
Ví dụ 6
: int n;

biế n n
&n;

địa chỉ của n
printf(trị = %d, địa chỉ = %d,n,&n);
b) Hàm getch():

Hà m getch() dùng để nhậ n một ký tự do ta nhậ p trê n bà n phí m mà không
cầ n gõ Enter với cú phá p :
ch = getch(); Không hiệ n ký tự nhậ p trê n mà n hì nh
ch = getche(); Hiệ n ký tự nhậ p trê n mà n hì nh
Với ch là biế n kiể u char.
Ví dụ 7
:
void main()
{ char ch;
printf(Go vao ky tu bat ky : );
ch = getche();
printf(\n Ban vua go %c,ch);
getch();
}
Ví dụ 8
: Bạ n nhậ p và o 1 chữ cá i. Nế u chữ cá i nhậ p và o là 'd' thì ch! ơng
trì nh sẽ kế t thúc, ng! ợc lạ i ch! ơng trì nh sẽ bá o lỗi và bắ t nhậ p lạ i.
#include <stdio.h>
#include <conio.h>
void main()
{ char ch;
Kỹ thuật lập trì nh
17
printf("\nBan nhap vao 1 chu cai tu a den e: ");
while ((ch=getche()) != 'd')
{ printf("\nXin loi, %c la sai roi",ch);
printf("\n Thu lai lan nua. \n");
}
}
L! u ý

: Hà m getch() còn cho phép ta nhậ p và o 1 ký tự mở rộng nh! các
phí m F1, F2, , cá c phí m di chuyể n cursor. Cá c phí m nà y luôn có 2 bytes: byte
thứ nhấ t bằ ng 0, còn byte 2 là m scancode của phí m đó. Để nhậ n biế t ta đ gõ
phí m ký tự hay phí m mở rộng, ta có ch! ơng trì nh sau:
void main()
{
int c;
int extended = 0;
c = getch();
if (!c)
extended = getch();
if (extended)
printf("The character is extended\n");
else
printf("The character isn't extended\n");
}
Phí m Mã scancode
F1 59
F2 60
F3 61
F4 62
F5 63
F6 64
F7 65
F8 66
F9 67
F10 68
Home 71
"
72

#
80
$
75
Kỹ thuật lập trì nh
18
%
77
PgUp 73
PgDn 81
End 79
Ins 82
Del 83
Bả ng m scancode của cá c phí m mở rộng
c. Hàm kbhit
(): Hà m int kbhit() sẽ kiể m tra xem có phí m nà o đ! ợc gõ
và o hay không. Nế u có, hà m kbhit sẽ trả về một số nguyê n khá c 0, và ng!ợc lạ i.
Ký tự mà ta nhậ p và o qua hà m kbhit() có thể lấ y đ! ợc qua hà m getch()
hoặ c getche().
Ví dụ
:
void main()
{
printf("Press any key to continue:");
while (!kbhit()) /* do nothing */ ;
char kytu=getch();
printf("\nKy tu vua an : %c",kytu);
}
I.4 Hằng
: Hằ ng là cá c đạ i l! ợng mà giá trị của nó không thay đổi trong quá

trì nh ch! ơng trì nh thực hiệ n.
I.4.1. Phân loại :
a.
Hằng số
: là cá c giá trị số đ xá c định và không đổi.
int unsigned long hệ 8 hệ 16 float/double
Dạ ng nnnn
-nnnn
nnnnU/u

nnnnL/l
-nnnnl/L
0nnnn 0xnnnn nnnn.nnnn
nnnn.nnnE/e

nnn
Ví dụ 4567
-12
123U
12uL
456789L
-1234L
0345 0x1AB 123.654
123.234E-4
Chú ý
:
- Cá c hằ ng số viế t không dấ u hoặ c không số mũ đ! ợc hiể u là số nguyê n,
ng! ợc lạ i là double.
- Các hằ ng số nguyê n lớn hơn int sẽ đ! ợc l! u trữ theo kiể u long, còn lớn
hơn long thì đ! ợc l! u trữ theo kiể u double.

- Cá c hằ ng số nguyê n d! ơng lớn hơn long sẽ đ! ợc l! u trữ theo kiể u double
- Một hằ ng số đ! ợc l! u trữ theo dạ ng long nế u theo số đó có ký tự l (L),
Kỹ thuật lập trì nh
19
dạ ng unsigned nế u sau đó có chữ u (U), dạ ng thậ p lục phâ n nế u tr!ớc số
đó có 0x và dạ ng bá t phâ n nế u tr! ớc số đó có 0
Ví dụ
: 50000; 10 L;

Long
5U, 100u

unsigned
0x10

hệ 16 = 16
10

010

hệ 8 = 8
10

b.
Hằng ký tự
: là ký tự riê ng biệ t đ! ợc viế t trong hai dấ u nhá y đơn : A
Giá trị của hằ ng ký tự là m ASCII của nó.
Ví dụ
: printf(%c có giá trị là %d,A,A);
% A có giá trị là 65

& Hằ ng ký tự có thể tham gia và o cá c phép toá n nh! mọi số nguyê n khá c.
Ví dụ
:9-0=57-48=9
& Hằ ng ký tự có thể là cá c ký tự đặ c biệ t dạ ng \c
1
mà ta đ xét ở hà m
printf() nh! \n,\a,\t
c.
Hằng chuỗi
: Là một chuỗi ký tự nằ m trong hai dấ u nhá y kép .
Ví dụ
: Day la mot chuoi
Hang chuoi co ky tu đạ c biệ t nh! \ \n \248


chuỗi rỗng.
Chú ý
:
- Phân biệt A

A
Hằ ng: Chuỗi Ký tự
Dạ ng l! u trữ :
A \0 A
- Nhậ n xét: ở dạ ng l! u trữ, ta thấ y tậ n cùng của chuỗi có ký tự NULL \0
mà không có ở dạ ng ký tự. Chí nh vì vậ y mà không có ký tự rỗng .
- Một chuỗi có thể đ! ợc viế t trê n nhiề u hà ng với điề u kiệ n hà ng trê n phả i
có dấ u \.
Ví dụ
:Day la mot chuoi duoc viet tren \

nhieu hang \n
d.
Hằng biể u thức
: Là một biể u thức mà trong đó cá c toá n hạ ng đều là
cá c hằ ng. Khi đó ch! ơng trì nh dịch sẽ tí nh toá n biểu thức tr!ớc, và kế t quả đ!ợc
l! u trữ thẳ ng bằ ng một hằ ng số t! ơng đ! ơng.
Ví dụ : 8*20-13

kế t quả l! u trữ là 173
Kỹ thuật lập trì nh
20
a -A

là 97-65 = 32
1<8

là 0 (sai)
I.4.2. Khai báo hằng:
Cú pháp
: const tê nhằ ng = biể uthức;
Ví dụ
: const MAX = 50;
const PI = 3.141593;
Chú ý
: - Ta có thể khai bá o hằ ng bằ ng cá ch định nghĩ a 1 macro nh! sau:
#define tê nhằ ng giá trị
- Lệ nh #define phả i đ!ợc khai bá o ngoà i hà m và sau nó không có
dấ u ;
I.5. Phép toán


I.5.1. Phép gán:
Cú pháp
: biế n = biể u thức;
Chú ý

: Phép gá n trong ngôn ngữ C trả về một kế t quả là trị của biể u thức
Ví dụ 1
: c = 10;
a = b = c;
printf(a=%d , b=%d,a,b);

a=10,b=10
Ví dụ 2
: x = b + 2*c;
y= a + (x= b + 2*c)

y = a + x;
Ví dụ 3
: (n+3) = 4+z; (không hợp lệ vì bê n trá i là biể u thức)
= c +o; (không hợp lệ vì bê n trá i là hằ ng)
I.5.2. Các phép toán số học :
a.
Phép toán hai toán hạng
: +, -, *, /, %
Phép toán Kiể u toán hạng Kiể u kế t quả
+, -, * char, int, long, float,
double
Kiể u của toá n hạ ng có kiể u cao nhấ t
/ nguyên/nguyê n Kiể u nguyê n và là phép chia nguyê n
thực(nguyê n)/thực

(nguyê n)
Kiể u thực và là phép chia thực
% nguyên/nguyê n Kiể u nguyê n và là phép chia lấy phần d!
Ví dụ :
#include <stdio.h>
void main()
Kỹ thuật lập trì nh
21
{ char cv;
int iv = 121;
float fv1,fv2;
printf( Chuyể n kiể u :\n\n);
cv = iv;
printf(int đ! ợc gá n cho char : %d

%d (%c)\n\n,iv,cv,cv);
fv1 = iv/50;
printf( int : %d / 50 = %f \n\n,iv,fv1);
fv1 = iv/50.0;
printf( float : %d / 50.0 = %f \n\n,iv,fv1);
fv1 = 1028.75;
fv2 = fv1 +iv ;
printf( %f + %d = %f \n\n,fv1,iv,fv2);
getch();
}
b.
Phép toán một toán hạng
: phép tă ng ++, phép giả m
a++ hoặ c ++a


a = a+1
a hoặ c a

a = a-1
Chú ý
: Tuy nhiê n a++ sẽ khá c ++a khi chúng đứng trong biể u thức (có
phép gá n).
a++ : Tă ng a sau khi giá trị của nó đ! ợc sử dụng.
++a : Tă ng a tr! ớc khi giá trị của nó đ! ợc sử dụng.
Ví dụ
:
main()
a b n
{ int a=4 , b=6, n;
n = a + b;
n = a++ + b;
n = ++a + b;
n = a + b;
n = a + b;
n = a+ b;
}
4
4
5
6
5
4
4
6
6

6
6
6
6
6

10
10
12
11
11
10
I.5.3. Phép gán phức hợp:
Cú pháp
: biế n op= <biể uthức>

biế n = biế n op <biể uthức>
Với op là phép toá n.
Kỹ thuật lập trì nh
22
Cá c phép gá n phức hợp : += , -= , *= , /= , %= , <<= , >>=
Ví dụ
:n = n*(10+x)

n *= (10 +x)
n = n % 10

n %= 10
I = I +3


I += 3
<< : là phép dịch chuyể n bit qua trá i .
>> : là phép dịch chuyể n bit qua phả i .
I.5.4. Phép toán quan hệ :
< : nhỏ hơn
> : lớn hơn
>= : lớn hơn hoặ c bằ ng
<= : nhỏ hơn hoặ c bằ ng
!= : khác
== : bằ ng
Chú ý
:
- Phâ n biệ t toá n tử so sá nh == với phép gá n =
- C không có kiể u dữ liệ u boolean mà qui ! ớc : Giá trị 0 là sai
Giá trị !=0 là đúng
Ví dụ
:
a=10;
b= (a>6)*(a-6)

b = 4
c= (a< 5)*(a-5)

c = 0
Ví dụ
: Tì m số lớn nhấ t trong 3 số nguyê n a, b, c
#include <stdio.h>
#include <conio.h>
void main ()
{ int a, b, c, max;

printf(Ch! ơng trì nh tì m số lớn nhấ t trong 3 số);
printf(Nhậ p a, b, c);
scanf(%d %d %d , &a, &b, &c);
max = a;
if (max<b) max = b;
if (max<c) max = c;
printf(Số lớn nhấ t = %d, max);
getch();
}
Kỹ thuật lập trì nh
23
I.5.5.Toán tử logic:
Toán tử
ý nghĩ a
NOT ! Phủ định
AND && Giao, và
OR || Hội
Thứ tự tí nh toá n từ trê n xuống.
Bả ng châ n trị
:
x ! x x y x && y
true false true true true
false true true false false
false true false
false false false

x y x || y
true true true
false true true
false true true

false false false
Ví dụ 1: Xét ký tự c có phả i là ký số hay không?
char c;
if (c >= 0 && c <= 9)
printf (% c là kí tự số , c);
Ví dụ 2
: Xét ký tự ch là chữ cá i hay không?
if ((ch> =a) and (ch< =z)) or ((ch> =A) and (ch< =Z))
printf(%c là chu cai \n,ch);
Ví dụ 3
:
int a=10, b=5, c=0;
a && b

1
a && c

0
a | | c

1

Ví dụ 4
:
int a=10, b=5;
Kỹ thuật lập trì nh
24
int i=2, j=0;
(a>b) && (i<j)


0
(a<b) | | (i>j)

1
Ví dụ 5
:
n=5;
while (n)
{ printf("\nSố n = %d",n);
n ;
}
I.5.6. Toán tử phẩy:
Cú pháp
:
T = (exp1, exp2, exp3 ); // T = kế t quả của exp3
Ví dụ: m= (t=2, t*t+3)

m=7; t=2
c= (a=10,b=5,a+b);

a=10, b=5, c=15
I.5.7. Toán tử điều kiện:
Cú pháp
:
T = <điề u kiệ n> ? <bt1> : <bt2>;
Nế u <điề u kiệ n> là đúng thì T = <bt1> , ng! ợc lạ i T = <bt2>
Ví dụ
: A = i>= MAX ? 1: 0;
printf ( max (a,b) = %d , (a>b) ? a:b);
lower = (c > = A && c< = Z) ? c - A + a :c;

I.5.8. Toán tử trê n bit (bit wise) :
Dạng Ký hiệu
ý nghĩ a
NOT bit ~ lấ y bù 1
AND bit & giao
OR bit | hội
XOR bit ^ hội loạ i trừ
dịch trá i << nhân 2
dịch phả i >> chia 2

Kỹ thuật lập trì nh
25
Bả ng châ n trị:
Bit Bit Bit kế t quả
A B ~ A A & B A | B A ^ B
0 0 1 0 0 0
0 1 1 0 1 1
1 0 0 0 1 1
1 1 0 1 1 0
Ví dụ:
a= 4564 0001 0001 1101 01 00
b= 13667 0011 0101 0110 0011
a & b 0001 0001 01 00 0000
a | b 0011 0101 1111 0111
a ^ b 0010 0100 1011 0111
ý nghĩ a
:
1. Phép AND bit th!ờng đ!ợc dùng để kiể m tra một bit cụ thể nà o đó trong
thà nh phầ n dữ liệ u x có trị 0 hay 1. Việ c nà y thực hiệ n bằ ng cá ch sử dụng một
mặ t nạ (mask) với bit cầ n quan tâ m bằ ng 1 còn cá c bit khá c bằ ng 0. Ta lấ y mask

AND với giá trị x. Nế u kế t quả thu đ!ợc bằ ng mask thì là bit cầ n quan tâ m là 1,
ng! ợc lạ i là 0.
Ví dụ 1
:
void main()
{ unsigned x1; x2;
printf (\n cho 2 số hex(2 số) );
scanf (%x %x , &x1, &x2);
printf (% 02x & % 02x = % 02x\n, x1, x2, x1& x2);
}
Ví dụ 2
: Ta muốn biế t bit thứ 3 của số hexa ch là 1 hay 0 :
void main()
{ unsigned char ch, kq;
printf ( \n cho 1 số hex 2 số :);
scanf ( %x, &ch);
kq= ch & 0x08;
if (kq== 0x08) printf (bit 3 = 1);
else printf (bit 3 = 0);
}

×