Fortran 中的 goto 语句

news2024/11/26 14:43:01

注意项

  • 避免滥用:Fortran 90引入了结构化编程的概念,切记不要滥用goto语句
  • 明确标签:在使用goto语句时,标签要明确
  • 避免跳转过多:过多的跳转会增加代码的复杂性和可读性
  • 避免跳转到循环内部:在循环内部使用goto语句可能会导致程序陷入无限循环或者跳出循环
  • 谨慎使用跳转到其他子程序:在跳转到其他子程序时,需要确保目标子程序的执行顺序和状态是正确的

goto is considered bad practice

Code Readability

        The use of goto makes the code less readable because it introduces jumping points or labels that disrupt the linear flow of code

Debugging Difficulties

        Tracing and debugging errors become more challenging since the execution flow can jump around unpredictably. This makes it harder to identify the source of bugs, leading to longer debugging sessions.

Program Structure and Maintainability

​​​​​​​        The use of goto ends to encourage spaghetti-like code(结构上完全不可理解的系统) with tangled control flow. This lack of structure makes the program difficult to maintain and modify over time. A well-organized codebase with clearly defined functions and control flow enhances readability and understandability.

goto使用实例

goto代替loop

program goto_loop
    implicit none
    integer :: i

    i = 1
10  if (i <= 10) then
        print *, i
        i = i + 1
        goto 10
        write(*,*) "this sentence just under goto"
    end if
    write(*,*) "this sentence just under end if"
    read(*,*)
end program goto_loop

goto进入loop内部

program goto_example
    implicit none
  
    integer :: i

    i = 1

10  continue

    print *, "i =", i

    i = i + 1

    if (i <= 5) then
        goto 10
    end if

    print *, "Loop finished"
    read(*,*)
end program goto_example

goto在子程序

  • 注意:
    • fortran 90 不支持从子程序 goto 到主程序中去
program goto_example
    implicit none

    print *, "Starting program"

    call subprogram

    print *, "Exiting program"
    read(*,*)

end program goto_example
    
subroutine subprogram
        implicit none
        integer :: i

        print *, "Entering subprogram"

    10  do i = 1, 5
            print *, "Loop iteration:", i

            goto 20
        end do

    20  print *, "Reached label 20"

        print *, "Exiting subprogram"
end subroutine subprogram

goto优势

  • goto语句在下列情况中有显著的优势
    • 跳出多层循环:使用goto语句可以直接跳转到指定的标签处,从而避免了使用复杂的逻辑结构或者引入额外的变量来控制循环的退出。
    • 错误处理:使用goto语句可以直接跳转到错误处理的标签处,从而简化了错误处理的逻辑。

跳出多重循环

program example
    implicit none
    integer :: i, j, k

    do i = 1, 10
      do j = 1, 10
         do k = 1, 10
            if (k == 5) then
                goto 10
            endif
            print *, i, j, k
         enddo
       enddo
     enddo


10  print *, "Exited loop at k = 5"
    read(*,*)
end program example

错误处理

program error_handling
    implicit none
    
    integer :: num, result
    
    write(*, *) "input an integer here:"
    read(*, *) num
    
    if (num < 0) then
        goto 10
    end if
    
    result = num * num
    
    write(*, *) "the square of your input number:", result
    
    goto 20
    
10  write(*, *) "Negative number is not allowed!"
    
20  write(*,*)"program is over.press any key to exit!"
    read(*,*)
end program error_handling

Fortran的发展历史

  • Fortran(Formula Translation)是一种于1957年由IBM公司开发出高级程序设计语言。它是世界上第一种广泛应用的高级程序设计语言
  • Fortran的第一个版本(Fortran I)于1957年发布,主要用于数值计算和科学研究。
  • Fortran I的语法相对简单,但它的出现极大地简化了程序编写过程,使得科学家和工程师能够更加高效地进行计算和模拟。
  • 1960年,Fortran II发布,引入了子程序和函数的概念
  • 1966年,Fortran IV发布,引入了更多的语言特性
  • 1977年,Fortran 77发布,引入了一些新的特性,如字符处理和动态内存分配,使得Fortran在处理更复杂的问题时更加方便和强大。Fortran 77也成为了许多科学计算软件的主要开发语言。
  • 1990年,Fortran 90发布,引入了许多新的特性,如动态内存分配、模块化编程和面向对象编程等,使得Fortran在软件开发中更加灵活和强大。
  • Fortran仍然是科学计算和工程领域中最常用的编程语言之一。它在气象学、地球物理学、核物理学等领域有着广泛的应用。

Fortran编写的核物理库

古早的代码山

  • 事实上,绝大多数的fortran90代码库全部装配的都是goto语句
    • 如果不能阅读goto语句的话,其实很难进一步操作和学习

一些参考书

  • 量子物理学中的常用算法与程序  井孝功 赵永芳 蒿凤有 哈尔滨工业大学出版社

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

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

相关文章

力扣 93. 复原 IP 地址

题目来源&#xff1a;https://leetcode.cn/problems/restore-ip-addresses/description/ C题解&#xff1a;递归回溯法。 递归参数&#xff1a;因为不能重复分割&#xff0c;需要ind记录下一层递归分割的起始位置&#xff1b;还需要一个变量num&#xff0c;记录ip段的数量。递…

【设计模式】第二十章:解释器模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章&#xff1a;单例模式 【设计模式】第二章&#xff1a;工厂模式 【设计模式】第三章&#xff1a;建造者模式 【设计模式】第四章&#xff1a;原型模式 【设计模式】第五章&#xff1a;适配器模式 【设计模式】第六章&…

中国移动九天毕昇部署fastchat Ubuntu18.04+torch1.13.1+cuda11.6+python3.9

8核CPU,RAM32G 时间&#xff1a;2023年7月 项目地址:GitHub - lm-sys/FastChat: An open platform for training, serving, and evaluating large language models. Release repo for Vicuna and FastChat-T5. 体验地址:https://chat.lmsys.org/ 时间20230703&#xff0c;fas…

【Web3】Web3连接到以太坊网络(测试网、主网)

目录 什么是Web3 Web3项目连接以太坊网络 1.下载Web3 2.实例化Web3对象 3.infura 获取连接以太坊网络节点 4.添加网络节点 什么是Web3 web3.js开发文档&#xff1a;web3.js - Ethereum JavaScript API — web3.js 1.0.0 documentation web3.js 中文文档 : web3.js - 以…

【观察】技术创新+以行践言双管齐下,戴尔科技加速边缘计算落地

众所周知&#xff0c;随着混合多云的快速发展&#xff0c;来自百行千业的用户都在通过混合多云的策略推进加速企业的数字化转型&#xff0c;其中边缘计算由于能够在靠近数据生成的地点和位置就近提供计算、网络、智能等关键能力&#xff0c;其不仅正成为构建“云边端”一体化的…

实验:验证TCP套接字传输的数据不存在数据边界

来源&#xff1a;《TCP/IP网络编程》 学习ing 自己动手&#xff0c;把坑踩一遍&#xff0c;也可以学习到很多。 Linux环境下: 客户端&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <…

23西安电子科技大学人工智能学院821考研录取情况

23西安电子科技大学人工智能学院821考研录取情况 01、人工智能学院各个方向 02、23人工智能学院一志愿考研录取情况总览、均分 PS&#xff1a;智能院23年院线相对于22年院线下降很多分&#xff0c;对于广大考生来说是一个好事 PS&#xff1a;1、总成绩均分在330-345之间&#…

封装一个类似微信通讯录带有字母检索功能的vue组件

这里我们直接使用scrollIntoView方法 该方法将调用它的元素滚动到浏览器窗口的可见区域 语法 element.scrollIntoView&#xff08;&#xff09;; // 等同于element.scrollIntoView(true) element.scrollIntoView&#xff08;alignToTop&#xff09;; //布尔参数 element.scro…

新颖的文档、视频交互方式:以《GPT API Unofficial Docs》和《渐构》为例

一、背景 无意中看到一份 《GPT API 非官方文档》&#xff1a;https://gpt.pomb.us/ 被网站的交互方式所吸引&#xff0c;颇为新颖&#xff0c;值得借鉴。 左侧是对应的 API 代码调用示例&#xff0c;右侧是文档的每个部分&#xff0c;滑动到对应部分&#xff0c;左侧相关的代…

前台-倒计时hooks

import { useIntervalFn } from @vueuse/core import { ref, onUnmounted } from vue// 全部显示 天、时、分、秒 const setAllCountdownStr = (value: number) => {let second = parseInt(value.toString())const day = second / (3600 * 24) //3600秒等于60分钟等于1小时s…

已上架的App在AppStore上无法搜索到的问题

已上架的App在AppStore上无法搜索到的问题 在AppStore上搜不到已经上架的应用程序可以采取以下解决办法&#xff1a; 拨打iTunes提供的支持电话&#xff1a;4006-701-855&#xff08;中国时间9:00-17:00&#xff09;。发送邮件给Review团队&#xff0c;在iTunes Connect登录后…

ElasticSearch8.x和Java API Client

建议 建议直接阅读我的博客原文 10.4 Java API Client操作-索引库/文档 客户端更新 ES为不同语言提供了用于操作ES的客户端&#xff0c;截至2023年7月4日&#xff0c;根据官网Java REST Client已经被弃用&#xff0c;取而代之的是Java API Client&#xff0c;黑马的教程里都…

Docker(一)之 应用(Application)部署容器化的演进之路

前言 容器化技术可以帮助企业更大化资源利用&#xff0c;同时帮助项目相关人员&#xff08;开发、运维、测试、安全等&#xff09;以最小的成本实现项目快速上云部署&#xff0c;掌握容器化管理工具Docker&#xff0c;就掌握了云原生最基础、最核心技术之一 应用&#xff08;…

springboot整合hibernate,gradle,达梦8数据库,实现增删改查的功能

1.新建一个springboot项目&#xff0c;选择gradle管理 2.gradle添加以下依赖&#xff0c;gradle版本7.4 dependencies {// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-webimplementation org.springframework.boot:spring-boot-starter…

Pytorch深度强化学习1-3:策略评估与贝尔曼期望方程详细推导

目录 0 专栏介绍1 从一个例子出发2 回报与奖赏3 策略评估函数4 贝尔曼期望方程5 收敛性证明 0 专栏介绍 本专栏重点介绍强化学习技术的数学原理&#xff0c;并且采用Pytorch框架对常见的强化学习算法、案例进行实现&#xff0c;帮助读者理解并快速上手开发。同时&#xff0c;辅…

ZUH-ACDM-网络-网闸-根据论坛的案例进行分析

H3C技术论坛&#xff1a;https://zhiliao.h3c.com/Theme/details/64343 文章目录 需求&#xff1a;源地址&#xff1a;172.16.1.33访问目的地址&#xff1a;192.168.4.233确认确定是主机确认外端机连接地址172.16.1.254确认内端机到源地址172.16.1.33是通的确认流量走向/路由第…

基于matlab使用高斯混合模型检测和计数视频序列中的汽车(附源码)

一、前言 此示例演示如何使用基于高斯混合模型 &#xff08;GMM&#xff09; 的前景检测器检测和计数视频序列中的汽车。 检测和计数汽车可用于分析交通模式。检测也是执行更复杂的任务&#xff08;例如按类型跟踪或分类车辆&#xff09;之前的第一步。 此示例演示如何使用前…

prometheus描点原理

大家好&#xff0c;我是蓝胖子&#xff0c;关于prometheus的入门教程有很多&#xff0c;拿我之前学prometheus的经历来讲&#xff0c;看了很多教程&#xff0c;还是会对prometheus的描点以及背后的统计原理感到迷惑&#xff0c;所以今天我们就来分析下这部分&#xff0c;来揭开…

AIGC - Stable Diffusion 的 墨幽人造人 模型与 Tag 配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131565068 Stable Diffusion的模型网站 LiblibAI&#xff1a;https://www.liblibai.com 墨幽人造人网址&#xff1a;https://www.liblibai.com/m…

BUU [vnctf2023]电子木鱼

BUU [vnctf2023]电子木鱼 先看看题目&#xff0c;点不了。 看看源码。Rust整数溢出。 在 Rust 中&#xff0c;整数类型默认是有符号整数类型&#xff0c;意味着这些整数类型可以表示正数和负数。对于有符号整数类型&#xff0c;最高位用来表示符号&#xff0c;0 表示正数&…