资源预览内容
第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
第9页 / 共18页
第10页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
动态数组,数组声明时不必确定数组大小,数组大小在程序运行期间动态确定。,为什么要用动态数组?,节约内存 使程序普适,具有灵活性,数组维数的大小与占用内存的关系,integer, parameter : kx =1000, ky=1200, kz=100 real, dimension(kx, ky, kz) : u, v,动态数组如何声明?,一维动态数组 real, allocatable, dimension(:) : array 二维动态数组 real, allocatable, dimension(:,:) : array 只让某一维动态, real, allocatable, dimension(:,5) : array Wrong!,只给出数组名,不指定上界和下界,如何运用?,分配空间 allocate( array(m,n) ) 释放空间 deallocate( array ),例1,问题:有2个专业,每个专业的人数不等,少则30来人,多则60余人。“Fortran编程”课程的考试成绩参差不齐,根据每人分数,求每个专业的平均成绩. 其格式如下: 2 class-1 29 0301 78.4 0329 60.0 class-2 39 ,使用固定维数组(静态数组),PROGRAM mean ! implicit none ! integer, parameter : class_num = 2 character(len=30) : score_table_name real, dimension(class_num, 100) : score integer, dimension(class_num) : num real, dimension(class_num) : mean_score character(len=30),dimension(class_num) : class_name ! real:total_score integer : i, j ! class_name=(/ class-1, class-2/) num=(/29,39/) !input score do i = 1, class_num do j = 1, num(i) print*,read score read*, score(i,j) enddo enddo,! !- calculate mean do i = 1, class_num total_score = 0. do j = 1, num(i) total_score = total_score + score(i,j) enddo mean_score (i) = total_score/num(i) ! - write out the above result write(*,*) class_name(i), mean_score(i) enddo ! ! END PROGRAM mean,sum( score(i,1:num(i) ),运用动态数组,PROGRAM mean ! implicit none ! character(len=30) : score_table_name, class_name integer : num integer, parameter : class_num = 2 real : mean_ score real, allocatable, dimension(:) : score ! integer : i, j !,cal_mean: & do i = 1, class_num ! - read information and score print*,read class_name read(*,*) class_name print*,read class_num read(*,*) num allocate( score(num) ) !分配num个元素的存储空间 print*,read score do j = 1, num read(*,*) score(j) enddo ! - calculate mean and write out mean_score = sum(score(:)/num write(*,*) class_name, mean_score ! - release memeory occupied by score(:) for next use deallocate( score ) !释放num个元素的存储空间 ! enddo cal_mean close(1) ! ! END PROGRAM mean,例2,从键盘输入数目不确定的一批正整数(最多200个),将这批整数保存在数组中,然后反序输出这批整数。,Program main implicit none ! integer, parameter : max = 200 integer, dimension(200) : array integer : i, n, num ! print*, 输入整数,以-1结束输入 n=0 read*, num do while (num /= -1) n=n+1 array(n) =num read*, num enddo print*, 数据个数:, n print*, 正序数据:, (array(i),i=1,n) print*, 反序数据:, (array(i),i=n,1,-1) endprogram main,静态数组,Program main implicit none ! integer, allocatable, dimension(:) : old_array, new_array integer : i, n, num ! print*, 输入整数,以-1结束输入 allocate (new_array(0) ! 给new_array分配0个元素存储空间 n=0 read*, num do while (num /= -1) n=n+1 allocate (old_array(n-1) !给old_array分配n-1个元素存储空间 old_array=new_array deallocate(new_array) !释放new_array存储空间 allocate(new_array(n) !给new_array分配n个元素存储空间 new_array(1:n-1)=old_array new_array(n)=num deallocate(old_array) !释放new_array存储空间 read*, num enddo print*, 数据个数:, n print*, 正序数据:, (new_array(i),i=1,n) print*, 反序数据:, (new_array(i),i=n,1,-1) endprogram main,动态数组,递归(recursive)子程序,指允许子程序体内直接或间接地调用自身的子程序,这种子程序调用称为递归调用。 递归子程序定义需在Function或Subroutine语句前加一个Recursive关键词前缀,递归法求阶乘,recursive function fact(n) implicit none integer: n integer: fact if (n=0.or.n=1) then fact=1 else fact=fact(n-1)*n end if end function,program ex70 implicit none integer: n integer: fact print*,input n: read*,n if (n0) then print*,error! else print*,n,fact(n) end if end program ex70,使用递归的原则,能够不使用递归就不要使用递归 如果当前计算要重复使用前两次(或多次递归)结果, 那么请不要使用递归! 如 gg_result = di_gui(n-1)*di_gui(n-2),!求两个阶乘之和(函数嵌套) program ex69 implicit none external sum integer n1,n2 integer sum print*,input n1,n2: read*,n1,n2 print*,the result:,sum(n1,n2) end program ex69,function sum(a,b) implicit none external fact integer a,b integer sum,fact sum=fact(a)+fact(b) end function function fact(n) implicit none integer i,n integer fact fact=1 do i=1,n fact=fact*i end do end function,谢谢听课!,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号