实验九1.doc
《实验九1.doc》由会员分享,可在线阅读,更多相关《实验九1.doc(7页珍藏版)》请在冰豆网上搜索。
实验九数组
(二)
数组是FORTRAN90最常用的结构数据类型之一,数组是求解许多复杂问题的有效工具。
FORTRAN90不但提供静态数组,而且还新增加了动态数组,为求解复杂问题和提高程序运行效率提供了方便。
FORTRAN90提供了丰富的有关数组运算的标准函数,为问题求解带来了极大方便。
本次实验是学习和掌握多维数组、动态数组的一次系统实验活动。
通过本次实验,能够设计和编写比较复杂的数组应用程序。
一.实验目的
1.进一步掌握数组声明、数组元素引用、数组输入输出、数组赋初值、数组构造器、隐含DO循环的使用规则。
2.掌握有关数组运算的常用标准函数。
3.掌握动态数组概念和动态数组的声明、存储分配的使用规则。
4.掌握设计和编写多维数组和动态数组应用程序。
二.实验内容1
1.问题描述
求m×n矩阵matrix中绝对值最大和最小元素所在的行、列位置。
并将绝对值最小元素与第1行第1列数组元素交换,将绝对值最大元素第m行第n列数组元素交换。
编写程序实现之。
25.535.238.515.3
matrix=15.212.029.518.5
20.314.530.517.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)输出交换前数组数据;
(8)绝对值最小元素与数组第1行第1列元素matrix(1,1)交换;
(9)绝对值最大元素与数组第m行第n列元素matrix(m,b)交换;
(10)输出交换后数组数据。
(11)结束
3.程序编写
设计和编写程序如下(不完整,请在下划线空白处填充正确内容):
!
班级:
?
?
?
!
姓名:
?
?
?
!
日期:
?
?
?
!
查询绝对值最小值和最大值
PROGRAMmain
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=
DOi=1,m
DOj=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
PRINT100,'最小元素',min,i_min,j_min
PRINT100,'最大元素',max,i_max,j_max
PRINT*,'交换前矩阵:
'
DOi=1,m
PRINT200,(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)=
ENDIF
PRINT*,'交换前矩阵:
'
DOi=1,m
PRINT200,(matrix(i,j),j=1,n)
ENDDO
100FORMAT(1X,'绝对值',A,':
',F4.1,2X,'行号:
',I2,2X,'列号:
',I2)
200FORMAT(1X,(F4.1,2X))
END
4.实验要求
l分析问题,理解算法和程序,将程序填写完整。
l掌握二维数组声明、数组构造器、RESHAPE函数、隐含DO循环基本概念和使用规则。
l在D盘上创建新工作区:
shiyan09和新项目:
xm91。
l在项目xm91内创建源程序文件:
xm91.f90,同时在文件中编辑输入给定程序。
l在项目xm91内编译、构建、运行、调试程序。
l将输出结果以注释形式编辑输入到源程序文件xm91.f90末尾。
l改写程序,提高通用性(行数、列数和数组数据从键盘输入,绝对值最大元素与第1行第1列元素交换,绝对值最小元素与第m行第n列元素交换)。
运行程序,输入一组数组数据,获得运行结果。
5.实验步骤
l分析问题,理解算法和程序,完成程序填空,得到正确完整程序。
l启动软件开发环境MicrosoftDeveloperStudio。
l创建新工作区:
shiyan09。
l在工作区shiyan09内创建新项目:
xm91。
l在项目xm91内创建源程序文件xm91.f90,编辑输入源程序文本。
l编译、构建、运行、调试程序。
运行程序,得到输出结果。
l输出结果以注释形式编辑输入到源程序文件末尾。
l在工作区shiyan09内创建新项目:
xm911,在新项目内创建源程序文件xm911.f90,编辑输入已改写程序。
编译、构建、运行、调试程序。
输入自定数组数据,获得输出结果。
三.实验内容2
1.问题描述
生成“魔幻方阵。
魔幻方阵是指方阵的每一行、每一列、对角线元素之和均相等,其值为n(n2+1)/2,n代表方阵的行数和列数。
一个n阶奇数方阵由1到n2个自然数构成,其组成规律是:
(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)中。
以下是五阶魔幻方阵:
真
假
输出:
魔幻方阵A
结束
开始
初始化:
1Þi,3=j
m≤n2
i-1Þi,j+iÞj
初始化:
1ÞA(1,3),2Þm
真
假
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
图9-1程序框图
17241815
23571416
46132022
101219213
11182529
2.算法设计
问题中魔幻方阵数据符合数组定义,用一个n行n列二维整型数组A存储魔幻方阵数据。
根据魔幻方阵组成规律,设计算法,绘制框图,如图9-1所示。
3.程序编写
设计和编写程序如下(不完整,请在下划线空白处填充正确内容):
!
班级:
?
?
?
!
姓名:
?
?
?
!
时间:
?
?
?
!
生成魔幻方阵
PROGRAMmain
PARAMETER(n=5)
INTEGER:
:
A=0,i=1,j=3,m
A(i,j)=
m=2
DOWHILE(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
DOi=
PRINT'((I3,1X))',(A(i,j),j=1,n)
ENDDO
END
4.实验要求
l分析问题,理解算法和程序,完成程序填空,得到正确完整程序。
l在工作区shiyan09内创建新项目:
xm92。
l在项目xm92内创建源程序文件:
xm92.f90,同时在文件中编辑输入给定程序。
l在项目xm92内编译、构建、运行、调试程序。
l将输入数据和输出结果以注释形式编辑输入到源程序文件xm92.f90末尾。
l改写程序,提高程序通用性,将方阵阶数n从键盘输入,生成3、5、7阶魔幻方阵。
5.实验步骤
l分析问题,理解算法和程序,在程序下划线空白处填写正确内容。
l在工作区shiyan09内创建新项目:
xm92。
l在项目xm92内创建源程序文件xm92.f90,编辑输入源程序文本。
l编译、构建、运行、调试程序。
得到5阶魔幻方阵数据。
l将输出结果以注释形式编辑输入到源程序文件末尾。
l在工作区shiyan09内创建新项目:
xm921,在新项目内创建源程序文件xm921.f90,编辑输入已改写程序。
编译、构建、运行、调试程序。
运行程序,分别输入3、5、7,获得输出结果。
四.实验内容3
1.问题描述
已知m×n矩阵,求每行元素之和,将和最大的行与第一行对调,输出对调前后矩阵。
使用动态数组,编写程序实现之。
2.算法设计
m×n的矩阵符合数组定义,用二维整型数组A保存,m、n和数组A数据从键盘输入。
m行数组元素之和,有m个数,用一维整型数组B保存。
数组A和B使用动态数组。
问题求解算法比较简单。
分析问题,自行设计算法和绘制框图。
3.程序编写
设计和编写程序如下(含有若干错误,请查找并改正错误):
!
班级:
?
?
?
!
姓名:
?
?
?
!
日期:
?
?
?
!
数组元素对调
PROGRAMmain
INTEGER,ALLOCATABLE:
:
A(:
),B(:
)
INTEGERsum,max,m,n,p
PRINT*,'请输入m×n矩阵阶数m,n:
'
READ*,m,n
ALLOCATE(A,B)
PRINT*,'按逻辑结构输入m×n矩阵数据(数据件之间用空格间隔):
'
DOI=
READ*,(A(I,J),J=1,