Khỏi niệm về cấu trỳc thuật toỏn

Một phần của tài liệu Ngôn ngữ lập trình Fortran và ứng dụng trong khí tượng thủy văn (Trang 28)

Trong mục 1.3, chương 1 đó sơ lược núi về quy trỡnh năm bước giải bài toỏn. Đối với những bài toỏn phức tạp về cỏch giải thỡ bước 4 là bước khú khăn nhất. Người lập trỡnh phải mụ tả tuần tự cỏc cụng đoạn từ đầu đến cuối quỏ trỡnh giải, chia quỏ trỡnh này thành một số khối và liệt kờ những khối đú ra để sau này chương trỡnh mỏy tớnh sẽ tuần tự thực hiện. Trong mỗi khối người lập trỡnh lại phải chi tiết hoỏ thờm đến mức cú thể chuyển thành những lệnh mỏy tớnh. Cỏch chia khối và chi tiết hoỏ từng khối như vậy cú thể gọi là phương phỏp chia và chinh phục. Kết quả cuối cựng của chia khối và chi tiết hoỏ từng khối chớnh là thuật giải (algorithm).

Bảng 4.1. Cỏc thao tỏc cơ bản và quy ước tương ứng trong giả trỡnh và lưu đồ

Dạng thao tỏc Chỳ giải giả trỡnh Biểu tượng lưu đồ

Tớnh toỏn TBTONG/N TB = TONG / N   Nhập dữ liệu Đọc A, B Đọc A, B   Xuất dữ liệu In A, B In A, B   So sỏnh Nếu A > B Đ S A > B ? 

Bắt đầu thuật giải Tờn bài toỏn Bắt đầu  Kết thỳc thuật giải Kết thúc

Những hỡnh thức để biểu diễn trực quan thuật giải sao cho dễ dàng chuyển thành chương trỡnh là giả trỡnh và lưu đồ. Một người lập trỡnh cú thể chọn hỡnh thức này hoặc hỡnh thức kia. Theo cỏch giả trỡnh, mỗi cấu trỳc của thuật giải được quy ước bởi một chỳ giải ngắn gọn gần giống với ngụn ngữ viết của chỳng ta; cũn trong cỏch biểu diễn lưu đồ, mỗi cấu trỳc đú được mụ tả bằng một biểu tượng hỡnh học.

28

Dần dần ta sẽ thấy rằng, núi chung những thao tỏc cơ bản trong một thuật giải thường là những tớnh toỏn, nhập, xuất dữ liệu và so sỏnh. Núi chung một chương trỡnh mỏy tớnh dự đơn giản hay phức tạp đến đõu cũng chỉ gồm cú những thao tỏc cơ bản đú. Một số thao tỏc (hay lệnh) cú thể nhúm lại với nhau tạo thành một khối hay một khối cấu trỳc. Những chỳ giải giả trỡnh và những biểu tượng lưu đồ chớnh là để thể hiện những thao tỏc cơ bản đú (xem bảng 4.1).

4.1.2. Cỏc cấu trỳc tổng quỏt trong thuật giải

Cỏc bước trong một thuật giải cú thể phõn chia thành ba dạng cấu trỳc tổng quỏt - đú là cấu trỳc tuần tự, lựa chọn và lặp. Cấu trỳc tuần tự là chuỗi cỏc bước thực hiện một cỏch kế tiếp nhau. Cấu trỳc lựa chọn (hay cũn gọi là cấu trỳc rẽ nhỏnh) cho phộp so sỏnh hai giỏ trị, sau đú tuỳ kết quả so sỏnh mà định ra một chuỗi cỏc bước khỏc nhau phải thực hiện. Cấu trỳc lặp được dựng khi quỏ trỡnh giải cần lặp lại một số thao tỏc cho đến khi thoả món một điều kiện. Trong thuật giải phức tạp hơn một chỳt cú thể thấy cỏc cấu trỳc tổng quỏt này lồng vào nhau, trong cấu trỳc lặp cú những đoạn gồm những thao tỏc tuần tự được thực hiện, cú những đoạn xuất hiện sự rẽ nhỏnh tuỳ theo một điều kiện so sỏnh nào đú.

4.1.3. Thớ dụứng dụng thuật toỏn cấu trỳc

Bõy giờ ta tỡm hiểu phương phỏp xõy dựng thuật giải theo kỹ thuật chia khối và chi tiết hoỏ từng khối, phõn tớch cấu trỳc thuật giải thụng qua một thớ dụ cụ thể về bài toỏn phõn tớch cỏc số liệu thực nghiệm.

1) Phỏt biểu bài toỏn: Xỏc định giỏ trị lớn nhất, nhỏ nhất và biờn độ cỏc giỏ trị của tập số liệu quan trắc.

2) Mụ tả dữ liệu vào và ra: Dữ liệu vào là một chuỗi cỏc số liệu quan trắc. Đầu ra là trị cực đại, cực tiểu và biờn độ cỏc giỏ trị.

3) Tớnh thử với tập số liệu quan trắc sau:

Chuỗi số liệu thử: 40.56 55.92 66.31 58.35 62.88 41.99 49.70 53.21

Thực hiện tỡm trị cực đại như sau: Trước hết so sỏnh số thứ nhất của chuỗi với số thứ hai để xỏc định số lớn hơn, coi là cực đại tạm thời. Bõy giờ xột số thứ ba và so sỏnh nú với cực đại tạm thời. Nếu cực đại tạm thời lớn hơn, ta xột tới số thứ tư; nhưng nếu số thứ ba lớn hơn cực đại tạm thời, ta thay thế số đú vào cực đại tạm thời. Tiếp tục quỏ trỡnh này với toàn bộ chuỗi số liệu sẽ dẫn tới kết quả là cực đại tạm thời chớnh là trị cực đại trong cả chuỗi. Một quỏ trỡnh tương tự sẽ cho phộp tỡm cực tiểu. Với tập số liệu đang xột, kết quả là:

Giỏ trị cực đại = 66.31 Giỏ trị cực tiểu = 40.56

Tớnh biờn độ bằng hiệu giữa cực đại và cực tiểu = 66.31  40.56 = 25.73

4) Xõy dựng thuật giải: Khỏi quỏt lại cỏc bước thực hiện ở bước (3) ta cú thể chia bài toỏn thành ba khối:

- Đọc số liệu và xỏc định cỏc trị cực đại và cực tiểu - Tớnh hiệu giữa cực đại và cực tiểu để nhận biờn độ - In cực đại, cực tiểu và biờn độ

Với thớ dụ này, ta chi tiết hoỏ cỏch giải bằng giả trỡnh. Rừ ràng khối thứ nhất đũi hỏi phải chi tiết hoỏ nhiều hơn nữa, vỡ nú vừa bao gồm cả việc

29

chọn trị cực đại, cực tiểu xuất phỏt, vừa bao gồm cả quỏ trỡnh lặp (lặp để đọc số liệu và lặp để cập nhật cực trị khi cần). Cực đại và cực tiểu xuất phỏt thường được gỏn bằng giỏ trị của quan trắc thứ nhất, do đú ta đọc một số liệu đầu để gỏn cho chỳng. Sau đú ta đọc số thứ hai và đi vào vũng lặp. "Chừng nào số khụng phải là zero", ta cập nhật trị cực đại và cực tiểu nếu cần thiết. Bõy giờ ta mụ tả những bước đó đủ chi tiết này bằng giả trỡnh như sau: Giả trỡnh: Đọc số Cực đại  Số Cực tiểu  Số Đọc số Chừng nào số khụng bằng zero thỡ Nếu số > Cực đại thỡ Cực đại  Số Nếu số < Cực tiểu thỡ Cực tiểu  Số Đọc số Biờn độ  Cực đại  Cực tiểu In 'GIA TRI CUC DAI = ', Cực đại In 'GIA TRI CUC TIEU = ', Cực tiểu In 'BIEN DO GIA TRI = ', Biờn độ

Đõy là một thuật giải đơn giản. Chỉ cú một khối thứ nhất cần chi tiết hoỏ. Thấy rằng khi thuật giải đó chi tiết hoỏ tới mức như vậy, thỡ việc

chuyển thành chương trỡnh Fortran sẽ khụng cũn là vấn đề khú khăn. Trong cỏc mục tiếp sau, ta sẽ nghiờn cứu cỏc lệnh Fortran chuyờn trợ giỳp cho việc thiết kế cỏc cấu trỳc điều khiển của bài toỏn này và nhiều bài toỏn tương tự.

4.2. Cu trỳc IF và cỏc lnh tương ng 4.2.1. Biểu thức lụgic

Biểu thức lụgic được tạo bởi cỏc toỏn tử quan hệ:

.EQ. bằng .NE. khụng bằng

.LT. nhỏ hơn .LE. nhỏ hơn hoặc bằng (adsbygoogle = window.adsbygoogle || []).push({});

.GT. lớn hơn .GE. lớn hơn hoặc bằng nối hai biến số ở hai bờn.

Tuỳ theo quan hệ giữa hai biến số đú mà biểu thức lụgic cú một trong hai giỏ trị lụgic:

đỳng (.TRUE.) hoặc sai (.FALSE.).

Thớ dụ, xột biểu thức A .EQ. B trong đú AB là cỏc biến số thực. Nếu giỏ trị của A bằng giỏ trị của B thỡ biểu thức lụgic sẽ cú giỏ trị là đỳng

.TRUE.. Nếu khụng thỡ biểu thức cú giỏ trị là sai .FALSE.. Tương tự, nếu

X bằng 4,5 thỡ biểu thức X .GT. 3.0 cú giỏ trị bằng đỳng .TRUE..

Ta cú thể nối hai biểu thức lụgic bằng một trong cỏc toỏn tử lụgic

.OR..AND. thành một biểu thức lụgic kết hợp.

Khi hai biểu thức lụgic nối với nhau bởi .OR. thỡ biểu thức lụgic kết hợp sẽ cú giỏ trị là đỳng nếu một hoặc cả hai biểu thức cú giỏ trị là đỳng. Ta cú thể gọi .OR. là toỏn tử cộng lụgic.

30

Khi hai biểu thức nối với nhau bởi .AND. thỡ biểu thức kết hợp cú giỏ trị đỳng chỉ khi cả hai biểu thức cú giỏ trị là đỳng. Ta cú thể gọi toỏn tử

.AND. là toỏn tử nhõn lụgic.

Toỏn tử .NOT. cú thể đứng trước biểu thức lụgic và đổi giỏ trị của nú thành giỏ trị ngược lại. Thớ dụ, nếu A. GT. B là đỳng (giỏ trị bằng .TRUE.) thỡ .NOT. A. GT. B là sai (.FALSE.).

Một biểu thức lụgic cú thể chứa nhiều toỏn tử lụgic, thớ dụ như trong biểu thức sau:

.NOT. (A .LT. 15.4) .OR. KT .EQ. ISUM

Quyền ưu tiờn từ cao nhất xuống thấp nhất là

.NOT., .AND. và .OR.

Trong biểu thức trờn, biểu thức A .LT. 15.4 sẽ được ước lượng trước tiờn, sau đú giỏ trị của nú (.TRUE. hoặc .FALSE.) được đổi ngược lại. Giỏ trị này sẽ được xột cựng với giỏ trị của KT .EQ. ISUM. Thớ dụ, nếu A là 5.0, KT là 5 và ISUM là 5, thỡ biểu thức bờn trỏi của toỏn tử .OR. cú giỏ trị sai .FALSE., biểu thức bờn phải cú giỏ trị đỳng .TRUE. và toàn bộ biểu thức sẽ cú giỏ trị là đỳng .TRUE..

Giỏ trị của biểu thức lụgic cú thể được gỏn cho biến lụgic bằng lệnh gỏn giống như lệnh gỏn dựng với cỏc biến số và biểu thức số, thớ dụ:

LOGICAL DONE, OK DONE = .FALSE.

OK = DONE .AND. I .GT. 24

Khi so sỏnh hai biểu thức lụgic hay hai biến lụgic cú tương đương nhau hay khụng, trong Fortran khụng dựng cỏc toỏn tử quan hệ như khi so sỏnh hai biểu thức số, mà dựng cỏc toỏn tử lụgic .EQV..NEQV..

Bảng 4.2. túm tắt quy tắc ước lượng của cỏc toỏn tử lụgic cho mọi trường hợp cú thể xảy ra.

Bảng 4.2. Cỏc toỏn tử lụgic

A B .NOT. A A.AND.B A.OR.B A.EQV.B A.NEQV.B

False False True False False True False

False True True False True False True

True False False False True False True

True True False True True True False

Khi cỏc toỏn tử số học, quan hệ và lụgic cựng cú mặt trong một biểu thức thỡ cỏc toỏn tử số học thực hiện trước tiờn; sau đú cỏc toỏn tử quan hệ dựng để phỏt sinh cỏc giỏ trị TRUE hoặc FALSE; và cỏc giỏ trị này được đỏnh giỏ bằng cỏc toỏn tử lụgic theo thứ tự ưu tiờn .NOT., .AND., và .OR.. Cỏc quan hệ .EQV. và .NEQV. được thực hiện sau cựng. (adsbygoogle = window.adsbygoogle || []).push({});

4.2.2. Lệnh IF lụgic

1) Cỏc lệnh IF lụgic cú thể cú một số dạng sử dụng. Dạng thứ nhất gọi là Logical IF viết như sau:

IF (Biu thc lụgic) Lnh thc hin

Theo lệnh này, nếu biểu thức lụgic ở trong cặp dấu ngoặc đơn cú giỏ trị True thỡ thực hiện lệnh nằm trờn cựng dũng với biểu thức lụgic, nếu biểu thức lụgic cú giỏ trị False thỡ khụng thực hiện lệnh cựng dũng mà chuyển ngay tới lệnh tiếp theo phớa dưới trong chương trỡnh. Chỳ ý rằng lệnh thực hiện ghi sau biểu thức lụgic cú thể là một trong những lệnh tớnh toỏn (gỏn), xuất, nhập dữ liệu..., nhưng khụng thể là một lệnh IF khỏc. Biểu thức lụgic bao giờ cũng phải đặt trong cặp dấu ngoặc đơn. Thớ dụ, những lệnh IF sau đõy là những lệnh đỳng:

31

IF (A. GT. 0.0) SUM = SUM + A IF (TIME .GT. 1.5) READ *, DIST

2) Dạng thứ hai gọi là Block IF: Nếu biểu thức lụgic cú giỏ trị True mỏy thực hiện cỏc lệnh từ lệnh 1 đến lệnh n, sau đú chuyển tới lệnh tiếp sau END IF. Nếu biểu thức lụgic cú giỏ trị False, điều khiển chuyển ngay xuống lệnh đứng sau END IF:

IF (Biểu thức lôgic) THEN

lệnh 1 . . . lệnh n

END IF

3) Dạng thứ ba gọi là dạng IF ELSE: Khi biểu thức lụgic cú giỏ trị True cỏc lệnh từ 1 đến n được thực hiện, nếu biểu thức lụgic cú giỏ trị False cỏc lệnh từ n1 đến m được thực hiện:

IF (Biểu thức lôgic) THEN

lệnh 1 ... lệnh n ELSE lệnh n+1 ... lệnh m END IF

4) Dạng thứ tư gọi là IF ELSE IF: Nếu biểu thức lụgic 1 cú giỏ trị True thỡ loạt cỏc lệnh từ 1 đến m được thực hiện; nếu biểu thức lụgic 1 cú trị False, biểu thức lụgic 2 cú trị True thỡ loạt lệnh từ m1 đến n thực

hiện; nếu cỏc biểu thức lụgic 1 và 2 là False và biểu thức lụgic 3 True thỡ cỏc lệnh từ n1 tới p thực hiện. Nếu khụng một biểu thức lụgic nào cú giỏ trị True thỡ chỉ cú cỏc lệnh từ p1 tới q được thực hiện. Trong thực tế ta cú thể cấu tạo số nhỏnh ELSE IF nhiều hơn hoặc ớt hơn, chứ khụng nhất thiết chỉ là hai nhỏnh như đó viết dưới đõy:

IF (Biểu thức lôgic 1) THEN

lệnh 1 ...

lệnh m

ELSE IF (Biểu thức lôgic 2)THEN

lệnh m+1 ...

lệnh n

ELSE IF (Bbiểu thức lôgic 3)THEN

lệnh n+1 ... lệnh p ELSE lệnh p+1 ... lệnh q END IF Thớ d 1: S dng cỏc lnh IF lụgic đểđiu khin r nhỏnh. Lập chương trỡnh giải hệ phương trỡnh bậc hai

0

2bxc

ax (cỏc hệ số a,b,c nhập từ bàn phớm, a0). Ta cú thể cụ thể húa thuật giải của bài toỏn này bằng lưu đồ như trờn hỡnh 4.1. Từ đú viết mó nguồn của chương trỡnh Fortran như dưới đõy.

32 Bắt đầu In ‘Nhap HS’ Đọc a, b, c Tính   < 0 Đ S     S   = 0 In -b / (2a)   a = 2a  Kết thúc In (-b + ) / a In (-b - ) / a    In ‘Vô nghiệm’  Đ

Hỡnh 4.1. Lưu đồ thuật giải bài toỏn của thớ dụ 1 PRINT * , ' HE SO A BANG' READ * , A PRINT * , ' HE SO B BANG' READ * , B PRINT * , ' HE SO C BANG' READ * , C DELT = B**2  4.*A*C IF (DELT .LT. 0.) THEN

PRINT * , ' PHUONG TRINH VO NGHIEM'

ELSE IF (DELT .EQ. 0.) THEN PRINT 5 , B / (2.0 *A) (adsbygoogle = window.adsbygoogle || []).push({});

5 FORMAT (1X, 'NGHIEM KEP BANG' , F10.2) ELSE

DELT = SQRT (DELT) A = 2. * A

PRINT 7 , (B + DELT) / A , (B  DELT) / A 7 FORMAT (1X, 'HAI NGHIEM: X1 = ', * F10.2, 5X, 'X2 = ', F10.2)

END IF END

4.2.3. Lệnh IF số học

Lệnh IF s hc cho phộp thực hiện rẽ nhỏnh chương trỡnh thành ba nhỏnh tựy thuộc vào giỏ trị của biểu thức số học, dạng tổng quỏt của lệnh này viết như sau:

IF (Biu thc s hc) n1 ,n2 ,n3

trong đú n1 ,n2 ,n3 nhón của cỏc lệnh thực hiện. Nếu biểu thức số học cú giỏ trị õm thỡ điều khiển được chuyển tới lệnh cú nhón là n1, bằng khụng  nhón n2, và dương  nhón n3.

Thớ dụ, theo lệnh

IF (I  10) 4, 8, 7

nếu I 10 điều khiển chuyển đến lệnh cú nhón là 4, nếu I 10 chuyển đến nhón 8 và nếu I 10 chuyển đến nhón 7.

33

Trong lệnh

IF (X  3.5) 3, 6, 6

khi X 3,5 điều khiển chuyển tới lệnh cú nhón là 6, khi X 3,5 điều khiển chuyển tới lệnh cú nhón là 3.

Thớ d 2: Dựng lnh IF s hc để thiết kế vũng lp. Viết chương trỡnh tớnh và in giỏ trị hàm ) 1 ( cos ) (xe 3 txf x ,

trong đú x biến thiờn từ 1 đến 3 với bước 0,1 và t 0,1. Lưu đồ giải bài toỏn này tham khảo trờn hỡnh 4.2.

Bắt đầu Tính F  S     X > 3 T = 0.1 X = 1.0 X = X + 0.1 Kết thúc  In X, F Đ 

Hỡnh 4.2. Lưu đồ thuật giải bài toỏn của thớ dụ 2

T = 0.1 X = 1.0 12 F = EXP ( X ** 3) * COS (T * X + 1) WRITE (6 , 9) X , F 9 FORMAT (F5.2, E12.2) X = X + 0.1 IF (X  3.0) 12 , 12 , 4 4 STOP END 4.2.4. Lệnh chuyển điều khiển vụ điều kiện GO TO Lệnh này cú dạng GO TO n

trong đú n nhón của lệnh mà điều kiển cần chuyển tới.

Lệnh cần chuyển tới nhất thiết phải cú nhón. Ngoài ra trong chương trỡnh khụng thể cú những lệnh cú cựng nhón như nhau. Lệnh GO TO cú thể chuyển điều khiển tới bất kỳ lệnh thực hiện nào đứng trước hoặc đứng sau lệnh GO TO. Thớ dụ:

GO TO 5 7 I = I + 1

. . . X (I)=Y (I)

5 X = X + 1.0 GO TO 7

Thớ d 3: Viết chương trỡnh nhập n phần tử của mảng một chiều X, sắp xếp lại cỏc phần tử mảng đú theo thứ tự tăng dần và in ra màn hỡnh.

34

REAL X (20), TG INTEGER N, I, J, K N = 10

PRINT * , 'NHAP CAC PHAN TU MANG' I = 0 7 I = I + 1 PRINT *, 'PHAN TU ', I READ *, X (I) IF (I .LT. N) GOTO 7 C Sắp xếp mảng X theo thứ tự tăng dần I = 1 2 K = I J = I + 1 1 IF (X (J) .LT. X (K)) K = J J = J + 1 IF (J .LE. N) GOTO 1 TG = X(I) X(I) = X(K) X(K) = TG I = I + 1 IF (I. LT. N) GOTO 2 C Lần lượt in cỏc giỏ trị của mảng X đó sắp xếp I = 1 3 PRINT 8 , X(I) 8 FORMAT (F12.2) I = I + 1 IF (I .LE. N) GOTO 3 END

(adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu Ngôn ngữ lập trình Fortran và ứng dụng trong khí tượng thủy văn (Trang 28)