Giáo trình ngôn ngữ lập trình Fortran 90 phần 2: Khái niệm về mảng và cách khai báo mảng hiệu quả

Giáo trình nghiên cứu ngôn ngữ lập trình fortran 90 phần 2, trình bày lý thuyết rõ ràng, minh họa ví dụ thực tế, phù hợp sinh viên .

Trường đại học

Trường Đại Học

Chuyên ngành

Khoa Học Máy Tính

Người đăng

Ẩn danh

Thể loại

giáo trình

2023

122
4
0

Phí lưu trữ

35 Point

Tóm tắt

I. Tổng quan về Giáo trình Fortran 90 Mảng và Khai báo

Giáo trình Fortran 90 cung cấp một cái nhìn tổng quan về cách sử dụng mảng và khai báo trong lập trình. Mảng là một cấu trúc dữ liệu quan trọng, cho phép lưu trữ nhiều giá trị cùng một lúc. Trong Fortran 90, mảng có thể là một chiều hoặc nhiều chiều, giúp lập trình viên dễ dàng quản lý và thao tác với dữ liệu. Việc khai báo mảng đúng cách là rất cần thiết để đảm bảo chương trình hoạt động hiệu quả.

1.1. Khái niệm về mảng trong Fortran 90

Mảng trong Fortran 90 được định nghĩa là một tập hợp các phần tử có cùng kiểu dữ liệu, được sắp xếp theo một trật tự nhất định. Mỗi phần tử trong mảng được xác định bởi chỉ số và giá trị của nó. Mảng có thể là một chiều, tương tự như vector, hoặc nhiều chiều, giống như ma trận.

1.2. Tại sao cần khai báo mảng trong Fortran 90

Khai báo mảng là bước quan trọng trong lập trình Fortran 90. Việc khai báo giúp xác định tên, kích thước và cách sắp xếp các phần tử trong mảng. Điều này không chỉ giúp quản lý bộ nhớ hiệu quả mà còn đảm bảo rằng các phần tử trong mảng có thể được truy cập và thao tác một cách chính xác.

II. Vấn đề và thách thức khi sử dụng mảng trong Fortran 90

Mặc dù mảng là một công cụ mạnh mẽ trong Fortran 90, nhưng việc sử dụng chúng cũng gặp phải một số thách thức. Một trong những vấn đề chính là việc xác định kích thước mảng trước khi sử dụng. Nếu kích thước không được xác định chính xác, có thể dẫn đến lỗi trong quá trình thực thi chương trình.

2.1. Các lỗi thường gặp khi khai báo mảng

Một số lỗi phổ biến khi khai báo mảng bao gồm việc không xác định kích thước mảng, hoặc xác định kích thước không phù hợp với dữ liệu thực tế. Điều này có thể dẫn đến việc truy cập vào các phần tử không hợp lệ, gây ra lỗi chương trình.

2.2. Cách khắc phục các vấn đề liên quan đến mảng

Để khắc phục các vấn đề liên quan đến mảng, lập trình viên cần kiểm tra kỹ lưỡng các khai báo mảng và đảm bảo rằng kích thước được xác định chính xác. Sử dụng các công cụ gỡ lỗi cũng có thể giúp phát hiện và sửa chữa các lỗi liên quan đến mảng.

III. Phương pháp khai báo mảng trong Fortran 90

Khai báo mảng trong Fortran 90 có thể được thực hiện theo nhiều cách khác nhau. Việc lựa chọn phương pháp khai báo phù hợp sẽ giúp tối ưu hóa hiệu suất của chương trình. Các phương pháp khai báo bao gồm khai báo tĩnh và khai báo động.

3.1. Khai báo mảng tĩnh

Khai báo mảng tĩnh là phương pháp phổ biến nhất, trong đó kích thước mảng được xác định ngay từ đầu. Điều này giúp tiết kiệm bộ nhớ và tăng tốc độ truy cập dữ liệu. Ví dụ, khai báo mảng một chiều có thể được thực hiện như sau: INTEGER A(10).

3.2. Khai báo mảng động

Khai báo mảng động cho phép lập trình viên thay đổi kích thước mảng trong quá trình thực thi chương trình. Điều này rất hữu ích khi kích thước dữ liệu không được biết trước. Để khai báo mảng động, sử dụng từ khóa ALLOCATABLE trong Fortran 90.

IV. Ứng dụng thực tiễn của mảng trong Fortran 90

Mảng trong Fortran 90 có nhiều ứng dụng thực tiễn trong các lĩnh vực khác nhau, từ khoa học máy tính đến kỹ thuật. Chúng được sử dụng để lưu trữ và xử lý dữ liệu lớn, thực hiện các phép toán ma trận, và nhiều ứng dụng khác.

4.1. Sử dụng mảng trong tính toán khoa học

Trong các lĩnh vực khoa học, mảng thường được sử dụng để lưu trữ dữ liệu thí nghiệm và thực hiện các phép toán phức tạp. Ví dụ, mảng có thể được sử dụng để lưu trữ các giá trị đo được từ các cảm biến và thực hiện phân tích dữ liệu.

4.2. Mảng trong lập trình đồ họa

Mảng cũng được sử dụng trong lập trình đồ họa để lưu trữ thông tin về các điểm ảnh, màu sắc và hình dạng. Điều này cho phép lập trình viên tạo ra các ứng dụng đồ họa phong phú và tương tác.

V. Kết luận và tương lai của mảng trong Fortran 90

Mảng là một phần không thể thiếu trong lập trình Fortran 90. Chúng cung cấp một cách hiệu quả để quản lý và thao tác với dữ liệu. Trong tương lai, với sự phát triển của công nghệ, việc sử dụng mảng trong lập trình sẽ ngày càng trở nên quan trọng hơn.

5.1. Xu hướng phát triển mảng trong lập trình

Xu hướng hiện nay là phát triển các cấu trúc dữ liệu phức tạp hơn, cho phép lập trình viên dễ dàng quản lý dữ liệu lớn. Mảng sẽ tiếp tục đóng vai trò quan trọng trong việc phát triển các ứng dụng hiệu quả và mạnh mẽ.

5.2. Tương lai của Fortran 90 trong lập trình

Fortran 90 vẫn sẽ giữ vị trí quan trọng trong cộng đồng lập trình viên, đặc biệt trong các lĩnh vực khoa học và kỹ thuật. Việc cải tiến và phát triển các tính năng mới sẽ giúp Fortran 90 tiếp tục phát triển và đáp ứng nhu cầu của người dùng.

16/08/2025

Trích đoạn nội dung tài liệu

1 Kh¸i niÖm vÒ m¶ng trong FORTRAN Cã thÓ ®Þnh nghÜa m¶ng lµ mét tËp hîp c¸c phÇn tö cã cïng kiÓu d÷ liÖu, ®−îc s¾p xÕp theo mét trËt tù nhÊt ®Þnh, trong ®ã mçi phÇn tö ®−îc x¸c ®Þnh bëi chØ sè vµ gi¸ trÞ cña chóng. ChØ sè cña mçi phÇn tö m¶ng ®−îc xem lµ “®Þa chØ” cña tõng phÇn tö trong m¶ng mµ nã ®−îc dïng ®Ó truy cËp/tham chiÕu ®Õn phÇn tö cña m¶ng. Mçi phÇn tö cña m¶ng ®−îc x¸c ®Þnh bëi duy nhÊt mét “®Þa chØ” trong m¶ng. M¶ng cã thÓ lµ m¶ng mét chiÒu hoÆc nhiÒu chiÒu.

M¶ng mét chiÒu cã thÓ hiÓu lµ mét vect¬ mµ mçi phÇn tö m¶ng lµ mét thµnh phÇn cña vect¬. §Þa chØ c¸c phÇn tö m¶ng mét chiÒu ®−îc x¸c ®Þnh bëi mét chØ sè lµ sè thø tù cña chóng trong m¶ng. M¶ng hai chiÒu ®−îc hiÓu nh− mét ma trËn mµ ®Þa chØ c¸c phÇn tö cña nã ®−îc x¸c ®Þnh bëi hai chØ sè: chØ sè thø nhÊt lµ sè thø tù hµng, chØ sè thø hai lµ sè thø tù cét. T−¬ng tù, m¶ng ba chiÒu ®−îc xem nh− lµ tËp hîp c¸c m¶ng hai chiÒu, trong ®ã c¸c phÇn tö m¶ng ®−îc x¸c ®Þnh bëi ba chØ sè: chØ sè thø nhÊt, chØ sè thø hai (t−¬ng øng lµ hµng vµ cét cña mét ma trËn) vµ chØ sè thø ba (líp − sè thø tù cña ma trËn),.

KiÓu d÷ liÖu cña c¸c phÇn tö m¶ng cã thÓ lµ kiÓu sè hoÆc kh«ng ph¶i sè. Mçi m¶ng ®−îc x¸c ®Þnh bëi tªn m¶ng, sè chiÒu, kÝch th−íc cùc ®¹i vµ c¸ch s¾p xÕp c¸c phÇn tö cña m¶ng. Tªn m¶ng cßn gäi lµ tªn biÕn m¶ng, hay ng¾n gän h¬n lµ biÕn m¶ng. BiÕn m¶ng lµ biÕn cã Ýt nhÊt mét chiÒu.

M¶ng cã thÓ lµ m¶ng tÜnh hoÆc m¶ng ®éng. NÕu lµ m¶ng tÜnh th× vïng bé nhí dµnh l−u tr÷ m¶ng lµ cè ®Þnh vµ nã kh«ng bÞ gi¶i phãng chõng nµo ch−¬ng tr×nh cßn hiÖu lùc. KÝch th−íc cña m¶ng tÜnh kh«ng thÓ bÞ thay ®æi trong qu¸ tr×nh ch¹y ch−¬ng tr×nh. NÕu m¶ng lµ m¶ng ®éng, vïng bé nhí l−u tr÷ nã cã thÓ ®−îc g¸n, thay ®æi vµ gi¶i phãng khi ch−¬ng tr×nh ®ang thùc hiÖn.

C¸c con trá (POINTER) lµ nh÷ng biÕn ®éng. NÕu con trá còng lµ m¶ng th× kÝch th−íc cña mçi chiÒu còng cã thÓ bÞ thay ®æi trong lóc ch−¬ng tr×nh ch¹y, gièng nh− c¸c m¶ng ®éng. C¸c con trá cã thÓ trá ®Õn c¸c biÕn m¶ng hoÆc biÕn v« h−íng.2 Khai b¸o m¶ng §Ó sö dông m¶ng nhÊt thiÕt cÇn ph¶i khai b¸o nã. Khi khai b¸o m¶ng cÇn ph¶i chØ ra tªn vµ sè chiÒu cña nã, nh−ng cã thÓ ch−a cÇn chØ ra kÝch th−íc vµ c¸ch s¾p xÕp c¸c phÇn tö m¶ng.

Cã rÊt nhiÒu c¸ch khai b¸o biÕn m¶ng. Sau ®©y sÏ liÖt kª mét sè tr−êng hîp vÝ dô. M¶ng B lµ m¶ng ®éng 2 chiÒu, trong ®ã kÝch th−íc vµ c¸ch s¾p xÕp c¸c phÇn tö ch−a ®−îc x¸c ®Þnh. M¶ng C lµ m¶ng thùc ba chiÒu cã kiÓu con trá.

Ta còng thÊy r»ng, cã thÓ chØ sö dông c¸c tõ khãa khai b¸o kiÓu, khai b¸o thuéc tÝnh ®Ó ®Þnh nghÜa m¶ng, nh−ng còng cã thÓ kÕt hîp c¶ c¸c tõ khãa khai b¸o kiÓu vµ khai b¸o thuéc tÝnh. Khi cã sù kÕt hîp gi÷a khai b¸o kiÓu vµ khai b¸o thuéc tÝnh, gi÷a chóng cÇn ph¶i ph©n t¸ch nhau bëi dÊu phÈy vµ sau tõ khãa thuéc tÝnh ph¶i cã hai dÊu hai chÊm liÒn nhau ph©n t¸ch chóng víi tªn biÕn. Sè chiÒu, kÝch th−íc vµ c¸ch s¾p xÕp phÇn tö m¶ng cã thÓ ®−îc ®Þnh nghÜa cïng víi tõ khãa thuéc tÝnh hoÆc tªn biÕn. C¸ch ®¸nh sè ®Þa chØ c¸c phÇn tö m¶ng còng lµ mét trong nh÷ng ®Æc ®iÓm hÕt søc quan träng, v× nã quyÕt ®Þnh c¸ch truy cËp ®Õn c¸c phÇn tö m¶ng.

ChØ sè x¸c ®Þnh ®Þa chØ c¸c phÇn tö m¶ng phô thuéc vµo giíi h¹n d−íi vµ giíi h¹n trªn dïng ®Ó m« t¶ c¸ch s¾p xÕp c¸c phÇn tö theo c¸c chiÒu cña m¶ng. VÝ dô, hai m¶ng INTEGER M(10, 10, 10) INTEGER K(-3:6, 4:13, 0:9) ®Òu cã cïng kÝch th−íc (10 x 10 x 10), nh−ng m¶ng M cã chØ sè c¸c phÇn tö m¶ng theo c¶ ba chiÒu biÕn thiªn tõ 1 ®Õn 10 (giíi h¹n d−íi b»ng 1, giíi h¹n trªn b»ng 10), cßn m¶ng K cã chØ sè c¸c phÇn tö m¶ng biÕn thiªn theo chiÒu thø nhÊt (hµng) lµ −3 ®Õn 6, theo chiÒu thø hai (cét) lµ 4 ®Õn 13 vµ theo chiÒu thø ba (líp) lµ 0 ®Õn 9. Nh− vËy, giíi h¹n d−íi cña chØ sè c¸c phÇn tö cña m¶ng K t−¬ng øng lµ −3, 4 vµ 0, cßn giíi h¹n trªn lµ 6, 13 vµ 9. C¸c m¶ng ®−îc m« t¶ râ rµng nh− vËy ®−îc gäi lµ c¸c m¶ng cã m« t¶ t−êng minh.

§èi víi c¸c m¶ng m« t¶ kh«ng t−êng minh, c¸ch s¾p xÕp vµ ®¸nh sè ®Þa chØ c¸c phÇn tö m¶ng th−êng ®−îc x¸c ®Þnh trong lóc ch−¬ng tr×nh ch¹y hoÆc sÏ ®−îc truyÒn qua tham sè cña c¸c ch−¬ng tr×nh con. 104 END SUBROUTINE SUB1(A) REAL A(:, :, :). END SUBROUTINE SUB1 SUBROUTINE SUB2(B) REAL B(3:, 0:, -2:). END SUBROUTINE SUB2 ë ®©y, m¶ng A trong ch−¬ng tr×nh con SUB1 sÏ lµ: A (4, 7, 9) cßn m¶ng B trong ch−¬ng tr×nh con SUB2 sÏ lµ: B (3:6, 0:6, -2:6) Nãi chung cã thÓ cã nhiÒu c¸ch khai b¸o m¶ng kh¸c nhau tïy thuéc vµo yªu cÇu vµ bèi c¶nh cô thÓ.

Sau ®©y lµ mét sè d¹ng có ph¸p tæng qu¸t cña c©u lÖnh khai b¸o m¶ng th−êng ®−îc sö dông trong lËp tr×nh. D¹ng 1: KiÓu_DL Tªn_biÕn_m¶ng (M«_t¶) D¹ng 2: Thuéc_tÝnh Tªn_biÕn_m¶ng (M«_t¶) D¹ng 3: KiÓu_DL, Thuéc_tÝnh (M«_t¶) :: Tªn_biÕn_m¶ng D¹ng 4: KiÓu_DL, Thuéc_tÝnh :: Tªn_biÕn_m¶ng(M«_t¶) Trong ®ã KiÓu_DL lµ kiÓu d÷ liÖu cña c¸c phÇn tö m¶ng, Thuéc_tÝnh cã thÓ lµ mét trong c¸c thuéc tÝnh DIMENSION, ALLOCATABLE, POINTER,…, Tªn_biÕn_m¶ng lµ tªn cña c¸c biÕn m¶ng (nÕu cã nhiÒu h¬n mét biÕn th× chóng ®−îc liÖt kª c¸ch nhau bëi c¸c dÊu phÈy), M«_t¶ lµ m« t¶ sè chiÒu, kÝch th−íc m¶ng vµ c¸ch s¾p xÕp c¸c phÇn tö m¶ng. NÕu lµ m« t¶ Èn th× c¸ch s¾p xÕp c¸c phÇn tö m¶ng ch−a cÇn chØ ra trong khai b¸o biÕn m¶ng. VÝ dô: D¹ng 1: REAL*4 X (0:100) REAL Y(12,34) D¹ng 2: DIMENSION N (10,20) ALLOCATABLE Y(:,:) D¹ng 3: REAL, ALLOCATABLE(:,:) :: X INTEGER, DIMENSION(12,34) :: Y D¹ng 4: 105 REAL, ALLOCATABLE :: X (:,:) REAL, DIMENSION Y(12,34) 5.3 L−u tr÷ m¶ng trong bé nhí vµ truy cËp ®Õn c¸c phÇn tö m¶ng Nguyªn t¾c l−u tr÷ m¶ng trong bé nhí cña Fortran lµ l−u tr÷ d−íi d¹ng vect¬, cho dï ®ã lµ m¶ng mét chiÒu hay nhiÒu chiÒu.

§èi víi m¶ng mét chiÒu, c¸c phÇn tö m¶ng ®−îc s¾p xÕp theo thø tù tõ phÇn tö cã ®Þa chØ m¶ng (chØ sè) nhá nhÊt ®Õn phÇn tö cã ®Þa chØ lín nhÊt. C¸c phÇn tö cña m¶ng hai chiÒu còng ®−îc xÕp thµnh mét vect¬, trong ®ã c¸c “®o¹n” liªn tiÕp cña vect¬ nµy lµ c¸c cét víi chØ sè cét t¨ng dÇn. C¸c m¶ng ba chiÒu ®−îc xem lµ tËp hîp c¸c m¶ng hai chiÒu víi sè thø tù cña c¸c m¶ng hai chiÒu nµy (sè thø tù líp) chÝnh lµ chØ sè thø ba cña m¶ng. C¸c m¶ng nhiÒu chiÒu h¬n còng ®−îc l−u tr÷ theo nguyªn t¾c nµy.

Nãi chÝnh x¸c h¬n, tïy thuéc vµo sè chiÒu cña m¶ng mµ khi s¾p xÕp c¸c phÇn tö m¶ng, chØ sè cña chiÒu thø nhÊt biÕn ®æi tr−íc, tiÕp ®Õn lµ chiÒu thø hai, chiÒu thø ba,. C¸c phÇn tö m¶ng ®−îc truy cËp ®Õn qua ®Þa chØ cña chóng trong m¶ng. §Ó râ h¬n ta xÐt mét sè vÝ dô sau. M¶ng mét chiÒu.

Gi¶ sö ta khai b¸o REAL X(5), Y(0:5) Khi ®ã c¸c m¶ng X vµ Y ®−îc s¾p xÕp trong bé nhí nh− sau: X(1) X(2) X(3) X(4) X(5) Y(0) Y(1) Y(2) Y(3) Y(4) Y(5) Ch−¬ng tr×nh sau ®©y minh häa c¸ch truy cËp ®Õn c¸c phÇn tö cña c¸c m¶ng nµy. DO I=1,5 X(I) = I*I ! G¸n gi¸ trÞ cho c¸c phÇn tö cña X Y(I) = X(I) + I ! NhËn gi¸ trÞ c¸c phÇn tö cña X, tÝnh to¸n ! vµ g¸n cho c¸c phÇn tö cña Y END DO PRINT ‘(6F7.1))’, (X(I), I=1,5) ! In c¸c phÇn tö cña X PRINT ‘(6F7.1))’, (Y(I), I=0,5) ! In c¸c phÇn tö cña Y END Khi ch¹y ch−¬ng tr×nh nµy ta sÏ nhËn ®−îc kÕt qu¶ trªn mµn h×nh lµ: 1. M¶ng hai chiÒu. Gi¶ sö ta khai b¸o INTEGER, PARAMETER :: N=3, M=4 INTEGER A(N, 0:M) Khi ®ã cã thÓ hiÓu m¶ng A nh− lµ mét ma trËn gåm 3 hµng, 5 cét: 106 ⎛ A( 1,0 ) A( 1,1 ) A( 1,2 ) A( 1,3 ) A( 1,4 ) ⎞ ⎜ ⎟ A = ⎜ A( 2,0 ) A( 2 ,1 ) A( 2 ,2 ) A( 2,3 ) A( 2,4 ) ⎟ ⎜ A( 3,0 ) A( 3,1 ) A( 3,2 ) A( 3,3 ) A( 3,4 ) ⎟ ⎝ ⎠ A ®−îc l−u tr÷ trong bé nhí d−íi d¹ng: VÝ dô 5.

M¶ng ba chiÒu. Gi¶ sö m¶ng A ®−îc khai b¸o bëi INTEGER, PARAMETER :: NH=3, MC=4, LLayer=3 INTEGER A(0:NH, MC, LLayer) Khi ®ã A lµ m¶ng ba chiÒu gåm 4 hµng, 4 cét vµ 3 líp, cã cÊu tróc nh− sau: Vµ ®−îc l−u tr÷ trong bé nhí d−íi d¹ng: Sau ®©y lµ mét sè vÝ dô truy cËp m¶ng. NÕu m¶ng A ®−îc khai b¸o bëi REAL A(5,10), B(5,10) Khi ®ã: A = 3.0 ! G¸n tÊt c¶ c¸c phÇn tö cña A b»ng 3 A(1,1) = 4. ! G¸n phÇn tö hµng 1, cét 1 b»ng 4.

! G¸n phÇn tö hµng 1, cét 2 b»ng 7.5 ! G¸n c¸c phÇn tö cét 1, 4, 7 hµng 2 b»ng 2. C¸c chØ sè 1:8:3 cña chiÒu thø hai t−¬ng ®−¬ng víi vßng lÆp DO J=1, 8, 3 107 B = SQRT(A) ! G¸n tÊt c¶ c¸c phÇn tö cña B b»ng ! c¨n bËc hai c¸c phÇn tö t−¬ng øng cña A NÕu khai b¸o REAL A(10) Khi ®ã: A(1:5:2)=3.0 ! T−¬ng tù c©u lÖnh trªn A(2::3)=3.0 ! T−¬ng tù nh− A = 3.0; Mét vÝ dô kh¸c, nÕu cã khai b¸o REAL A(10), B(5, 5) INTEGER I(4), J(3) ta cã thÓ g¸n gi¸ trÞ cho c¸c phÇn tö cña c¸c m¶ng I vµ J b»ng c¸ch: I = (/ 5, 3, 8, 2 /) J = (/ 3, 1, 5 /) Cßn c©u lÖnh A(I) = 3.0 cã nghÜa lµ g¸n c¸c phÇn tö A(5), A(3), A(8) vµ A(2) b»ng 3. Qua c¸c vÝ dô trªn ta cã thÓ thÊy c¸ch truy cËp ®Õn c¸c phÇn tö m¶ng cña Fortran rÊt mÒm dÎo vµ linh ho¹t. §ã còng lµ mét trong nh÷ng “thÕ m¹nh” cña ng«n ng÷ lËp tr×nh nµy.1 Sö dông lÖnh DATA ®Ó khëi t¹o m¶ng Trong mét sè tr−êng hîp, d÷ liÖu ban ®Çu cã thÓ ®−îc g¸n trùc tiÕp cho c¸c phÇn tö m¶ng ngay trong ch−¬ng tr×nh mµ kh«ng nhÊt thiÕt nhËn tõ file.

Mét trong nh÷ng c¸ch g¸n ®ã lµ sö dông c©u lÖnh g¸n th«ng th−êng. Tuy nhiªn c¸ch lµm nµy kh«ng hiÖu qu¶, v× ph¶i lÆp l¹i nhiÒu lÇn lÖnh g¸n, lµm “gi·n dµi” ch−¬ng tr×nh mét c¸ch kh«ng cÇn thiÕt. Thay cho viÖc sö dông nh÷ng c©u lÖnh g¸n ®ã, ta còng cã thÓ sö dông c©u lÖnh DATA ®Ó g¸n gi¸ trÞ cho c¸c phÇn tö m¶ng.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ