Tải bản đầy đủ (.doc) (24 trang)

BÁO CÁO ĐỒ ÁN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

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 (309.01 KB, 24 trang )

ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -1 -
MỤC LỤC
MỤC LỤC 1
7
GIỚI THIỆU ĐỀ TÀI 7
.I Viết một chương trình C để xử lí các công việc sau đây: 7
.II Viết chương trình ASM : 7
NỘI DUNG BÁO CÁO: 8
.A Phần C 8
.I Mô tả các hàm trong chương trình 8
-strstr(chuoi,” ”);//trả lại vị trí tìm thấy của ký tự trống trong chuỗi 8
-strim(chuoi);//tìm và xóa ký tự trống trong chuỗi 8
-strlen(chuoi);//tính độ dài chuỗi 8
-memmove(p,p+1,strlen(chuoi)-(p-chuoi));//dich chuỗi sang phải 1 đơn vị 8
-tpi(exp,i);//tính pi 8
-tsin(x,i,exp);//tính sin 8
-tcos(x,i,exp);//tính cos 8
-gt(n);//tính giai thừa n 8
-lt(x,y);//tính x^y 8
-tong(n,i,exp,x);//tính tổng 8
-nph(x);//đổi số thập phân sang nhị phân 8
-tlph(t);//đổi số nhị phân sang thập lục phân 8
-tp(k);//đổi từ số thập lục phân sang nhị phân 8
-tp_np_tlph_tp(a);//xuất từ thập phân-nhị phân-thập lục phân-thập phân 8
.II Xây dựng thuật toán: 8
1. Nhập xâu thập lục phân,nén xâu bằng cách xóa ký tự trống,sau đó
chuyển sang số thập phân: 8
.B Phần ASM 19
.I Chức năng của các hàm của ngắt 21h: 19
.II Xây dựng thuật toán: 19
1. Ý tưởng: 19


2. Thuật toán: 19
Bước 1: nhập xâu số thập phân: 19
- dùng chức năng 01h của ngắt 21h để nhập số phần tử của xâu:sopt 19
- dùng thủ tục DOC_XAU để nhập các ký tự thâp phân vào xâu tphan db 5
dup(0) 19
- gán so=0; và mov al,so; đếm số đã nhập 19
- Lưu số đã nhập vào vào ô nhớ có địa chỉ ds:bx mov byte ptr [bx],al 19
- Mổi lần lưu tăng giá trị ô nhở lên 1: inc bx ;tiến hành lặp 19
Bước 2: in xâu đã nhập: 19
- bước lặp: mov dl,byte ptr xtp[bx] ;đọc nội dung ô nhớ tại ds:bx 19
; thao tác đọc, toán hạng bên trái là thanh ghi dl 19
-dùng chức năng 02h của ngắt 21h để in 19
-tăng giả trị ô nhớ lên 1: inc bx; và tiến hành lặp 19
Bước 3: Đổi xâu thập phân ra số thập phân 19
- bước lặp: mov al,byte ptr xtp[bx];al đọc nội dung ô nhớ bx 19
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -2 -
-and al,0fh ; giữ giá trị của al 19
- xchg ax,dx ;tiến hành đổi chổ ax và dx 19
- mul so10 ;dx dx*10 19
- add dx,ax ; dx dx+ax 19
- inc bx ;tăng địa chỉ ô nhớ lên 1 và tiến hành lặp 19
- mov ax,dx ; ax dx chứa tổng  thập phân 19
- call in10 ;gọi chức năng in10 để tiến hành in giá trị của ax 19
- Bước 4: đổi số thập phân sang xâu thập lục phân 20
- mov bx,16 ;gán bx=16 20
mov dx,0 ; 20
bước lặp: div ax,bx ;ax a x/16 20
push dx ; đưa giá trị ax%16 vào ngăn xếp dx 20
cmp ax,0 ; tiến hành so sánh ax và 0 20

;nếu (ax==0) làm bước kế tiếp 20
;ngược lại tăng địa chỉ ngăn xếp lên 1 inc cx ;tiến hành lặp 20
pop dx ; lấy giá trị dx ra khỏi ngăn xếp 20
cmp dx,9 ;so sánh giá trị của dx và 9 20
-nếu (dx<9) add dl,48 ;trả về số hex 20
-ngược lại: add dl,55 ;đưa về dạng ký tự 20
- Tiến hành xuất xâu thập lục phân: dùng thủ tục in10 20
.III Chương trình và hình minh họa: 20
1. Chương trình: 20
; cac macro 20
inxau macro tbao 20
push ax 20
push dx 20
mov ah,9 20
lea dx,tbao 20
int 21h 20
pop dx 20
pop ax 20
endm 20
.model small 20
.stack 100h 20
.data 20
m0 db 'nhap so ptu: $' 20
m4 db 10,13,'nhap xau: $' 20
m1 db 10,13,' xau thap phan la: $' 20
m2 db 10,13,'doi xau thap phan ra so thap phan $' 20
m3 db 10,13,' doi ra xau tlp: $' 20
xtp db 100 dup (0) 21
xtlp db 100 dup (0) 21
sopt dw 0 21

so db 0 21
so10 db 10 21
luu dw 0 21
.code 21
main: 21
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -3 -
mov ax,@data 21
mov ds,ax 21
;//==================================== 21
;// Nhap so phan tu xau 21
inxau m0 21
mov ah,1 21
int 21h 21
and al,0fh 21
mov ah,0 21
mov sopt,ax 21
mov cx,ax 21
mov bx, offset xtp 21
inxau m4 21
l1: 21
call DOC_XAU 21
mov al,so 21
mov byte ptr [bx],al 21
inc bx 21
loop l1 21
;//==================================== 21
;// Xuat xau thap phan vua nhap 22
inxau m1 22
xor bx,bx 22

mov cx,sopt 22
mov ah,2 22
l2: 22
mov dl,byte ptr xtp[bx] 22
int 21h 22
inc bx 22
loop l2 22
;//==================================== 22
;// doi xau thap phan ra so thap phan 22
inxau m2 22
mov cx,sopt 22
xor bx,bx 22
xor dx,dx 22
l3: 22
mov al,byte ptr xtp[bx] 22
and al,0fh 22
mov ah,0 22
xchg ax,dx 22
mul so10 22
add dx,ax 22
inc bx 22
loop l3 22
mov ax,dx 22
mov luu,ax 22
call in10 22
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -4 -
;//==================================== 22
;// doi so thap phan sang xau tlp 22
inxau m3 22

mov ax,luu 22
mov bx,16 22
lea si, xtlp 23
doi: 23
mov dx,0 23
div bx 23
push dx 23
inc cx 23
cmp ax,0 23
jne doi 23
mov sopt,cx 23
nhay: 23
pop dx 23
cmp dx,9 23
jg l4 23
add dl,48 23
jmp l5 23
l4: 23
add dl,55 23
l5: 23
mov byte ptr [si],dl 23
inc si 23
loop nhay 23
;//==================================== 23
;//in xau tlp 23
xor bx,bx 23
mov cx,sopt 23
mov ah,2 23
kthuc: 23
mov dl,byte ptr xtlp[bx] 23

int 21h 23
inc bx 23
loop kthuc 23
mov ah,4ch 23
int 21h 23
;//==================================== 23
;// Thu tuc in10 24
in10 proc 24
push bx 24
push cx 24
push dx 24
mov bx,10 24
l6: 24
mov dx , 0 24
div bx 24
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -5 -
push dx 24
inc cx 24
cmp ax ,0 24
jnz l6 24
;//==================================== 24
;// lay ra tu stack de in 24
mov ah , 2 24
printf: 24
pop dx 24
or dl, 30h 24
int 21h 24
loop printf 24
pop dx 24

pop cx 24
pop bx 24
ret 24
in10 endp 24
;//==================================== 24
;// thu tuc doc xau 24
24
DOC_XAU proc 24
push ax 24
push bx 24
push cx 24
push dx 24
mov so,0 24
24
l7: 25
mov ah,1 25
int 21h 25
cmp al,'0' 25
jl l7 25
cmp al,'9' 25
jg l7 25
mov so,al 25
pop dx 25
pop cx 25
pop bx 25
pop ax 25
ret 25
DOC_XAU endp 25
end main 25
2. Hình minh họa: 25

ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -6 -

GIỚI THIỆU ĐỀ TÀI
.I Viết một chương trình C để xử lí các công việc sau đây:
1. Hãy nhập xâu ký tự số thập lục phân st[] có lẫn các ký tự trống, hãy nén xâu bằng
cách xóa hết các ký tự trống, rồi đổi xâu st[] ra số thập phân tương ứng vd:. char st[]=” 1 8 F
”; =>char st[]=”18F”;=>unsigned int n=399.
2. Viết các hàm đệ quy tsin(), tcos(), tpi() để tính các dãy số biểu diển hàm chuẩn
sin(x), cos(x) và hằng chuẩn M_PI, với x=0.25 và độ chính xác ef=1e-5.
3. Hãy gán tx=(int)(n+tsin()*tpi())/tcos());viết hàm doihe() để đổi tx ra số nhị phân, sau
đó đổi từ số nhị phân ra số thập lục phân, rồi đổi từ số thập lục phân ra lại số thập phân. vd:
tx=140=>10001100=>0x8C=> 140
.II Viết chương trình ASM :
Xử lý xâu ký tự số thập phân: thủ tục DOC_XAU để nhập các ký tự thâp phân
vào xâu tphan db 5 dup(0) , Hãy đổi xâu tphan ra số thập phân, tương ứng, rôi đổi số thập
phân ra xâu số thập lục phân (tlp db 4 dup(0).
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -7 -
NỘI DUNG BÁO CÁO:
.A Phần C
.I Mô tả các hàm trong chương trình
-strstr(chuoi,” ”);//trả lại vị trí tìm thấy của ký tự trống trong chuỗi
-strim(chuoi);//tìm và xóa ký tự trống trong chuỗi
-strlen(chuoi);//tính độ dài chuỗi
-memmove(p,p+1,strlen(chuoi)-(p-chuoi));//dich chuỗi sang phải 1 đơn vị
-tpi(exp,i);//tính pi
-tsin(x,i,exp);//tính sin
-tcos(x,i,exp);//tính cos
-gt(n);//tính giai thừa n

-lt(x,y);//tính x^y
-tong(n,i,exp,x);//tính tổng
-nph(x);//đổi số thập phân sang nhị phân
-tlph(t);//đổi số nhị phân sang thập lục phân
-tp(k);//đổi từ số thập lục phân sang nhị phân
-tp_np_tlph_tp(a);//xuất từ thập phân-nhị phân-thập lục phân-thập phân
.II Xây dựng thuật toán:
1. Nhập xâu thập lục phân,nén xâu bằng cách xóa ký tự trống,sau đó chuyển
sang số thập phân:
a. Nhập xâu thập phân: chứa các ký tự 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,A,B,C,D,E,F.
-Bước 1: Khai báo con trỏ p-trỏ vào chuỗi
-Bước 2: dùng vòng lặp while để kiểm tra ký tự trống
-p=strstr(chuoi,” ”);//trả lại vị trí tìm thấy của ký tự trống trong chuỗi
-memmove(p,p+1,strlen(chuoi)+(chuoi-p);//khi đó ta sẽ xét chuỗi từ vị trí
khoảng trắng"_"và xóa khoảng đó,và dich chuỗi qua phải 1 dơn vị
-Bước 3: so sánh (chuoi[0]==’’) dịch chuỗi qua phải 1 dơn vị,độ dài chuỗi giảm xuống
1.
-Bước 4: so sánh (chuoi[strlen(chuoi)-1]==’’),xét hết chuỗi ,nếu chưa hết ta quay lại
bước 2
chuoi[strlen(chuoi)-1]=0;// thêm số 0 vào cuối chuỗi.
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -8 -
-Code:
char *trim(char *chuoi)
{
char *p;
while (p=strstr(chuoi," "))
memmove(p,p+1,strlen(chuoi)-(p-chuoi));
if (chuoi[0]==' ')
memmove(chuoi,chuoi+1,strlen(chuoi)-1);

if (chuoi[strlen(chuoi)-1]==' ')
chuoi[strlen(chuoi)-1]=0;
return chuoi;
}
b. -Tạo hàm luythua() để đổi từ xâu thập luc phân số thập phân
Code:
int lt(int x, int y)
{
int i,t=1;
for(i=1;i<=y;i++)
t=t*x;
return t;
}
c. Tạo hàm in xâu thập lục phân được chuyển sang số thập phân:
Thuật toán:
-Bước 1: gọi hàm nhập xâu thập lục phân: st=trim();
Biến s chứa độ dài xâu cần chuyển s=strlen();
-Bước 2: cho i=0;j=s-1;
-Bước 3:- Nếu (st[i]>=’0’)&&(st[i]<=’9’) h=st[i]-48đổi sang số thập phân
(h>=0)&&(h<=9)
- Nếu (st[i]>=’a’)&&(st[i]<f) h=st[i]-87 đổi ký tự thường sang số thập phân
(h>=10)&&(h<=15)
-Nếu (st[i]>=’A’&&st[i]<=’F’) h=st[i]-55 đổi ký tự in sang số thập phân
-Gán :so= so+h*lt(16,j );tính tổng dãy số
-Bước 4: So sánh i với s: nếu(i==s) trả về giá trị của so.kết thúc
Ngược lại: i=i+1; quay lại bước 3
-Code:
int xau_int(char st[20])
{
char h;

int i,j,s=0,so=0;
st=trim(st);
s=strlen(st);
j=s-1;
for(i=0;i<s;i++)
{
if((st[i]>='0')&&(st[i]<='9')) h=st[i]-48;
else if ((st[i]>='a')&&(st[i]<='f')) h=st[i]-87;
else if((st[i]>='A')&&(st[i]<='F')) h=st[i]-55;
else ;
so=so+h*lt(16,j );
}
return so;
}
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -9 -
2).Tính sin(x),cos(x),pi dùng đệ quy:
a). Tính số pi:
Thuật toán:
-Bước 1: khai báo biến s:kiểu float chứa tổng pi
-Bước 2: cho i=0;
Gán s=((-1)^i)*4/(2*i+1);
-Bước 3: +So sánh s với hằng số epsilon: nếu (s<=epsilon) return s; kết thúc
+Ngược lại :gọi đệ quy trả về s=s+tpi(exp,i+1);
-Chương trình:
Code:
float tpi(float exp,int i)
{
float s;
s=(pow(-1,i)*4/(2*i+1));

if ( fabs(s)<=exp) return s;
else return (s+tpi(exp,i+1));
}
b). Tính sin(x):
Thuật toán:
-Bước 1: cho i=0;
gán s=((-1)^i)*(x,2*i+1)/(gt(2*i+1));
-Bước 2: so sánh s và epsilon:
+Nếu (s<=epsilon) trả về giá trị s.kết thúc
+Ngược lại gọi đệ quy (s+tsin(x,i+1,exp));
-Code:
float tsin(float x,int i,float exp)
{
float s;
s=(pow(-1,i)*pow(x,2*i+1))/(gt(2*i+1));
if (fabs(s)<=exp) return s;
else return (s+tsin(x,i+1,exp));
}
c). Tính cos(x):
Thuật toán:
-Bước 1: cho i=0;
gán s=((-1)^i)*(x,2*i+)/(gt(2*i+1));
-Bước 2: so sánh s và epsilon:
+Nếu (s<=epsilon) trả về giá trị s.kết thúc
+Ngược lại gọi đệ quy (s=s+tcos(x,i+1,exp));
Code:
float tcos(float x,int i,float exp)
{
float s;
s=(pow(-1,i)*pow(x,2*i))/(gt(2*i));

if (fabs(s)<=exp) return s;

else return (s+tcos(x,i+1,exp));
}
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -10 -
3). Tính tổng:tx=int(n+tsin()*tpi()/tcos());
Thuật toán:
-Bước 1:gán a=tsin();b=tcos();c=tpi();
-Bước 2:gán s=a*c/b;
-Bước 3:lấy phần nguyên của s: nếu float s=30.123;int s=30;
-Bước 4:trả về giá trị tổng: tong(n,i,exp,x)=s+n; kết thúc
Code:
int tong(int n,int i,float exp,float x)
{
float a=tsin(x,i,exp);
float b=tcos(x,i,exp);
float c=tpi(exp,i);
float s=a*c/b;
int s1=s;
return s1+n;
}
4). Chuyển mã: thập phân-nhị phân-thập lục phân-thập phân
-Khai báo: xâu ký tự kiểu char mnph[20]; char mtph[5];
-khai báo biếm dem:đếm số ký tự có trong xâu
-Tạo hàm lũy thừa:lt() để tính giá trị của xâu nhị phân:
-Code:
int lt(char x, char y)
{
char i,t=1;

for (i=1;i<=y;i++)
t=t*x;
return t;
}
a). Hàm đổi từ số thập phân sang nhi phân:
Thuật toán:
-Bước 1: i=0; gán x=a //biến x chứa giá trị của số thập phân cần chuyển
-Bước 2: so sánh x và 2
-Bước 2.1:(nếu x<2) return i; kết thúc
+Ngược lại: mnph[i++]=x%2;
x=x/2; quay lại bước 2
Code:
char nph(int a)
{
int x=a,i=0;
while(x>2)
{
mnph[i++]=x%2;
x=x/2;
}
return i;
}
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -11 -
b). Hàm chuyển từ số nhị phân sang thập lục phân:
Thuật toán:
-từ xâu nhị phân chuyển sang thập lục phân: ta có tổ hợp 4 bít nhị phân tạo thành 1 số
thập lục phân tương ứng.
-Bước 1:j=0; gán i=0;//đếm số ký tự xâu nhị phân
-Bước 2:gán x=x+mnph[i]*lt(2,j++);

Nếu:((i+1)%4==0)//4 bít là một số thập lục phân
Nếu:( (0<=x)&&(x<=9) )x=x+48//in ra số thập lục phân
Nếu:( (10<=x)&&(x<=15)) x=x+55//in ra dạng ký tự
-Bước 3: so sánh: nếu i bằng độ dài xâu nhi phân (i==t) trả về giá trị x;kết thúc
Ngược lại : i++ quay lại bước 2
Code:
char tlp(char t)
{
int i,j=0,x=0;
char k=0;
for(i=0;i<t;i++)
{
x=x+mnph[i]*lt(2,j++);
if(((i+1)%4==0)||(i==t-1))
{
if((x>=0)&&(x<=9)) x=x+48;
if((x>=10)&&(x<=15)) x=x+55;
mtlp[k++]=x;
x=0;
j=0;
}
}
return k;
}
c). Hàm chuyển từ thập lục phân sang thập phân:
Thuật toán:
-Bước 1:gán j=0;i=0; //đếm số chữ số được chuyển
-Bước 2: x=mtlp[i];
Nếu:( (x>=48)&&(x<=57)) x=x-48;chuyển từ thập luc phân sang số thập phân
Nếu :((x>=65&&x<=70)) x=x-55;chuyển từ dạng ký tự hex sang thập phân

t=t+x*lt(16,j++);đổi từ hexa sang thập phân bằng cách nhân số đó với (16^j) (số
đó nằm ở vị trí thứ j trong dãy)
-Bước 3:so sánh: i và k-tổng số trong dãy
Nếu (i==k) trả về giá trị của số thập phân return t;//kết thúc
Ngược lại: i=i+1 //quay lại bước 2
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -12 -
Code:
int tp(char k)
{
int i,x,t;
char j=0;
for(i=0;i<k;i++)
{
x=mtlp[i];
if((x>=48)&&(x<57)) x=x-48;
if((x>=65)&&(x<=70)) x=x-55;
t=t+x*lt(16,j++);
}
return t;
}
d). Xuất : Thập phân-nhị phân-thập lục phân-thập phân
Code:
void tp_np_tlp_tp (int a)
{
char i,dem1,dem2;
int t;
printf("%d > ",a);
dem1 = nph(a);
dem2 = tlp(dem1);

t = tp(dem2);
for(i=dem1-1;i>=0;i ) printf("%d",mnph[i]);
printf(" > ");
printf("Ox");
for(i=dem2-1;i>=0;i ) printf("%c",mtlp[i]);
printf(" > %d",t);

}
III.Chương trình và hình minh họa:
1) . Nhập xâu thập lục phân nén xâu bằng cách xóa ký tự trống và đổi xâu ra số
thập phân:
a). Code:
#include<math.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
char xau[20];
//=============================
char *trim(char *chuoi);
int lt(int x, int y);
int xau_int(char st[20]);
main()
{
printf("\n\n\n nhap ao xau thap phan: ");
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -13 -
scanf("%[ 0123456789abcdefABCDEF]",xau);
printf("\n\n\n So tp la: %d",xau_int(xau));
getch();
}

//=============================
//tim ky tu trong va xoa
char *trim(char *chuoi)
{
char *p;
while (p=strstr(chuoi," "))
memmove(p,p+1,strlen(chuoi)-(p-chuoi));
if (chuoi[0]==' ')
memmove(chuoi,chuoi+1,strlen(chuoi)-1);
if (chuoi[strlen(chuoi)-1]==' ')
chuoi[strlen(chuoi)-1]=0;
return chuoi;
}
//==============================
// Tinh luy thua
int lt(int x, int y)
{
int i,t=1;
for(i=1;i<=y;i++)
t=t*x;
return t;
}
//===============================
// in xau o dang thap phan
int xau_int(char st[20])
{
char h;
int i,j,s=0,so=0;
st=trim(st);
s=strlen(st);

j=s-1;
for(i=0;i<s;i++)
{
if((st[i]>='0')&&(st[i]<='9')) h=st[i]-48;
else if ((st[i]>='a')&&(st[i]<='f')) h=st[i]-87;
else if((st[i]>='A')&&(st[i]<='F')) h=st[i]-55;
else ;
so=so+h*lt(16,j );
}
return so;
}
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -14 -
b). Hình minh họa:
2). Viết các hàm đệ quy tsin(), tcos(), tpi() để tính các dãy số biểu diển hàm chuẩn
sin(x), cos(x) và hằng chuẩn M_PI, với x=0.25 và độ chính xác ef=1e-5.
3). Gán tx=(int)(n+tsin()*tpi())/tcos());viết hàm doihe() để đổi tx ra số nhị phân, sau đó
đổi từ số nhị phân ra số thập lục phân, rồi đổi từ số thập lục phân ra lại số thập phân.
a). Code:
#include<stdio.h>
#include<conio.h>
#include<math.h>
char mnph[20],mtlp[5];
//====================================
//Tinh pi
float tpi(float exp,int i)
{
float s;
s=(pow(-1,i)*4/(2*i+1));
if ( fabs(s)<=exp) return s;

else return (s+tpi(exp,i+1));
}
//====================================
// Tinh giai thua
int gt(int n)
{
if (n==0) return 1;
else return gt(n-1)*n;
}
//====================================
//ham tinh sin(x)
float tsin(float x,int i,float exp)
{
float s;
s=(pow(-1,i)*pow(x,2*i+1))/(gt(2*i+1));
if (fabs(s)<=exp) return s;
else return (s+tsin(x,i+1,exp));
}
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -15 -
//====================================
// ham tinh cos(x)
float tcos(float x,int i,float exp)
{
float s;
s=(pow(-1,i)*pow(x,2*i))/(gt(2*i));
if (fabs(s)<=exp) return s;
else return (s+tcos(x,i+1,exp));
}
//====================================

// ham tinh tong
int tong(int n,int i,float exp,float x)
{
float a=tsin(x,i,exp);
float b=tcos(x,i,exp);
float c=tpi(exp,i);
float s=a*c/b;
int s1=s;
//printf("\n\n tong:%2.3d",s1+n);
return s1+n;
}
//====================================
// ham tinh luy thua
int lt(char x, char y)
{
char i,t=1;
for (i=1;i<=y;i++)
t=t*x;
return t;
}
//====================================
// Chuyen tu thap phan sang nhi phan
char nph(int a)
{
int x=a,i=0;
while(x>0)
{
mnph[i++]=x%2;
x=x/2;
}

return i;
}
//====================================
// Chuyen tu ni phan sang thap luc phan
char tlp(char t)
{
int i,j=0,x=0;
char k=0;
for(i=0;i<t;i++)
{
x=x+mnph[i]*lt(2,j++);
if(((i+1)%4==0)||(i==t-1))
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -16 -
{
if((x>=0)&&(x<=9)) x=x+48;
if((x>=10)&&(x<=15)) x=x+55;
mtlp[k++]=x;
x=0;
j=0;
}
}
return k;
}
//====================================
// Chuyen tu thap luc phan sang thap phan
int tp(char k)
{
int i,x,t;
char j=0;

for(i=0;i<k;i++)
{
x=mtlp[i];
if((x>=48)&&(x<57)) x=x-48;
if((x>=65)&&(x<=70)) x=x-55;
t=t+x*lt(16,j++);
}
return t;
}
//====================================
// In tu thap phan->nhi phan->thap luc phan->thap phan
void tp_np_tlp_tp (int a)
{
char i,dem1,dem2;
int t;
printf("\n Chuyen ma:");
printf("%d > ",a);
dem1 = nph(a);
dem2 = tlp(dem1);
t = tp(dem2);
for(i=dem1-1;i>=0;i ) printf("%d",mnph[i]);
printf(" > ");
printf("Ox");
for(i=dem2-1;i>=0;i ) printf("%c",mtlp[i]);
printf(" > %d",t);

}
//====================================
// chuong trinh chinh
main()

{
float x,exp;
int n,i=0;
printf("\n nhap vao x(radian):");
scanf("%f",&x);
//x=x*3.14/180;
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -17 -
printf("\n nhap hang so epsilon:exp=");
scanf("%f",&exp);
printf("\n Nhap n=");
scanf("%d",&n);
printf("\n\n sin(x)=%2.5f",tsin(x,i,exp));
printf("\n\n cos(x)=%2.5f",tcos(x,i,exp));
printf("\n\n pi=%2.5f",tpi(exp,i));
printf("\n\n Tong:%2d",tong(n,i,exp,x));
printf("\n\n");
int a= tong(n,i,exp,x);
tp_np_tlp_tp (a);
getch();
}
b)Hình minh họa:
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -18 -
.B Phần ASM
.I Chức năng của các hàm của ngắt 21h:
– 01h: đợi đọc 1 ký tự từ bàn phím có hiển thị trên màn hình.
– 02h: hiển thị 1 ký tự tại vị trí con trỏ trên màn hình.
– 09h: xuất 1 chuỗi ký tự lên màn hình.
– 0ah: đợi đọc 1 chuỗi ký tự từ bàn phím, kết thúc bằng Enter.

– 4ch: kết thúc chương trình và trở về DOS
.II Xây dựng thuật toán:
1. Ý tưởng:
- Nhập xâu ký tự số thập phân: thủ tục DOC_XAU để nhập các ký tự thâp phân
vào xâu tphan db 5 dup(0) :dùng chức năng của ngắt 21h hàm 01h cho nhập dữ
liệu và 09h kết xuất
- Sau đó đổi sau tphan sang số thập phân tương ứng bằng cách nhân so10.
- Đổi số thập phân ra xâu số thập lục phân và lưu vào xâu tlp db 4 dup(0)
2. Thuật toán:
- Bước 1: nhập xâu số thập phân:
- dùng chức năng 01h của ngắt 21h để nhập số phần tử của xâu:sopt
- dùng thủ tục DOC_XAU để nhập các ký tự thâp phân vào xâu tphan db 5
dup(0).
- gán so=0; và mov al,so; đếm số đã nhập
- Lưu số đã nhập vào vào ô nhớ có địa chỉ ds:bx mov byte ptr [bx],al
- Mổi lần lưu tăng giá trị ô nhở lên 1: inc bx ;tiến hành lặp
- Bước 2: in xâu đã nhập:
- bước lặp: mov dl,byte ptr xtp[bx] ;đọc nội dung ô nhớ tại ds:bx
; thao tác đọc, toán hạng bên trái là thanh ghi dl
-dùng chức năng 02h của ngắt 21h để in
-tăng giả trị ô nhớ lên 1: inc bx; và tiến hành lặp
- Bước 3: Đổi xâu thập phân ra số thập phân
- bước lặp: mov al,byte ptr xtp[bx];al đọc nội dung ô nhớ bx
-and al,0fh ; giữ giá trị của al
- xchg ax,dx ;tiến hành đổi chổ ax và dx
- mul so10 ;dxdx*10
- add dx,ax ; dxdx+ax
- inc bx ;tăng địa chỉ ô nhớ lên 1 và tiến hành lặp
- mov ax,dx ; axdx chứa tổng thập phân
- call in10 ;gọi chức năng in10 để tiến hành in giá trị của ax

ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -19 -
- Bước 4: đổi số thập phân sang xâu thập lục phân
- mov bx,16 ;gán bx=16
- mov dx,0 ;
- bước lặp: div ax,bx ;axax/16
- push dx ; đưa giá trị ax%16 vào ngăn xếp dx
- cmp ax,0 ; tiến hành so sánh ax và 0
;nếu (ax==0) làm bước kế tiếp
;ngược lại tăng địa chỉ ngăn xếp lên 1 inc cx ;tiến hành lặp
- pop dx ; lấy giá trị dx ra khỏi ngăn xếp
- cmp dx,9 ;so sánh giá trị của dx và 9
-nếu (dx<9) add dl,48 ;trả về số hex
-ngược lại: add dl,55 ;đưa về dạng ký tự
- Tiến hành xuất xâu thập lục phân: dùng thủ tục in10
.III Chương trình và hình minh họa:
1. Chương trình:
; cac macro
inxau macro tbao
push ax
push dx
mov ah,9
lea dx,tbao
int 21h
pop dx
pop ax
endm
;//====================================
.model small
.stack 100h

.data
m0 db 'nhap so ptu: $'
m4 db 10,13,'nhap xau: $'
m1 db 10,13,' xau thap phan la: $'
m2 db 10,13,'doi xau thap phan ra so thap phan $'
m3 db 10,13,' doi ra xau tlp: $'
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -20 -
xtp db 100 dup (0)
xtlp db 100 dup (0)
sopt dw 0
so db 0
so10 db 10
luu dw 0
.code
main:
mov ax,@data
mov ds,ax
;//====================================
;// Nhap so phan tu xau
inxau m0
mov ah,1
int 21h
and al,0fh
mov ah,0
mov sopt,ax
mov cx,ax
mov bx, offset xtp
inxau m4
l1:

call DOC_XAU
mov al,so
mov byte ptr [bx],al
inc bx
loop l1
;//====================================
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -21 -
;// Xuat xau thap phan vua nhap
inxau m1
xor bx,bx
mov cx,sopt
mov ah,2
l2:
mov dl,byte ptr xtp[bx]
int 21h
inc bx
loop l2
;//====================================
;// doi xau thap phan ra so thap phan
inxau m2
mov cx,sopt
xor bx,bx
xor dx,dx
l3:
mov al,byte ptr xtp[bx]
and al,0fh
mov ah,0
xchg ax,dx
mul so10

add dx,ax
inc bx
loop l3
mov ax,dx
mov luu,ax
call in10
;//====================================
;// doi so thap phan sang xau tlp
inxau m3
mov ax,luu
mov bx,16
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -22 -
lea si, xtlp
doi:
mov dx,0
div bx
push dx
inc cx
cmp ax,0
jne doi
mov sopt,cx
nhay:
pop dx
cmp dx,9
jg l4
add dl,48
jmp l5
l4:
add dl,55

l5:
mov byte ptr [si],dl
inc si
loop nhay
;//====================================
;//in xau tlp
xor bx,bx
mov cx,sopt
mov ah,2
kthuc:
mov dl,byte ptr xtlp[bx]
int 21h
inc bx
loop kthuc
mov ah,4ch
int 21h
;//====================================
ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -23 -
;// Thu tuc in10
in10 proc
push bx
push cx
push dx
mov bx,10
l6:
mov dx , 0
div bx
push dx
inc cx

cmp ax ,0
jnz l6
;//====================================
;// lay ra tu stack de in
mov ah , 2
printf:
pop dx
or dl, 30h
int 21h
loop printf
pop dx
pop cx
pop bx
ret
in10 endp
;//====================================
;// thu tuc doc xau

DOC_XAU proc
push ax
push bx
push cx
push dx
mov so,0

ĐỀ TÀI 17 LỚP 11T2
ĐỒ ÁN LẬP TRÌNH HỆ THỐNG -24 -
l7:
mov ah,1
int 21h

cmp al,'0'
jl l7
cmp al,'9'
jg l7
mov so,al
pop dx
pop cx
pop bx
pop ax
ret
DOC_XAU endp
end main
2. Hình minh họa:
ĐỀ TÀI 17 LỚP 11T2

×