HC VIN CÔNG NGH BU CHÍNH VIN THÔNG
BÀI GING
K THUT LP TRÌNH
Biên son : Ths. NGUYN DUY PHNG
Gii thiu môn hc
GII THIU MÔN HC
I. GII THIU CHUNG
S phát trin công ngh thông tin trong nhng nm va qua đã làm thay đi b mt
kinh t xã hi toàn cu, trong đó công ngh phn mm tr thành mt ngành công nghip
quan trng đy tim nng. Vi s hi t ca công ngh vin thông và công ngh thông rin,
t trng v giá tr phn mm chim rt cao trong các h thng vin thông cng nh các thit
b đu cu
i. Chính vì lý do đó, vic nghiên cu, tìm hiu, tin ti phát trin cng nh làm
ch các h thng phn mm ca các k s đin t vin thông là rt cn thit.
Tài liu ging dy “K thut lp trình” cho h đào to t xa đc xây dng da trên
giáo trình “K thut lp trình” đã đc ging dy ti hc vi
n trong nhng nm qua vi
mc đích cung cp cho sinh viên nhng kin thc c bn nht, có tính h thng liên quan
ti lp trình.
Thông qua cun tài liu này, chúng tôi mun gii thiu vi các bn đc v k nng
lp trình cu trúc và mt s thut toán quan trng, bao gm: i cng v lp trình cu trúc;
Duyt và đ qui; Ngn xp, hàng đi và danh sách móc ni; Cây; th và cu
i cùng là Sp
xp và tìm kim.
II. MC ÍCH
Môn hc cung cp cho sinh viên k nng lp trình trên các cu trúc d liu quan trng
nh: stack, queue mlink, tree & graph cùng vi phng pháp phân tích, thit k, đánh giá
thut toán.
Sau khi hc xong môn hc này, sinh viên có kh nng vit đc chng trình gii
quyt nhng bài toán trong thc t.
III. PHM VI NGHIÊN CU
Nghiên cu các thut toán c bn đc s dng trong thc t nh các thut toán tìm
kim, các thut toán liên quan đn đ th. Các gii thut lp trình da trên danh sách, cây…
Nghiên cu cách cài đt các thut toán trên máy tính.
Tìm hiu các lnh vc ng dng ca các thut toán, phng pháp trong thc t.
IV. PHNG PHÁP NGHIÊN CU
hc tt môn hc này, sinh viên cn lu ý nhng vn đ sau:
1. Kin thc cn trc
Li nói đu
2
- Sinh viên phi có kin thc c bn v toán hc cao cp.
- Thành tho ít nht mt ngôn ng lp trình. c bit trong cun sách này đã s dng
ngôn ng lp trình C đ mô t thut toán, vì vy sinh viên phi nm đc ngôn ng lp trình C.
2. Các tài liu cn có:
Sách hng dn hc tp K thut lp trình. Ths. Nguyn Duy Phng, Hc vin
Công ngh Bu chính Vin thông, 2006.
N
u cn sinh viên nên tham kho thêm:
- Giáo trình K thut lp trình. Ts. Lê Hu Lp, Ths. Nguyn Duy Phng, Hc
vin Công ngh Bu chính Vin thông, 2002.
- Bài ging đin t môn hc: “K thut lp trình” ca Hc vin Công ngh Bu
chính Vin thông.
3. t ra mc tiêu, thi hn cho bn thân
t ra các mc tiêu tm thi và thi hn cho bn thân và c gng thc hin chúng
Xây d
ng mc tiêu trong chng trình nghiên cu.
4 Nghiên cu và nm nhng kin thc ct lõi
Sinh viên nên đc qua sách hng dn hc tp trc khi nghiên cu bài ging môn
hc và các tài liu tham kho khác.
5. Tham gia đy đ các bui hng dn hc tp
Thông qua các bui hng dn hc tp, ging viên s giúp sinh viên nm đc ni
dung tng th ca môn hc và gii đáp thc mc, đng th
i sinh viên cng có th trao đi,
tho lun vi nhng sinh viên khác v ni dung bài hc.
6. Ch đng liên h vi bn hc và ging viên
Cách đn gin nht là tham d các din dàn hc tp trên mng Internet, qua đó có th
trao đi trc tip các vn đ vng mc vi ging viên hoc các bn hc khác đang online.
7. T ghi chép li nhng ý chính
Vic ghi chép li nhng ý chính là mt ho
t đng tái hin kin thc, kinh nghim
cho thy nó giúp ích rt nhiu cho vic hình thành thói quen t hc và t duy nghiên cu.
8. Hc đi đôi vi hành
Hc lý thuyt đn đâu thc hành làm bài tp và thc hành ngay đn đó đ hiu và nm
chc lý thuyt. Sinh viên cn cài đt trên máy tính các thut toán trong bài hc bng các ngôn
ng lp trình đ t đó có th hiu và nm chc hn t
tng và ni dung ca thut toán.
Hà Ni, ngày 20 tháng 02 nm 2006
Ths. Nguyn Duy Phng
Chng 1: i cng v k thut lp trình cu trúc
3
CHNG 1: I CNG V K THUT LP
TRÌNH CU TRÚC
Ni dung chính ca chng này tp chung làm sáng t nhng nguyên lý c bn ca
lp trình cu trúc. Nhng nguyên lý này đc coi nh nn tng t tng ca phng pháp
lp trình cu trúc đã đc tích hp trong các ngôn ng lp trình. Nm vng các nguyên lý
ca lp trình cu trúc không ch giúp ngi hc có cách tip cn ngôn ng lp trình nhanh
chóng mà con giúp h cách t duy trong khi xây dng các h thng ng dng. Các nguyên
lý c b
n đc gii thiu trong chng này bao gm:
X Nguyên lý lnh - lnh có cu trúc - cu trúc d liu.
X Nguyên lý ti thiu.
X Nguyên lý đa phng.
X Nguyên lý an toàn.
X Nguyên lý nht quán.
X Nguyên lý Top-Down .
X Nguyên lý Botton-Up.
Bn đc có th tìm đc nhng chi tit sâu hn và rng hn trong tài liu [1] & [6].
1.1. S LC V LCH S LP TRÌNH CU TRÚC
Lp trình là mt trong nhng công vic nng nhc nht ca khoa hc máy tính. Có
th nói, nng sut xây dng các sn phm phn mm là rt thp so vi các hot đng trí tu
khác. Mt sn phm phn mm có th đc thit k và cài đt trong vòng 6 tháng vi 3 lao
đng chính. Nhng đ kim tra tìm li và tip tc hoàn thin sn phm đó phi mt thêm
chng 3 n
m. ây là hin tng ph bin trong tin hc ca nhng nm 1960 khi xây dng
các sn phm phn mm bng k thut lp trình tuyn tính. khc phc tình trng li ca
sn phm, ngi ta che chn nó bi mt mành che mang tính cht thng mi đc gi là
Version. Thc cht, Version là vic thay th sn phm c bng cách sa đi nó ri công b
d
i dng mt Version mi, ging nh: MS-DOS 4.0 ch tn ti trong thi gian vài tháng
ri thay đi thành MS-DOS 5.0, MS-DOS 5.5, MS-DOS 6.0 . . . ây không phi là mt sn
phm mi nh ta tng mà trong nó còn tn ti nhng li không th b qua đc, vì ngay
MS-DOS 6.0 cng ch là s khc phc hn ch ca MS-DOS 3.3 ban đu.
Trong thi k đu ca tin hc, các lp trình viên xây dng chng trình bng các
ngôn ng lp trình bc th
p, quá trình np và theo dõi hot đng ca chng trình mt cách
trc tip trong ch đ trc tuyn (on-line). Vic tìm và sa li (debbugging) nh ngày nay
là không th thc hin đc. Do vy, trc nhng nm 1960, ngi ta coi vic lp trình
Chng 1: i cng v k thut lp trình cu trúc
4
ging nh nhng hot đng ngh thut nhum màu sc cá nhân hn là khoa hc. Mt s
ngi nm đc mt vài ngôn ng lp trình, cùng mt s mo vt tn dng cu hình vt lý
c th ca h thng máy tính, to nên mt s sn phm l ca phn mm đc coi là mt
chuyên gia nm bt đc nhng bí
n ca ngh thut lp trình.
Các h thng máy tính trong giai đon này có cu hình yu, b nh nh, tc đ các
thit b vào ra thp làm chm quá trình np và thc hin chng trình. Chng trình đc
xây dng bng k thut lp trình tuyn tính mà ni bt nht là ngôn ng lp trình Assembler
và Fortran. Vi phng pháp lp trình tuyn tính, lp trình viên ch đc phép th hin
chng trình ca mình trên hai c
u trúc lnh, đó là cu trúc lnh tun t (sequential) và
nhy không điu kin (goto). H thng th vin vào ra nghèo nàn làm cho vic lp trình tr
nên khó khn, chi phí cho các sn phm phn mm quá ln, đ tin cy ca các sn phm
phn mm không cao dn ti hàng lot các d án tin hc b tht bi, đc bit là các h thng
tin hc có tm c ln. Nm 1973, Hoare khng
đnh, nguyên nhân tht bi mà ngi M
gp phi khi phóng v tinh nhân to v phía sao V n (Sao Kim) là do li ca chng trình
điu khin vit bng Fortran. Thay vì vit:
DO 50 I = 12, 523
(Thc hin s 50 vi I là 12, 13, ..., 523)
Lp trình viên (hoc thao tác viên đc bìa) vit thành:
DO 50 I = 12.523
(Du phy đã thay bng du chm)
Gp câu lnh này, chng trình dch ca Fortran đã hiu là gán giá tr thc 12.523
cho bin DO 50 I làm cho kt qu
chng trình sai.
gii quyt nhng vng mc trong k thut lp trình, các nhà tin hc lý thuyt đã
đi sâu vào nghiên cu tìm hiu bn cht ca ngôn ng, thut toán và hot đng lp trình,
nâng ni dung ca k thut lp trình lên thành các nguyên lý khoa hc ngày nay. Kt qu
ni bt nht trong giai đon này là Knuth xut bn b 3 tp sách mang tên “Ngh thut lp
trình” gii thiu ht sc t
m c s lý thuyt đm bo toán hc và các thut toán c bn x
lý d liu na s, sp xp và tìm kim. Nm 1968, Dijkstra công b lá th “V s nguy hi
ca toán t goto”. Trong công trình này, Dijkstra khng đnh, có mt s li do goto gây nên
không th xác đnh đc đim bt đu ca li. Dijkstra còn khng đnh thêm: “Tay ngh
ca mt lp trình viên t l ngh
ch vi s lng toán t goto mà anh ta s dng trong
chng trình”, đng thi kêu gi hu b trit đ toán t goto trong mi ngôn ng lp trình
ngoi tr ngôn ng lp trình bc thp. Dijkstra còn đa ra khng đnh, đng thái ca chng
trình có th đc đánh giá tng minh qua các cu trúc lp, r nhánh, gi đ qui là c s
ca lp trình cu trúc ngày nay.
Nhng kt qu
đc Dijikstra công b đã to nên mt cuc cách mng trong k
thut lp trình, Knuth lit kê mt s trng hp có li ca goto nh vòng lp kt thúc gia
chng, bt li . . ., Dijkstra, Hoare, Knuth tip tc phát trin t tng coi chng trình máy
tính cùng vi lp trình viên là đi tng nghiên cu ca k thut lp trình và phng pháp
Chng 1: i cng v k thut lp trình cu trúc
5
làm ch s phc tp ca các hot đng lp trình. Nm 1969, Hoare đã phát biu các tiên đ
phc v cho vic chng minh tính đúng đn ca chng trình, phát hin tính bt bin ca
vòng lp bng cách coi chng trình va là bn mã hoá thut toán đng thi là bn chng
minh tính đúng đn ca chng trình. Sau đó Dahl, Hoare, Dijiksta đã phát trin thành ngôn
ng lp trình cu trúc.
trin khai các nguyên lý lp trình c
u trúc, L. Wirth đã thit k và cài đt ngôn
ng ALGOL W là mt bin th ca ALGOL 60. Sau này, L. Wirth tip tc hoàn thin đ
tr thành ngôn ng lp trình Pascal. ây là ngôn ng lp trình gin d, sáng sa v cú pháp,
d minh ha nhng vn đ phc tp ca lp trình hin đi và đc coi là mt chun mc
trong ging dy lp trình.
Nm 1978, Brian Barninghan cùng Denit Ritche thit k ngôn ng lp trình C vi t
i
thiu các cu trúc lnh và hàm khá phù hp vi t duy và tâm lý ca ca ngi lp trình.
ng thi, hai tác gi đã phát hành phiên bn h điu hành UNIX vit ch yu bng ngôn
ng C, khng đnh thêm uy th ca C trong lp trình h thng.
1.2. CU TRÚC LNH, LNH CÓ CU TRÚC, CU TRÚC D LIU
1.2.1. Cu trúc lnh (cu trúc điu khin)
Mi chng trình máy tính v bn cht là mt bn mã hoá thut toán. Thut toán
đc coi là dãy hu hn các thao tác s cp trên tp đi tng vào (Input) nhm thu đc
kt qu ra (output). Các thao tác trong mt ngôn ng lp trình c th đc điu khin bi
các lnh hay các cu trúc điu khin, còn các đi tng chu thao tác thì đc mô t và biu
di
n thông qua các cu trúc d liu.
Trong các ngôn ng lp trình cu trúc, nhng cu trúc lnh sau đc s dng đ xây
dng chng trình. D nhiên, chúng ta s không bàn ti cu trúc nhy không điu kin goto
mc dù ngôn ng lp trình cu trúc nào cng trang b cu trúc lnh goto.
câu lnh GOTO.
Hình 1.1: Cu trúc tun t và cu trúc r nhánh dng đy đ
Cu trúc tun t
A;
B;
Sau khi thc hin lnh A thì thc hin lnh B
A
B
Cu trúc r nhánh dng đy đ
If (E) A; S
Else B;
Nu biu thc E có giá tr đúng (khác 0) thì
thchinA;NuEsaithìthchinB;
AB
Chng 1: i cng v k thut lp trình cu trúc
6
Hình 1.2. Các cu trúc lp
A, B : ký hiu cho các câu lnh đn hoc lnh hp thành. Mi lnh đn l đc gi là
mt lnh đn, lnh hp thành là lnh hay cu trúc lnh đc ghép li vi nhau theo qui đnh
ca ngôn ng, trong Pascal là tp lnh hay cu trúc lnh đc bao trong thân ca begin . . .
end; trong C là tp các lnh hay cu trúc lnh đc bao trong hai ký hiu { ... }.
E, E1, E2, E3 là các biu thc s hc hoc logic. Mt s ngôn ng lp trình coi giá tr
ca biu thc logic hoc đúng (TRUE) hoc sai (FALSE), mt s ngôn ng lp trình khác
nh C coi giá tr ca biu thc logic là đúng nu nó có giá tr khác 0, ngc li biu thc
logic có giá tr sai.
Cn lu ý rng, mt chng trình đc th hin bng các cu trúc điu khin lnh :
tun t, tuyn chn if..else, switch . . case .. default, lp vi đi
u kin trc while , lp vi
điu kin sau do . . while, vòng lp for bao gi cng chuyn đc v mt chng trình, ch
s dng ti thiu hai cu trúc lnh là tun t và lp vi điu kin trc while. Phng pháp
lp trình này còn đc gi là phng pháp lp trình hn ch.
Cu trúc lp vi điu kin sau
do
A; S
while (E);
Thc hin A cho ti khi nào E vn còn
đúng;
Cu trúc lp FOR
For (E1; E2;E3)
A;
S
Cu trúc lp vi điu kin trc
While (E) A;
S
Trong khi biu thc E còn có giá tr đúng thì
thc hin A;
E
A
A
E
E1
E2
E3
A
Chng 1: i cng v k thut lp trình cu trúc
7
1.2.2. Lnh có cu trúc
Lnh có cu trúc là lnh cho phép cha các cu trúc điu khin trong nó. Khi tìm hiu
mt cu trúc điu khin cn xác đnh rõ v trí đc phép đt mt cu trúc điu khin trong
nó, cng nh nó là mt phn ca cu trúc điu khin nào. iu này tng nh rt tm
thng nhng có ý ngha ht sc quan trng trong khi xây d
ng và kim tra li có th xy
ra trong chng trình. Nguyên tc vit chng trình theo cu trúc: Cu trúc con phi đc
vit lt trong cu trúc cha, đim vào và đim ra ca mi cu trúc phi nm trên cùng mt
hàng dc. Ví d sau s minh ha cho nguyên tc vit chng trình:
if (E)
while (E1)
A;
else
do
B;
while(E2);
Trong ví d trên, while (E1) A; là cu trúc con nm trong thân ca cu trúc cha là if
(E) ; còn do B while(E2); là cu trúc con trong thân ca else. Do vy, câu lnh while(E1);
do . . . while(E2) có cùng cp vi nhau nên nó phi nm trên cùng mt ct, tng t nh
vy vi A, B và if vi else.
1.2.3. Cu trúc d liu
Các ngôn ng lp trình cu trúc nói chung đu ging nhau v cu trúc lnh và cu
trúc d liu. im khác nhau duy nht gia các ngôn ng
lp trình cu trúc là phng pháp
đt tên, cách khai báo, cú pháp câu lnh và tp các phép toán đc phép thc hin trên các
cu trúc d liu c th. Nm bt đc nguyên tc này, chúng ta s d dàng chuyn đi cách
th hin chng trình t ngôn ng lp trình này sang ngôn ng lp trình khác mt cánh
nhanh chóng mà không tn quá nhiu thi gian cho vic hc tp ngôn ng lp trình.
Thông thng, các cu trúc d liu đc phân thành hai loi: cu trúc d li
u có kiu
c bn (Base type) và cu trúc d liu có kiu do ngi dùng đnh ngha (User type) hay
còn gi là kiu d liu có cu trúc. Kiu d liu c bn bao gm: Kiu kí t (char), kiu s
nguyên có du (signed int), kiu s nguyên không du (unsigned int), kiu s nguyên dài có
du (signed long), kiu s nguyên dài không du (unsigned long ), kiu s thc (float) và
kiu s
thc có đ chính xác gp đôi (double).
Kiu d liu do ngi dùng đnh ngha bao gm kiu xâu kí t (string), kiu mng
(array), kiu tp hp (union), kiu cu trúc (struct), kiu file, kiu con tr (pointer) và các
kiu d liu đc đnh ngha mi hoàn toàn nh kiu danh sách móc ni (link list), kiu cây
(tree) . . .
Kích c ca kiu c bn đ
ng ngha vi min xác đnh ca kiu vi biu din nh
phân ca nó, và ph thuc vào tng h thng máy tính c th. xác đnh kích c ca kiu
nên dùng toán t sizeof( type). Chng trình sau s lit kê kích c ca các kiu c bn.
Chng 1: i cng v k thut lp trình cu trúc
8
Ví d 1.1. Kim tra kích c ca kiu.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <io.h>
void main(void) {
printf(“\n Kích c kiu kí t:%d”, sizeof(char));
printf(“\n Kích c kiu kí t không du:%d”, sizeof(unsigned char));
printf(“\n Kích c kiu s nguyên không du:%d”, sizeof(unsigned int));
printf(“\n Kích c kiu s nguyên có du:%d”, sizeof(signed int));
printf(“\n Kích c kiu s nguyên dài không du:%d”, sizeof(unsigned long ));
printf(“\n Kích c kiu s nguyên dài có du:%d”, sizeof(signed long ));
printf(“\n Kích c kiu s thc có đ chính xác đn:%d”, sizeof(float ));
printf(“\n Kích c kiu s thc có đ chính xác kép:%d”, sizeof(double ));
getch();
}
Kích c ca các kiu d liu do ngi dùng đnh ngha là tng kích c ca mi kiu
thành viên trong nó. Chúng ta cng vn dùng toán t sizeof(tên kiu) đ xác đnh đ ln tính
theo byte ca các kiu d liu này.
Mt đim đc bit chú ý trong khi lp trình trên các cu trúc d liu là cu trúc d liu
nào thì phi kèm theo phép toán đó, vì mt bin đc gi là thuc kiu d liu nào
đó nu
nh nó nhn mt giá tr t min xác đnh ca kiu và các phép toán trên kiu d liu đó.
1.3. NGUYÊN LÝ TI THIU
Hãy bt đu t mt tp nguyên tc và ti thiu các phng tin là các cu trúc lnh, kiu
d liu cùng các phép toán trên nó và thc hin vit chng trình. Sau khi nm chc nhng
công c vòng đu mi đt vn đ m rng sang h thng th vin tin ích ca ngôn ng.
Khi làm quen vi mt ngôn ng lp trình nào đó, không nht thit phi l thuc quá
nhiu vào h
thng th vin hàm ca ngôn ng, mà điu quan trng hn là trc mt bài
toán c th, chúng ta s dng ngôn ng đ gii quyt nó th nào, và phng án tt nht là
lp trình bng chính h thng th vin hàm ca riêng mình. Do vy, đi vi các ngôn ng
lp trình, chúng ta ch cn nm vng mt s các công c ti thiu nh sau:
1.3.1. Tp các phép toán
Tp các phép toán s
hc: + (cng); - (tr); * (nhân); % (ly phn d); / (chia).
Tp các phép toán s hc m rng:
++a ú a = a +1; // tng giá tr bin nguyên a lên mt đn v;
--a ú a = a-1; //gim giá tr bin nguyên a mt đn v;
a+= n ú a = a+n; // tng giá tr bin nguyên a lên n đn v;
Chng 1: i cng v k thut lp trình cu trúc
9
a-=n ú a = a - n; // gim giá tr bin nguyên a n đn v);
a%=n ú a = a%n; // ly giá tr bin a modul vi n;
a/=n ú a=a/n;// ly giá tr bin a chia cho n;
a*=n ú a = a*n; // ly giá tr bin a nhân vi n;
Tp các phép toán so sánh: >, <, >=, <=, ==, != ( ln hn, nh hn, ln hn
hoc bng, nh hn hoc bng, đúng bng, khác). Qui tc vit đc th hin nh sau:
if ( a>b) { . . } // nu a ln hn b
if ( a<b) { . . } // nu a nh
hn b
if ( a>=b) { . . } // nu a ln hn hoc bng b
if ( a<=b) { . . } // nu a nh hn hoc bng b
if ( a==b) { . . } // nu a đúng bng b
if ( a!=b) { . . } // nu a khác b
Tp các phép toán logic: &&, ||, ! (và, hoc, ph đnh)
&&: Phép và logic ch cho giá tr đúng khi hai biu thc tham gia đu có giá tr
đúng (giá tr đúng ca mt biu thc trong C đc hiu là biu thc có giá tr khác 0).
||: Phép hoc logic ch cho giá tr sai khi c hai biu thc tham gia đu có giá
tr
sai.
!: Phép ph đnh cho giá tr đúng nu biu thc có giá tr sai và ngc li cho
giá tr sai khi biu thc có giá tr đúng. Ng ngha ca các phép toán đc minh ha
thông qua các câu lnh sau:
int a =3, b =5;
if ( (a !=0) && (b!=0) ) // nu a khác 0 và b khác 0
if ((a!=0) || (b!=0)) // nu a khác 0 hoc b khác 0
if ( !a ) // ph đnh a khác 0
if (a==b) // nu a đúng bng b
Các toán t thao tác bít (không s dng cho float và double)
& : Phép hi các bít.
| : Phép tuyn các bít.
^ : Phép tuyn các bít có loi tr.
<< : Phép dch trái (dch sang trái n bít giá tr 0)
>> : Phép dch ph
i (dch sang phi n bít có giá tr 0)
~ : Phép ly phn bù.
Chng 1: i cng v k thut lp trình cu trúc
10
Ví d 1.2: Vit chng trình kim 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 chuyn đi kiu: Ta có th dùng toán t chuyn đi kiu đ nhn đc kt qu
tính toán nh mong mun. Qui tc chuyn đi kiu đc thc hin theo qui tc: (kiu) bin.
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 thng c = a / b =%6.2f”, c);
getch();
}
Th t u tiên các phép toán : Khi vit mt biu thc, chúng ta cn lu ý ti th t
u tiên tính toán các phép toán, các bng tng hp sau đây phn ánh trt t u tiên tính toán
ca các phép toán s hc và phép toán so sánh.
Bng tng hp th t u tiên tính toán các phép toán s hc và so sánh
TÊN TOÁN T CHIU TÍNH TOÁN
( ), [] , -> L -> R
- , ++, -- , ! , ~ , sizeof() R -> L
* , /, % L -> R
Chng 1: i cng v k thut lp trình cu 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. Tp các lnh vào ra c bn
Nhp d liu t bàn phím: scanf(“format_string, . . .”, ¶meter . . .);
Nhp d liu t tp: fscanf( file_pointer,”format_string, . . .”, ¶meter, . . .);
Nhn mt ký t t bàn phím: getch(); getchar();
Nhn mt ký t t file: fgetc(file_pointer, character_name);
Nhp mt string t bàn phím: gets(string_name);
Nhn mt string t file text : fgets(string_name, number_character, file_pointer);
Xut d liu ra màn hình: printf(“format_string . . .”, parameter . . .);
Xut d liu ra file : fprintf(file_pointer, “format_string . . .”, parameter. . .);
Xut mt ký t ra màn hình: putch(character_name);
Xut mt ký t ra file: fputc(file_pointer, character_name);
Xut mt string ra màn hình: puts(const_string_name);
Xut mt string ra file: fputs(file_pointer, const_string_name);
1.3.3. Thao tác trên các ki
u d liu có cu trúc
Tp thao tác trên string:
char *strchr(const char *s, int c) : tìm ký t c đu tiên xut hin trong xâu s;
char *stpcpy(char *dest, const char *src) : copy xâu scr vào dest;
Chng 1: i cng v k thut lp trình cu trúc
12
int strcmp(const char *s1, const char *s2) : so sánh hai xâu s1 và s2 theo th t t
đin, nu s1 < s2 thì hàm tr li giá tr nh hn 0. Nu s1>s2 hàm tr li giá tr
dng. Nu s1==s2 hàm tr li 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) : chuyn xâu s t ký t in hoa thành ký t in thng.
char *strupr(char *s): chuyn xâu s t ký t thng hoa thành ký t in hoa.
char *strrev(char *s): đo ngc xâu s.
char *strstr(const char *s1, const char *s2): tìm v trí đu tiên ca xâu s2 trong xâu s1.
int strlen(char *s): cho đ dài ca xâu ký t s.
Tp thao tác trên con tr:
Thao tác l
y đa ch ca bin: & parameter_name;
Thao tác ly ni dung bin (bin có kiu c bn): *pointer_name;
Thao tác tr ti phn t tip theo: ++pointer_name;
Thao tác tr ti phn t th n k t v trí hin ti: pointer_name = pointer_name +n;
Thao tác tr ti phn t sau con tr k t v trí hin ti: --pointer_name;
Thao tác tr ti phn t sau n phn t k t v
trí hin ti:
Pointer_name = pointer_name - n;
Thao tác cp phát b nh cho con tr:
void *malloc(size_t size);
void *calloc(size_t nitems, size_t size);
Thao tác cp phát li b nh cho con tr : void *realloc(void *block, size_t size);
Thao tác gii phóng b nh cho con tr: void free(void *block);
Tp thao tác trên cu trúc:
nh ngha cu 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 nhp ti thành phn cu trúc:
Chng 1: i cng v k thut lp trình cu trúc
13
struct_parameter_name.parameter_name.
Phép gán hai cu trúc cùng kiu:
struct_parameter_name1 = struct_parameter_name2;
Phép tham tr ti thành phn ca con tr cu trúc:
pointer_struct_parameter_name -> struct_parameter_name.
Tp 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 tng dòng trong file: char *fgets(char *s, int n, FILE *stream);
Thao tác đc tng khi trong file:
size_t fread(void *ptr, size_t size,size_t n, FILE *stream);
Thao tác ghi tng dòng vào file: int fputs(const char *s, FILE *stream);
Thao tác ghi tng khi vào file:
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);
Thao tác kim tra s tn ti ca 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 loi b file: int unlink(const char *filename);
1.4. NGUYÊN LÝ A PHNG
̇ Các bin đa phng trong hàm, th tc hoc chu trình cho dù có trùng tên
vi bin toàn cc thì khi x lý bin đó trong hàm hoc th tc vn không làm
thay đi giá tr ca bin toàn cc.
̇ Tên ca các bin trong đi ca hàm hoc th tc đu là hình thc.
̇ Mi bin hình thc truyn theo tr cho hàm hoc th tc đu là các bin đa
phng.
̇ Các bin khai báo bên trong các ch
ng trình con, hàm hoc th tc đu là
bin đa phng.
̇ Khi phi s dng bin ph nên dùng bin đa phng và hn ch ti đa vic
s dng bin toàn cc đ tránh xy ra các hiu ng ph.
Ví d hoán đi giá tr ca hai s a và b sau đây s minh ha rõ hn v nguyên lý đa
phng.
Ví d 1.4. Hoán đi giá tr ca hai bi
n a và b.
Chng 1: i cng v k thut lp trình cu 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 bin toàn cc.
void Swap(void) {
int a,b, temp; // khai báo a, b là hai bin đa phng
a= 3; b=5; // gán giá tr cho a và b
temp=a; a=b; b=temp;// đi giá tr ca a và b
printf(“\n Kt qu thc hin trong th tc a=%5d b=%5d:,a,b);
}
void main(void) {
a=1; b=8; // khi đu giá tr cho bin toàn cc a, b.
Swap();
printf(“\n Kt qu sau khi thc hin th tc a =%5d b=%5d”,a,b);
getch();
}
Kt qu thc hin chng trình:
Kt qu thc hin trong th tc a = 5 b=3
Kt qu sau khi thc hin th tc a = 1 b =8
Trong ví d trên a, b là hai bin toàn cc, hai bin a, b trong th tc Swap là hai bin
cc b. Các thao tác trong th tc Swap gán cho a giá tr 3 và b giá tr 5 sau đó thc hin
đi giá tr ca a =5 và b =3 là công vic x lý ni b ca th tc mà không làm thay đi giá
tr ca bin toàn c
c ca a, b sau thi thc hin xong th tc Swap. Do vy, kt qu sau khi
thc hin Swap a = 1, b =8; iu đó chng t trong th tc Swap cha bao gi s dng ti
hai bin toàn cc a và b. Tuy nhiên, trong ví d sau, th tc Swap li làm thay đi giá tr ca
bin toàn cc a và b vì nó thao tác trc tip trên bin toàn cc.
Ví d 1.5. i giá tr ca hai bin 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 bin toàn cc.
void Swap(void) {
int temp; // khai báo a, b là hai bin đa phng
a= 3; b=5; // gán giá tr cho a và b
temp=a; a=b; b=temp;// đi giá tr ca a và b
printf(“\n Kt qu thc hin trong th tc a=%5d b=%5d:,a,b);
}
void main(void) {
Chng 1: i cng v k thut lp trình cu trúc
15
a=1; b=8; // khi đu giá tr cho bin toàn cc a, b.
Swap();
printf(“\n Kt qu sau khi thc hin th tc a =%5d b=%5d”,a,b);
getch();
}
Kt qu thc hin chng trình:
Kt qu thc hin trong th tc a = 8 b=1
Kt qu sau khi thc hin th tc a = 1 b =8
1.5. NGUYÊN LÝ NHT QUÁN
̇ D liu th nào thì phi thao tác th y. Cn sm phát hin nhng mâu thun
gia cu trúc d liu và thao tác đ kp thi khc phc.
Nh chúng ta đã bit, kiu là mt tên ch tp các đi tng thuc min xác đnh cùng
vi nhng thao tác trên nó. Mt bin khi đnh ngha bao gi cng thuc mt kiu xác đnh
nào đó hoc là kiu c
bn hoc kiu do ngi dùng đnh ngha. Thao tác vi bin ph
thuc vào nhng thao tác đc phép ca kiu. Hai kiu khác nhau đc phân bit bi tên,
min xác đnh và các phép toán trên kiu d liu. Tuy nhiên, trên thc t có nhiu li nhp
nhng gia phép toán và cu trúc d liu mà chúng ta cn hiu rõ.
i vi kiu ký t, v nguyên tc chúng ta không đc phép thc hin các phép toán
s hc trên nó, nhng ngôn ng
C luôn đng nht gia ký t vi s nguyên có đ ln 1
byte. Do vy, nhng phép toán s hc trên các ký t thc cht là nhng phép toán s hc
trên các s nguyên. Chng hn, nhng thao tác nh trong khai báo di đây là đc phép:
char x1=’A’, x2 =’z’;
x1 = (x1 + 100) % 255;
x2 = (x2-x1) %255;
Mc dù x1, x2 đc khai báo là hai bin kiu char, nhng trong thao tác
x1 = (x1 + 100) % 255;
x2 = (x2 +x1) %255;
chng trình dch s t đng chuyn đi x1 thành mã ca ký t ‘A’ là 65, x2 thành mã ký
t ‘z’ là 122 đ thc hin phép toán. Kt qu nhn đc x1 là mt ký t có mã là
(65+100)%255 = 165; x2 là ký t có mã là 32 ng vi mã ca ký t space.
Chúng ta có th thc hin đc các phép toán s hc trên kiu int, long, float, double.
Nhng đi vi int và long, chúng ta cn đc bit chú ý phép chia hai s nguyên cho ta mt
s nguyên, tích hai s nguyên cho ta mt s nguyên, tng hai s nguyên cho ta mt s
nguyên mc dù thng hai s nguyên là mt s th
c, tích hai s nguyên hoc tng hai s
nguyên có th là mt s long int. Do vy, mun nhn đc kt qu đúng, chúng ta cn phi
chuyn đi các bin thuc cùng mt kiu trc khi thc hin phép toán. Ngc li, ta không
Chng 1: i cng v k thut lp trình cu trúc
16
th ly modul ca hai s thc hoc thc hin các thao tác dch chuyn bít trên nó, vì nhng
thao tác đó không nm trong đnh ngha ca kiu.
iu tng t cng xy ra vi các string. Trong Pascal, phép toán so sánh hai string
hoc gán trc tip hai Record cùng kiu vi nhau là đc phép, ví d : Str1>Str2, Str1 :=
Str2; Nhng trong C thì các phép toán trên li không đc đnh ngha, nu mun thc hin
nó, chúng ta ch có cách đnh ngha li hoc thc hi
n nó thông qua các li gi hàm.
1.6. NGUYÊN LÝ AN TOÀN
̇ Li nng nht nm mc cao nht (mc ý đ thit k) và mc thp nht th
tc phi chu ti ln nht.
̇ Mi li, dù là nh nht cng phi đc phát hin mt bc nào đó ca
chng trình. Quá trình kim tra và phát hin li phi đc thc hin trc
khi li đó hoành hành.
Các loi li thng xy ra trong khi vit chng trình có th đc tng kt li nh
sau:
Li đc thông báo bi t khoá error (li cú pháp): loi li này thng xy ra
trong khi son tho chng trình, chúng ta có th vit sai các t khoá ví d thay vì vit là int
chúng ta son tho sai thành Int (li ch in thng thành in hoa), hoc vit sai cú pháp các
biu thc nh thiu các du ngoc đn, ngoc kép hoc du chm ph
y khi kt thúc mt
lnh, hoc cha khai báo nguyên mu cho hàm .
Li đc thông báo bi t khoá Warning (li cnh báo): li này thng xy ra khi
ta khai báo bin trong chng trình nhng li không s dng ti chúng, hoc li trong các
biu thc kim tra khi bin đc kim tra không xác đnh đc giá tr ca nó, hoc li do
th t u tiên các phép toán trong biu thc. Hai loi li error và warning đc thông báo
ngay khi dch chng trình thành file *.OBJ. Quá trình liên k
t (linker) các file *.OBJ đ
to nên file chng trình mã máy *.EXE ch đc tip tc khi chúng ta hiu đính và kh b
mi li error.
Li xy ra trong quá trình liên kt: li này thng xut hin khi ta s dng ti các
li gi hàm, nhng nhng hàm đó mi ch tn ti di dng nguyên mu (function
prototype) mà cha đc mô t chi tit các hàm, hoc nhng li hàm gi cha đúng vi
tên c
a nó. Li này đc khc phc khi ta b sung đon chng trình con mô t chi tit cho
hàm hoc sa đi li nhng li gi hàm tng ng.
Ta quan nim, li cú pháp (error), li cnh báo (warning) và li liên kt (linker) là li
tm thng vì nhng li này đã đc Compiler ca các ngôn ng lp trình phát hin đc.
khc phc các li loi này, chúng ta ch cn phi đc và hiu đc nh
ng thông báo li
thng đc vit bng ting Anh. Cng cn phi lu ý rng, do mc đ phc tp ca
chng trình dch nên không phi li nào cng đc ch ra mt cách tng minh và chính
xác hoàn toàn ti ni xut hin li.
Chng 1: i cng v k thut lp trình cu trúc
17
Loi li cui cùng mà các compiler không th phát hin ni đó là li do chính lp
trình viên gây nên trong khi thit k chng trình và x lý d liu. Nhng li này không
đc compiler thông báo mà nó phi tr giá bng quá trình t test hoc chng minh đc
tính đúng đn ca chng trình. Li có th nm chính ý đ thit k, hoc li do không
lng trc đc tính cht ca mi loi thông tin vào. Ví d sau minh ha cho l
i thng
xy ra thuc loi này.
Ví d 1.6. Tính tng hai đa thc A bc n, đa thc B bc 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++)
Chng 1: i cng v k thut lp trình cu 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 dng đnh ngha MAX =100 đ gii quyt bài toán.
MAX đc hiu là bc ca đa thc ln nht mà chúng ta cn x lý. Nh vy, bn thân vic
đnh ngha MAX đã hn ch ti phm vi bài toán, hn ch đó cng có th xut phát t ý đ
thit k. Do vy, nu ngi s dng nhp n>MAX thì chng trình s
gp li. Nu chúng ta
khc phc bng cách đnh ngha BAC đ ln thì trong trng hp x lý các đa thc có bc n
nh s gây nên hin tng lãng phí b nh, và trong nhiu trng hp không đ b nh đ
đnh ngha đa thc. Gii pháp khc phc các li loi này là chúng ta s dng con tr thay
cho các hng, k thut này s đc th
o lun k trong Chng 2.
1.7. PHNG PHÁP TOP-DOWN
̇ Quá trình phân tích bài toán đc thc hin t trên xung di. T vn đ
chung nht đn vn đ c th nht. T mc tru tng mang tính cht tng
quan ti mc đn gin nht là đn v chng trình.
Mt trong nhng nguyên lý quan trng ca lp trình cu trúc là phng pháp phân
tích t trên xung (Top - Down) vi quan đim “thy cây không bng thy rng”, phi
đng cao hn đ quan sát tng th khu rng ch không th đng trong rng quan sát chính
nó.
Quá trình phân rã bài toán đc thc hin theo tng mc khác nhau. Mc thp nht
đc gi là mc tng quan (level 0), mc tng quan cho phép ta nhìn tng th h thng
thông qua các chc nng ca nó, nói cách khác mc 0 s tr li thay cho câu hi “H thng
có th thc hin đc nhng gì ?”. Mc tip theo là mc các chc nng chính.
mc này,
nhng chc nng c th đc mô t. Mt h thng có th đc phân tích thành nhiu mc
khác nhau, mc thp đc phép s dng các dch v ca mc cao. Quá trình phân tích tip
Chng 1: i cng v k thut lp trình cu trúc
19
tc phân rã h thng theo tng chc nng ph cho ti khi nào nhn đc mc các đn th (
UNIT, Function, Procedure), khi đó chúng ta tin hành cài đt h thng.
Chúng ta s làm rõ hn tng mc ca quá trình Top-Down thông qua bài toán sau:
Bài toán: Cho hai s nguyên có biu din 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 dng tp các thao tác trên hai s nguyên đó.
Mc tng quan (level 0):
Hình dung toàn b nhng thao tác trên hai s nguyên a=(a
1
, a
2
, . . ., a
n
),
b=(b
1
,b
2
,..,b
n
) vi đy đ nhng chc nng chính ca nó. Gi s nhng thao tác đó bao
gm:
F1- Chuyn đi a, b thành các s nh phân;
F2- Tính tng hai s nguyên: a + b;
F3- Tính hiu hai s nguyên: a - b;
F4 Tính tích hai s nguyên: a *b;
F5- Thng hai s nguyên : a/b;
F6- Phn d hai s nguyên: a % b;
F7- c s chung ln nht ca hai s nguyên.
Mc 1. Mc các chc nng chính: mi chc nng cn 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).
Chc nng F1: Chuyn đ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 trin c s b bt 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 trin c s b ca a là (a
k-1
, a
k-2
, . ., a
1
, a
0
) >;
}
Chc nng F2: Tính tng hai s nguyên a, b.
Input:
a=(a
1
, a
2
, . . ., a
n
),
b = (b
1
, b
2
, .., b
n
);
Output:
Chng 1: i cng v k thut lp trình cu 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 trin nh phân ca tng là (s
n
s
n-1
. . .s
1
,s
0
)
2
>
}
Chc nng F3: Hiu 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);
}
Chc nng 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;
Chng 1: i cng v k thut lp trình cu trúc
21
for( j=0; j< n; j++) {
p = Addition(p, c
j
);
}
return(p);
}
Chc nng F5: Thng 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);
}
Chc nng 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);
}
Chc nng F7: c s chung ln nht 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 {
Chng 1: i cng v k thut lp trình cu trúc
22
while ( a≠ b ) {
if (a > b)
a = Subtraction(a, b)
else
b = Subtraction(b,a);
}
return(a);
}
ý rng, sau khi phân rã bài toán mc 1, chúng ta ch cn xây dng hai phép toán
cng và phép tính nhân các s nh phân ca a, b. Vì hiu hai s a và b chính là tng s ca
(a,-b). Tng t nh vy, tích hai s a và b đc biu din bng tng ca mt s ln phép
nhân mt bít nh phân ca vi a. Phép chia và ly phn d hai s a và b chính là phép tr
nhiu ln s a. Phép tìm USCLN cng tng t nh vy.
i v
i các h thng ln, quá trình còn đc mô t tip tc cho ti khi nhn đc
mc đn v chng trình. Trong ví d đn gin này, mc đn v chng trình xut hin
ngay ti mc 1 nên chúng ta không cn phân rã tip na mà dng li đ cài đt h thng.
1.8. PHNG PHÁP BOTTOM-UP
̇ i t cái riêng ti cái chung, t các đi tng thành phn mc cao ti các
đi tng thành phn mc thp, t mc đn v chng trình ti mc tng
th, t nhng đn v đã bit lp đt thành nhng đn v mi.
Nu nh phng pháp Top-Down là phng pháp phân rã vn đ mt cách có h
thng t trên xung,
đc ng dng ch yu cho quá trình phân tích và thit h thng, thì
phng pháp Bottom- Up thng đc s dng cho quá trình cài đt h thng. Trong ví d
trên, chúng ta s không th xây dng đc chng trình mt cách hoàn chnh nu nh ta
cha xây dng đ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). Chng trình sau th hin quá trình cài đt
chng 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;
Chng 1: i cng v k thut lp trình cu 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);
Chng 1: i cng v k thut lp trình cu 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);