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
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
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
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.
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
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
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
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();
& 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
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
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();
}
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
#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 ){
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
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;
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
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
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
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
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
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);