实验九 数组(二)
数组是FORTRAN90最常用的结构数据类型之一,数组是求解许多复杂问题的有效工具。 FORTRAN90不但提供静态数组,而且还新增加了动态数组,为求解复杂问题和提高程序运行效率提供了方便。
FORTRAN90提供了丰富的有关数组运算的标准函数,为问题求解带来了极大方便。 本次实验是学习和掌握多维数组、动态数组的一次系统实验活动。通过本次实验,能够设计和编写比较复杂的数组应用程序。
一.实验目的
1. 进一步掌握数组声明、数组元素引用、数组输入输出、数组赋初值、数组构造器、隐含DO循环的使用规则。
2. 掌握有关数组运算的常用标准函数。
3. 掌握动态数组概念和动态数组的声明、存储分配的使用规则。 4. 掌握设计和编写多维数组和动态数组应用程序。
二.实验内容1
1.问题描述 求m×n矩阵matrix中绝对值最大和最小元素所在的行、列位置。并将绝对值最小元素与第1行第1列数组元素交换,将绝对值最大元素第m行第n列数组元素交换。编写程序实现之。
25.5 35.2 38.5 15.3 matrix= 15.2 12.0 29.5 18.5 20.3 14.5 30.5 17.8
2.算法设计 m×n矩阵符合数组定义,用二维实型数组matrix保存,用数组构造器赋初值。
算法基本思想:使用“计数型”二重循环结构求绝对值最小元素min和最大元素max所在的位置。然后将绝对值最小元素与第1行第1列数组元素matrix(1,1)交换,将绝对值最大元素第m行第n列数组元素matrix(m,n)交换。输出绝对值最小元素和最大元素所在的行号和列号,以及交换前后矩阵数据。
根据分析,设计算法如下: 算法:
(1) 给数组matrix赋初值;
(2) 给min赋初值:min=matrix(1,1), 位置赋初值:i_min=1,j_min=1; (3) 给max赋初值:max=matrix(m,n),位置赋初值:i_max=m,j_max=n;
(4) 使用“计数型”二重循环结构求绝对值最小元素min,所在位置i_min和j_min,最大元素max,所在位置i_max和j_max;
(5) 输出绝对值最小元素min,所在位置i_min和j_min; (6) 输出绝对值最大元素max,所在位置i_max和j_max; (7) 输出交换前数组数据;
-63-
(8) 绝对值最小元素与数组第1行第1列元素matrix(1,1)交换; (9) 绝对值最大元素与数组第m行第n列元素matrix(m,b)交换; (10)输出交换后数组数据。 (11)结束 3.程序编写
设计和编写程序如下(不完整,请在下划线空白处填充正确内容):
!班级:??? !姓名:??? !日期:???
!查询绝对值最小值和最大值 PROGRAM main PARAMETER(m=3,n=4)
REAL :: matrix(m,n),min,max,temp
INTEGER :: i_min=1,j_min=1,i_max=m,j_max=
matrix=RESHAPE((/25.5,15.2,20.3,35.2,12.0,14.5,38.5,29.5,&
& 30.5,15.3,18.5,17.8/),(/3,4/)) min=ABS(matrix(1,1)); max=
DO i=1,m DO j=1,N
IF (ABS(matrix(i,j))< ) THEN min=ABS(matrix(i,j)) i_min= ; j_min=j ENDIF
IF ( >max) THEN max= i_max=i; j_max=j ENDDO
PRINT 100, '最小元素', min, i_min, j_min PRINT 100, '最大元素', max, i_max, j_max PRINT *,'交换前矩阵:' DO i=1,m
PRINT 200,(matrix(i,j),j= ) ENDDO
IF (min/=matrix( )) THEN
=matrix(1,1); matrix(1,1)=min; matrix(i_min,j_min)=temp ENDIF
IF (max/=matrix( )) THEN
temp=matrix(m,n); matrix(m,n)=max; matrix(i_max,j_max)=
-64-
ENDIF
PRINT *,'交换前矩阵:' DO i=1,m
PRINT 200,(matrix(i,j),j=1,n) ENDDO
100 FORMAT(1X, '绝对值',A ,':' ,F4.1 , 2X , '行号:', I2 , 2X , '列号:' ,I2) 200 FORMAT(1X,
4.实验要求
? 分析问题,理解算法和程序,将程序填写完整。
? 掌握二维数组声明、数组构造器、RESHAPE函数、隐含DO循环基本概念和使用规则。 ? 在D盘上创建新工作区:shiyan09和新项目:xm91。
? 在项目xm91内创建源程序文件:xm91.f90,同时在文件中编辑输入给定程序。 ? 在项目xm91内编译、构建、运行、调试程序。
? 将输出结果以注释形式编辑输入到源程序文件xm91.f90末尾。
? 改写程序,提高通用性(行数、列数和数组数据从键盘输入,绝对值最大元素与第1行第1列元素交换,绝对值最小元素与第m行第n列元素交换)。运行程序,输入一组数组数据,获得运行结果。
5.实验步骤
? 分析问题,理解算法和程序,完成程序填空,得到正确完整程序。 ? 启动软件开发环境Microsoft Developer Studio。 ? 创建新工作区:shiyan09。
? 在工作区shiyan09内创建新项目:xm91。
? 在项目xm91内创建源程序文件xm91.f90,编辑输入源程序文本。 ? 编译、构建、运行、调试程序。运行程序,得到输出结果。 ? 输出结果以注释形式编辑输入到源程序文件末尾。
? 在工作区shiyan09内创建新项目:xm911,在新项目内创建源程序文件xm911.f90,编辑输入已改写程序。编译、构建、运行、调试程序。输入自定数组数据,获得输出结果。
三.实验内容2
1.问题描述
生成“魔幻方阵。魔幻方阵是指方阵的每一行、每一列、对角线元素之和均相等,其值
22
为n(n+1)/2,n代表方阵的行数和列数。一个n阶奇数方阵由1到n个自然数构成,其组成规律是:
(1)将1放在第1行的中间一列;
(2)由m=1开始依次从左下到右上方向放连续数,如m放在A(i,j),则m+1放在A(i-1,j+1);
(3)如果i-1<1,则i-1为n; (4)如果j+1>n,则j+1为1;
(5)如果A(i-1,j+1)已放数,则将数放在A(i+1,j)中。 以下是五阶魔幻方阵:
-65-
17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
开始 初始化:1?i,3=j 初始化:1?A(1,3), 2?m m≤n 真 22.算法设计
问题中魔幻方阵数据符合数组定义,用一个n行n列二维整型数组A存储魔幻方阵数据。根据魔幻方阵组成规律,设计算法,绘制框图,如图9-1所示。
3.程序编写
设计和编写程序如下(不完整,请在下划线空白处填充正确内容):
!班级:??? !姓名:??? !时间:??? !生成魔幻方阵 PROGRAM main PARAMETER (n=5)
INTEGER :: A=0,i=1,j=3,m A(i,j)= m=2
DO WHILE (m<= ) i=i-1; j=j+1 IF (i<1) i= IF (j>n) j=
IF ( ) THEN A(i,j)=m m= ELSE
i= ;j=j-2 IF (i>n) i= IF (j<1) =j+n ENDDO
DO i=
PRINT '(
-66-
假 i-1?i,j+i?j 真 i<1 假 n?i 真 j>n 假 1?j 真 A(i,j)==0 假 m?A(i,j),m=m+1 真 i+3?i,j-2?j i>n 假 i-n?i 真 假 j<1 j+n?j 输出:魔幻方阵A 结束 图9-1 程序框图
4. 实验要求
? 分析问题,理解算法和程序,完成程序填空,得到正确完整程序。 ? 在工作区shiyan09内创建新项目:xm92。
? 在项目xm92内创建源程序文件:xm92.f90,同时在文件中编辑输入给定程序。 ? 在项目xm92内编译、构建、运行、调试程序。
? 将输入数据和输出结果以注释形式编辑输入到源程序文件xm92.f90末尾。
? 改写程序,提高程序通用性,将方阵阶数n从键盘输入,生成3、5、7阶魔幻方阵。 5.实验步骤
? 分析问题,理解算法和程序,在程序下划线空白处填写正确内容。 ? 在工作区shiyan09内创建新项目:xm92。
? 在项目xm92内创建源程序文件xm92.f90,编辑输入源程序文本。 ? 编译、构建、运行、调试程序。得到5阶魔幻方阵数据。 ? 将输出结果以注释形式编辑输入到源程序文件末尾。
? 在工作区shiyan09内创建新项目:xm921,在新项目内创建源程序文件xm921.f90,编辑输入已改写程序。编译、构建、运行、调试程序。运行程序,分别输入3、5、7,获得输出结果。
四.实验内容3
1.问题描述 已知m×n矩阵,求每行元素之和,将和最大的行与第一行对调,输出对调前后矩阵。使用动态数组,编写程序实现之。 2.算法设计 m×n的矩阵符合数组定义,用二维整型数组A保存,m、n和数组A数据从键盘输入。m行数组元素之和,有m个数,用一维整型数组B保存。数组A和B使用动态数组。
问题求解算法比较简单。
分析问题,自行设计算法和绘制框图。 3.程序编写
设计和编写程序如下(含有若干错误,请查找并改正错误):
!班级:??? !姓名:??? !日期:??? !数组元素对调 PROGRAM main
INTEGER,ALLOCATABLE :: A(:),B(:) INTEGER sum,max,m,n,p
PRINT*,'请输入m×n矩阵阶数m,n:' READ *,m,n ALLOCATE(A,B)
PRINT*,'按逻辑结构输入m×n矩阵数据(数据件之间用空格间隔):' DO I=
READ *,(A(I,J),J=1,n)
-67-