96、编程学习资源与实践练习全解析

编程学习资源与实践练习全解析

1. 编程学习资源推荐

在编程学习的道路上,丰富的学习资源能帮助我们更好地掌握知识。以下是不同领域的优质学习资源:
- Java 平台相关
- 在线资源
- http://java.sun.com/ :提供 Java 编程语言及相关主题的最新信息,涵盖版本发布、安全问题和在线文档。
- http://java.sun.com/Series/ :提供该系列书籍的最新信息,包括勘误和更新。
- 书籍资料
- 《The Unicode Standard 4.0》:可在 http://www.unicode.org 获取更多 Unicode 数据。
- 《IEEE/ANSI Standard for Binary Floating - Point Arithmetic》:IEEE 标准,编号为 IEEE Std 754 - 1985。
- 其他资源
- http://www.unicode.org/unicode/onlinedat/languages.html :查找语言的双字母 ISO 639 代码。
- http://www.unicode.org/unicode/onlinedat/countries.html :查找国家的双字母 ISO 3166 代码。
- “Uniprocessor Garbage Collection Techniques”:虽有些过时,但对单处理器垃圾回收技术有很好的综述。
- 《Garbage Collection: Algorithms for Automatic Dynamic Memory Management》:全面介绍多种垃圾回收形式及其权衡。
- http://www.w3.org/ :万维网联盟的主站点,可找到 HTML 标签的文档。
- http://tycho.usno.navy.mil/systime.html :美国海军天文台关于 Date 类使用的时间范式的数据。

资源类型 名称 链接
在线资源 Java 官方网站 http://java.sun.com/
在线资源 Java 系列书籍信息 http://java.sun.com/Series/
书籍资料 The Unicode Standard 4.0 http://www.unicode.org
其他资源 语言 ISO 639 代码查询 http://www.unicode.org/unicode/onlinedat/languages.html
其他资源 国家 ISO 3166 代码查询 http://www.unicode.org/unicode/onlinedat/countries.html
其他资源 万维网联盟主站点 http://www.w3.org/
其他资源 美国海军天文台时间数据 http://tycho.usno.navy.mil/systime.html
  • 面向对象设计

    • 《An Introduction to Object - Oriented Programming, 3rd Edition》:介绍面向对象编程,并对 Java、C++、Objective C、Smalltalk 和 Delphi 进行比较。
    • 《Pitfalls of Object - Oriented Development》:收集了对象技术中应避免的陷阱,并提供解决方案。
    • 《Design Patterns》:经典的设计模式书籍。
    • 《Object - Oriented Analysis and Design with Applications, 2nd Edition》:面向对象分析与设计的应用书籍。
    • 《Structured Programming》:结构化编程的相关书籍。
    • 《Object - Oriented Programming: An Evolutionary Approach, 2nd Edition》:以进化的方法介绍面向对象编程。
  • 多线程编程

    • 《Concurrent Programming in Java™: Design Principles and Patterns, 2nd Edition》:介绍 Java 并发编程的设计原则和模式。
    • 《Programming with Threads》:关于线程编程的书籍。
    • 《Programming with POSIX Threads》:讲解 POSIX 线程编程。
    • 《The Architecture of Concurrent Programs》:并发程序的架构相关书籍。
    • “Monitors: An Operating System Structuring Concept”:关于使用监视器同步并发任务的开创性论文。
  • 泛型

    • “Making the Future Safe for the Past: Adding Genericity to the Java™ Programming Language”:Java 编程语言添加泛型类型的原始提案。
    • “Adding Wildcards to the Java™ Programming Language”:介绍通配符的由来及其在类型系统中的影响。
  • 正则表达式

    • 《Mastering Regular Expressions; Powerful Techniques for Perl and Other Tools》:专门介绍正则表达式及其使用的书籍。
    • “Unicode Technical Report #18: Unicode Regular Expression Guidelines”:介绍 Unicode 字符如何融入正则表达式语言。
  • 通用编程技术

    • 《Hacker’s Delight》:涵盖通用编程技术。
  • 相关语言

    • 《The C Programming Language, 2nd Edition》:C 语言经典书籍。
    • 《The C++ Programming Language, 3rd Edition》:C++ 语言的权威著作。
    • 《The Evolution of C++》:讲述 C++ 的发展历程。
    • 《Eiffel: The Language》:介绍 Eiffel 语言。
    • “A Structural View of the Cedar Programming Environment”:关于 Cedar 编程环境的结构视图。
    • 《Mesa Language Manual, version 5.0》:Mesa 语言手册。
    • 《Systems Programming with Modula - 3》:介绍 Modula - 3 语言。
    • 《Programming in OberonSteps Beyond Pascal and Modula》:介绍 Oberon 编程。
    • 《Objective C: Object - Oriented Programming Techniques》:Objective C 面向对象编程技术。
    • “Self: The Power of Simplicity”:关于 Self 语言的介绍。
    • 《Data ProcessingProgramming LanguagesSIMULA》:瑞典标准的 SIMULA 语言资料。
    • 《Smalltalk - 80: The Language》:Smalltalk - 80 语言的相关书籍。
  • 软件工程

    • 《The Decline and Fall of the American Programmer》:分析编程领域的变革,部分章节讨论面向对象设计。
    • 《The Mythical Man - Month, Anniversary Edition》:描述软件项目实际管理和应有的管理方式。
    • 《Peopleware》:关于软件开发中的人员因素。
  • 视觉设计与 GUI 设计

    • 《Designing Visual Interfaces》:介绍提升图形用户界面视觉质量的基本技术。
    • 《About Face》:以直白的方式介绍良好 GUI 设计的基础。
    • 《Usability Engineering》:关于测试界面可用性的指南。
    • 《The Visual Display of Quantitative Information》:在使用图形媒体进行交流前值得一读。
    • 《The Non - Designer’s Design Book》:介绍如何使用字体、空间、对齐等基本技术使设计更具视觉吸引力和用户友好性。
    • 《The Design of Everyday Things》:讨论日常物品的可用性设计,对任何人类使用的设计都有借鉴意义。
2. 编程实践练习

实践是检验真理的唯一标准,以下是一系列编程实践练习:

graph LR
    A[编程练习] --> B[基础练习]
    A --> C[面向对象练习]
    A --> D[多线程练习]
    A --> E[其他练习]
    B --> B1[HelloWorld 练习]
    B --> B2[Fibonacci 练习]
    C --> C1[Vehicle 类练习]
    C --> C2[LinkedList 类练习]
    D --> D1[线程创建与执行练习]
    D --> D2[线程同步练习]
    E --> E1[正则表达式练习]
    E --> E2[文件操作练习]
  • 基础练习

    • Exercise 1.1 :在系统中输入、编译并运行 HelloWorld 程序。
    • Exercise 1.2 :尝试修改 HelloWorld 程序的部分内容,查看可能出现的错误。
    • Exercise 1.3 :为 Fibonacci 程序的打印列表添加标题。
    • Exercise 1.4 :编写一个生成不同序列的程序,如平方表。
    • Exercise 1.5 :将 HelloWorld 应用程序修改为使用命名的字符串常量作为要打印的字符串。
    • Exercise 1.6 :将 Exercise 1.3 中的程序修改为使用命名的字符串常量作为标题。
    • Exercise 1.7 :修改 ImprovedFibonacci 中的循环,使 i 反向计数。
    • Exercise 1.8 :为 Point 类添加一个方法,将当前对象的坐标设置为传入的 Point 对象的坐标。
    • Exercise 1.9 :修改 Fibonacci 应用程序,将序列存储到数组中,并在最后打印值列表。
    • Exercise 1.10 :修改 ImprovedFibonacci 应用程序,将其序列存储在数组中。通过创建一个新类来保存值和一个布尔值,指示该值是否为偶数,然后创建该类对象的引用数组。
    • Exercise 1.11 :修改 StringsDemo 应用程序,使用不同的字符串。
    • Exercise 1.12 :修改 ImprovedFibonacci 程序,将其创建的 String 对象存储到数组中,而不是直接调用 println。
    • Exercise 1.13 :使用 printf 重写 ImprovedFibonacci 程序,而不是使用 println。
    • Exercise 1.14 :勾勒出一组反映索尼 Walkman 产品家族类结构的类。使用方法隐藏数据,使所有数据为私有,方法为公共。确定 Walkman 类应包含哪些方法,以及哪些扩展类应添加哪些方法。
    • Exercise 1.15 :编写一个扩展 Lookup 的接口,声明 add 和 remove 方法,并在一个新类中实现该扩展接口。
    • Exercise 1.16 :为 BadDataSetException 添加字段,以保存数据集名称和发出问题信号的 I/O 异常,以便捕获该异常的人了解错误详情。

    • 操作步骤示例(以 Exercise 1.1 为例)

      1. 打开文本编辑器,输入以下 Java 代码:
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
    2. 保存文件,文件名命名为 `HelloWorld.java`。
    3. 打开命令行终端,进入保存文件的目录。
    4. 使用 `javac HelloWorld.java` 命令编译代码。
    5. 使用 `java HelloWorld` 命令运行编译后的程序。
  • 面向对象练习

    • Exercise 2.1 :编写一个简单的 Vehicle 类,至少包含当前速度、当前方向(以度为单位)和车主姓名的字段。
    • Exercise 2.2 :编写一个 LinkedList 类,包含一个 Object 类型的字段和一个指向下一个 LinkedList 元素的引用。
    • Exercise 2.3 :为 Vehicle 类添加一个静态字段,用于保存下一个车辆标识号,并为 Vehicle 类添加一个非静态字段,用于保存每辆车的 ID 号。
    • Exercise 2.4 :考虑 Exercise 2.3 的解决方案,思考标识号字段是否应该为 final。
    • Exercise 2.5 :为 Vehicle 类编写一个 main 方法,创建几个车辆对象并打印它们的字段值。
    • Exercise 2.6 :为 LinkedList 类编写一个 main 方法,创建几个 Vehicle 类型的对象,并将它们放入列表的连续节点中。
    • Exercise 2.7 :为 Vehicle 类添加两个构造函数:一个无参构造函数和一个接受初始车主姓名的构造函数。修改主程序,使其生成与之前相同的输出。
    • Exercise 2.8 :思考应向 LinkedList 类添加哪些构造函数。
    • Exercise 2.9 :为 Vehicle 类添加一个静态方法,返回迄今为止使用的最高标识号。
    • Exercise 2.10 :为 Vehicle 类添加一个 toString 方法。
    • Exercise 2.11 :为 LinkedList 类添加一个 toString 方法。
    • Exercise 2.12 :考虑 Vehicle 和 LinkedList 类,思考是否需要任何接受可变数量参数的方法。
    • Exercise 2.13 :将 Vehicle 类中的字段设为私有,并为这些字段添加访问器方法。确定哪些字段应该有修改方法,哪些不应该。
    • Exercise 2.14 :将 LinkedList 类中的字段设为私有,并为这些字段添加访问器方法。确定哪些字段应该有修改方法,哪些不应该。
    • Exercise 2.15 :为 Vehicle 类添加一个 changeSpeed 方法,将车辆的当前速度更改为传入的值,并添加一个 stop 方法,将速度设置为零。
    • Exercise 2.16 :为 LinkedList 类添加一个方法,返回列表中的元素数量。
    • Exercise 2.17 :为 Vehicle 类添加两个 turn 方法:一个接受要转动的度数,另一个接受 Vehicle.TURN_LEFT 或 Vehicle.TURN_RIGHT 常量。
    • Exercise 2.18 :修改 Vehicle.main 方法,创建车主姓名在命令行中指定的汽车,并打印它们。
  • 多线程练习

    • Exercise 14.1 :编写一个程序,显示执行 main 方法的线程的名称。
    • Exercise 14.2 :修改 PrintServer 的第一个版本,使只有在构造函数中创建的线程才能成功执行 run 方法,使用线程的标识。
    • Exercise 14.3 :编写一个类,其对象保存一个当前值,并具有一个将该值增加的方法,打印新值。编写一个程序,创建这样一个对象,创建多个线程,并从每个线程重复调用添加方法。编写该类,确保没有加法操作丢失。
    • Exercise 14.4 :修改 Exercise 14.3 的代码,使用静态数据和方法。
    • Exercise 14.5 :修改 Exercise 14.4 的代码,使线程可以安全地减少值,而不使用静态同步方法。
    • Exercise 14.6 :编写一个程序,从执行开始每秒打印经过的时间,另一个线程每 15 秒打印一条消息。让消息打印线程在每秒过去时由时间打印线程通知。添加另一个线程,每 7 秒打印一条不同的消息,而不修改时间打印线程。
    • Exercise 14.7 :多次运行 Babble 程序,检查输出是否总是相同。如果可能,在不同系统上运行并进行比较。
    • Exercise 14.8 :试验 Friendly 程序。在你的系统上死锁实际发生的频率是多少?如果添加 yield 调用,是否可以改变死锁的可能性?如果可以,在多种系统上尝试此练习。在不消除同步的情况下消除死锁的可能性。
    • Exercise 14.9 :编写一个方法,接受一个线程组,并启动一个线程,定期打印该组内的线程和线程组的层次结构,使用刚刚描述的方法。使用一个程序进行测试,该程序在各个组中创建几个短生命周期的线程。
  • 其他练习

    • 正则表达式练习
      • Exercise 13.1 :编写一个方法,计算给定字符在字符串中出现的次数。
      • Exercise 13.2 :编写一个方法,计算特定字符串在另一个字符串中出现的次数。
      • Exercise 13.3 :重写 delimitedString 方法,使其可以提取输入字符串中的所有分隔字符串并返回一个数组。
      • Exercise 13.4 :编写一个程序,读取输入字符串,每行格式为 “type value”,其中 type 是包装类名称(如 Boolean、Character 等),value 是该类型构造函数可以解码的字符串。为每个这样的条目创建该类型的对象,并将其添加到 ArrayList 中。读取完所有行后,显示最终结果。
      • Exercise 13.5 :编写一个方法,将包含十进制数字的字符串转换为用逗号分隔的数字,从右到左每三位添加一个逗号。
      • Exercise 13.6 :修改该方法,接受指定分隔符字符和分隔符之间位数的参数。
    • 文件操作练习
      • Exercise 20.1 :将 translateByte 程序重写为一个方法,将 InputStream 的内容转换到 OutputStream,其中映射和流是参数。对于本章中读到的每种 InputStream 和 OutputStream 类型,编写一个新的 main 方法,使用该翻译方法对该类型的流进行操作。如果有配对的输入和输出流,可以在一个 main 方法中涵盖两者。
      • Exercise 20.2 :将 TRanslateByte 类重写为一个过滤器。
      • Exercise 20.3 :创建一对 Filter 流类,使用任何你选择的算法(如将字节与某个值进行异或)对字节进行加密,使 DecryptInputStream 能够解密 EncryptOutputStream 创建的字节。
      • Exercise 20.4 :创建 FilterReader 的一个子类,通过一个方法每次返回一行输入,该方法会阻塞直到有完整的一行输入可用。
      • Exercise 20.5 :编写一个程序,读取指定文件并搜索指定单词,打印包含该单词的每行的行号和行内容。
      • Exercise 20.6 :编写一个程序,接受 “name op value” 形式的输入,其中 name 是你选择的三个单词之一,op 是 +、 - 或 =,value 是一个数字。对命名的值应用每个运算符。输入结束后,打印这三个值。额外加分:使用用于 AttributedImpl 的 HashMap 类,以便可以使用任意数量的命名值。
      • Exercise 20.7 :为第 3 章的 Attr 类添加一个方法,将对象的内容写入 DataOutputStream,并添加一个构造函数,从 DataInputStream 读取状态。
      • Exercise 20.8 :编写一个程序,读取以 “%%” 开头的行分隔的文件,并创建一个表文件,记录每个条目的起始位置。然后编写一个程序,使用该表打印一个随机条目。
      • Exercise 20.9 :编写一个方法,给定一个或多个路径名,打印该文件(如果存在)的所有可用信息。
      • Exercise 20.10 :编写一个程序,使用 StreamTokenizer 对象将输入文件拆分为单词,并计算每个单词在文件中出现的次数,打印结果。使用 HashMap 跟踪单词和计数。
      • Exercise 20.11 :使用 FilenameFilter 或 FileFilter,编写一个程序,接受一个目录和一个后缀作为参数,打印所有具有该后缀的文件。

编程学习资源与实践练习全解析

3. 不同编程概念的深入学习资源

除了前面提到的各类编程资源,还有一些关于特定编程概念的学习资料值得关注。

  • 泛型相关
    • “Making the Future Safe for the Past: Adding Genericity to the Java™ Programming Language” 这篇文章是 Java 编程语言添加泛型类型的原始提案。虽然其中的想法在泛型类型实际出现在语言中之前经历了重大修订,但它能让我们了解泛型的起源和最初的设计思路。
    • “Adding Wildcards to the Java™ Programming Language” 则详细介绍了通配符是如何产生的,以及它们在类型系统中的影响。通过阅读这篇文章,我们能更深入地理解 Java 泛型中通配符的使用和意义。
资源名称 主要内容
Making the Future Safe for the Past: Adding Genericity to the Java™ Programming Language Java 泛型类型的原始提案
Adding Wildcards to the Java™ Programming Language 通配符的产生及在类型系统中的影响
  • 正则表达式相关
    • 《Mastering Regular Expressions; Powerful Techniques for Perl and Other Tools》是一本专门介绍正则表达式及其使用的书籍。书中详细讲解了正则表达式的各种技巧,并且可以很容易地区分哪些是 Perl 编程语言特有的,哪些是更通用的知识。
    • “Unicode Technical Report #18: Unicode Regular Expression Guidelines” 则聚焦于 Unicode 字符如何融入正则表达式语言。虽然简单来说,其规则和我们的猜测差不多,但这份报告提供了正式的详细信息。
4. 更多编程实践练习及操作步骤

除了前面的基础、面向对象和多线程练习,还有一些其他方面的实践练习可以帮助我们提升编程能力。

graph LR
    A[其他编程练习] --> B[通用编程技术练习]
    A --> C[相关语言练习]
    A --> D[软件工程练习]
    A --> E[视觉设计与 GUI 设计练习]
    B --> B1[位操作练习]
    B --> B2[数值计算练习]
    C --> C1[C 语言练习]
    C --> C2[C++ 语言练习]
    D --> D1[项目管理练习]
    D --> D2[人员协作练习]
    E --> E1[界面设计练习]
    E --> E2[可用性测试练习]
  • 通用编程技术练习
    • Exercise 9.1 :编写一个程序,对两个无限操作数使用 +、 -、 * 和 / 运算符,并显示结果。要确保尝试相同符号和相反符号的无穷值。
      • 操作步骤
        1. 打开文本编辑器,输入以下 Java 代码:
public class InfiniteOperands {
    public static void main(String[] args) {
        double positiveInfinity = Double.POSITIVE_INFINITY;
        double negativeInfinity = Double.NEGATIVE_INFINITY;

        System.out.println("Positive Infinity + Positive Infinity: " + (positiveInfinity + positiveInfinity));
        System.out.println("Positive Infinity + Negative Infinity: " + (positiveInfinity + negativeInfinity));
        System.out.println("Positive Infinity - Positive Infinity: " + (positiveInfinity - positiveInfinity));
        System.out.println("Positive Infinity - Negative Infinity: " + (positiveInfinity - negativeInfinity));
        System.out.println("Positive Infinity * Positive Infinity: " + (positiveInfinity * positiveInfinity));
        System.out.println("Positive Infinity * Negative Infinity: " + (positiveInfinity * negativeInfinity));
        System.out.println("Positive Infinity / Positive Infinity: " + (positiveInfinity / positiveInfinity));
        System.out.println("Positive Infinity / Negative Infinity: " + (positiveInfinity / negativeInfinity));
    }
}
        2. 保存文件,文件名命名为 `InfiniteOperands.java`。
        3. 打开命令行终端,进入保存文件的目录。
        4. 使用 `javac InfiniteOperands.java` 命令编译代码。
        5. 使用 `java InfiniteOperands` 命令运行编译后的程序。
- **Exercise 9.2**:编写一个方法,仅使用位操作运算符确定传入的 int 中 1 位的数量(即不使用 Integer.bitCount)。可以将自己的解决方案与已发布的算法进行比较。
    - **操作步骤**:
        1. 打开文本编辑器,输入以下 Java 代码:
public class BitCount {
    public static int countBits(int num) {
        int count = 0;
        while (num != 0) {
            count += num & 1;
            num >>= 1;
        }
        return count;
    }

    public static void main(String[] args) {
        int number = 15;
        System.out.println("Number of 1 bits in " + number + " is: " + countBits(number));
    }
}
        2. 保存文件,文件名命名为 `BitCount.java`。
        3. 打开命令行终端,进入保存文件的目录。
        4. 使用 `javac BitCount.java` 命令编译代码。
        5. 使用 `java BitCount` 命令运行编译后的程序。
  • 相关语言练习
    • C 语言练习 :可以通过阅读《The C Programming Language, 2nd Edition》来学习 C 语言的基础知识,然后进行一些简单的 C 语言程序编写练习,比如实现一个简单的计算器程序。
      • 操作步骤
        1. 打开文本编辑器,输入以下 C 代码:
#include <stdio.h>

int main() {
    int num1, num2;
    char operator;

    printf("Enter two numbers: ");
    scanf("%d %d", &num1, &num2);

    printf("Enter an operator (+, -, *, /): ");
    scanf(" %c", &operator);

    switch (operator) {
        case '+':
            printf("%d + %d = %d\n", num1, num2, num1 + num2);
            break;
        case '-':
            printf("%d - %d = %d\n", num1, num2, num1 - num2);
            break;
        case '*':
            printf("%d * %d = %d\n", num1, num2, num1 * num2);
            break;
        case '/':
            if (num2 != 0) {
                printf("%d / %d = %d\n", num1, num2, num1 / num2);
            } else {
                printf("Error: Division by zero!\n");
            }
            break;
        default:
            printf("Invalid operator!\n");
    }

    return 0;
}
        2. 保存文件,文件名命名为 `calculator.c`。
        3. 打开命令行终端,进入保存文件的目录。
        4. 使用 `gcc calculator.c -o calculator` 命令编译代码。
        5. 使用 `./calculator` 命令运行编译后的程序。
- **C++ 语言练习**:阅读《The C++ Programming Language, 3rd Edition》学习 C++ 语言的高级特性,然后进行面向对象编程的练习,比如实现一个简单的学生管理系统。
  • 软件工程练习

    • 项目管理练习 :可以参考《The Mythical Man - Month, Anniversary Edition》中描述的软件项目实际管理和应有的管理方式,模拟进行一个小型项目的管理规划。例如,规划一个简单的网站开发项目,包括确定项目需求、制定项目进度计划、分配人员任务等。
    • 人员协作练习 :阅读《Peopleware》了解软件开发中的人员因素,然后组织一个小组进行编程项目开发,在过程中注重团队成员之间的沟通、协作和问题解决。
  • 视觉设计与 GUI 设计练习

    • 界面设计练习 :根据《Designing Visual Interfaces》中介绍的提升图形用户界面视觉质量的基本技术,设计一个简单的桌面应用程序的界面。可以使用 Java 的 Swing 或 JavaFX 库来实现。
    • 可用性测试练习 :按照《Usability Engineering》中的指南,对自己设计的界面进行可用性测试。邀请一些用户进行操作,收集他们的反馈,然后对界面进行改进。

通过不断地学习这些编程资源,并进行大量的实践练习,我们可以逐步提升自己的编程能力,在不同的编程领域中取得更好的成绩。无论是基础的编程知识,还是高级的编程概念,都需要我们通过不断地学习和实践来掌握。希望这些资源和练习能为大家的编程学习之路提供帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值