💻 程序设计部分:开发代码 - 综合学习笔记

未来的程序员们,大家好!欢迎来到“开发代码”这一章。在这里,你们之前学习的规划和算法将转化为实际运行的软件!学习编程不仅仅是输入指令,更是关于如何从逻辑上解决问题,并确保你的解决方案稳健(强大且可靠)。

如果刚开始写代码觉得有点棘手,不用担心。把它想象成学做菜:你按照菜谱(算法)操作,混合配料(变量和输入),最终做出美味的成品(程序)!

1. 软件开发生命周期 (SDLC)

开发程序是一个结构化的过程。你肯定不会在没有蓝图的情况下盖摩天大楼!遵循以下阶段可以确保你的代码高效、无误,并满足用户的需求。

第 1 阶段:计划与分析
  • 明确问题并定义需求(程序必须完成什么任务)。
  • 设计解决方案(创建算法、结构图等)。
第 2 阶段:编码与实现(开发代码)
  • 使用合适的编程语言编写代码。
  • 将算法(如流程图)转换为实际的指令。
  • 专注于使代码易于阅读和维护(详见第 2 节)。
第 3 阶段:测试与调试
  • 运行代码并检查其是否正常工作。
  • 发现并修复出现的任何错误(Bug)。
  • 使用多种类型的数据进行测试,以确保程序的稳健性。
第 4 阶段:评估与维护
  • 根据初始需求评估最终产品。它是否符合任务目标?
  • 如有必要,更新代码以修复新发现的 Bug 或添加新功能。

核心要点: 代码开发不是线性的!你通常需要在编码、测试和调试之间循环往复,直到程序准备就绪。


2. 优秀程序代码的特征

写出能运行的代码是一回事,但写出简洁、清晰且易于他人(或未来的你自己!)理解的代码至关重要。这被称为编写可维护的代码

A. 可读性与结构
  • 有意义的变量名: 不要将变量命名为 ax1,应使用描述性的名称,如 userAgetotalScore。这能让读者一眼看出变量存储的是什么。
  • 缩进与空格: 使用一致的缩进(Tab 键)来表明代码行所属的控制结构(如 IF 语句或 FOR 循环)。这会让程序结构一目了然。
  • 模块化: 将大型任务拆分为更小、易于管理的片段,称为模块过程函数类比:长篇大论中,一个章节通常比一整段连绵不绝的文字更容易阅读。
B. 注释的重要性

注释是代码中被计算机忽略的文本行。它们完全是为了让人类阅读而存在的!

  • 注释解释了复杂代码段的实现原理
  • 它们解释了关键变量或函数的用途。
  • 它们对于调试和维护至关重要。如果你六个月后再看代码,注释能帮你回忆起当初写了什么!

你知道吗? 专业程序员花在阅读和维护现有代码上的时间,往往比编写全新代码的时间还要多!简洁的代码能节省大量时间和成本。


3. 理解错误 (Bug)

Bug 是程序中导致其行为异常或崩溃的错误。发现并修复这些错误(调试)是开发过程中非常重要的一部分。

三种类型的错误

别担心!每个人都会犯错。关键在于如何识别它们。

  1. 语法错误 (Syntax Errors)

    这是编程语言的语法或规则错误。程序无法理解该指令,因此无法运行。
    例如:在 Python 中,将 print 拼写成 prnt,或者在 IF 语句中漏掉了冒号 (:)。

    检测方式: 通常由编程环境 (IDE) 在代码尝试执行前自动捕获。

    类比:作文里的错别字或语法错误。你的老师(计算机)看不懂你想表达什么。

  2. 逻辑错误 (Logic Errors)

    代码语法正确且能成功运行,但执行结果不符合你的预期。输出是错误的。
    例如:你想计算两个数字的平均值,却不小心用了减法而不是加法: average = (num1 - num2) / 2

    检测方式: 这是最棘手的!只能通过仔细测试,将实际输出与预期输出进行对比才能发现。

    类比:菜谱写着“加 2 汤匙盐”,但你只加了 2 茶匙。菜做好了能吃,但味道不对(输出结果错误)。

  3. 运行时错误 (Run-time Errors)

    这些错误发生在程序运行期间,通常是因为计算机在执行过程中发现了某种不可能完成的操作。程序通常会崩溃或冻结。
    例如:尝试将数字除以零(例如 \(10 / 0\))。这在数学上是不可能的,会导致程序崩溃。

    检测方式: 只有在执行到该特定代码行时才会被发现。

快速复习:错误类型

Syntax(语法) = Spelling/拼写错误(无法运行)
Logic(逻辑) = Lies/谎言/结果错误(能运行,但输出不对)
Run-time(运行时) = Random Crash/随机崩溃(执行期间发生)


4. 测试的艺术

测试是一种系统化检查程序是否稳健(能优雅地处理异常数据)且提供正确结果的方法。在宣布程序完成之前,你必须用不同类型的数据对其进行测试。

三种测试数据

为了确保稳健性,我们使用三类数据:

  1. 正常数据 (Normal Data / Valid Data)

    你期望用户输入的、且程序绝对应该接受的数据。这类数据在可接受范围内。
    例如:如果程序接受 18 到 65 岁之间的年龄,正常数据可以是 30、45 或 50。

  2. 边界数据 (Boundary Data / Extreme Data)

    位于可接受范围边缘或极限处的数据。程序员在处理限制条件时经常出错(例如将 < 写成了 ≤)。测试边界可以确保极限情况被正确处理。
    例如:对于 18 到 65 岁的范围,边界数据是 18 和 65。你也应该测试边界之外的数字:17 和 66。

  3. 错误数据 (Erroneous Data / Invalid Data)

    程序应该拒绝的数据,通常会导致错误提示。这测试了你的输入验证功能有多稳健。
    例如:对于 18 到 65 岁的范围,错误数据可以是 -5、100,或者输入文本(如“二十”)而不是数字。

核心要点: 只有当程序能正确处理这三类数据(尤其是错误数据)时,它才算稳健。


5. 调试技术:跟踪表 (Trace Table)

当你遇到逻辑错误时,计算机不会直接告诉你错误在哪里。你需要把自己变成计算机!跟踪表(或称干运行)是一种强大的手动调试技术,用于在算法执行时,一步步跟踪变量的值。

如何使用跟踪表(侦探的工具)

想象以下简单的算法:将输入的数字累加到总数中,但仅在数字大于 10 时才进行累加。

跟踪表可以帮你手动检查逻辑是否正确。

第 1 步:准备
为程序中使用的每个变量创建列,再加上“输出”列和“条件”列(用于 IF 语句或循环)。

第 2 步:执行
逐行查看代码。每当变量的值发生变化时,就在表中记录新值。仅在程序有显示内容时记录“输出”。

示例跟踪表结构:

行号 输入 (N) 总数 (Total) 条件 (N > 10) 输出
1 - 0 - -
2 (输入 5) 5 0 False -
2 (输入 15) 15 0 True -
3 (如果为真) 15 15 (0 + 15) True -
4 (输出) 15 15 - Total is 15

通过跟踪步骤,你可以精确定位变量何时被赋予了异常值,从而找出导致逻辑错误的代码行。如果最终输出是 15,而你期望的是 20,你可以向前回溯,查看数字 5 在哪里被错误地处理了。

跟踪表小贴士!

始终从每个变量的初始值(通常为零或空)开始,并且不要跳过任何一步。如果某一行变量没有改变,请将旧值延续到下一步。


6. 应避免的常见开发陷阱

在开发代码时,请留意这些常见的错误:

  • 差一错误 (Off-by-one Errors): 一种经典的逻辑错误,循环执行次数多了一次或少了一次(例如需要循环 9 次,结果循环了 10 次)。请务必仔细检查边界条件!
  • 忽略输入验证: 想当然地认为用户总是会输入正确类型的数据。如果你要求输入数字,就必须编写代码来处理用户输入文本的情况(即处理错误数据)。
  • 忽略数据类型: 混淆了数值型数据(用于计算)和字符串数据(用于文字)。例如:试图将数字 5 与文本“10”相加。
  • 测试不足: 只进行正常数据测试。这是很危险的!你必须使用边界数据和错误数据来找出那些隐蔽的 Bug。

本章提供了从设计算法到构建可靠程序所必需的基本工具。请继续练习你的跟踪和测试技能!


*** 章节笔记结束 ***