Fotran学习:chapter8函数

news2024/9/22 17:20:00

1.子程序(subrountine)的使用

把常常用于使用、具有特定功能的程序代码独立出来,封装程子程序,以后调用使用call即可。

program chapter4_exercise !主程序
    implicit none
    call sub1()
    call sub2()
    pause
    end program chapter4_exercise

    subroutine sub1()  !子程序sub1
    implicit none
      write(*,*)"This is sub1"
      call sub2()
      return
    end subroutine sub1

    subroutine sub2() !子程序sub2
    implicit none
    write(*,*)"This is sub2"
    return 
    end subroutine sub2

在这里插入图片描述
例:假设在一场田径赛的标枪选项中,有5位选手的投掷标枪的情况为:
1号选手:以30度角,每秒25米的速度掷出标枪。
2号选手:以45度角,每秒20米的速度掷出标枪。
3号选手:以35度角,每秒21米的速度掷出标枪。
4号选手:以50度角,每秒27米的速度掷出标枪。
5号选手:以40度角,每秒22米的速度掷出标枪。
假设忽略空气阻力以及身高等因素,请写出一个程序来计算选手们的投射距离(即计算自由投射运动的抛物线距离)

!法一:
program chapter4_exercise
    implicit none
    integer,parameter::players=5
    real::angle(players)=(/30.0,45.0,35.0,50.0,40.0/)
    real::speed(players)=(/25.0,20.0,21.0,27.0,22.0/)
    real::distance(players)
    integer::i

    do i=1,players
       call Get_Distance(angle(i),speed(i),distance(i))
       write(*,"('Player',I1,'=',F8.2)")i,distance(i)
    end do

    pause
end program chapter4_exercise

    !0-360的角度转换程0-2pi的弧度
    subroutine Angle_To_Rad(angle,rad)
       implicit none
       real angle,rad
       real,parameter::pi=3.14159

       rad=angle*pi/180.0

       return
    end 

    !由角度、切线速度来计算投射距离
    subroutine Get_Distance(angle,speed,distance)
        implicit none
        real angle,speed !输入的参数
        real distance !准备返回去的结果
        real rad,Vx,time !内部使用
        real,parameter::G=9.81

        call Angle_To_Rad(angle,rad) !单位转换
        Vx=speed*cos(rad) !水平方向速度
        time=2.0*speed*sin(rad)/G !在空中飞行时间
        distance=Vx*time !距离=水平方向速度*飞行时间
        return 
    end
!法二:自定义函数
  program chapter4_exercise
    implicit none
    integer,parameter::players=5
    real::angle(players)=(/30.0,45.0,35.0,50.0,40.0/)
    real::speed(players)=(/25.0,20.0,21.0,27.0,22.0/)
    real::distance(players)
    real,external::Get_Distance !声明Get_Distance是一个函数
    integer::i

    do i=1,players
       distance(i)=Get_Distance(angle(i),speed(i))
       write(*,"('Player',I1,'=',F8.2)")i,distance(i)
    end do
    pause
 end program chapter4_exercise

    !0-360的角度转换成0-2pi的弧度
    real function Angle_To_Rad(angle)
       implicit none
       real angle
       real,parameter::pi=3.14159

       Angle_To_Rad=angle*pi/180.0
       return 
    end

    !由角度、切线速度来计算投射距离
    real function Get_Distance(angle,speed)
       implicit none
       real angle,speed !输入的参数
       real rad,Vx,time !内部使用
       real,external::Angle_To_Rad !声明Angle_To_Rad是个函数
       real,parameter::G=9.81
       rad=Angle_To_Rad(angle) !单位转换
       Vx=speed*cos(rad) !水平方向速度
       time=2.0*speed*sin(rad)/G !在空中飞行时间
       Get_Distance=Vx*time !距离=水平方向速度*飞行时间
       return 
    end

在这里插入图片描述

2.全局变量(COMMON)

2.1 COMMON的使用

Common是Fortran77中使用“全局变量”的方法,它用来定义一块共享的内存空间。
取用全局变量时,是根据它们声明时的相对位置关系来作对应,而不是使用变量名称来对应。

program chapter4_exercise
    implicit none
    integer::a,b
    common a,b !定义a,b是全局变量中的第1、2个变量
    a=1
    b=2
    call ShowCommon()

    pause
    end program chapter4_exercise

    subroutine ShowCommon()
       implicit none
       integer::num1,num2
       common num1,num2 !定义num1,num2是全局变量中的第1、2个变量
       write(*,*)num1,num2
       return 
    end

在这里插入图片描述

由于全局变量使用“地址对应”的方法在程序中共享数据,使用在程序设计时常常会有麻烦出现,如:在主函数中使用了6个变量当全域变量,子程序只使用第6个全域变量,它仍然要宣告前5个变量在前面垫着,才能拿到第6个变量来使用。
为解决这一麻烦,将变量归类、放在彼此独立的COMMON区间中。

program chapter4_exercise
    implicit none
    integer::a,b
    common /group1/ a
    common /group2/ b
    a=1
    b=2
    call ShowGroup1()
    call ShowGroup2()

    pause
    end program chapter4_exercise

    subroutine ShowGroup1()
    implicit none
      integer::num1
      common /group1/ num1
      write(*,*)num1
      return 
    end

    subroutine ShowGroup2()
    implicit none
      integer::num1
      common /group2/ num1
      write(*,*)num1
      return
    end

在这里插入图片描述

2.2 BLOCK DATA

COMMON变量不能直接在子程序或主程序中使用DATA来设置初值,要在BLOCK DATA命令来设置初值。
BLOCK DATA只能用作设置全局变量的初值,故只能包含跟声明有关的描述,程序命令不能放在这个程序模块中。
全局变量不能声明为常量,所以BLOCK DATA中不能出现PARAMETER

program chapter4_exercise
    implicit none
    integer::a,b
    common a,b !a,b放在不署名的全局变量空间中
    integer::c,d
    common /group1/ c,d !c,d放在group1的全局变量空间中
    integer::e,f
    common /group2/ e,f !e,f放在group2的全局变量空间中

    write(*,"(6I4)")a,b,c,d,e,f

    pause
    end program chapter4_exercise

    block data
     implicit none
     integer a,b
     common a,b !a,b放在不署名的全局变量空间中
     data a,b /1,2/ !设置a,b的初值
     integer c,d
     common /group1/ c,d !c,d放在group1的全局变量空间中
     data c,d /3,4/ !设置c,d的初值
     integer e,f
     common /group2/ e,f !e,f放在group2的全局变量空间中
     data e,f /5,6/ !设置e,f的初值
    end block data

在这里插入图片描述

2.3 注意事项

COMMON只是用来提供一块共享的内存,编译器不会帮忙做类型的检查。
在使用COMMON时要注意:(1)变量的类型;(2)变量的位置
如果在主程序声明为浮点数,而在子程序中声明为整型则会出现错误。

program chapter4_exercise
    implicit none
    real a
    common a !把浮点数a放在全局变量中
    a=1.0
    call ShowCommon()

    pause
    end program chapter4_exercise

    subroutine ShowCommon()
    implicit none
    integer a
    common a !把整数a放在全局变量中
    write(*,*)a
    return
    end

在这里插入图片描述
试着通过bitview.exe来发现结果。

3.函数中的变量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/511113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

产品经理制,互联网公司发扬光大的

产品经理制,在互联网公司发扬光大 张小龙被称作:七星产品经理 其实,中小企业老板基本是首席产品经理 趣讲大白话:像带孩子一样做产品 【趣讲信息科技160期】 **************************** 产品经理制核心问题解决的是&#xff1a…

STM32F4_随机数发生器(RNG)

目录 1. 随机数发生器RNG是什么 2. RNG随机发生器框图 3. 运行RNG 4. RNG寄存器 4.1 RNG控制寄存器:RNG_CR 4.2 RNG状态寄存器:RNG_SR 4.3 RNG数据寄存器:RNG_DR 5. 库函数配置随机数发生器 6. 实验程序 6.1 main.c 6.2 RNG.c 6.…

植物奶站上风口

不知不觉间,植物奶无处不在。逛街,便利店里有燕麦奶、椰奶、豆奶,星巴克、肯德基有燕麦拿铁;打开小红书,有人做各种植物奶产品的测评结果,有人分享优质植物奶的自制方法…… 这场“风”并非空穴而来。 一…

软件工程开发文档写作教程(07)—招投标文件写作规范

本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文参考资料:电子工业出版社《软件文档写作教程》 马平,黄冬梅编著 招投标文件概述 国内的软件项目招投标文件的写作规则并不存在行业标准。许多大型企业的信息…

面向开发人员的 ChatGPT 提示词教程 - ChatGPT Prompt Engineering for Developers

面向开发人员的 ChatGPT 提示词教程 - ChatGPT Prompt Engineering for Developers 1. 指南(原文: Guidelines)1-1. 提示的指南(原文: Guidelines for Prompting)1-2. 配置1-3. 提示语原则(原文: Prompting Principles)原则 1: 写出清晰而具体的指示(原文: Write clear and spe…

【近期解决的小问题】

文章目录 写在前面1. Win10中USB转串口设备安装完成驱动显示感叹号(USB不能用)背景尝试过的方法其他解决方法 2. 安装Win7虚拟机“缺少所需的CD/DVD驱动器设备驱动程序”背景尝试过的方法 3. WMware安装Kali Linux后黑屏左上角光标闪烁背景尝试过的方法 …

Java设计模式 12-模版模式

模板模式 一、豆浆制作问题 编写制作豆浆的程序,说明如下: 1)制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎 2)通过添加不同的配料,可以制作出不同口味的豆浆 3)选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一…

关于使用SSM框架搭建的项目的运行方法

目录 运行环境配置 1、安装 IDEA 开发工具 中文版设置 JDK直接下载 2、安装 MYSQL 数据库 2.1 下载安装 2.2 配置环境变量 2.4 安装 MySQL 2.4 进入 MySQL 2.5 常见问题 3、安装Tomcat 4、IDEA配置MYSQL 4.1、常见错误 5、IDEA配置TOMCAT 5.1、常见报错 一 运行环…

2023年最新无脑安装 Go lang 环境配置并编写、运行、打包第一个 Golang 程序详细步骤,附带图文教程

文章目录 下载安装Golang配置 Golang 环境GO111MODULEGOPROXY开启 Go mod 模式及设置包下载国内镜像配置 Vscode Golang 环境 Bug 集锦The "gopls" command is not available.Run "go get -v golang.org/x/tools/gopls" to install. GO语言也称为Golang&am…

烽火HG680-J/V-Hi3798MV100-当贝纯净桌面-卡刷固件包

烽火HG680-J/V-Hi3798MV100-当贝纯净桌面-卡刷固件包 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的没用的软件&…

【ArcGIS教程】批量裁剪

ArcGIS教程:批量裁剪 1 裁剪1.1 准备:创建shp文件/选定区域、自由选区1.1 单一裁剪1.2 批量裁剪(Batch) 2 批量裁剪参考 1 裁剪 1.1 准备:创建shp文件/选定区域、自由选区 步骤1: 创建shp文件 打开ArcCat…

2023年了,来体验下前端的测试方案

在当前的前端当中,有好多同学自己写的代码bugger横飞,怎么解决这个问题呢🤔🤔🤔?个人觉得主要有以下两个趋势 给前端的代码加上类型检查(ts)给前端代码编写单元测试和e2e测试 当然&a…

【C++】继承和多态、共有私有和保护、重写

区分继承与多态、辨别public、protected、private 继承与多态的概念继承与多态的区别与联系区别:联系:示例结果: 继承和访问的权限说明示例:结果 结论 继承与多态的概念 面向对象三大原则:封装、继承、多态。继承是一种…

【C++进阶1--继承】面向对象三大特性之一(附菱形继承讲解

继承是面向对象中很重要的特性,今天就来讲讲C中的继承。 文中不足错漏之处望请斧正! 什么是继承? 是一种类的复用,可以让B类继承,从而使B类获得A类的所有成员。 A类叫做父类或基类,B类叫做子类或派生类。…

C++ 构造函数-2

构造函数-2 构造函数体赋值 在对象创建的时候,编译器会调用构造函数,给对象当中的成员赋一个合适的初始值。 class Date { public: Date(int year, int month, int day) { _year year; _month month; _day day; } private: int _year; int _month; i…

Android framework工程师一定要知道的高级技巧

作为一名android framework工程师,你是否对Android framework的一些高阶使用技巧感到陌生?想了解更多的细节?如果是这样,那么就请你读下去。本篇文章我将为大家相信介绍Android framework的高阶技巧,帮助你成为一名高级…

【Nginx】【SSL】Nginx上配置ssl证书

配置需要有自己的域名和云主机;域名已经解析到主机;安装好Nginx 一、申请免费版的SSL证书 1、阿里云可以申请免费版的SSL证书 阿里云搜索 ssl 找到 数字证书管理服务/SSL 证书>免费证书;申请一个免费的 2、下载SSL证书到本地&#xf…

贝叶斯公式与全概率公式的理解。

1.贝叶斯与全概率公式解释 1.全概率公式定义 即若在某个场景下,可找到一个完备事件组 Ai ( i 1,2,3…n)。 则对任一与该场景有关的事件 B,都可以分割成无数个小事件(由不同因素引起的事件) 有:   B B ∩ A1 ∪ A2…

给你的项目启动提提速:Lazy Initialization

前言 在一个名为种花家的小镇上,生活着一群热爱编程的人。他们致力于构建出高效、可维护的软件系统,而 Spring Boot 框架成为了他们的不二之选。这个小镇上的人们每天都在用 Spring Boot 框架创造着令人瞩目的应用程序。 然而,随着时间的推移…

Java 学习之线程

1、引入线程的优点: 1)充分利用cup资源 2)简化编程模型 3)简化异步事件处理 4)使GUI更有效率 5)节约成本 2、线程使用:在Java中创建线程有几种方法,每个Java程序至少包含一个线…