实验七 数组的应用.docx
《实验七 数组的应用.docx》由会员分享,可在线阅读,更多相关《实验七 数组的应用.docx(15页珍藏版)》请在冰豆网上搜索。
实验七数组的应用
实验七数组的应用
数组是FORTRAN95最重要的结构数据类型之一。
许多实际问题往往设计大量的数据,数组是存储和处理大批量数据的有效工具,有些问题如果不用数组求解将难以解决。
数组是类型相同且有序的一组数据,涉及到这类数据均可考虑使用数组。
FORTRAN95不但提供静态数组,而且还新增加了动态数组,为求解复杂问题和提高程序运行效率提供了方便。
FORTRAN95提供了丰富的有关数组运算的标准函数,为问题求解带来了极大方便。
本次实验是学习和掌握数组声明、数组元素引用、数组输入输出、数组赋初值、多维数组、动态数组的一次系统实验活动。
通过本次实验,能够设计和编写比较复杂的数组应用程序。
一、实验目的
1.理解数组概念。
2.掌握数组声明、数组元素引用、数组输入输出和数组赋初值的使用规则。
3.掌握数组构造器和隐含DO循环概念和使用。
4.掌握数组逻辑结构、存储结构及其相互关系。
5.掌握有关数组运算的常用标准函数。
6.掌握动态数组概念和动态数组的声明、存储分配的使用规则。
二、实验内容1
1、问题描述
已知10个正整数:
10、55、25、70、45、15、25、85、45、35,输入一个待删除整数,在10个整数中查找,若有该整数,则将其删除,输出删除前后这组整数。
编写程序实现之。
2、算法设计
已知的10个正整数符合数组定义,用一维整型数组num保存,用数组构造器赋初值。
待删除整数n从键盘输入。
算法基本思想:
输入待删除整数,从第1个数组元素num
(1)开始,依次用n去比较是否相等,若相等查找成功,将该数组元素删除(在该数组元素位置设置删除标志),直到第10个数组元素检查比较完毕。
输出删除前后数组元素。
因10个整数为正数,所以删除标志可用-1表示。
算法:
1)输入待删除整数n;
2)输出删除前10个整数;
3)用n依次在数组元素num
(1)、num
(2)、…、num(10)中查找,查找成功置删除标志;
4)输出删除后数据。
5)结束
算法第3步可用“计数型”循环结构和DO循环语句实现。
3、程序编写
根据算法,设计和编写不完整示例程序如下(请在下划线空白处填充正确内容):
程序7-1:
!
班级:
?
?
?
!
姓名:
?
?
?
!
时间:
?
?
?
!
数据查询
PROGRAMproblem71
INTEGER:
:
num(10)=(____________________),n
PRINT*,'请输入100以内的一个正整数:
'
READ*,n
PRINT*,'删除前数据:
'
WRITE(*,100)(num(I),__________)
DOI=1,10
IF(n==num(I))num(I)=-1
ENDDO
PRINT*
PRINT*,'删除后数据:
'
DOI=__________
IF(__________)WRITE(*,100)num(I)
ENDDO
PRINT*
100FORMAT((I3,2X\))
END
4、实验要求
●分析问题,理解算法和程序,将程序填写完整。
●掌握数组声明、数组构造器、隐含DO循环基本概念和使用规则。
●在D盘上创建新工作区:
shiyan07和新项目:
xm71。
●在项目xm71内创建源程序文件:
xm71.f90,同时在文件中编辑输入给定程序7-1。
●在项目xm71内编译、构建、运行、调试程序。
●将输入数据和输出结果以注释形式编辑输入到源程序文件xm71.f90末尾。
●改写程序,提高通用性(正整数个数不定,且从键盘输入,数组元素最大个数max通过PARAMETER语句定义)。
运行输入几组不同数据,获得不同运行结果。
5、实验步骤
●分析问题,理解算法和程序,完成程序填空,得到正确完整程序。
●启动软件开发环境MicrosoftDeveloperStudio。
●在D盘上创建新工作区:
shiyan07。
●在工作区shiyan07内创建新项目:
xm71。
●在项目xm71内创建源程序文件xm71.f90,编辑输入源程序文本7-1。
●编译、构建、运行、调试程序。
运行时输入数据45,得到输出结果。
●将输入数据和输出结果以注释形式编辑输入到源程序文件末尾。
●在工作区shiyan07内创建新项目:
xm711,在新项目内创建源程序文件xm711.f90,在文件中编辑输入已改写程序。
编译、构建、运行、调试程序。
输入自定的几组数据,获得输出结果。
三、实验内容2
1、问题描述
输入一个班学生(人数≤40)的学号和3门课(英语、数学、物理)成绩,计算每个学生平均成绩、每门课平均成绩和三门课平均成绩,统计高于每门课平均成绩和三门课平均成绩的学生人数和占总人数比例,输出统计结果。
编写程序实现之。
2、算法设计
问题中涉及一个班级的学生学号、3门课成绩和学生平均成绩,这些数据符合数组定义,用五个数组存储这些数据。
定义以下五个数组:
●numbers:
字符型数组,存储学生学号。
从键盘输入。
●englishs:
整型数组,存储英语成绩。
●maths:
整型数组,存储数学成绩。
从键盘输入。
●physics:
整型数组,存储物理成绩。
从键盘输入。
●averages:
实型数组,存储学生平均成绩。
计算获得。
计算获得英语平均成绩english_av、数学平均成绩math_av、物理平均成绩physic_av和三门课平均成绩average,均为实型。
从键盘输入学生人数n。
统计高于英语平均成绩人n1和比例p1,高于数学平均成绩人n2和比例p2,高于物理平均成绩人n3和比例p3,高于三门课平均成绩人nn和比例pp。
求解算法比较简单,设计算法如下:
1)输入学生人数n;
2)采用“计数型”循环结构输入学生学号和三门课成绩,同时计算学生平均成绩,统计英语、数学、物理课总成绩;
3)计算英语、数学、物理课平均成绩和三门课平均成绩;
4)采用“计数型”循环结构统计高于平均成绩人数及比例
5)输出统计结果
6)结束
3、程序编写
根据算法,设计和编写不完整示例程序如下(请在下划线空白处填充正确内容):
程序7-2:
!
班级:
?
?
?
!
姓名:
?
?
?
!
时间:
?
?
?
!
统计人数及比例
PROGRAMproblem72
PARAMETER(max=40)
CHARACTER*5:
:
numbers(max)
INTEGER,DIMENSION(__________):
:
englishs,maths,physics
REAL:
:
averages(max),english_av,math_av,physic_av,average,sum1=0,sum2=0,sum3=0
INTEGER
(1):
:
n,n1=0,n2=0,n3=0,nn=0
REAL:
:
p1,p2,p3,pp
PRINT*,'请输入学生人数:
'
READ*,n
PRINT*,'请输入',n,'名学生的学号、英语成绩、数学成绩和物理成绩。
'
PRINT*,'数据之间用空格间隔。
学号为长度为5的字符串,用引号括住。
'
DOI=1,n
READ*,numbers(I),englishs(I),maths(I),physics(I)
averages(I)=(____________________)/3.0
sum1=sum1+englishs(I)
sum2=sum2+maths(I)
sum3=__________
__________
english_av=sum1/n
math_av=__________
physic_av=sum3/n
average=(english_av+math_av+physic_av)/__________
DOI=1,n
IF(englishs(I)>english_av)n1=n1+1
IF(____________________)n2=n2+1
IF(physics(I)>physic_av)__________
IF(averages(I)>average)nn=__________
ENDDO
p1=REAL(n1)/n
p2=__________/n
p3=REAL(n3)/__________
pp=__________(nn)/n
WRITE(*,100)'英语',n1,p1*100
WRITE(*,100)__________
WRITE(*,100)'物理',n3,p3*100
WRITE(*,100)'三门课',nn,pp*__________
100FORMAT(1X,'高于',A,'平均成绩的学生人数有',I2,'人,占总人数比例',F4.1,'%')
END
4、实验要求
●分析问题,理解算法和程序,完成程序填空,得到正确完整程序。
●在工作区shiyan07内创建新项目:
xm72。
●在项目xm72内创建源程序文件:
xm72.f90,同时在文件中编辑输入给定程序7-2。
●在项目xm72内编译、构建、运行、调试程序。
●将输入数据和输出结果以注释形式编辑输入到源程序文件xm72.f90末尾。
●改写程序,提高程序通用性(将英语平均成绩、数学平均成绩、物理平均成绩和三门课平均成绩采用数组保存,将高于平均成绩人数采用数组保存,统计高于平均成绩人数可用循环结构实现)。
5、实验步骤
●分析问题,理解算法和程序,在程序下划线空白处填写正确内容。
●在工作区shiyan07内创建新项目:
xm72。
●在项目xm72内创建源程序文件xm72.f90,编辑输入源程序文本7-2。
●编译、构建、运行、调试程序。
●运行程序,输入学生人数:
5和5名学生的学号、三门课成绩数据:
‘02201’457085
‘02202’756560
‘02203’558550
‘02204’856070
‘02205’609045
●运行结束,得到输出结果。
●将输入数据和输出结果以注释形式编辑输入到源程序文件末尾。
●在工作区shiyan07内创建新项目:
xm721,在新项目内创建源程序文件xm721.f90,在文件中编辑输入已改写程序。
编译、构建、运行、调试程序。
输入自定数据,获得输出结果。
四、实验内容3
1、问题描述
输入4个整数放在数组中,数组元素向左循环移位1、2、3、4个位置,第1个元素移动到最后一个元素,结果放在数组中,输出移位前后的结果数据。
如输入:
2、5、8、3,输出结果为下面方阵所示。
编写程序实现之。
2583
5832
8325
3258
2583
2、算法设计
问题中涉及4个整数,符合数组定义,用一个整型数组X保存这些整数,便于处理。
通过“计数型”循环完成循环移位,先从第1个元素X
(1)开始移位,直到最后一个元素。
第1个元素移位时先移动到一个临时变量T中,等到最后一个元素移位后在将临时变量T中值赋予最后元素。
分析问题,自行设计算法和绘制框图。
3、程序编写
通过需求分析,设计和编写含有错误的示例程序如下(请查找并改正程序中错误)。
程序7-3:
!
班级:
?
?
?
!
姓名:
?
?
?
!
时间:
?
?
?
!
循环移位
PROGRAMproblem73
DATA(N=4)
INTEGER:
:
X(N)
PRINT*,'请输入',N,'个整数:
'
READ*,(X(J),J=1,N)
PRINT100,X(J),J=1,N
DOI=1,N
T=X(N)
DOJ=N,1
X(J-1)=X(J)
ENDDO
X(I)=T
PRINT100,X
ENDDO
100FORMAT(1X,(F4,1X))
END
4、实验要求
●分析问题,设计算法,绘制框图,查找并改正程序错误,得到正确程序。
●在工作区shiyan07内创建新项目:
xm73。
●在项目xm73内创建源程序文件:
xm73.f90,同时在文件中编辑输入给定程序8-3
●在项目xm73内编译、构建、运行、调试程序。
●将输入数据和输出结果以注释形式编辑输入到源程序文件xm73.f90末尾。
●改写程序,使数组元素向右循环移位1、2、3、4位。
5、实验步骤
●上机实验前,完成程序改错,得到正确程序。
●在工作区shiyan07内创建新项目:
xm73。
●在项目xm73内创建源程序文件xm73.f90,编辑输入源程序文本7-3。
●编译、构建、运行、调试程序。
●运行程序,输入数据:
10,15,20,2530
●运行结束,得到输出结果。
●将输入输出数据以注释形式编辑输入到源程序文件末尾。
●在工作区shiyan07内创建新项目:
xm731,在新项目内创建源程序文件xm731.f90,在文件中编辑输入已改写程序。
编译、构建、运行、调试程序。
输入自定一组数据,获得输出结果。
五、实验内容4
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)中。
以下是五阶魔幻方阵:
17241815
23571416
46132022
101219213
11182529
2、算法设计
问题中涉及魔幻方阵,魔幻方阵数据符合数组定义,用一个n行n列二维整型数组A存储魔幻方阵数据。
根据魔幻方阵组成规律,设计算法,绘制框图,如图7-1所示。
3、程序编写
根据算法,设计和编写不完整示例程序如下(请在下划线空白处填充正确内容):
程序7-4:
!
班级:
?
?
?
!
姓名:
?
?
?
!
时间:
?
?
?
!
生成魔幻方阵
PROGRAMproblem74
PARAMETER(n=5)
INTEGER:
:
A(5,5)=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、实验要求
●分析问题,理解算法和程序,完成程序填空,得到正确完整程序。
●在工作区shiyan07内创建新项目:
xm74。
●在项目xm74内创建源程序文件:
xm74.f90,同时在文件中编辑输入给定程序9-2。
●在项目xm74内编译、构建、运行、调试程序。
●将输入数据和输出结果以注释形式编辑输入到源程序文件xm74.f90末尾。
●改写程序,提高程序通用性(将魔幻方阵阶数n改为由键盘输入,生成3、5、7阶魔幻方阵)。
5、实验步骤
●分析问题,理解算法和程序,在程序下划线空白处填写正确内容。
●在工作区shiyan07内创建新项目:
xm74。
●在项目xm92内创建源程序文件xm74.f90,编辑输入源程序文本7-4。
●编译、构建、运行、调试程序。
得到5阶魔幻方阵数据。
●将输出结果以注释形式编辑输入到源程序文件末尾。
●在工作区shiyan07内创建新项目:
xm741,在新项目内创建源程序文件xm741.f90,在文件中编辑输入已改写程序。
编译、构建、运行、调试程序。
运行程序,分别输入3、5、7,获得输出结果。
六、实验内容5
1、问题描述
已知m×n矩阵,求每行元素之和,将和最大的行与第一行对调,输出对调前后矩阵。
使用动态数组,编写程序实现之。
2、算法设计
m×n的矩阵符合数组定义,用二维整型数组A保存,m、n和数组A数据从键盘输入。
m行数组元素之和,有m个数,用一维整型数组B保存。
数组A和B使用动态数组。
问题求解算法比较简单。
分析问题,自行设计算法和绘制框图。
3、程序编写
通过需求分析,设计和编写含有错误的示例程序如下(请查找并改正程序中错误)。
程序7-5:
!
班级:
?
?
?
!
姓名:
?
?
?
!
时间:
?
?
?
!
数组元素对调
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=1,m
READ*,(A(I,J),J=1,n)
ENDDO
DOI=1,m
sum=0
DOJ=1,n
sum=sum+A(I,J)
ENDDO
B(J)=sum
ENDDO
max=B(m);p=0
DOI=2,m
IF(B(I)/=max)THEN
max=B(J);p=J
ENDIF
ENDDO
PRINT*,'对调前矩阵:
'
DOI=1,m
PRINT200,(A,J=1,n)
ENDDO
DOJ=1,n
A(1,J)=A(p,J);A(p,J)=A(1,J);A(1,J)=T
ENDDO
PRINT*,'和最大的行:
',p
PRINT*,'对调后矩阵:
'
DOI=1,m
PRINT200,(A(I,J),J=1,n)
ENDDO
200FORMAT(1X,(I4,1X))
END
4、实验要求
●分析问题,设计算法,绘制框图,查找并改正程序错误,得到正确程序。
●在工作区shiyan07内创建新项目:
xm75。
●在项目xm75内创建源程序文件:
x75.f90,同时在文件中编辑输入给定程序7-5
●在项目xm75内编译、构建、运行、调试程序。
●将输入数据和输出结果以注释形式编辑输入到源程序文件xm75.f90末尾。
●改写程序,求每列元素之和,将和最大的列与第一列对调,输出对调前后矩阵。
5、实验步骤
●上机实验前,查找和改正程序中错误,得到正确程序。
●在工作区shiyan07内创建新项目:
xm75。
●在项目xm75内创建源程序文件xm75.f90,编辑输入源程序文本7-5。
●编译、构建、运行、调试程序。
●运行程序,输入矩阵阶数:
3,4,以及下面矩阵数据:
12251520
18302012
10201711
●运行结束,得到输出结果。
●将输入输出数据以注释形式编辑输入到源程序文件末尾。
●在工作区shiyan07内创建新项目:
xm751,在新项目内创建源程序文件xm751.f90,在文件中编辑输入已改写程序。
编译、构建、运行、调试程序。
输入自定一组数据,获得输出结果。
七、实验小结
本次实验主要涉及二维数组和动态数组的应用,对二维数组的处理多数情况使用二重循环结构,所以二维数组处理与二重循环有密切关系,实验时要重点关注。
在使用中要特别注意数组下标的使用和数组元素的引用。
对于二维数组赋初值,要掌握数组构造器和RESHAPE函数的使用。
要熟练掌握用隐含DO循环实现数组的输入输出。
通过本次实验,学生对一维数组、二维数组、甚至三维数组及其综合应用有深入了解,能够设计和编写较复杂的数组应用程序。
八、课外练习
利用课后业余时间,完成以下练习,以巩固所学知识。
求解以下问题:
已知两组有序整数(个数不定),将两组整数合并为一组有序整数。
合并后的该组整数没有相同整数。
从键盘输入两组整数,输出合并前后整数序列。
输入使用静态数组和动态数组两种方式,编写程序实现之。
提示:
使用三个数组,两个保存合并前两组整数,一个保存合并后整数。
解题要求:
●对问题进行详细分析,设计算法,绘制框图,编写程序。
●在工作区lianxi7内创建新项目:
lx7。
●在项目lx7内创建源程序文件:
lx7.f90,同时在文件中编辑输入源程序文本。
●在项目lx7内编译、构建、运行、调试程序。
●输入数据,得到输出结果,将输入输出数据以注释形式编辑输入到源程序文件末尾。