当前位置: 首页 > news >正文

Fortran基础语法速览——从零开始编写你的第一个程序

1. 为什么选择Fortran?

如果你正在寻找一门专为科学计算而生的编程语言,Fortran绝对值得考虑。我第一次接触Fortran是在研究生阶段,当时需要处理大量气象数据。教授说:"用Fortran吧,它的数组计算速度比Python快20倍。"事实证明他是对的——我用Fortran重写的算法,运行时间从3小时缩短到了9分钟。

Fortran(Formula Translation的缩写)诞生于1957年,是现存最古老的高级编程语言之一。但别被它的年龄吓到,现代Fortran(如Fortran 90/95/2003)早已不是当年的模样。它保留了高效的数值计算能力,同时加入了模块化、面向对象等现代特性。NASA的气候模拟、欧洲核子研究中心(CERN)的粒子物理计算、金融领域的量化分析,这些高性能计算场景中都能看到Fortran的身影。

2. 搭建开发环境

2.1 安装编译器

在开始写代码前,我们需要一个Fortran编译器。推荐使用免费的gfortran,它是GNU编译器集合(GCC)的一部分:

  • Windows用户:下载MinGW-w64安装包,记得勾选gfortran组件
  • Mac用户:用Homebrew一键安装:brew install gcc
  • Linux用户:通过包管理器安装,例如Ubuntu下:sudo apt install gfortran

安装完成后,在终端输入gfortran --version,如果看到版本信息就说明安装成功。我建议配合VS Code使用,安装Modern Fortran插件后可以获得语法高亮和代码提示。

2.2 第一个程序

打开文本编辑器,输入以下代码:

! 我的第一个Fortran程序 program hello implicit none print *, "你好,世界!" end program hello

保存为hello.f90(.f90后缀表示使用Fortran 90标准)。然后在终端编译运行:

gfortran hello.f90 -o hello ./hello

看到屏幕输出"你好,世界!"时,恭喜你迈出了第一步!这个简单程序包含几个关键元素:

  • !开头的行是注释
  • program helloend program hello定义了程序边界
  • implicit none是个好习惯,它要求所有变量必须显式声明
  • print *是最简单的输出语句

3. 基础语法要素

3.1 变量与数据类型

Fortran是静态类型语言,使用变量前必须先声明。基本数据类型包括:

类型声明说明示例值
integer整型42
real单精度浮点数3.14159
double precision双精度浮点数1.23456d0
character(len=10)字符串"Hello"
logical布尔值.true.

来看个实际例子:

program variables implicit none integer :: age = 30 real :: height = 1.75 character(len=20) :: name = "张三" logical :: is_student = .false. print *, "姓名:", name print *, "年龄:", age print *, "身高:", height, "米" print *, "是否学生:", is_student end program variables

注意::符号用于分隔类型和变量名,这是Fortran 90的新语法。老式的Fortran 77会直接写integer age,但现代编程中建议使用新语法。

3.2 输入输出

除了简单的print *,Fortran提供了更灵活的I/O控制。read用于输入,write可以格式化输出:

program io_demo implicit none real :: weight character(len=20) :: pet_name print *, "请输入你的宠物名字:" read *, pet_name print *, "请输入宠物重量(kg):" read *, weight write(*, '(a, f6.2, a)') trim(pet_name), weight, "公斤" ! 输出示例: "小花 3.50公斤" end program io_demo

这里的'(a, f6.2, a)'是格式说明符:

  • a表示字符串
  • f6.2表示浮点数,总宽度6位,小数点后2位
  • trim()函数去除字符串尾部空格

4. 编写BMI计算程序

现在我们来实践一个完整的BMI(身体质量指数)计算程序。BMI的计算公式是:

[ BMI = \frac{体重(kg)}{身高(m)^2} ]

4.1 程序实现

program bmi_calculator implicit none real :: height_cm, weight_kg, height_m, bmi ! 获取用户输入 print *, "请输入身高(cm):" read *, height_cm print *, "请输入体重(kg):" read *, weight_kg ! 计算BMI height_m = height_cm / 100.0 bmi = weight_kg / (height_m ** 2) ! 输出结果 print *, "你的BMI指数是:", bmi ! 健康评估 if (bmi < 18.5) then print *, "体重过轻" else if (bmi < 24) then print *, "正常范围" else if (bmi < 28) then print *, "超重" else print *, "肥胖" end if end program bmi_calculator

4.2 关键语法解析

  1. 运算符

    • **表示乘方(相当于其他语言的^)
    • /是除法
    • 注意整数除法会截断,所以用100.0而非100
  2. 条件语句

    if (条件) then ! 代码块 else if (其他条件) then ! 代码块 else ! 代码块 end if

    这是Fortran的标准条件结构,注意thenend if必不可少

  3. 类型转换: 当混合使用整数和实数时,Fortran会自动转换。但显式转换更安全:

    height_m = real(height_cm) / 100.0

5. 常见问题与调试技巧

刚开始学习Fortran时,我经常遇到这些问题:

  1. 隐式类型问题: 忘记写implicit none,导致变量名拼写错误时编译器不会报错,而是隐式创建一个新变量。比如:

    program bug_demo ! 缺少 implicit none integer :: counter = 0 counter = counter + 1 ! 拼写错误,但不会报错 conuter = conuter + 2 print *, counter ! 输出1而非3 end program
  2. 数组下标从1开始: 与C/Python不同,Fortran默认数组下标从1开始:

    real :: temps(3) ! 有效下标是1,2,3 temps(0) = 25.0 ! 运行时错误
  3. 调试建议

    • 使用print *输出中间变量值
    • 编译时添加-Wall选项显示所有警告:
      gfortran -Wall my_program.f90 -o my_program
    • 对于复杂程序,可以分模块测试

6. 下一步学习建议

掌握基础语法后,你可以继续探索:

  1. 数组操作: Fortran的数组处理非常高效,支持整体运算:

    real :: A(100), B(100), C(100) C = A + B ! 整个数组相加
  2. 子程序和函数: 将代码模块化:

    function circle_area(radius) real :: circle_area real, intent(in) :: radius circle_area = 3.14159 * radius**2 end function
  3. 文件操作: 读写数据文件:

    open(unit=10, file="data.txt") read(10, *) some_variable write(10, *) "结果=", result close(10)

我建议从实际项目入手,比如:

  • 计算物理习题
  • 处理实验数据
  • 实现简单数值算法(如梯形法积分)

Fortran社区虽然不如Python活跃,但仍有许多优质资源。推荐:

  • Fortran Wiki(英文)
  • 《Fortran 95/2003 程序设计》(中文教材)
  • GitHub上的开源Fortran项目
http://www.jsqmd.com/news/527101/

相关文章:

  • 终极指南:5分钟用OpCore Simplify一键生成完美黑苹果EFI配置
  • Ubuntu20.04下ROS与NLopt完美搭配安装指南(避坑实录)
  • 从提示词到交响曲:一文读懂AI音乐生成的技术、应用与未来
  • 空气温湿度相关参数计算在PLC编程中的实现
  • PythonVista:让Windows 7焕发新生的Python 3.9+兼容性解决方案
  • 多模态数据标注实战指南:5大高效工具与避坑策略(含Label Studio优化技巧)
  • 手把手教你搞定Green Hills MULTI-IDE安装(附资源与常见问题排查)
  • 并联型APF有源电力滤波器:仿真与分析
  • OpenClaw自动化测试:Qwen3-VL:30B飞书任务稳定性验证
  • 【LLM】Ollama:本地大模型 WebAPI 调用实战指南
  • Alpamayo-R1-10B实操手册:tail -f实时监控WebUI日志并识别关键错误模式
  • GLM-OCR文档解析工具5分钟快速部署:单卡极速版,小白也能轻松上手
  • 从一次后仿失败案例看Testbench时钟设计:如何避免dut_clk和tb_clk相位差引发的灾难
  • 银泰百货卡回收渠道大盘点:哪个最划算? - 团团收购物卡回收
  • YOLO12新手入门指南:无需代码,Web界面一键检测物体
  • 高价回收银泰百货卡,这些靠谱渠道值得一试! - 团团收购物卡回收
  • 比迪丽AI绘画Agent系统设计:自主艺术创作智能体开发
  • 零基础入门AI绘画:基于Anything V5的镜像快速搭建实战
  • 2026年实验室电炉哪家好?综合质量、口碑、信誉的厂家推荐 - 品牌推荐大师
  • GMAC接口(4)——实战:从零构建DWC_ether_qos驱动
  • 2026年重型波芯纸箱厂家推荐:泰安嘉旭工贸,重型蜂窝纸箱/蜂窝分体箱/瓦楞纸箱厂家精选 - 品牌推荐官
  • 提升流动性优化表面性能 瑞道化工 HF-24 流动改质剂赋能聚酰胺改性 - 妙妙水侠
  • MogFace人脸检测模型GitHub开源项目实战:参与社区贡献与协作开发
  • YOLO26(极速目标检测) + SAM3(精准掩码生成) 搭建一套实用的流水线
  • 避开APDL数据导出那些坑:*Vwrite格式符(F6.3)与*cfopen的12个常见报错解决方案
  • 基于Python的手机销售网站毕设
  • 多目标优化求解Pareto:权重法与多种算法的解析与应用
  • 旧设备激活指南:使用OpenCore Legacy Patcher实现老款Mac的系统扩展与硬件适配
  • 凌欧FOC框架实战:ADC采样与运放调试的5个关键步骤(附代码示例)
  • VibeVoice实时TTS系统部署全攻略:GPU一键启动,300ms低延迟体验