1. Trang chủ
  2. » Giáo án - Bài giảng

Mô Phỏng Thuật Toán

17 4,3K 59

Đ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

Thông tin cơ bản

Định dạng
Số trang 17
Dung lượng 369,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Các đặc trưng của thuật toán Tính kết thúc: Một thuật toán phải kết thúc sau một số hữu hạn thao tác Tính rõ ràng: theo nghĩa nhiều người khác nhau thực hiện thì phải cho cùng một kết qu

Trang 1

Thuật toán là gì?

Thuật toán để giải một bài toán là một dãy hữư hạn các thao tác được sắp xếp theo một trình tự xác định sao cho sau khi thực hiện dãy thao tác ấy, từ input của bài toán, ta nhận được output cần tìm.

Các đặc trưng của thuật toán Tính kết thúc: Một thuật toán phải kết thúc sau một số hữu hạn thao tác

Tính rõ ràng: theo nghĩa nhiều người khác nhau thực hiện thì phải cho cùng một kết quả Tình phổ dụng: Thuật toán nào dùng được rộng rãi hơn tổng quát hơn thì tính phổ dụng cao

hơn

Tính hiệu quả: Ít tốn kém về số lượng thao tác, về vùng nhớ, về thời gian

Cách biểu diễn thuật toán

Người ta thường dùng hai phương pháp sau đây để mô tả thuật toán

a)Phương pháp liệt kê

b) Phương pháp sơ đồ khối ( Lưu đồ)

Hình O van thể hiện thao tác nhập xuất dữ liệu

Hình chữ nhật thể hiện các phép tính toán

Các mũi tên quy định trình tự thực hiện thao tác

Mũi tên ngược được hiểu là phép gán

Hình thoi thể hiện thao tác so sánh

Một số thuật toán đơn giản thường gặp 1)Hoán vị hai giá trị x,y có dùng biến trung gian

Bước 1: Dùng một biến trung gian tam và thực hiện tam ← x

Bước 2: x ←y

Bước 3: y← tam

Bước 4: kết thúc

2)Hoán vị hai giá trị x,y không dùng biến trung gian

Bước 1: x← x+y

Bước 2: y ←x-y

Bước 3: x← x-y

Bước 4: kết thúc

3)Tìm phần tử nhỏ nhất trong dãy a1 an

Bước 1: Nhập giá trị N và a1 an

Bước 2: I ← 1; Min← a1

Bước 3: i←i+1

Bước 4: nếu i> n thì xuất Min và chuyển đến bước 7 để kết thúc ngược lại thực hiện bước 5 Bước 5: Nếu ai<min thì min← ai

Bước 6 lặp lại bước 3

Bước 7 Kết thúc

4)Kiểm tra k có trong dãy a1 an không?

( Thuật toán tìm kiếm)

Bước 1: Nhập các giá trị n, a1 an, k

Bước 2: i←1

Bước 3: Nếu i> n thì sang bước 5, trái lại đến bước 4

Trang 2

Bước 4: Nếu k=ai thì sang bước 5, trái lại i←i+1 và quay về bước3

Bước 5: Nếu i>n thì thông báo k không thuộc dãy, trái lại thông báo k là phần tử thứ I của dãy

Bước 6: kết thúc

Trang 3

Tìm giá trị lớn nhất của một dãy số nguyên Xác định

bài toán

Input:

Số n và dãy a1 an

Output: Giá trị lớn nhất của dãy số nguyên

Y tưởng

Khởi tạo giá trị Max=a1;

Lần lượt với I từ 2 đến n so sánh các giá trị số hạng ai với Max, nếu ai>Max thì Max nhận giá trị mới là ai

Mô tả

thuật toán

bằng

liệt kê

Bước 1: Nhập N và dãy a1,,an

Bước 2: Max <- a1; i<-2;

Bước 3: Nếu i> N thì đưa ra giá trị Max rồi kết thúc Bước 4;

Bước 4.1 Nếu ai>Max thì Max<-ai Bước 4.2 i<-i+1 rồi quay lại bước 3

Mô tả

thuật toán

bằng Sơ đồ

khối

Và minh

họa bằng

chương

trình

Pascal

program bt;

uses crt;

var a:array[1 100] of integer; n,i, max:integer;

begin clrscr;

write('nhap n');readln(n); for i:=1 to n do

begin write('a[',i,']=');

readln(a[i]);

end;

Max:=0;

for i:=2 to n do

if a[i]>max then max:=a[i]; write('gia tri lon nhat la ',max);

readln;

end.

Ví dụ N=11 và dãy số 5,1,4,7,6,3,15,8,4,9,12

Mô phỏng

theo ví dụ

Giá trị lớn nhất là : 15

Trang 4

Kiểm tra tính nguyên tố của một số nguyên dương Xác

định

bài

toán

Input: N là một số nguyên dương

Output: “N là số nguyên tố” hoặc “N không là số nguyên tố”

Ý

tưởng

Một số nguyên dương N là một số nguyên tố nếu nó có đúng hai ước số khác nhau là 1 và chính nó.

 Nếu N=1 thì N không là số nguyên tố;

 Nếu 1<N<4 thì N là số nguyên tố;

 Nếu n>= 4 và không có ước số trong phạm vi từ 2 đến phần nguyên căn bậc 2 của

N thì N là số nguyên tố

Mô tả

thuật

toán

bằng

liệt kê

Bước 1: Nhập số nguyên dương N

Bước 2: Nếu N=1 thì thông báo N không nguyên tố rồi kết thúc

Bước 3: Nếu N<4 thì thông báo N là nguyên tố rồi kết thúc

Bước 4; i <-2;

Bước 5 Nếu i>[ ]N thì thông báo N là số nguyên tố rồi kết thúc

Bước 6 Nếu N chia hết cho I thì thông báo N không nguyên tố rồi kết thúc

Bước 7 i<- i+1 rồi qua lại bước 5

Mô tả

thuật

toán

bằng

Sơ đồ

khối

minh

họa

bằng

chương

trình

Pascal

program bt;

uses crt;

var N,i:integer; kt:boolean ; begin

clrscr;

write('nhap N');readln(n);

if n=1 then write('N khong la so nguyen to')

else

if n<4 then write('N la so nguyen to')

else begin for i:=2 to trunc(sqrt(n)) do

if n mod i=0 then kt:=true;

if kt then write ('N khong la so nguyen to')

else write('N la so nguyen to'); end;

readln;

end.

Ví dụ a) N= 29 phần nguyên ([ ]N =5) b) N =45 ([ ]N =6)

phỏng

theo ví

dụ

Chia hết

không? Không Không Không Không Chia hết không? Không hết

29 là số nguyên tố 45 không là số nguyên tố

Trang 5

Thuật toán tìm kiếm tuần tự Xác định

bài toán

Input:Số n và dãy a1 an và số nguyên k

Output: Chỉ số i có giá trị bằng khóa k

Ý tưởng

Tìm kiếm tuần tự được thực hiện một cách tự nhiên Lần lượt từ số hạng thứ nhất, ta so sánh giá trị số hạng đang xét với khóa cho đến khi hoặc gặp một số hạng bằng khóa hoặc dãy đã được xét hết và không co giá trị nào bằng khóa Trong trường hợp thứ 2 dãy A không có số hạng nào bằng khóa

Mô tả

thuật toán

bằng cách

liệt kê

Bước 1: Nhập N và dãy a1 an và số nguyên k ( khóa) Bước 2: i<-1;

Bước 3: Nếu ai=k thì thông báo chỉ số i rồi kết thúc Bước 4 i=i+1

Bước 5 Nếu i>N thì thông báo dãy A không có số hạng nào có giá trị bằng k rồi kết

thúc

Bước 6 Quay lại bước 3

Mô tả

thuật toán

bằng Sơ

đồ khối

Và minh

họa bằng

chương

trình

Pascal

program bt;

uses crt;

var a:array[1 100] of integer; n,i, max,k,m:integer;

kt:boolean;

begin clrscr;

write('nhap n'); readln(n);

for i:=1 to n do begin

write('a[',i,'] =');

readln(a[i]);

end;

write('nhap khoa k');

readln(k);

for i:=1 to n do

if a[i]=k then begin

kt:=true ; m:=i;

end;

if kt then write('chi so i la ',m) else

write('khong co gia tri bang khoa k');

readln;

end.

Mô phỏng

theo ví dụ

Với i=5 thì a5=2 Với mọi i từ 1 đến 8 không có ai

có giá trị bằng 6

Trang 6

Thuật toán tìm kiếm nhị phân ( Binary Search) Xác định

bài toán

Input:Số n và dãy a1 an và số nguyên k ( Dãy đã sắp tăng)

Output: Chỉ số i có giá trị bằng khóa k

Ý tưởng

Dãy A đã sắp tăng, ta tìm cách thu hẹp nhanh phạm vi tìm kiếm sau mỗi lần so sánh với số hạng được chọn Để thực hiện điều này, ta chọn số hạng

a giua ở “giữa dãy” để so sánh với k, trong đó giua= +2 

1

n

Khi đó chỉ xảy ra một trong ba trường hợp sau:

-Nếu a giua=k thì Giua là chỉ số cần tìm và kết thúc việc tìm kiếm Nếu a giua>k thì việc tìm kiếm thuộc khoảng từ a1 đến a giua-1 Nếu a giua<k thì việc tìm kiếm thuộc khoảng từ a giua+1 đến cuối dãy Quá trình trên sẽ lặp lại một số lần cho đến khi tìm thấy giá trị bằng k hoặc không

Mô tả

thuật toán

bằng cách

liệt kê

Bước 1: Nhập N và dãy a1 an và số nguyên k ( khóa) ( dạy a đã sắp tăng)

Bước 2: Dau<-1, Cuoi<- N;

Bước 3: giua<- +2 

Cuoi Dau

;

Bước 4: Nếu a giua=k thì thông báo chỉ số Giua rồi kết thúc;

Bước 5: a giua>k thì đặt cuoi=giua+1, rồi chuyển đến bước 7;

Bước 6: Dau<- Giua+1;

Bước 7: Nếu Dau>Cuoi thì thông báo dãy A không có số hạng nào có giá

trị bằng k rồi kết thúc;

Bước 8 Quay lại bước 3.

Mô tả

thuật toán

bằng Sơ

đồ khối

minh họa

bằng

chương

trình

Pascal

minh họa program bt;

Trang 7

chương

trình

Pascal

uses crt;

var a: array[1 100] of integer; i, n,k,dau,giua,cuoi: integer;

begin clrscr;

write('nhap n'); readln(n);

for i:=1 to n do begin

write('a[',i,'] =');

readln(a[i]);

end;

write('nhap khoa k'); readln(k);

dau:=1;

cuoi:=n;

repeat giua:=(dau+cuoi)div 2;

if a[giua]<k then dau:=giua+1 else

if a[giua]>k then cuoi:=giua-1 else

cuoi:= -1;

until dau>cuoi;

if cuoi=-1 then write(‘ giua la’, giua) else write('khong co gia tri bang khoa k');

readln;

end.

Ví dụ K=21, N=10

Mô phỏng

theo ví dụ

Ở lần duyệt thứ 3 a giua=21=k tại i=giua=6

Mô phỏng

theo ví dụ

Ở lần duyệt thứ 5 Dau> Cuoi kết luận không có số hạng =k

Trang 8

Thuật toán sắp xếp tráo đổi ( Exchange Sort) (Sắp xếp nổi bọt ( Bubble Sort) Xác

định

bài

toán

Input:Số n và dãy a1 an

Output: Dãy A được sắp xếp lại thành dãy tăng ( không giảm)

Ý

tưởng

Với mỗi cặp số hạng đứng liền kề trong dãy, nếu số trước lớn hơn số sau ta đổi chỗ chúng cho nhau, việc đó được lặp lại cho đến khi không có sự đổi chỗ nào xảy ra nữa

Sau mỗi lần đổi chỗ giá trị lớn nhất của dãy chuyển dần về cuối dãy, và tiếp đến giá trị lớn thứ hai chuyển về gần cuối dãy cứ thế giống bọt nước nổi từ

đáy lên mặt nước gọi là sắp xếp nổi bọt

Mô tả

thuật

toán

bằng

liệt kê

Bước 1: Nhập N và dãy a1 an

Bước 2: M<-N

Bước 3: Nếu M<2 thì đưa ra dãy A đã được sắp xếp rồi kết thúc

Bước 4; M<-M-1; i<-0;

Bước 5 i<-i+1;

Bước 6 Nếu i>M thì quay lại bước 3

Bước 7 Nếu ai>ai+1 thì tráo đổi ai và ai+1 cho nhau

Bước 8 Quay lại bước 5

Mô tả

thuật

toán

bằng

Sơ đồ

khối

minh

họa

bằng

chương

trình

Pascal

program bt;

uses crt;

var a:array[1 100] of integer;

n,i, tam,j,m:integer; kt:boolean;

begin clrscr;

write('nhap n'); readln(n); for i:=1 to n do

begin write('a[',i,']=');readln(a[i]); end;

for i:=1 to n do for j:=n downto 1+1 do

If a[ j ] < a[ j-1] Then Begin

tam :=a[ j ];

a[ j ] := a[j-1]; a[ j-1] := tam; End;

for i:=1 to n do write(a[ i ]:5);

readln;

end.

Ví dụ a) N= 10 dãy A= 6, 1, 5, 3, 7, 8, 10, 7, 12, 4

6 1 5 3 7 8 10 7 12 4 1 3 5 6 7 7 4 8 10 12

Trang 9

theo ví

dụ

1 6 5 3 7 8 10 7 12 4 lần 4 1 3 5 6 7 4 7 8 10 12 Lần 1 1 5 6 3 7 8 10 7 12 4

1 5 3 6 7 8 10 7 12 4 lần 5 1 3 5 6 7 4 7 8 10 12

1 5 3 6 7 8 7 10 4 12 1 3 5 6 4 7 7 8 10 12

1 5 3 6 7 8 7 10 4 12

1 5 3 6 7 8 7 10 4 12 lần 6 1 3 5 6 4 7 7 8 10 12

1 3 5 6 7 8 7 10 4 12 1 3 5 4 6 7 7 8 10 12 Lần 2 1 3 5 6 7 7 8 10 4 12

1 3 5 6 7 7 8 4 10 12 lần 7 1 3 5 4 6 7 7 8 10 12

1 3 4 5 6 7 7 8 10 12

1 3 5 6 7 7 8 4 10 12 lần 8 1 3 4 5 6 7 7 8 10 12 Lần 3 1 3 5 6 7 7 4 8 10 12 lần 9 1 3 4 5 6 7 7 8 10 12 Lần 10 1 3 4 5 6 7 7 8 10 12

Trang 10

Thuật toán tìm ươc chung của hai số ( dạng 1) Xác định

bài toán

Input: nhập hai số a,b Output: ucln của hai số

Ý tưởng

Ý tưởng của thuật tốn Euclide l UCLN của 2 số a,b cũng l UCLN của 2 số

b v a mod b, vậy ta sẽ đổi a l b, b l a mod b cho đến khi b bằng 0 Khi đĩ

UCLN l a

Mô tả

thuật toán

bằng cách

liệt kê

Bước 1: Nhập hai số a và b Bước 2: du<-a chia b

Bước 3: Nếu b = 0 chuyển qua bước 5 Bước 4 Nếu b<>0 thì a<-b; b<- du quay lại bước 2 Bước 5 đưa ra uớc chung lớn nhất của hai số và kết thúc

Mô tả

thuật toán

bằng Sơ

đồ khối

Và minh

họa bằng

chương

trình

Pascal

program bt;

uses crt;

var a,b,du:integer;

begin clrscr;

write('nhap so a');readln(a);

write('nhap so b');readln(b);

repeat du:=a mod b;

a:=b;

b:=du;

until b=0;

write(a);

readln;

end.

Ví dụ A=125; b=35

Mô phỏng

theo ví dụ

Lần

Khi b bằng 0 UCLN là giá trị của a lúc đó

Thuật toán tìm ươc chung của hai số ( dạng 2)

Trang 11

Xác định

bài toán

Input: nhập hai số a,b Output: ucln của hai số

Ý tưởng

Nếu a=b thì gi trị chung đó l UCLN của a v b Nếu a<b thì UCLN(a,b) = UCLN(a, a-b) Nếu a>b thì UCLN(a,b)=UCLN(a-b,b)

Mô tả

thuật toán

bằng cách

liệt kê

Bước 1: Nhập hai số a và b;

Bước 2: Nếu a=b thì lấy giá trị chung này làm UCLN rồi chuyển đến bước

5;

Bước 3: Nếu a>b thì a<-a-b rồi quay lại bước 2;

Bước 4 b<-b-a rồi quay lại bước 2 ; Bước 5 đưa ra uớc chung lớn nhất của hai số và kết thúc

Mô tả

thuật toán

bằng Sơ

đồ khối

Và minh

họa bằng

chương

trình

Pascal

program bt;

uses crt;

var a,b:integer;

begin clrscr;

write('nhap so a');readln(a); write('nhap so b');readln(b);

repeat

if a>b then a:=a-b else

b:=b-a;

until a=b;

write(‘UCLN’,a);

readln;

end.

Ví dụ A=125; b=35

Mô phỏng

theo ví dụ

Lần duyệt A B So sánh a-<a-b b<-b-a

Khi a=b UCLN là giá trị của a lúc đó là 5

( sử dụng 8 lần duyệt)

Trang 12

Thuật toán tìm ươc chung của hai số ( dạng 3) Xác định

bài toán

Input: nhập hai số a,b Output: ucln của hai số

Ý tưởng UCLN của hai số là hai số đó chia hết cho một số k nào đó trong khoảng từ 1 đến số thứ nhất ( với k cần tìm l số lớn nhất )

Mô tả

thuật toán

bằng cách

liệt kê

Bước 1: Nhập hai số a và b;

Bước 2: Nếu k>a thì lấy giá trị k này làm UCLN rồi chuyển đến bước 6; Bước 3: k<-k+1 ;

Bước 4: nếu a và b cùng chia hết cho k UCLN<-k quay lại bước 2 ;

Bước 5: a và b không chia hết cho k quay lại bước 2;

Bước 6 đưa ra uớc chung lớn nhất của hai số là k và kết thúc.

Mô tả

thuật toán

bằng Sơ

đồ khối

Và minh

họa bằng

chương

trình

Pascal

program bt;

uses crt;

var a,b,k,UCLN:integer; begin

clrscr;

write('nhap so a');readln(a); write('nhap so b');readln(b);

repeat k:=k+1;

if (a mod k=0) and (b mod k=0) then UCLN:=k;

until k>a;

write(‘uoc chung lon nhat ’, UCLN);

readln;

end.

Ví dụ A=125; b= 35

Mô phỏng

theo ví dụ

Khi k=5 UCLN là giá trị của k lúc đó là 5

( sử dụng 126 lần duyệt)

Thuật toán tìm BCNN của hai số ( dạng 1)

Trang 13

Xác định

bài toán

Input: nhập hai số a,b Output: BCNN của hai số

Ý tưởng

Bội chung nhỏ nhất của hai số bằng tích của a và b chia cho UCLN của hai

số đó Từ đó muốn tìm BCNN của hai số ta cần tìm UCLN trước

Thuật tốn ny l viết tiếp thuật tốn tìm UCLN chỉ khc l cần phải gn a v b bằng một giá trị khác để thực hiện tính toán sau này vì khi tính tốn UCLN

gi trị a v b lc đó đ thay đổi

Mô tả

thuật toán

bằng cách

liệt kê

Bước 1: Nhập hai số a và b gán M<-a; N<-b;

Bước 2: du<-a chia b Bước 3: Nếu b = 0 chuyển qua bước 5 Bước 4 Nếu b<>0 thì a<-b; b<- du quay lại bước 2 Bước 5 đưa ra uớc chung lớn nhất (UCLN) của hai số

Bước 6: BC<-(M*N)/ UCLN Bước 7: xuất BCNN và kết thúc

Mô tả

thuật toán

bằng Sơ

đồ khối

Và minh

họa bằng

chương

trình

Pascal

program bt;

uses crt;

var a,b,du,M,N,bc:integer; begin

clrscr;

write('nhap so a');readln(a); write('nhap so b');readln(b);

repeat du:=a mod b;

a:=b;

b:=du;

until b=0;

Bc:=(M*N) div a Write (BC);

readln;

end.

Ví dụ A=125; b=35 ; gán M cho a và N cho b

Mô phỏng

theo ví dụ

Lần

Khi b bằng 0 UCLN là giá trị của a lúc đó và BC=(M*N)/a=875 Thuật toán tìm Bội chung nhỏ nhất của hai số ( dạng 2)

Xác định Input: nhập hai số a,b

Trang 14

bài toán Output: BCNN của hai số

Ý tưởng BCNN của hai số là một số k nào đó chia hết cho hai số đ cho trong lần gặpđầu tiên trong khoảng từ 1 đến vô cùng.

Mô tả

thuật toán

bằng cách

liệt kê

Bước 1: Nhập hai số a và b;

Bước 2: k<-k+1 Bước 3: Nếu k không chia hết cho a và b thì chuyển đến bước 2 Bước 4: xuất k là BCNN và kết thúc.

Mô tả

thuật toán

bằng Sơ

đồ khối

Và minh

họa bằng

chương

trình

Pascal

program bt;

uses crt;

var a,b,k:integer;

begin clrscr;

write('nhap so a');readln(a);

write('nhap so b');readln(b);

repeat k:=k+1;

until (k mod a=0) and (

k mod b=0);

write(‘ Bọi chung nho nhat

la ’, k);

readln;

end.

Ví dụ A=5; b= 15

Mô phỏng

theo ví dụ

Lần duyệt A B k K chia hết cho a và b ?

Khi k=15 BCNN là giá trị của k lúc đó là 15

( sử dụng 15 lần duyệt)

Thuật toán đếm số thoả mãn điều kiện Xác định Input:Số n và dãy a1 an và số nguyên k

Trang 15

bài toán Output: Có bao nhiêu giá trị bằng k

Ý tưởng

Tìm kiếm tuần tự được thực hiện một cách tự nhiên Lần lượt từ số hạng thứ nhất, ta so sánh giá trị số hạng đang xét với khóa cho đến khi hoặc gặp một số hạng bằng khóa thực hiện đếm hoặc dãy đã được xét hết và không

co giá trị nào bằng khóa Trong trường hợp thứ 2 dãy A không có số hạng nào bằng khóa đếm sẽ bằng không

Mô tả

thuật toán

bằng cách

liệt kê

Bước 1: Nhập N và dãy a1 an và số nguyên k ( khóa)

Bước 2: i<-1; dem<-0;

Bước 3: i=i+1

Bước 3: Nếu ai=k thì dem<- dem+1 quay lại bước 3

Bước 4 ai<> k quay lại bước 3 Bước 5 Nếu i>N thì đưa giá trị dem rồi kết thúc

Mô tả

thuật toán

bằng Sơ

đồ khối

Và minh

họa bằng

chương

trình

Pascal

program bt;

uses crt;

var a:array[1 100] of integer;

n,i, max,k,m, dem:integer; begin

clrscr;

write('nhap n'); readln(n); for i:=1 to n do

begin write('a[',i,'] =');

readln(a[i]);

end;

write('nhap khoa k');

readln(k);

for i:=1 to n do

if a[ i ]=k then dem:=dem+1;

write(' co ',dem , ‘so’) ; readln;

end.

Mô phỏng

theo ví dụ

Dem=2

Thuật toán tính tổng các số thoả mãn điều kiện Xác định Input:Số n và dãy a1 an và số nguyên k

Ngày đăng: 20/09/2015, 00:03

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w