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

Tài liệu BÀI GIẢNG VỀ KỸ THUẬT LẬP TRÌNH pptx

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 (1.25 MB, 156 trang )




HC VIN CÔNG NGH BU CHÍNH VIN THÔNG






BÀI GING
K THUT LP TRÌNH

Biên son : Ths. NGUYN DUY PHNG
Gii thiu môn hc

GII THIU MÔN HC
I. GII THIU CHUNG
S phát trin công ngh thông tin trong nhng nm va qua đã làm thay đi b mt
kinh t xã hi toàn cu, trong đó công ngh phn mm tr thành mt ngành công nghip
quan trng đy tim nng. Vi s hi t ca công ngh vin thông và công ngh thông rin,
t trng v giá tr phn mm chim rt cao trong các h thng vin thông cng nh các thit
b đu cu
i. Chính vì lý do đó, vic nghiên cu, tìm hiu, tin ti phát trin cng nh làm
ch các h thng phn mm ca các k s đin t vin thông là rt cn thit.
Tài liu ging dy “K thut lp trình” cho h đào to t xa đc xây dng da trên
giáo trình “K thut lp trình” đã đc ging dy ti hc vi
n trong nhng nm qua vi
mc đích cung cp cho sinh viên nhng kin thc c bn nht, có tính h thng liên quan
ti lp trình.
Thông qua cun tài liu này, chúng tôi mun gii thiu vi các bn đc v k nng


lp trình cu trúc và mt s thut toán quan trng, bao gm: i cng v lp trình cu trúc;
Duyt và đ qui; Ngn xp, hàng đi và danh sách móc ni; Cây;  th và cu
i cùng là Sp
xp và tìm kim.
II. MC ÍCH
Môn hc cung cp cho sinh viên k nng lp trình trên các cu trúc d liu quan trng
nh: stack, queue mlink, tree & graph cùng vi phng pháp phân tích, thit k, đánh giá
thut toán.
Sau khi hc xong môn hc này, sinh viên có kh nng vit đc chng trình gii
quyt nhng bài toán trong thc t.
III. PHM VI NGHIÊN CU
Nghiên cu các thut toán c bn đc s dng trong thc t nh các thut toán tìm
kim, các thut toán liên quan đn đ th. Các gii thut lp trình da trên danh sách, cây…
Nghiên cu cách cài đt các thut toán trên máy tính.
Tìm hiu các lnh vc ng dng ca các thut toán, phng pháp trong thc t.
IV. PHNG PHÁP NGHIÊN CU
 hc tt môn hc này, sinh viên cn lu ý nhng vn đ sau:
1. Kin thc cn trc
Li nói đu

2
- Sinh viên phi có kin thc c bn v toán hc cao cp.
- Thành tho ít nht mt ngôn ng lp trình. c bit trong cun sách này đã s dng
ngôn ng lp trình C đ mô t thut toán, vì vy sinh viên phi nm đc ngôn ng lp trình C.
2. Các tài liu cn có:
Sách hng dn hc tp K thut lp trình. Ths. Nguyn Duy Phng, Hc vin
Công ngh Bu chính Vin thông, 2006.
N
u cn sinh viên nên tham kho thêm:
- Giáo trình K thut lp trình. Ts. Lê Hu Lp, Ths. Nguyn Duy Phng, Hc

vin Công ngh Bu chính Vin thông, 2002.
- Bài ging đin t môn hc: “K thut lp trình” ca Hc vin Công ngh Bu
chính Vin thông.
3. t ra mc tiêu, thi hn cho bn thân
t ra các mc tiêu tm thi và thi hn cho bn thân và c gng thc hin chúng
Xây d
ng mc tiêu trong chng trình nghiên cu.
4 Nghiên cu và nm nhng kin thc ct lõi
Sinh viên nên đc qua sách hng dn hc tp trc khi nghiên cu bài ging môn
hc và các tài liu tham kho khác.
5. Tham gia đy đ các bui hng dn hc tp
Thông qua các bui hng dn hc tp, ging viên s giúp sinh viên nm đc ni
dung tng th ca môn hc và gii đáp thc mc, đng th
i sinh viên cng có th trao đi,
tho lun vi nhng sinh viên khác v ni dung bài hc.
6. Ch đng liên h vi bn hc và ging viên
Cách đn gin nht là tham d các din dàn hc tp trên mng Internet, qua đó có th
trao đi trc tip các vn đ vng mc vi ging viên hoc các bn hc khác đang online.
7. T ghi chép li nhng ý chính
Vic ghi chép li nhng ý chính là mt ho
t đng tái hin kin thc, kinh nghim
cho thy nó giúp ích rt nhiu cho vic hình thành thói quen t hc và t duy nghiên cu.
8. Hc đi đôi vi hành
Hc lý thuyt đn đâu thc hành làm bài tp và thc hành ngay đn đó đ hiu và nm
chc lý thuyt. Sinh viên cn cài đt trên máy tính các thut toán trong bài hc bng các ngôn
ng lp trình đ t đó có th hiu và nm chc hn t
 tng và ni dung ca thut toán.

Hà Ni, ngày 20 tháng 02 nm 2006
Ths. Nguyn Duy Phng

Chng 1: i cng v k thut lp trình cu trúc

3
CHNG 1: I CNG V K THUT LP
TRÌNH CU TRÚC
Ni dung chính ca chng này tp chung làm sáng t nhng nguyên lý c bn ca
lp trình cu trúc. Nhng nguyên lý này đc coi nh nn tng t tng ca phng pháp
lp trình cu trúc đã đc tích hp trong các ngôn ng lp trình. Nm vng các nguyên lý
ca lp trình cu trúc không ch giúp ngi hc có cách tip cn ngôn ng lp trình nhanh
chóng mà con giúp h cách t duy trong khi xây dng các h thng ng dng. Các nguyên
lý c b
n đc gii thiu trong chng này bao gm:
X Nguyên lý lnh - lnh có cu trúc - cu trúc d liu.
X Nguyên lý ti thiu.
X Nguyên lý đa phng.
X Nguyên lý an toàn.
X Nguyên lý nht quán.
X Nguyên lý Top-Down .
X Nguyên lý Botton-Up.
Bn đc có th tìm đc nhng chi tit sâu hn và rng hn trong tài liu [1] & [6].
1.1. S LC V LCH S LP TRÌNH CU TRÚC
Lp trình là mt trong nhng công vic nng nhc nht ca khoa hc máy tính. Có
th nói, nng sut xây dng các sn phm phn mm là rt thp so vi các hot đng trí tu
khác. Mt sn phm phn mm có th đc thit k và cài đt trong vòng 6 tháng vi 3 lao
đng chính. Nhng đ kim tra tìm li và tip tc hoàn thin sn phm đó phi mt thêm
chng 3 n
m. ây là hin tng ph bin trong tin hc ca nhng nm 1960 khi xây dng
các sn phm phn mm bng k thut lp trình tuyn tính.  khc phc tình trng li ca
sn phm, ngi ta che chn nó bi mt mành che mang tính cht thng mi đc gi là
Version. Thc cht, Version là vic thay th sn phm c bng cách sa đi nó ri công b

d
i dng mt Version mi, ging nh: MS-DOS 4.0 ch tn ti trong thi gian vài tháng
ri thay đi thành MS-DOS 5.0, MS-DOS 5.5, MS-DOS 6.0 . . . ây không phi là mt sn
phm mi nh ta tng mà trong nó còn tn ti nhng li không th b qua đc, vì ngay
MS-DOS 6.0 cng ch là s khc phc hn ch ca MS-DOS 3.3 ban đu.
Trong thi k đu ca tin hc, các lp trình viên xây dng chng trình bng các
ngôn ng lp trình bc th
p, quá trình np và theo dõi hot đng ca chng trình mt cách
trc tip trong ch đ trc tuyn (on-line). Vic tìm và sa li (debbugging) nh ngày nay
là không th thc hin đc. Do vy, trc nhng nm 1960, ngi ta coi vic lp trình
Chng 1: i cng v k thut lp trình cu trúc

4
ging nh nhng hot đng ngh thut nhum màu sc cá nhân hn là khoa hc. Mt s
ngi nm đc mt vài ngôn ng lp trình, cùng mt s mo vt tn dng cu hình vt lý
c th ca h thng máy tính, to nên mt s sn phm l ca phn mm đc coi là mt
chuyên gia nm bt đc nhng bí 
n ca ngh thut lp trình.
Các h thng máy tính trong giai đon này có cu hình yu, b nh nh, tc đ các
thit b vào ra thp làm chm quá trình np và thc hin chng trình. Chng trình đc
xây dng bng k thut lp trình tuyn tính mà ni bt nht là ngôn ng lp trình Assembler
và Fortran. Vi phng pháp lp trình tuyn tính, lp trình viên ch đc phép th hin
chng trình ca mình trên hai c
u trúc lnh, đó là cu trúc lnh tun t (sequential) và
nhy không điu kin (goto). H thng th vin vào ra nghèo nàn làm cho vic lp trình tr
nên khó khn, chi phí cho các sn phm phn mm quá ln, đ tin cy ca các sn phm
phn mm không cao dn ti hàng lot các d án tin hc b tht bi, đc bit là các h thng
tin hc có tm c ln. Nm 1973, Hoare khng
đnh, nguyên nhân tht bi mà ngi M
gp phi khi phóng v tinh nhân to v phía sao V n (Sao Kim) là do li ca chng trình

điu khin vit bng Fortran. Thay vì vit:
DO 50 I = 12, 523
(Thc hin s 50 vi I là 12, 13, ..., 523)
Lp trình viên (hoc thao tác viên đc bìa) vit thành:
DO 50 I = 12.523
(Du phy đã thay bng du chm)
Gp câu lnh này, chng trình dch ca Fortran đã hiu là gán giá tr thc 12.523
cho bin DO 50 I làm cho kt qu
chng trình sai.
 gii quyt nhng vng mc trong k thut lp trình, các nhà tin hc lý thuyt đã
đi sâu vào nghiên cu tìm hiu bn cht ca ngôn ng, thut toán và hot đng lp trình,
nâng ni dung ca k thut lp trình lên thành các nguyên lý khoa hc ngày nay. Kt qu
ni bt nht trong giai đon này là Knuth xut bn b 3 tp sách mang tên “Ngh thut lp
trình” gii thiu ht sc t
m c s lý thuyt đm bo toán hc và các thut toán c bn x
lý d liu na s, sp xp và tìm kim. Nm 1968, Dijkstra công b lá th “V s nguy hi
ca toán t goto”. Trong công trình này, Dijkstra khng đnh, có mt s li do goto gây nên
không th xác đnh đc đim bt đu ca li. Dijkstra còn khng đnh thêm: “Tay ngh
ca mt lp trình viên t l ngh
ch vi s lng toán t goto mà anh ta s dng trong
chng trình”, đng thi kêu gi hu b trit đ toán t goto trong mi ngôn ng lp trình
ngoi tr ngôn ng lp trình bc thp. Dijkstra còn đa ra khng đnh, đng thái ca chng
trình có th đc đánh giá tng minh qua các cu trúc lp, r nhánh, gi đ qui là c s
ca lp trình cu trúc ngày nay.
Nhng kt qu
đc Dijikstra công b đã to nên mt cuc cách mng trong k
thut lp trình, Knuth lit kê mt s trng hp có li ca goto nh vòng lp kt thúc gia
chng, bt li . . ., Dijkstra, Hoare, Knuth tip tc phát trin t tng coi chng trình máy
tính cùng vi lp trình viên là đi tng nghiên cu ca k thut lp trình và phng pháp
Chng 1: i cng v k thut lp trình cu trúc


5
làm ch s phc tp ca các hot đng lp trình. Nm 1969, Hoare đã phát biu các tiên đ
phc v cho vic chng minh tính đúng đn ca chng trình, phát hin tính bt bin ca
vòng lp bng cách coi chng trình va là bn mã hoá thut toán đng thi là bn chng
minh tính đúng đn ca chng trình. Sau đó Dahl, Hoare, Dijiksta đã phát trin thành ngôn
ng lp trình cu trúc.
 trin khai các nguyên lý lp trình c
u trúc, L. Wirth đã thit k và cài đt ngôn
ng ALGOL W là mt bin th ca ALGOL 60. Sau này, L. Wirth tip tc hoàn thin đ
tr thành ngôn ng lp trình Pascal. ây là ngôn ng lp trình gin d, sáng sa v cú pháp,
d minh ha nhng vn đ phc tp ca lp trình hin đi và đc coi là mt chun mc
trong ging dy lp trình.
Nm 1978, Brian Barninghan cùng Denit Ritche thit k ngôn ng lp trình C vi t
i
thiu các cu trúc lnh và hàm khá phù hp vi t duy và tâm lý ca ca ngi lp trình.
ng thi, hai tác gi đã phát hành phiên bn h điu hành UNIX vit ch yu bng ngôn
ng C, khng đnh thêm uy th ca C trong lp trình h thng.
1.2. CU TRÚC LNH, LNH CÓ CU TRÚC, CU TRÚC D LIU
1.2.1. Cu trúc lnh (cu trúc điu khin)
Mi chng trình máy tính v bn cht là mt bn mã hoá thut toán. Thut toán
đc coi là dãy hu hn các thao tác s cp trên tp đi tng vào (Input) nhm thu đc
kt qu ra (output). Các thao tác trong mt ngôn ng lp trình c th đc điu khin bi
các lnh hay các cu trúc điu khin, còn các đi tng chu thao tác thì đc mô t và biu
di
n thông qua các cu trúc d liu.
Trong các ngôn ng lp trình cu trúc, nhng cu trúc lnh sau đc s dng đ xây
dng chng trình. D nhiên, chúng ta s không bàn ti cu trúc nhy không điu kin goto
mc dù ngôn ng lp trình cu trúc nào cng trang b cu trúc lnh goto.


câu lnh GOTO.






Hình 1.1: Cu trúc tun t và cu trúc r nhánh dng đy đ
Cu trúc tun t
A;


B;

Sau khi thc hin lnh A thì thc hin lnh B
A
B
Cu trúc r nhánh dng đy đ
If (E) A; S
Else B; 




Nu biu thc E có giá tr đúng (khác 0) thì
thchinA;NuEsaithìthchinB;
AB
Chng 1: i cng v k thut lp trình cu trúc

6

















Hình 1.2. Các cu trúc lp
A, B : ký hiu cho các câu lnh đn hoc lnh hp thành. Mi lnh đn l đc gi là
mt lnh đn, lnh hp thành là lnh hay cu trúc lnh đc ghép li vi nhau theo qui đnh
ca ngôn ng, trong Pascal là tp lnh hay cu trúc lnh đc bao trong thân ca begin . . .
end; trong C là tp các lnh hay cu trúc lnh đc bao trong hai ký hiu { ... }.
E, E1, E2, E3 là các biu thc s hc hoc logic. Mt s ngôn ng lp trình coi giá tr

ca biu thc logic hoc đúng (TRUE) hoc sai (FALSE), mt s ngôn ng lp trình khác
nh C coi giá tr ca biu thc logic là đúng nu nó có giá tr khác 0, ngc li biu thc
logic có giá tr sai.
Cn lu ý rng, mt chng trình đc th hin bng các cu trúc điu khin lnh :
tun t, tuyn chn if..else, switch . . case .. default, lp vi đi
u kin trc while , lp vi
điu kin sau do . . while, vòng lp for bao gi cng chuyn đc v mt chng trình, ch

s dng ti thiu hai cu trúc lnh là tun t và lp vi điu kin trc while. Phng pháp
lp trình này còn đc gi là phng pháp lp trình hn ch.
Cu trúc lp vi điu kin sau
do


A; S 
while (E);
Thc hin A cho ti khi nào E vn còn
đúng;
Cu trúc lp FOR
For (E1; E2;E3)
A;



S 

Cu trúc lp vi điu kin trc
While (E) A;

S



Trong khi biu thc E còn có giá tr đúng thì
thc hin A;
E
A
A

E
E1
E2
E3
A
Chng 1: i cng v k thut lp trình cu trúc

7
1.2.2. Lnh có cu trúc
Lnh có cu trúc là lnh cho phép cha các cu trúc điu khin trong nó. Khi tìm hiu
mt cu trúc điu khin cn xác đnh rõ v trí đc phép đt mt cu trúc điu khin trong
nó, cng nh nó là mt phn ca cu trúc điu khin nào. iu này tng nh rt tm
thng nhng có ý ngha ht sc quan trng trong khi xây d
ng và kim tra li có th xy
ra trong chng trình. Nguyên tc vit chng trình theo cu trúc: Cu trúc con phi đc
vit lt trong cu trúc cha, đim vào và đim ra ca mi cu trúc phi nm trên cùng mt
hàng dc. Ví d sau s minh ha cho nguyên tc vit chng trình:
if (E)
while (E1)
A;
else
do
B;
while(E2);
Trong ví d trên, while (E1) A; là cu trúc con nm trong thân ca cu trúc cha là if
(E) ; còn do B while(E2); là cu trúc con trong thân ca else. Do vy, câu lnh while(E1);
do . . . while(E2) có cùng cp vi nhau nên nó phi nm trên cùng mt ct, tng t nh
vy vi A, B và if vi else.
1.2.3. Cu trúc d liu
Các ngôn ng lp trình cu trúc nói chung đu ging nhau v cu trúc lnh và cu

trúc d liu. im khác nhau duy nht gia các ngôn ng
 lp trình cu trúc là phng pháp
đt tên, cách khai báo, cú pháp câu lnh và tp các phép toán đc phép thc hin trên các
cu trúc d liu c th. Nm bt đc nguyên tc này, chúng ta s d dàng chuyn đi cách
th hin chng trình t ngôn ng lp trình này sang ngôn ng lp trình khác mt cánh
nhanh chóng mà không tn quá nhiu thi gian cho vic hc tp ngôn ng lp trình.
Thông thng, các cu trúc d liu đc phân thành hai loi: cu trúc d li
u có kiu
c bn (Base type) và cu trúc d liu có kiu do ngi dùng đnh ngha (User type) hay
còn gi là kiu d liu có cu trúc. Kiu d liu c bn bao gm: Kiu kí t (char), kiu s
nguyên có du (signed int), kiu s nguyên không du (unsigned int), kiu s nguyên dài có
du (signed long), kiu s nguyên dài không du (unsigned long ), kiu s thc (float) và
kiu s
thc có đ chính xác gp đôi (double).
Kiu d liu do ngi dùng đnh ngha bao gm kiu xâu kí t (string), kiu mng
(array), kiu tp hp (union), kiu cu trúc (struct), kiu file, kiu con tr (pointer) và các
kiu d liu đc đnh ngha mi hoàn toàn nh kiu danh sách móc ni (link list), kiu cây
(tree) . . .
Kích c ca kiu c bn đ
ng ngha vi min xác đnh ca kiu vi biu din nh
phân ca nó, và ph thuc vào tng h thng máy tính c th.  xác đnh kích c ca kiu
nên dùng toán t sizeof( type). Chng trình sau s lit kê kích c ca các kiu c bn.
Chng 1: i cng v k thut lp trình cu trúc

8
Ví d 1.1. Kim tra kích c ca kiu.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <io.h>

void main(void) {
printf(“\n Kích c kiu kí t:%d”, sizeof(char));
printf(“\n Kích c kiu kí t không du:%d”, sizeof(unsigned char));
printf(“\n Kích c kiu s nguyên không du:%d”, sizeof(unsigned int));
printf(“\n Kích c kiu s nguyên có du:%d”, sizeof(signed int));
printf(“\n Kích c kiu s nguyên dài không du:%d”, sizeof(unsigned long ));
printf(“\n Kích c kiu s nguyên dài có du:%d”, sizeof(signed long ));
printf(“\n Kích c kiu s thc có đ chính xác đn:%d”, sizeof(float ));
printf(“\n Kích c kiu s thc có đ chính xác kép:%d”, sizeof(double ));
getch();
}
Kích c ca các kiu d liu do ngi dùng đnh ngha là tng kích c ca mi kiu
thành viên trong nó. Chúng ta cng vn dùng toán t sizeof(tên kiu) đ xác đnh đ ln tính
theo byte ca các kiu d liu này.
Mt đim đc bit chú ý trong khi lp trình trên các cu trúc d liu là cu trúc d liu
nào thì phi kèm theo phép toán đó, vì mt bin đc gi là thuc kiu d liu nào
đó nu
nh nó nhn mt giá tr t min xác đnh ca kiu và các phép toán trên kiu d liu đó.
1.3. NGUYÊN LÝ TI THIU
Hãy bt đu t mt tp nguyên tc và ti thiu các phng tin là các cu trúc lnh, kiu
d liu cùng các phép toán trên nó và thc hin vit chng trình. Sau khi nm chc nhng
công c vòng đu mi đt vn đ m rng sang h thng th vin tin ích ca ngôn ng.
Khi làm quen vi mt ngôn ng lp trình nào đó, không nht thit phi l thuc quá
nhiu vào h
 thng th vin hàm ca ngôn ng, mà điu quan trng hn là trc mt bài
toán c th, chúng ta s dng ngôn ng đ gii quyt nó th nào, và phng án tt nht là
lp trình bng chính h thng th vin hàm ca riêng mình. Do vy, đi vi các ngôn ng
lp trình, chúng ta ch cn nm vng mt s các công c ti thiu nh sau:
1.3.1. Tp các phép toán
Tp các phép toán s

 hc: + (cng); - (tr); * (nhân); % (ly phn d); / (chia).
Tp các phép toán s hc m rng:
++a ú a = a +1; // tng giá tr bin nguyên a lên mt đn v;
--a ú a = a-1; //gim giá tr bin nguyên a mt đn v;
a+= n ú a = a+n; // tng giá tr bin nguyên a lên n đn v;
Chng 1: i cng v k thut lp trình cu trúc

9
a-=n ú a = a - n; // gim giá tr bin nguyên a n đn v);
a%=n ú a = a%n; // ly giá tr bin a modul vi n;
a/=n ú a=a/n;// ly giá tr bin a chia cho n;
a*=n ú a = a*n; // ly giá tr bin a nhân vi n;
Tp các phép toán so sánh: >, <, >=, <=, ==, != ( ln hn, nh hn, ln hn
hoc bng, nh hn hoc bng, đúng bng, khác). Qui tc vit đc th hin nh sau:
if ( a>b) { . . } // nu a ln hn b
if ( a<b) { . . } // nu a nh
 hn b
if ( a>=b) { . . } // nu a ln hn hoc bng b
if ( a<=b) { . . } // nu a nh hn hoc bng b
if ( a==b) { . . } // nu a đúng bng b
if ( a!=b) { . . } // nu a khác b
Tp các phép toán logic: &&, ||, ! (và, hoc, ph đnh)
&&: Phép và logic ch cho giá tr đúng khi hai biu thc tham gia đu có giá tr
đúng (giá tr đúng ca mt biu thc trong C đc hiu là biu thc có giá tr khác 0).
||: Phép hoc logic ch cho giá tr sai khi c hai biu thc tham gia đu có giá
tr
 sai.
!: Phép ph đnh cho giá tr đúng nu biu thc có giá tr sai và ngc li cho
giá tr sai khi biu thc có giá tr đúng. Ng ngha ca các phép toán đc minh ha
thông qua các câu lnh sau:

int a =3, b =5;
if ( (a !=0) && (b!=0) ) // nu a khác 0 và b khác 0
if ((a!=0) || (b!=0)) // nu a khác 0 hoc b khác 0
if ( !a ) // ph đnh a khác 0
if (a==b) // nu a đúng bng b
Các toán t thao tác bít (không s dng cho float và double)
& : Phép hi các bít.
| : Phép tuyn các bít.
^ : Phép tuyn các bít có loi tr.
<< : Phép dch trái (dch sang trái n bít giá tr 0)
>> : Phép dch ph
i (dch sang phi n bít có giá tr 0)
~ : Phép ly phn bù.
Chng 1: i cng v k thut lp trình cu trúc

10
Ví d 1.2: Vit chng trình kim tra các toán t thao tác bít.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <io.h>
void main(void){
unsigned int a=3, b=5, c; clrscr();
c = a & b; printf(“\n c = a & b=%d”,c);
c = a | b; printf(“\n c = a | b=%d”,c);
c = a ^ b; printf(“\n c = a ^ b=%d”,c);
c = ~a; printf(“\n c = ~a =%d”,c);
c = a << b; printf(“\n c = a << b=%d”,c);
c = a >>b; printf(“\n c = a >> b=%d”,c);
getch();

}
Toán t chuyn đi kiu: Ta có th dùng toán t chuyn đi kiu đ nhn đc kt qu
tính toán nh mong mun. Qui tc chuyn đi kiu đc thc hin theo qui tc: (kiu) bin.
Ví d 1.3: Tính giá tr phép chia hai s nguyên a và b.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <io.h>
void main(voi)(
int a=3, b=5; float c;
c= (float) a / (float) b;
printf(“\n thng c = a / b =%6.2f”, c);
getch();
}
Th t u tiên các phép toán : Khi vit mt biu thc, chúng ta cn lu ý ti th t
u tiên tính toán các phép toán, các bng tng hp sau đây phn ánh trt t u tiên tính toán
ca các phép toán s hc và phép toán so sánh.
Bng tng hp th t u tiên tính toán các phép toán s hc và so sánh

TÊN TOÁN T CHIU TÍNH TOÁN
( ), [] , -> L -> R
- , ++, -- , ! , ~ , sizeof() R -> L
* , /, % L -> R
Chng 1: i cng v k thut lp trình cu trúc

11
+ , - L -> R
>>, << L -> R
<, <=, > , >=, L -> R
== != L -> R

& L -> R
^ L -> R
| L -> R
&& L -> R
|| L -> R
?: R -> L
=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>= R -> L
1.3.2. Tp các lnh vào ra c bn
Nhp d liu t bàn phím: scanf(“format_string, . . .”, &parameter . . .);
Nhp d liu t tp: fscanf( file_pointer,”format_string, . . .”, &parameter, . . .);
Nhn mt ký t t bàn phím: getch(); getchar();
Nhn mt ký t t file: fgetc(file_pointer, character_name);
Nhp mt string t bàn phím: gets(string_name);
Nhn mt string t file text : fgets(string_name, number_character, file_pointer);
Xut d liu ra màn hình: printf(“format_string . . .”, parameter . . .);
Xut d liu ra file : fprintf(file_pointer, “format_string . . .”, parameter. . .);
Xut mt ký t ra màn hình: putch(character_name);
Xut mt ký t ra file: fputc(file_pointer, character_name);
Xut mt string ra màn hình: puts(const_string_name);
Xut mt string ra file: fputs(file_pointer, const_string_name);
1.3.3. Thao tác trên các ki
u d liu có cu trúc
Tp thao tác trên string:
char *strchr(const char *s, int c) : tìm ký t c đu tiên xut hin trong xâu s;
char *stpcpy(char *dest, const char *src) : copy xâu scr vào dest;
Chng 1: i cng v k thut lp trình cu trúc

12
int strcmp(const char *s1, const char *s2) : so sánh hai xâu s1 và s2 theo th t t
đin, nu s1 < s2 thì hàm tr li giá tr nh hn 0. Nu s1>s2 hàm tr li giá tr

dng. Nu s1==s2 hàm tr li giá tr 0.
char *strcat(char *dest, const char *src) : thêm xâu scr vào sau xâu dest.
char *strlwr(char *s) : chuyn xâu s t ký t in hoa thành ký t in thng.
char *strupr(char *s): chuyn xâu s t ký t thng hoa thành ký t in hoa.
char *strrev(char *s): đo ngc xâu s.
char *strstr(const char *s1, const char *s2): tìm v trí đu tiên ca xâu s2 trong xâu s1.
int strlen(char *s): cho đ dài ca xâu ký t s.
Tp thao tác trên con tr:
Thao tác l
y đa ch ca bin: & parameter_name;
Thao tác ly ni dung bin (bin có kiu c bn): *pointer_name;
Thao tác tr ti phn t tip theo: ++pointer_name;
Thao tác tr ti phn t th n k t v trí hin ti: pointer_name = pointer_name +n;
Thao tác tr ti phn t sau con tr k t v trí hin ti: --pointer_name;
Thao tác tr ti phn t sau n phn t k t v
trí hin ti:
Pointer_name = pointer_name - n;
Thao tác cp phát b nh cho con tr:
void *malloc(size_t size);
void *calloc(size_t nitems, size_t size);
Thao tác cp phát li b nh cho con tr : void *realloc(void *block, size_t size);
Thao tác gii phóng b nh cho con tr: void free(void *block);
Tp thao tác trên cu trúc:
nh ngha cu trúc:
struct struct_name{
type_1 parameter_name_1;
type_2 parameter_name_2;
. . . . . . . . . . . . . . . . . . . . . .
type_k parameter_name_k;
} struct_parameter_name;

Phép truy nhp ti thành phn cu trúc:
Chng 1: i cng v k thut lp trình cu trúc

13
struct_parameter_name.parameter_name.
Phép gán hai cu trúc cùng kiu:
struct_parameter_name1 = struct_parameter_name2;
Phép tham tr ti thành phn ca con tr cu trúc:
pointer_struct_parameter_name -> struct_parameter_name.
Tp thao tác trên file:
Khai báo con tr file: FILE * file_pointer;
Thao tác m file theo mode: FILE *fopen(const char *filename,const char *mode);
Thao tác đóng file: int fclose(FILE *stream);
Thao tác đc tng dòng trong file: char *fgets(char *s, int n, FILE *stream);
Thao tác đc tng khi trong file:
size_t fread(void *ptr, size_t size,size_t n, FILE *stream);
Thao tác ghi tng dòng vào file: int fputs(const char *s, FILE *stream);
Thao tác ghi tng khi vào file:
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);
Thao tác kim tra s tn ti ca file: int access(const char *filename, int amode);
Thao tác đi tên file: int rename(const char *oldname,const char *newname);
Thao tác loi b file: int unlink(const char *filename);
1.4. NGUYÊN LÝ A PHNG
̇ Các bin đa phng trong hàm, th tc hoc chu trình cho dù có trùng tên
vi bin toàn cc thì khi x lý bin đó trong hàm hoc th tc vn không làm
thay đi giá tr ca bin toàn cc.
̇ Tên ca các bin trong đi ca hàm hoc th tc đu là hình thc.
̇ Mi bin hình thc truyn theo tr cho hàm hoc th tc đu là các bin đa
phng.
̇ Các bin khai báo bên trong các ch

ng trình con, hàm hoc th tc đu là
bin đa phng.
̇ Khi phi s dng bin ph nên dùng bin đa phng và hn ch ti đa vic
s dng bin toàn cc đ tránh xy ra các hiu ng ph.
Ví d hoán đi giá tr ca hai s a và b sau đây s minh ha rõ hn v nguyên lý đa
phng.
Ví d 1.4. Hoán đi giá tr ca hai bi
n a và b.
Chng 1: i cng v k thut lp trình cu trúc

14
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <io.h>
int a, b; // khai báo a, b là hai bin toàn cc.
void Swap(void) {
int a,b, temp; // khai báo a, b là hai bin đa phng
a= 3; b=5; // gán giá tr cho a và b
temp=a; a=b; b=temp;// đi giá tr ca a và b
printf(“\n Kt qu thc hin trong th tc a=%5d b=%5d:,a,b);
}
void main(void) {
a=1; b=8; // khi đu giá tr cho bin toàn cc a, b.
Swap();
printf(“\n Kt qu sau khi thc hin th tc a =%5d b=%5d”,a,b);
getch();
}
Kt qu thc hin chng trình:
Kt qu thc hin trong th tc a = 5 b=3

Kt qu sau khi thc hin th tc a = 1 b =8
Trong ví d trên a, b là hai bin toàn cc, hai bin a, b trong th tc Swap là hai bin
cc b. Các thao tác trong th tc Swap gán cho a giá tr 3 và b giá tr 5 sau đó thc hin
đi giá tr ca a =5 và b =3 là công vic x lý ni b ca th tc mà không làm thay đi giá
tr ca bin toàn c
c ca a, b sau thi thc hin xong th tc Swap. Do vy, kt qu sau khi
thc hin Swap a = 1, b =8; iu đó chng t trong th tc Swap cha bao gi s dng ti
hai bin toàn cc a và b. Tuy nhiên, trong ví d sau, th tc Swap li làm thay đi giá tr ca
bin toàn cc a và b vì nó thao tác trc tip trên bin toàn cc.
Ví d 1.5. i giá tr ca hai bin a và b
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <io.h>
int a, b; // khai báo a, b là hai bin toàn cc.
void Swap(void) {
int temp; // khai báo a, b là hai bin đa phng
a= 3; b=5; // gán giá tr cho a và b
temp=a; a=b; b=temp;// đi giá tr ca a và b
printf(“\n Kt qu thc hin trong th tc a=%5d b=%5d:,a,b);
}
void main(void) {
Chng 1: i cng v k thut lp trình cu trúc

15
a=1; b=8; // khi đu giá tr cho bin toàn cc a, b.
Swap();
printf(“\n Kt qu sau khi thc hin th tc a =%5d b=%5d”,a,b);
getch();
}

Kt qu thc hin chng trình:
Kt qu thc hin trong th tc a = 8 b=1
Kt qu sau khi thc hin th tc a = 1 b =8
1.5. NGUYÊN LÝ NHT QUÁN
̇ D liu th nào thì phi thao tác th y. Cn sm phát hin nhng mâu thun
gia cu trúc d liu và thao tác đ kp thi khc phc.
Nh chúng ta đã bit, kiu là mt tên ch tp các đi tng thuc min xác đnh cùng
vi nhng thao tác trên nó. Mt bin khi đnh ngha bao gi cng thuc mt kiu xác đnh
nào đó hoc là kiu c
 bn hoc kiu do ngi dùng đnh ngha. Thao tác vi bin ph
thuc vào nhng thao tác đc phép ca kiu. Hai kiu khác nhau đc phân bit bi tên,
min xác đnh và các phép toán trên kiu d liu. Tuy nhiên, trên thc t có nhiu li nhp
nhng gia phép toán và cu trúc d liu mà chúng ta cn hiu rõ.
i vi kiu ký t, v nguyên tc chúng ta không đc phép thc hin các phép toán
s hc trên nó, nhng ngôn ng
C luôn đng nht gia ký t vi s nguyên có đ ln 1
byte. Do vy, nhng phép toán s hc trên các ký t thc cht là nhng phép toán s hc
trên các s nguyên. Chng hn, nhng thao tác nh trong khai báo di đây là đc phép:
char x1=’A’, x2 =’z’;
x1 = (x1 + 100) % 255;
x2 = (x2-x1) %255;
Mc dù x1, x2 đc khai báo là hai bin kiu char, nhng trong thao tác
x1 = (x1 + 100) % 255;
x2 = (x2 +x1) %255;
chng trình dch s t đng chuyn đi x1 thành mã ca ký t ‘A’ là 65, x2 thành mã ký
t ‘z’ là 122 đ thc hin phép toán. Kt qu nhn đc x1 là mt ký t có mã là
(65+100)%255 = 165; x2 là ký t có mã là 32 ng vi mã ca ký t space.
Chúng ta có th thc hin đc các phép toán s hc trên kiu int, long, float, double.
Nhng đi vi int và long, chúng ta cn đc bit chú ý phép chia hai s nguyên cho ta mt
s nguyên, tích hai s nguyên cho ta mt s nguyên, tng hai s nguyên cho ta mt s

nguyên mc dù thng hai s nguyên là mt s th
c, tích hai s nguyên hoc tng hai s
nguyên có th là mt s long int. Do vy, mun nhn đc kt qu đúng, chúng ta cn phi
chuyn đi các bin thuc cùng mt kiu trc khi thc hin phép toán. Ngc li, ta không
Chng 1: i cng v k thut lp trình cu trúc

16
th ly modul ca hai s thc hoc thc hin các thao tác dch chuyn bít trên nó, vì nhng
thao tác đó không nm trong đnh ngha ca kiu.
iu tng t cng xy ra vi các string. Trong Pascal, phép toán so sánh hai string
hoc gán trc tip hai Record cùng kiu vi nhau là đc phép, ví d : Str1>Str2, Str1 :=
Str2; Nhng trong C thì các phép toán trên li không đc đnh ngha, nu mun thc hin
nó, chúng ta ch có cách đnh ngha li hoc thc hi
n nó thông qua các li gi hàm.
1.6. NGUYÊN LÝ AN TOÀN
̇ Li nng nht nm  mc cao nht (mc ý đ thit k) và  mc thp nht th
tc phi chu ti ln nht.
̇ Mi li, dù là nh nht cng phi đc phát hin  mt bc nào đó ca
chng trình. Quá trình kim tra và phát hin li phi đc thc hin trc
khi li đó hoành hành.
Các loi li thng xy ra trong khi vit chng trình có th đc tng kt li nh
sau:
Li đc thông báo bi t khoá error (li cú pháp): loi li này thng xy ra
trong khi son tho chng trình, chúng ta có th vit sai các t khoá ví d thay vì vit là int
chúng ta son tho sai thành Int (li ch in thng thành in hoa), hoc vit sai cú pháp các
biu thc nh thiu các du ngoc đn, ngoc kép hoc du chm ph
y khi kt thúc mt
lnh, hoc cha khai báo nguyên mu cho hàm .
Li đc thông báo bi t khoá Warning (li cnh báo): li này thng xy ra khi
ta khai báo bin trong chng trình nhng li không s dng ti chúng, hoc li trong các

biu thc kim tra khi bin đc kim tra không xác đnh đc giá tr ca nó, hoc li do
th t u tiên các phép toán trong biu thc. Hai loi li error và warning đc thông báo
ngay khi dch chng trình thành file *.OBJ. Quá trình liên k
t (linker) các file *.OBJ đ
to nên file chng trình mã máy *.EXE ch đc tip tc khi chúng ta hiu đính và kh b
mi li error.
Li xy ra trong quá trình liên kt: li này thng xut hin khi ta s dng ti các
li gi hàm, nhng nhng hàm đó mi ch tn ti di dng nguyên mu (function
prototype) mà cha đc mô t chi tit các hàm, hoc nhng li hàm gi cha đúng vi
tên c
a nó. Li này đc khc phc khi ta b sung đon chng trình con mô t chi tit cho
hàm hoc sa đi li nhng li gi hàm tng ng.
Ta quan nim, li cú pháp (error), li cnh báo (warning) và li liên kt (linker) là li
tm thng vì nhng li này đã đc Compiler ca các ngôn ng lp trình phát hin đc.
 khc phc các li loi này, chúng ta ch cn phi đc và hiu đc nh
ng thông báo li
thng đc vit bng ting Anh. Cng cn phi lu ý rng, do mc đ phc tp ca
chng trình dch nên không phi li nào cng đc ch ra mt cách tng minh và chính
xác hoàn toàn ti ni xut hin li.
Chng 1: i cng v k thut lp trình cu trúc

17
Loi li cui cùng mà các compiler không th phát hin ni đó là li do chính lp
trình viên gây nên trong khi thit k chng trình và x lý d liu. Nhng li này không
đc compiler thông báo mà nó phi tr giá bng quá trình t test hoc chng minh đc
tính đúng đn ca chng trình. Li có th nm  chính ý đ thit k, hoc li do không
lng trc đc tính cht ca mi loi thông tin vào. Ví d sau minh ha cho l
i thng
xy ra thuc loi này.
Ví d 1.6. Tính tng hai đa thc A bc n, đa thc B bc m.

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 100
typedef float dathuc[MAX];
void In(dathuc A, int n, char c){
int i;
printf("\n Da thuc %c:", c);
for(i=0;i<n; i++)
printf("%6.2f", A[i]);
}
void Init( dathuc A, int *n, dathuc B, int *m){
int i;float temp;
printf("\n Nhap n="); scanf("%d", n);*n=*n+1;
printf("\n Nhap m="); scanf("%d",m); *m=*m+1;
printf("\n Nhap he so da thuc A:");
for(i=0; i<*n;i++){
printf("\n A[%d]=", i); scanf("%f", &temp);
A[i]=temp;
}
printf("\n Nhap he so da thuc B:");
for(i=0; i<*m;i++){
printf("\n B[%d]=",i); scanf("%f", &temp);
B[i] = temp;
}
In(A,*n,'A'); In(B,*m,'B');
}
void Tong(dathuc A, int n, dathuc B, int m, dathuc C){
int i, k;
if (n>= m ){

k =n;
for(i=0; i<m; i++)
C[i] = A[i]+B[i];
for (i=m; i<n; i++)
Chng 1: i cng v k thut lp trình cu trúc

18
C[i]=A[i];
In(C,k,'C');
}
else {
k = m;
for(i=0; i<n; i++)
C[i] = A[i]+B[i];
for (i=n; i<m; i++)
C[i]=B[i];
In(C,k,'C');
}
}
void main(void){
dathuc A, B, C;
int n, m;
Init(A, &n, B, &m);
Tong(A, n, B, m, C);
}
Trong ví d trên, chúng ta s dng đnh ngha MAX =100 đ gii quyt bài toán.
MAX đc hiu là bc ca đa thc ln nht mà chúng ta cn x lý. Nh vy, bn thân vic
đnh ngha MAX đã hn ch ti phm vi bài toán, hn ch đó cng có th xut phát t ý đ
thit k. Do vy, nu ngi s dng nhp n>MAX thì chng trình s
 gp li. Nu chúng ta

khc phc bng cách đnh ngha BAC đ ln thì trong trng hp x lý các đa thc có bc n
nh s gây nên hin tng lãng phí b nh, và trong nhiu trng hp không đ b nh đ
đnh ngha đa thc. Gii pháp khc phc các li loi này là chúng ta s dng con tr thay
cho các hng, k thut này s đc th
o lun k trong Chng 2.
1.7. PHNG PHÁP TOP-DOWN
̇ Quá trình phân tích bài toán đc thc hin t trên xung di. T vn đ
chung nht đn vn đ c th nht. T mc tru tng mang tính cht tng
quan ti mc đn gin nht là đn v chng trình.
Mt trong nhng nguyên lý quan trng ca lp trình cu trúc là phng pháp phân
tích t trên xung (Top - Down) vi quan đim “thy cây không bng thy rng”, phi
đng cao hn đ quan sát tng th khu rng ch không th đng trong rng quan sát chính
nó.
Quá trình phân rã bài toán đc thc hin theo tng mc khác nhau. Mc thp nht
đc gi là mc tng quan (level 0), mc tng quan cho phép ta nhìn tng th h thng
thông qua các chc nng ca nó, nói cách khác mc 0 s tr li thay cho câu hi “H thng
có th thc hin đc nhng gì ?”. Mc tip theo là mc các chc nng chính.
 mc này,
nhng chc nng c th đc mô t. Mt h thng có th đc phân tích thành nhiu mc
khác nhau, mc thp đc phép s dng các dch v ca mc cao. Quá trình phân tích tip
Chng 1: i cng v k thut lp trình cu trúc

19
tc phân rã h thng theo tng chc nng ph cho ti khi nào nhn đc mc các đn th (
UNIT, Function, Procedure), khi đó chúng ta tin hành cài đt h thng.
Chúng ta s làm rõ hn tng mc ca quá trình Top-Down thông qua bài toán sau:
Bài toán: Cho hai s nguyên có biu din nh phân là a=(a
1
, a
2

, . . ., a
n
), b = (b
1
, b
2
,
.., b
n
); a
i
, b
i
=0, 1, i=1, 2, . . .n. Hãy xây dng tp các thao tác trên hai s nguyên đó.
Mc tng quan (level 0):
Hình dung toàn b nhng thao tác trên hai s nguyên a=(a
1
, a
2
, . . ., a
n
),
b=(b
1
,b
2
,..,b
n
) vi đy đ nhng chc nng chính ca nó. Gi s nhng thao tác đó bao
gm:

F1- Chuyn đi a, b thành các s nh phân;
F2- Tính tng hai s nguyên: a + b;
F3- Tính hiu hai s nguyên: a - b;
F4 Tính tích hai s nguyên: a *b;
F5- Thng hai s nguyên : a/b;
F6- Phn d hai s nguyên: a % b;
F7- c s chung ln nht ca hai s nguyên.
Mc 1. Mc các chc nng chính: mi chc nng cn mô t đy đ thông tin vào
(Input), thông tin ra (Output), khuôn d
ng (Format) và các hành đng (Actions).
Chc nng F1: Chuyn đi a, b thành các s  h nh phân
Input : a : integer;
Output : a=(a
1
, a
2
, . . ., a
n
)
b
; (*khai trin c s b bt k*)
Format : Binary(a);
Actions
{ Q = n; k=0;
While ( Q≠ 0 ) {
a
k
= q mod b;
q = q div b;
k = k +1;

}
< Khai trin c s b ca a là (a
k-1
, a
k-2
, . ., a
1
, a
0
) >;
}
Chc nng F2: Tính tng hai s nguyên a, b.
Input:
a=(a
1
, a
2
, . . ., a
n
),
b = (b
1
, b
2
, .., b
n
);
Output:
Chng 1: i cng v k thut lp trình cu trúc


20
c = a + b;
Format: Addition(a, b);
Actions {
c = 0;
for (j = 0; j< n; j++){

d = (a
j
+ b
j
+ c) div 2;
s
j
= a
j
+ b
j
+ c - 2d;
c = d;
}
s
n
= c;
< Khai trin nh phân ca tng là (s
n
s
n-1
. . .s
1

,s
0
)
2
>
}
Chc nng F3: Hiu hai s nguyên a, b.
Input:
a=(a
1
, a
2
, . . ., a
n
),
b = (b
1
, b
2
, .., b
n
);
Output:
c = a - b;
Format: Subtraction(a, b);
Actions {
b = -b;
c = Addition(a, b);
return(c);
}

Chc nng F4: Tích hai s nguyên a, b.
Input:
a=(a
1
, a
2
, . . ., a
n
),
b = (b
1
, b
2
, .., b
n
);
Output:
c = a * b;
Format: Multual(a, b);
Actions {
For (j =0; j< n; j++){
If ( b
j
=1)
c
j
= a<<j;
Else
c
j

= 0;
}
(* c
0
, c
1
, . . ., c
n-1
là các tích riêng*)
p=0;
Chng 1: i cng v k thut lp trình cu trúc

21
for( j=0; j< n; j++) {
p = Addition(p, c
j
);
}
return(p);
}
Chc nng F5: Thng hai s nguyên a, b.
Input:
a=(a
1
, a
2
, . . ., a
n
),
b = (b

1
, b
2
, .., b
n
);
Output:
c = a div b;
Format: Division(a, b);
Actions {
c = 0;
while ( a>= b ) {
c = c +1;
a = Subtraction(a, b);
}
return(c);
}
Chc nng F6: Modul hai s nguyên a, b.
Input:
a=(a
1
, a
2
, . . ., a
n
),
b = (b
1
, b
2

, .., b
n
);
Output:
c = a mod b;
Format: Modulation(a, b);
Actions {
while ( a>= b )
a = Subtraction(a, b);
return(a);
}
Chc nng F7: c s chung ln nht hai s nguyên a, b.
Input:
a=(a
1
, a
2
, . . ., a
n
),
b = (b
1
, b
2
, .., b
n
);
Output:
c = USCLN(a,b);
Format: USCLN(a, b);

Actions {
Chng 1: i cng v k thut lp trình cu trúc

22
while ( a≠ b ) {
if (a > b)
a = Subtraction(a, b)
else
b = Subtraction(b,a);
}
return(a);
}
 ý rng, sau khi phân rã bài toán  mc 1, chúng ta ch cn xây dng hai phép toán
cng và phép tính nhân các s nh phân ca a, b. Vì hiu hai s a và b chính là tng s ca
(a,-b). Tng t nh vy, tích hai s a và b đc biu din bng tng ca mt s ln phép
nhân mt bít nh phân ca vi a. Phép chia và ly phn d hai s a và b chính là phép tr
nhiu ln s a. Phép tìm USCLN cng tng t nh vy.
i v
i các h thng ln, quá trình còn đc mô t tip tc cho ti khi nhn đc
mc đn v chng trình. Trong ví d đn gin này, mc đn v chng trình xut hin
ngay ti mc 1 nên chúng ta không cn phân rã tip na mà dng li đ cài đt h thng.
1.8. PHNG PHÁP BOTTOM-UP
̇ i t cái riêng ti cái chung, t các đi tng thành phn  mc cao ti các
đi tng thành phn  mc thp, t mc đn v chng trình ti mc tng
th, t nhng đn v đã bit lp đt thành nhng đn v mi.
Nu nh phng pháp Top-Down là phng pháp phân rã vn đ mt cách có h
thng t trên xung,
đc ng dng ch yu cho quá trình phân tích và thit h thng, thì
phng pháp Bottom- Up thng đc s dng cho quá trình cài đt h thng. Trong ví d
trên, chúng ta s không th xây dng đc chng trình mt cách hoàn chnh nu nh ta

cha xây dng đc các hàm Binary(a), Addition(a,b), Subtraction(a,b), Multial(a,b),
Division(a,b), Modulation(a,b), USCLN(a,b). Chng trình sau th hin quá trình cài đt
chng trình theo nguyên lý Botton-Up:
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <dos.h>
void Init(int *a, int *b){
printf("\n Nhap a=");scanf("%d", a);
printf("\n Nhap b=");scanf("%d", b);
}
void Binary(int a){
int i, k=1;
Chng 1: i cng v k thut lp trình cu trúc

23
for(i=15; i>=0; i--){
if ( a & (k<<i))
printf("%2d",1);
else
printf("%2d",0);
}
printf("\n");delay(500);
}
int bit(int a, int k){
int j=1;
if (a & (j<<k))
return(1);

return(0);
}
int Addition(int a, int b){
int du, d, s, j, c=0;
du=0;
for ( j=0; j<=15; j++){
d =( bit(a,j) + bit(b, j) +du)/2;
s = bit(a,j)+bit(b,j)+ du - 2*d;
c = c | (s <<j);
du = d;
}
return(c);
}
int Multial(int a, int b) {
int c,j, p=0;
for(j=0; j<=15; j++){
c = bit(b, j);
if (c==1) {
c = a<<j;
p= Addition(p, c);
}
else c=0;
}
return(p);
}
int Subtraction(int a, int b){
int c;
b=-b;
c=Addition(a,b);return(c);
Chng 1: i cng v k thut lp trình cu trúc


24
}
int Modul(int a, int b){
while(a>=b)
a = Subtraction(a,b);
return(a);
}
int Division(int a, int b){
int d=0;
while(a>=b) {
a= Subtraction(a,b);
d++;
}
return(d);
}
int USCLN(int a, int b){
while(a!=b){
if(a>b) a = Subtraction(a,b);
else b = Subtraction(b,a);
}
return(a);
}
void main(void){
int a, b, key, control=0;
do {
clrscr();
printf("\n Tap thao tac voi so nguyen");
printf("\n 1- Nhap hai so a,b");
printf("\n 2- So nhi phan cua a, b");

printf("\n 3- Tong hai so a,b");
printf("\n 4- Hieu hai so a,b");
printf("\n 5- Tich hai so a,b");
printf("\n 6- Thuong hai so a,b");
printf("\n 7- Phan du hai so a,b");
printf("\n 8- USCLN hai so a,b");
printf("\n 0- Tro ve");
key=getch();
switch(key){
case '1': Init(&a, &b); control=1; break;
case '2':
if (control){
Binary(a); Binary(b);

×