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

Tài liệu Bài giảng " kỹ thuật lập trình " pdf

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);

×