Kỹ thuật trợ giỳp tỡm lỗi chương trỡnh

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 59)

Thật vụ nghĩa nếu một chương trỡnh xử lý dữ liệu mà lại đọc sai dữ liệu trong file. Mà điều này khụng phải là khụng bao giờ xảy ra. Trường hợp số dũng dữ liệu thực tế trong file cú ớt hơn số vũng lặp đọc dữ liệu thỡ chương trỡnh sẽ bỏo lỗi chạy chương trỡnh. Khi đú chỳng ta buộc phải xem

lại chương trỡnh hoặc xem lại file dữ liệu và dễ dàng phỏt hiện lỗi ở đõu. Tuy nhiờn cú những trường hợp lỗi chạy chương trỡnh khụng phỏt sinh, nhưng kết quả chương trỡnh cho ra sai. Nếu kết quả sai vụ lý, rừ ràng thỡ chỳng ta cũng biết và tỡm nguyờn nhõn ở chương trỡnh hay ở file dữ liệu. Đỏng sợ nhất là những trường hợp đọc “nhầm dữ liệu”, đọc hơi thiếu dữ liệu. Khi đú chương trỡnh làm việc bỡnh thường, kết quả tỏ ra chấp nhận được, nhưng thực chất là sai hoặc khụng chớnh xỏc. Do đú, trong lập trỡnh phải rất thận trọng với file dữ liệu.

Khi tỡm lỗi một chương trỡnh làm việc với cỏc file dữ liệu, điều rất quan trọng là kiểm tra xem cỏc lệnh nhập, xuất dữ liệu cú làm việc đỳng đắn, chớnh xỏc khụng.

Trong thực tế cỏc file dữ liệu cú thể do bản thõn người lập trỡnh xõy dựng, cũng cú thể người lập trỡnh nhận được trong quỏ trỡnh trao đổi dữ liệu với đồng nghiệp của mỡnh. Trong những trường hợp đú, trước khi viết những lệnh đọc file dữ liệu phải nghiờn cứu kĩ cấu trỳc của file, đọc kĩ tài liệu mụ tả file, phải tin chắc tuyệt đối những thụng tin trong file là những thụng tin gỡ, cỏch thức ghi ở trong đú ra sao thỡ mới đọc file đỳng và chớnh xỏc. Đặc biệt lần đầu tiờn làm việc với một loại file phải kiểm tra kĩ lưỡng kết quả đọc file.

Hóy nờn nhớ rằng trong số những yếu tố của Fortran thỡ vấn đề làm việc với file cú thể xem là vấn đề khú nhất và lý thỳ nhất.

Với cỏc file dữ liệu nhập, ta nờn thử chương trỡnh với một file dữ liệu nhỏ, sao cho ta cú thể in lờn màn hỡnh từng dũng dữ liệu khi chương trỡnh đọc vào. Hóy kiểm tra xem chương trỡnh cú bỏ qua dũng dữ liệu, hoặc một giỏ trị nào khụng. Nếu file dữ liệu cú ghi số dũng dữ liệu, thỡ hóy in số đú ra sau khi đọc.

Với cỏc file dữ liệu xuất, sau khi tạo lập ra nú, hóy mở ra xem lại nội dung file. Nờn xem cấu trỳc file cú như ta dự định khụng, những giỏ trị cú đỳng là nằm ở những chỗ nú cần nằm khụng. Ngoài ra cần phải kiểm tra

59

file đầu ra trong nhiều phương ỏn chạy chương trỡnh. Rất cú thể trong một trường hợp ta thấy mọi chuyện đều ổn, nhưng đến trường hợp khỏc thỡ tỡnh hỡnh khụng phải như vậy. Chỉ cú kiểm tra kĩ thỡ mới trỏnh được những lỗi tiềm ẩn khú nhận biết trong chương trỡnh.

Bài tập

1. File dữ liệu LAB1 chứa nhữnng thụng tin về thời gian và nhiệt độ trờn mỗi dũng như sau:

0.0 26.5 (dũng 1) 0.5 28.7 (dũng 2) 1.0 29.1 (dũng 3) 1.5 29.2 (dũng 4) 2.0 29.4 (dũng 5) 2.5 29.7 (dũng 6)

Hóy cho biết giỏ trị của cỏc biến sau khi mỗi nhúm lệnh dưới đõy thực hiện. Giả sử rằng trước khi thực hiện mỗi nhúm lệnh đú, thỡ file dữ liệu đó được mở và chưa từng cú một lệnh READ nào được thực hiện:

1) READ (1, *) TIM, TEM

2) READ (1, *) TIM1, TEM1, TIM2, TEM2 3) READ (1, *) TIM

4) READ (1, *) TIM1, TEM1 READ (1, *) TEM

READ (1, *) TIM2, TEM2 5) READ (1, *) TIM1

6) READ (1, *) TIM1, TIM2 READ (1, *) TEM1

READ (1, *) TEM1, TEM2

READ (1, *) TIM2 READ (1, *) TEM2

2. File dữ liệu cú tờn CONDAO.TEM cú nội dung ghi như sau: Dũng thứ nhất - tiờu đề bỏo rằng đõy là số liệu về biến thiờn nhiệt độ khụng khớ tại trạm Cụn Đảo. Dũng thứ hai - đơn vị đo (C). Dũng thứ ba tuần tự ghi cỏc tham số: số năm quan trắc, thỏng, năm bắt đầu và thỏng, năm kết thỳc quan trắc. Dũng thứ tư gồm 12 cột ghi cỏc thỏng trong năm. Cỏc dũng tiếp sau tuần tự ghi những giỏ trị nhiệt độ ứng với từng thỏng thành 12 cột, trong đú những thỏng khuyết số liệu được ghi bằng số 9.9 (bảng phớa dưới).

OSCILLATION OF TEMPERATURE OF THE AIR AT STATION CONDAO degree C 12 1 1979 12 1990 1 2 3 4 5 6 7 8 9 10 11 12 25.2 25.7 27.3 28.7 29.0 27.7 27.2 27.5 27.2 -9.9 26.8 25.3 25.0 25.6 27.2 28.5 28.6 27.6 27.8 27.0 27.4 26.7 26.8 25.8 24.6 25.0 26.9 28.6 28.1 28.0 28.0 27.9 26.9 27.0 26.3 25.0 24.5 25.2 -9.9 -9.9 28.3 27.8 27.2 27.2 27.4 26.7 27.4 26.1 25.3 25.7 26.6 28.2 29.1 28.2 28.0 27.5 26.9 27.2 25.9 25.5 24.7 25.1 25.9 27.9 27.8 27.2 27.2 27.8 26.3 26.5 26.9 25.8 25.4 26.4 27.0 27.3 27.7 28.3 27.5 28.0 26.8 26.5 26.9 25.7 24.5 24.8 25.6 28.1 28.8 28.2 27.8 27.6 26.8 26.8 26.4 25.5 25.2 25.2 27.0 28.9 28.5 28.0 28.6 27.7 27.3 26.9 27.2 25.9 25.8 26.6 27.1 28.3 28.1 28.0 27.3 27.6 27.2 27.0 26.1 24.8 25.3 24.7 25.9 27.2 27.6 27.9 27.7 27.3 27.4 26.6 26.7 25.4 25.6 26.0 27.2 29.0 28.5 28.3 28.2 27.8 27.6 27.4 26.6 25.8

Hóy lập đoạn chương trỡnh đọc file này và in lại lờn màn hỡnh toàn bộ dữ liệu gốc cựng biến trỡnh năm trung bỡnh của nhiệt độ khụng khớ ở dũng cuối cựng.

60

3. Lập đoạn chương trỡnh đọc file dữ liệu với nội dung như trong bài tập 2 và ghi lại thành file cựng tờn, ỏp dụng kỹ thuật dựng dũng ký hiệu đỏnh dấu kết thỳc dữ liệu trong mục 6.3.2.

4. Trong file tờn là DATA1, mỗi dũng ghi thời gian tớnh bằng giõy và nhiệt độ tớnh bằng độ C. Dũng cuối cựng là dũng bỏo hết dữ liệu chứa giỏ trị 999.9 cho cả thời gian và nhiệt độ. Hóy đọc file dữ liệu này và sắp xếp giỏ trị nhiệt độ theo thứ tự giảm dần. In chuỗi nhiệt độ đó sắp xếp thành dạng 10 giỏ trị một dũng. Giả sử trong file cú khụng quỏ 200 dũng dữ liệu.

5. Trong file tờn là DATA2, mỗi dũng ghi thời gian tớnh bằng giõy và nhiệt độ tớnh bằng độ C. Khụng cú dũng tiờu đề và khụng cú dũng bỏo hết dữ liệu. Hóy đọc file dữ liệu này và in ra số giỏ trị nhiệt độ, giỏ trị nhiệt độ trung bỡnh và số giỏ trị nhiệt độ lớn hơn trung bỡnh. Giả sử trong file cú khụng quỏ 200 dũng dữ liệu.

6. Viết chương trỡnh sửa lại file CONDAO.TEM trong bài tập 2 sao cho ở mỗi dũng số liệu cú chỉ năm quan trắc tương ứng ở đầu dũng, giỏ trị nhiệt độ trung bỡnh năm ở cuối dũng và giỏ trị nhiệt độ trung bỡnh nhiều năm của từng thỏng ở dũng dưới cựng.

7. Viết chương trỡnh tỡm nghiệm gần đỳng với sai số cho phộp 0,0001 của phương trỡnh 3,7 0 3 1      e x e x x

trong khoảng [0, 2] theo phương phỏp lặp và in thụng bỏo kết quả lờn màn hỡnh với 4 chữ số thập phõn.

8. Viết chương trỡnh nhập một số tự nhiờn n nhỏ hơn 21, một số thực (adsbygoogle = window.adsbygoogle || []).push({});

x bất kỳ nhỏ hơn 1. Xỏc định tổng: nx x x nx x x x x x x x x x x x x x x cos ... 2 cos cos sin ... 2 sin sin ... 3 cos 2 cos cos 3 sin 2 sin sin 2 cos cos 2 sin sin cos sin                

Chương 7 - S dng biến cú ch s trong Fortran

Trong chương 2, mục 2.3 đó xột cỏch khai bỏo kiểu biến cú chỉ số và khỏi niệm mảng trong Fortran, nờu một số đặc điểm về lưu giữ đối với cỏc biến cú chỉ số hay gọi là biến mảng.

Chương này sẽ cung cấp thờm phương phỏp lưu giữ và xử lý những nhúm giỏ trị mà khụng cần cung cấp tờn một cỏch tường minh cho từng giỏ trị đú. Trong thực tế, ta thường xử lý một nhúm cỏc giỏ trị ớt nhiều liờn hệ hoặc hoàn toàn khụng liờn hệ với nhau. Trong trường hợp này, nếu sử dụng biến mảng, cả nhúm dữ liệu sẽ cú một tờn chung, nhưng những giỏ trị riờng biệt cú chỉ số riờng duy nhất. Kỹ thuật này cho phộp ta phõn tớch dữ liệu sử dụng cỏc vũng lặp một cỏch thuận tiện. Trong cỏc mục dưới đõy sẽ bổ sung thờm những cấu trỳc, những lệnh của Fortran cho phộp thao tỏc thuận lợi với cỏc biến mảng, kỹ thuật đọc dữ liệu từ file để gỏn vào cỏc biến mảng v.v...

Mảng là yếu tố quan trọng và mạnh mẽ nhất của Fortran. Nếu so sỏnh với một số ngụn ngữ lập trỡnh khỏc, thớ dụ như Pascal, ta thấy trong Fortran cho phộp khai bỏo những mảng dữ liệu rất lớn và thao tỏc rất mềm dẻo. Nhiều khi khả năng khai bỏo mảng dữ liệu lớn làm cho thuật giải của chương trỡnh xử lý trở nờn đơn giản. Ngoài ra, sử dụng mảng đỳng đắn và thành thạo sẽ giỳp chỳng ta viết những chương trỡnh hoặc những đoạn chương trỡnh rất ngắn gọn.

61 7.1. Mng mt chiu

Trong lập trỡnh, mảng một chiều thường dựng để biểu diễn một dũng hoặc một cột dữ liệu.

Về phương diện ngụn ngữ, một mảng là một nhúm địa chỉ lưu giữ

trong bộ nhớ mỏy tớnh cú cựng tờn. Từng thành phần của mảng được gọi là phần tử mảng và được phõn biệt với phần tử khỏc bởi tờn chung kốm theo chỉ số trong cặp dấu ngoặc. Những chỉ số được biểu diễn bằng những số nguyờn liờn tiếp nhau, thường là bắt đầu (chỉ số đầu) bằng số nguyờn 1. Những trường hợp dựng chỉ số đầu khỏc 1 thường liờn quan tới tớnh thuận tiện thao tỏc cỏc cụng thức toỏn học hoặc phương diện thực tiễn. Thớ dụ muốn biểu diễn cỏc hệ số a của phương trỡnh hồi quy nhiều biến liờn hệ giữa đại lượng y và cỏc đại lượng x1 ,x2 ,..., xm

m mx a x a x a a y  0  1 1  2 2 ... ta cú thể dựng mảng một chiều với tờn A để chỉ tất cả cỏc hệ số, kể cả hệ số tự do, của phương trỡnh hồi quy này và khai bỏo như sau:

REAL A (0 : 20)

Trong trường hợp này phần tử thứ nhất A(0) của mảng A biểu diễn hệ số a0. Như vậy rất thuận tiện trong khi sử dụng cỏc cụng thức của đại số.

Nếu ta cú tập hợp số liệu về lượng mưa năm trong thế kỷ này tại một trạm khớ tượng nào đú, ta cú thể dựng mảng

REAL RAIN (1900 : 2000)

Trong trường hợp này, nếu muốn truy cập lượng mưa năm 1985, ta chỉ định phần tử mảng RAIN (1985).

Để đọc dữ liệu vào một mảng một chiều từ bàn phớm hoặc từ file dữ liệu, ta sử dụng lệnh READ. Nếu muốn đọc toàn bộ mảng, ta dựng tờn mảng khụng cú cỏc chỉ số. Ta cũng cú thể chỉ định những phần tử cụ thể

trong lệnh READ, thớ dụ READ *, B

READ *, B(1), B(2), B(3)

Cần chỳ ý rằng, trong thớ dụ này, nếu mảng B theo khai bỏo chứa 3 phần tử thỡ hai lệnh READ trờn tương đương nhau. Nhưng nếu mảng B chứa 8 phần tử thỡ cú sự khỏc nhau quan trọng giữa hai lệnh READ trờn đõy, là vỡ: lệnh thứ nhất đọc vào toàn bộ 8 phần tử của mảng B, trong khi lệnh thứ hai chỉ đọc cỏc giỏ trị của ba phần tử đầu tiờn.

Cỏc giỏ trị của biến mảng cũn cú thể đọc với vũng lp DOn. Thớ dụ, nếu muốn đọc 5 phần tử đầu tiờn của mảng B ta sử dụng lệnh READ như sau

READ *, (B (I) , I = 1 , 5)

Trong lệnh này, chỳng ta thấy khụng cú mặt từ khúa DO, chỉ cú chỉ số I của biến mảng B biến thiờn từ 1 tới 5 với gia số bằng 1. Như vậy với một lệnh READ mỏy đọc được liờn tục 5 phần tử của mảng B.

Thớ d 17: Một tập hợp 50 số liệu lượng mưa năm được lưu trong file dữ liệu, mỗi số liệu một dũng. Giả sử đơn vị file là 9. Viết nhúm lệnh đọc những số liệu này vào mảng LMUA.

Cỏch 1: Dựng lệnh READ đọc từng số, nhưng vũng lặp thực hiện 50 lần và đọc toàn bộ mảng:

REAL LMUA (50) DO 10 I = 1 , 50

READ (9, *) LMUA (I) 10 CONTINUE

Cỏch 2: Dựng lệnh READ khụng chứa chỉ số, nú sẽ đọc toàn bộ mảng, tức đọc liền 50 phần tử:

62

REAL LMUA (50) READ (9, *) LMUA

Cỏch 3: Lệnh READ chứa vũng lặp ẩn: REAL LMUA (50) (adsbygoogle = window.adsbygoogle || []).push({});

READ (9, *) (LMUA (I), I = 1, 50)

7.2. Lnh DATA

Lệnh DATA là lệnh đặc tả, thuộc loại lệnh khụng thực hiện. Nú dựng để khởi tạo giỏ trị ban đầu cho cỏc biến đơn và cỏc mảng. Dạng tổng quỏt của lệnh DATA như sau

DATA Danh sỏch tờn biến / Danh sỏch hng /

Theo lệnh này cỏc giỏ trị dữ liệu trong danh sỏch hằng nằm trong hai dấu gạch chộo được gỏn cho cỏc biến trong danh sỏch tờn biến theo tuần tự. Kiểu của cỏc giỏ trị dữ liệu cũng nờn phự hợp kiểu của cỏc biến, sao cho mỏy tớnh khụng phải chuyển đổi. Cỏc lệnh DATA phải đặt trước cỏc lệnh thực hiện, tức ở gần đầu chương trỡnh, ngay sau những lệnh mụ tả kiểu như lệnh REAL, INTEGER, LOGICAL, DIMENSION...

Thớ dụ, lệnh

DATA A , B, C , I / 0.0 , 32.75 , 2.5 , 10 /

sẽ khởi tạo giỏ trị 0,0 cho biến A, 32,75 cho biến B, 2,5 cho biến C và 10 cho biến I.

Chỳ ý rằng lệnh DATA chỉ khởi tạo giỏ trị ở đầu chương trỡnh. Lệnh DATA khụng thể sử dụng trong vũng lặp để tỏi tạo giỏ trị cỏc biến. Nếu cần tỏi tạo cỏc biến, ta phải sử dụng cỏc lệnh gỏn. Lệnh DATA cũng khụng thể nằm trong chương trỡnh con.

Nếu cỏc giỏ trị lặp lại trong danh sỏch hằng, ta cú thể dựng cỏch viết

lệnh DATA ngắn gọn. Thớ dụ, nếu muốn khởi tạo giỏ trị 1 cho cỏc biến I, J, K và giỏ trị 0,5 cho cỏc biến X, Y, Z, thỡ hai lệnh sau đõy tương đương nhau:

DATA I, J, K, X, Y, Z / 1, 1, 1, 0.5, 0.5, 0.5 / DATA I, J, K, X, Y, Z / 3*1, 3*0.5 /

Lệnh DATA cú thể sử dụng để khởi tạo một hoặc một số phần tử của mảng. Thớ dụ, cỏc lệnh sau khởi tạo tất cỏc cỏc phần tử của mảng J và TIME: INTEGER J (5) REAL TIME (4) DATA J, TIME / 5*0, 1.0, 2.0, 3.0, 4.0 / Nhúm lệnh REAL HOUR (5) DATA HOUR (1) / 10.0 /

chỉ khởi tạo một giỏ trị của phần tử đầu tiờn của mảng HOUR, cỏc phần tử từ thứ 2 đến 5 của nú chưa biết.

Cú thể sử dụng vũng DO ẩn trong lệnh DATA. Thớ dụ: INTEGER Y (100)

DATA (Y (I), I = 1, 50) / 50*0 /

khởi tạo giỏ trị 0 cho 50 phần tử đầu của mảng Y, 50 phần tử cũn lại chưa được khởi tạo.

7.3. Mng hai chiu

Cỏc lệnh mụ tả mảng hai chiều giống như với mảng một chiều, khỏc biệt duy nhất là dựng hai tham số kớch thước mảng. Mỗi phần tử mảng được truy cập bởi tờn mảng với hai chỉ số nằm trong cặp dấu ngoặc.

63

Trong thực tế lập trỡnh người ta thường biểu diễn cỏc ma trận, cỏc bảng dữ liệu gồm một số cột, mỗi cột cú một số dũng giỏ trị thành mảng hai chiều.

Thớ dụ, ma trận cỏc hệ số đứng trước cỏc ẩn của hệ phương trỡnh đại số tuyến tớnh ai,j (i1..10,j1..10) thường biểu diễn bằng mảng hai chiều A với lệnh mụ tả như sau

REAL A(10, 10)

Cỏc giỏ trị quan trắc từng giờ về mực nước biển trong vũng một thỏng cú thể biểu diễn thành một bảng số liệu gồm 31 dũng, 24 cột. Cỏc dũng tuần tự ứng với cỏc ngày trong thỏng. Cỏc cột tuần tự ứng với 24 giờ trong một ngày. Trong Fortran, bảng số liệu này cú thể biểu diễn bằng mảng hai chiều

REAL SLEV (31, 24)

theo cỏch này, khi thao tỏc với mực nước tại một ngày, giờ cụ thể nào đú, người ta chỉ cần chỉ định phần tử SLEV (I, J), với chỉ số thứ nhất I chỉ ngày, chỉ số thứ hai J chỉ giờ trong ngày đú. Khi cần tớnh mực nước trung bỡnh ngày, thớ dụ của ngày thứ nhất trong thỏng, người ta chỉ cần cộng tất cả cỏc phần tử với chỉ số I = 1: ) 24 , 1 ( SLEV ... ) 2 , 1 ( SLV ) 1 , 1 ( SLEV   

Sử dụng cỏc mảng rất tiện lợi khi lập chương trỡnh phõn tớch, tớnh 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 59)