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

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

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐỒ Á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 [...]... 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... LỚP 11T2 ĐỒ ÁN LẬP TRÌNH HỆ THỐNG - Bước 4: đổi số thập phân sang xâu thập lục phân - -19 - 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ị... 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...ĐỒ Á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... if((st[i]>='A')&&(st[i] . 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. ;//==================================== 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. 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)

Ngày đăng: 26/10/2014, 11:47

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan