基础程序设计技术(Java)

基础程序设计技术

利用基本数据类型、变量、常量、操作符、表达式、输入和输出进行基本的程序设计。

编写程序

编写程序涉及如何设计解决问題的策略,以及如何应用编程语言实现这个策略。

编写程序涉及如何设计算法以及如何将算法翻译成程序指令,即代码。

算法描述的是:如果要解决问题,所需要执行的动作以及这些动作执行的顺序。算法可以帮助程序员在使用程序设计语言编写程序之前做一个规划。

算法可以用自然语言或者伪代码(即自然语言和程序设计代码混在一起使用)描述。在编写代码之前,以一种算法的形式来勾勒程序(或者它潜在的问题),是一个很好的做法。

从控制台读取输入

从控制台读取输入,使得程序可以从用户那里获得输入。

Java 使用 System.out 来表示标准输出设备,而用 System.in 来表示标准输入设备。
默认情况下,输出设备是显示器,而输人设备是键盘。为了完成控制台输出,只需使用 System.out.println 方法就可以在控制台上显示基本值或字符串。 Java 并不直接支持控制台输人,但是可以可以使用 Scanner 类创建它的对象,以读取来自 System.in 的输入,如下所示:

Scanner input = new Scanner(System.in);

语法 new Scanner(System.in) 表明创建了一个 Scanner 类型的对象。 语法 Scanner input 表明 input 是一个 Scanner 类型的变量。表明创建一个 Scanner 对象,并且将它的引用值赋值给变量 input 。对象可以调用它自己的方法。调用对象的方法可以让对象完成某个任务。

System.out.println() 和 System.out.print() 方法类似,不同之处在于当显示完字符串之后,前者会将光标移到下一行,后者光标在当前行末。

当用户键入一个数值后单击回车键,该数值就被读入并赋值给变量。可以输人多个用空格
符分隔开的数值,然后按回车键,或者每输入一个数值之后就按一次回车键。如果输入了一个非数值的值,一个运行时错误将产生。

使用 Scanner 类要在第一行代码中导入 Scanner 类。如果使用 Math 类,该类没有被导人程序。Math 类是在 java.lang 包中,而 java.lang 包中的所有类是隐式被导入的。因此不需要显式地导人 Math 类。

Scanner 类在包 java.util 里。import 语句有两种类型:明确导入 (specific import)和通配符导入(wildcard import)。明确导入是在 import 语句中指定单个的类。如从包 java.util 中导入 Scanner 类:

import java.util.Scanner;

通配符导入是指通过使用星号作为通配符,导人一个包中所有的类。导入包
java.util 中所有的类:

import java.util.*;

除非要在程序中使用某个类,否则关于被导人包中的这些类的信息在编译时或运行时是不被读入的。导人语句只是告诉编译器在什么地方能找到这些类。明确导人和通配符导入在性能上是没有什么差别的。

程序分三个步骤执行,即输入、处理和输出,这被称为 IPO 。输入是从用户那里获得输入 ,处理是使用输入产生结果,而输出是显示结果。

标识符

标识符是为了标识程序中诸如类、方法和变量的元素而采用的命名。

在 Java 程序设计术语中,命名称为标识符(identifier)。所有的标识符必须遵从以下规则:

  • 标识符是由字母、数字、下划线 (_) 和美元符号 ($) 构成的字符序列。
  • 标识符必须以字母、下划线 (_) 和美元符号 ($) 开头,不能以数字开头。
  • 标识符不能是 Java 中的保留字
  • 标识符不能是 true 、 false 或 null
  • 标识符可以为任意长度
    Java 编译器会检测出非法标识符,并且报语法错误。

Java 中共有 53 个标识符或称为保留字,其中 50 个为关键字(goto, const 目前尚未使用);另外 3 个是值,这 3 个值为 true, false 和 null。

注意: Java 是区分大小写的,所有的关键字都是小写。所以 NULL 不是 Java 中的保留字。

提示: 标识符是用于命名程序中的变量、方法、类和其他项。具有描述性的标识符可提高程序的可读性。避免采用缩写作为标识符,使用完整的词汇会更具有描述性。 为了简明,也会采用 i、j、k、x和y 之类的变量名。不用字符 $ 命名标识符。习惯上,字符 $ 只用在机器自动产生的源代码中。

变量

变量代表了存储在计算机内存中的一个值,其值可以被改变。

每个变量都有名字、类型、大小和值。直到一个变量被赋初值,这个变量才被定义。

变量名应该尽量选择描述性的名字(descriptive name),而不是用 x 和 y 这样的名字。

Java 提供简单数据类型来表示整数、实数、字符以及布尔类型。这些类型称为原始数据类型或基本数据类型。

实数(即带小数点的数字)在计算机中使用浮点计数法来表示。实数也称为浮点型。Java中,可以用关键字 double 或 float 来声明一个浮点型变量。

变量用于表示特定类型的数据。为了让编译器知道变量是什么,需要指明它们的数据类型。即存储在变量中的数据的类型。这称为声明变量。为了使用变量,可以通过告诉编译器变量的名字及其可以存储的数据类型来声明该变量。变量声明告知编译器根据数据类型为变量分配合适的内存空间。声明变量的语法如下:

dateType variableName;

如果几个变量为同一类型,允许一起声明它们,变董之间用逗号分隔开。如下所示:

datatype variable1 , variable2 , ... , variableN 

变量通常都有初始值。可以一步完成变量的声明和初始化。如下所示:

dateType variableName = initialValue;

提示: 在赋值给变量之前,必须声明变量。方法中声明的变量在使用之前必须被赋值。任何时候,都要尽可能一步完成变量的声明和斌初值。这会使得程序易读,同时避免
程序设计错误。

注意: 每个变量都有使用范围。变量的使用范围是指变量可以被引用到的程序的部分。一个变量在可以使用前,必须被声明和初始化。

审査程序如何工作的方法称为跟踪一个程序,可以显示程序中对应每行语句执行之后变量的值。跟踪程序有助于理解一个程序是如何工作的,而且它也是一个査找程序误的非常有用的工具。

赋值语句和赋值表达式

赋值语句将一个值指定给一个变量。在 Java 中赋值语句可以作为一个表达式。

声明变量之后,可以使用赋值语句(assignment statement)给它赋一个值。在 Java 中,将等号(=)作为赋值操作符 (assignment operator)。赋值语句语法如下:

//变量 = 表达式
variable = expression; 

表达式(expression)表示涉及值、变量和操作符的一个运算,它们组合在一起计算出一个新值。变量也可用在表达式中,变量可以用于 = 操作符的两边。要给一个变量陚值,变量名必须在賦值操作符的左边。

在 Java 中,赋值语句本质上就是计算出一个值并将它赋给操作符左边变量的一个表达式。由于这个原因,赋值语句常常称作赋值表达式(assignment expression)。下面的语法正确:

System.out.println(variable = expression);

等价于

variable = expression;
System.out.println(variable);

如果一个值要赋给多个变量,可以采用以下语法:

variable1 = variable2 = ··· = variableN = expression;

等价于

variable1 = expression;
variable2 = expression;
    ··· ···
variableN = expression;

注意: 在赋值语句中,左边变量的教据类型必须与右边值的数据类型兼容。

命名常量

命名常量是一个代表不变值的标识符。

一个变量的值在程序执行过程中可能会发生变化,但是命名常量(named constant)或简
称常量,则表示从不改变的永久数据。从不改变表示是在变量中存储的常量的地址,一旦被赋值就不能再作修改。下面就是声明常量的语法:

final dateType CONSTANNAME = value;

常量必须在同一条语句中声明和赋值。单词 final 是声明常量的 Java 关键字。

使用常量有三个好处:

  • 不必重复输入同一个值
  • 如果必须修改常量值,只需在源代码中的一个地方做改动
  • 给常量赋一个描述性的名字会提高程序易读性

在 Java 程序中,字符串常量不能跨行。可以将该字符串分成几个单独的子串,然后再用连接符(+)将它们组合起来。

加号(+)有两种意义:一种用途是做加法,另一种用途是做字符串的连接(合并)。加号 (+)称为字符串连接符。它可以把两个字符串合并为一个。如果一个字符串和一个数值连接,数值将先转化为字符串然后再和另外一个字符串连接。关于字符串以及字符串连接可以参考 <数学函数、字符和字符串(Java)> 。

命名习惯

严格遵循 Java 的命名习惯可以让程序易于理解,以及避免错误。

应该确保程序中为变量、常量、类和方法所选择的描述性名字是直观易懂的。Java 命名是区分大小写的。下面列出变量、常量、方法和类的命名习惯。

  • 使用小写字母命名变量和方法。如果一个名字包含多个单词,就将它们连在一起,第一个单词的字母小写,而后面的每个单词的首字母大写
  • 类名中的每个单词的首字母大写
  • 大写常量中的所有字母,两个单词间用下划线连接

警告: 对类命名时不要选择 Java 库中已经使用的名称 。

数值数据类型和操作

Java 为数值、字符值和布尔值数据提供了八种基本数据类型。
Java 针对整数和浮点数有六种数值类型,以及 + ,- ,* ,/ 和 % 等操作符。

数值数据类型

每个数据类型都有它的取值范围,编译器会根据每个变量或常量的数据类型为其分配内存空间。

表中列出了六种数值数据类型、它们的范围以及所占存储空间

类型名范围存储空间
byte-27~27
-128~127
8 位带符号数
short-215~215
-32768~32767
16 位带符号数
int-231~231
-2147483648~2147483647
32 位带符号数
long-263~263
-9223372036854775808~9223372036854775807
64 位带符号数
float负数范围:-3.4028235E+38~-1.4E-45
正数范围;1.4E-45~3.4028235E+38
32 位,标准 IEEE 754
double负数范围:-1.7976931348623157E+308~-4.9E-324
正数范围:4.9E-324~1.7976931348623157E+308
64 位,标准 IEEE 754

IEEE 754 标准用于在计算机上表示浮点数。Java 采用 32 位 IEEE 754 表示 float 型,64 位 IEEE 754 表示 double 型。除此之外,还定义了一些特殊浮点值。

Java 使用四种类型的整数:byte 、short 、int 、long 。应该为变量选择最合适的数据类型。为了简单和一致性,可以统一使用 int 表示整数。

Java 使用两种类型的浮点数:float 、double 。double 型是 float 型的两倍。double 型又称双精度,float 型称为单精度。通常使用double 型,因为更精确。

从键盘读取数值可以使用 Scanner 类中的 nextByte() 、nextShort() 、nextInt() 、nextLong() 、nextFloat() 、nextDouble() 方法从键盘读取对应类型的数值。如果输人了一个不正确范围或者格式的值,将产生一个运行时错误。

注意: 数值数据类型向后兼容:double -> float -> long -> int -> short -> byte。

数值操作符
操作数是被操作符操作的值。数值数据类型的操作符包括标准的算术操作符:加号 (+) 、减号 (-) 、乘号 (*) 、除号 (/) 和求余号 (%) ,如下表所示。

运算符名字
+加法
-减法
*乘法
/除法
%求余

注意: 当除法的操作数都是整数时,除法的结果就是整数,小数部分被舍去。为了实现浮点数的除法,其中一个操作数必须是浮点数。

注意: 操作符 % ,被称为求余或者取模操作符,可以求得除法的余数。左边的操作数是被除数,右边的操作数是除数。操作符 % 通常用在正整数上,实际上,它也可用于负整数和浮点值。只有当被除数是负数时,余数才是负的。

注意: 操作符 + 和 - 可以是一元的也可以是二元的。一元操作符仅有一个操作数;而二元操作符有两个操作数。

注意: 使用方法 Math.pow(a,b) 来计算 ab 。pow 方法定义在 Java API 的 Math 类中。运用语法 Math.pow(a,b) 可以调用该方法,并将返回结果 ab 。 这里,a 和 b 是 pow 方法的参数。

数值型直接量

一个直接量 (literal) 是一个程序中直接出现的常量值。

整型直接量
只要整型直接量与整型变量相匹配,就可以将整型直接量陚值给该整型变量。如果直接量太大,超出该变量的存储范围,就会出现编译错误。

整型直接量默认为是 int 型的。为了表示一个 long 型的整型直接量,需要在其后追加字母 L 或 l 。 推荐使用 L ,因为 l (L 的小写) 很容易与 1 (数字 1) 混淆。

注意: 默认情况下,整型直接量是一个十进制整数。要表示一个二进制整数直接量 ,使用 Ob 或者 0B 开头;表示一个八进制整数直接量,就用 0 开头,而要表示一个十六进制整数直接量,就用 Ox 或 0X 开头。

浮点型直接量
浮点型直接量带小数点,默认情况下是 double 型的。可以通过在数字后面加字母 f 或 F 表示该数为 float 型直接量,也可以在数字后面加 d 或 D 表示该数为 double 型直接量。

注意: double 型值比 float 型值更精确。一个 float 值有 7 到 8 位小数位, 一个 double 值有 15 到 17 位小数位。

科学计数法
浮点型直接量也可以用 a x 10b 形式的科学记数法表示。一种特定的语法可以用于表示科学记数法的数值。 E 或 e 表示指数,a x 10b 记为 aEb 。

注意: float 型和 double 型都是用来表示带有小数点的数。这些数都是以科学记数法的形式进行内部存储的。

注意: 为了提高可读性,Java 允许在数值直接量的两个数字间使用下划线,下划线必须置于两个数字间。

表达式求值以及操作符优先级

Java 表达式的求值和数学表达式求值是一样的。用 Java 编写数值表达式就是使用 Java 操作符对算术表达式进行直接的翻译 。

Java 有后台计算表达式的方法,Java 表达式的结果和它对应的算术表达式的结果一样。因此可以将算术运算规则应用在计算 Java 表达式上。首先执行的是包括在圆括号里的运算,圆括号可以嵌套,嵌套时先计算内层括号。当一个表达式中有多于一个操作符时,以下操作符的优先级规则用于确定计算的次序:

  • 乘法、除法和求余运算首先计算。如果表达式中包含若干个乘法、除法和求余操作符,可按照从左到右的顺序执行。
  • 最后执行加法和减法运算。如果表达式中包含若干个加法和减法操作符,则按照从左到右的顺序执行 。

注意: 使用除法时要特别小心,在 Java 中,两个整数相除商为整数。

增强赋值操作符

操作符 + 、- 、* 、/ 、% 可以结合赋值操作符形成增强操作符。

经常会出现变量的当前值被使用、修改,然后再重新赋值给该变量的情况。Java 允许使用增强赋值操作符来结合赋值操作符和算数操作符的功能。增强赋值操作符如下表所示:

操作符名称
+=加法赋值操作符
-=减法赋值操作符
*=乘法赋值操作符
/=除法赋值操作符
%=求余赋值操作符

增强赋值操作符在表达式中所有其他操作符计算完成后执行。

警告: 在增强操作符中是没有空格的。

注意: 就像赋值操作符(=)一样 , 操作符(+= 、-= 、*= 、/= 、%=)既可以构成赋值语句,也可以构成赋值表达式。

自增和自减操作符

自增操作符(++)和自减操作符(–)是对变量进行加 1 和减 1 的操作。

要点提示: ++ 和 – 是对变量进行自增 1 和自减 1 的简写操作符。

i++ 读为 i 加加,i-- 读为 i 减减。这些操作符分别称为后置自增操作符和后置自减操
作符,因为操作符 ++ 和 – 放在变量后面。这些操作符也可以放在变量前面:++i 和 --i 。这些操作符称为前置自增操作符和前置自减操作符。

i++ 和 ++i 或者 i-- 和 --i 的效果是一样的。然而,当用在表达式中不单纯只进行自增和自减时,它们就会产生不同的效果。

操作符名称说明
++var前置自增操作符变量 var 的值加 1 且使用 var 增加后的新值
var++后置自增操作符变量 var 的值加丨但使用 var 原来的值
–var前置自减操作符变量 var 的值减丨且使用 var 减少后的新值
var–后置自减操作符变量 var 的值减 1 但使用 var 原来的值

提示: 使用自增操作符和自减操作符可以使表达式更加简短,但也会使它们比较复杂且难以读懂。应该避免在同一个表达式中使用这些操作符修改多个变量或多次修改同一个变量。

数值类型转换

通过显式装换,浮点数可以被转换为整数。

总是可以将一个数值赋给支持更大数值范围类型的变量。但是,如果不进行类型转换,就不能将一个值赋给范围较小类型的变量。

类型转换是一种将一种数据类型的值转换成另一种数据类型的操作。将一个小范围类型的变量转换为大范围类型的变量称为拓宽类型(widening a type),把大范围类型的变量转换为小范围类型的变量称为缩窄类型(narrowing a type ) 。Java 将自动拓宽一个类型,但是缩窄类型必须显式完成。

类型转换的语法要求目标类型放在括号内,紧跟其后的是要转换的变量名或值。

警告: 如果要将一个值赋给一个范围较小类型的变量,就必须进行类型转换。如果在这种情况下没有使用类型转换,就会出现编译错误。使用类型转换时必须小心,丢失的信息也许会导致不精确的结果。

注意: 类型转换不改变被转换的变量。

注意: Java 中, xl op = x2 形式的增强赋值表达式,执行为 xl = (T) (xl op x2) ,这里 T 是 x1 的类型。

注意: 将一个 int 型变量賦值给 short 型或 byte 型变量,必须显式地使用类型转换。然而,只要整型直接量是在目标变量允许的范围内,那么将整型直接量赋给 short 型或 byte 型变量时,就不需要显式的类型转换。

软件开发过程

软件开发生命周期是一个多阶段的过程,包括需求规范、分析、设计、实现、测试、部署和维护。

开发一个软件产品是一个工程过程。软件产品,无论多大或者多小,具有同样的生命周期:需求规范 >>> 分析 >>> 设计 >>> 实现 >>> 测试 >>> 部署 >>> 维护。

  • 需求规范是一个规范化的过程,旨在理解软件要处理的问题,以及将软件系统需要做的详细记录到文档中。这个阶段涉及用户和开发者之间紧密的接触。在实际中,问题经常没有很好的定义。开发者需要和他们的顾客(使用软件的个人或者组织)密切合作,仔细地研究问题,以确定软件需要做什么。

  • 系统分析旨在分析数据流,并且确定系统的输人和输出。当进行分析的时候,首先确定输出,然后弄清楚需要什么样子的输入从而产生结果是有帮助的。

  • 系统设计是设计一个从输人获得输出的过程。这个阶段涉及使用多层的抽象,将问题分解为可管理的组成部分,并且设计执行每个组成部分的策略。可以将每个组成部分看作一个执行系统特定功能的子系统。系统分析和设计的本质是输入、处理和输出(IPO)。

  • 实现也称为编码(编写代码),就是将系统设计翻译成程序。为每个组成部分编写独立的程序,然后集成在一起工作。这个过程需要使用一门编程语言。实现包括编码、自我测试、以及调试(在代码中寻找错误,称为调试)。

  • 测试确保代码符合需求规范,并且排除错误。通常由一个没有参与产品设计和实现的独立软件工程团队完成这样的测试。当实现好程序之后。使用一些样例输人数据并且验证输出是否正确。— 些问题将涉及许多问题,需要设计覆盖所有可能情况的数据。

  • 部署使得软件可以被使用。按照软件类型的不同,可能被安装到每个用户的机器上,或者安装在一个 Internet 可访问的服务器上 。

  • 维护是对软件产品进行更新和改进。软件产品必须在一直演化的环境中连续运行和改进。这要求产品的周期性改进,以修正新发现的错误,并且将更改集成到产品中。

在软件开发生命周期的任何阶段都有可能回到之前的阶段改正错误,或者处理其他可能阻止软件按所设想的发挥功能的问题。

注意: 在分析过程中,你可能发现如果要获得输出,有些输入不充分,或者有些值不是必需的。如果这样,可以回过头来修改需求规范。

注意: 实际应用中,将和来自各个方面的客户一起工作。可能没有(或者不需要有)这些领域的完整知识。因此,不需要知道这些公式是如何推导的,需要和客户交流并且理解一个数学模型是如何对系统起作用的。

提示: 系统设计阶段确定了多个步骤。通过一次加入一个步骤,从而对这些步骤进行增量式的编程和测试。这个方法使得查明问題以及调试程序变得更加容易。

常见错误和陷阱

常见的基础编程措误经常涉及未声明变量、未初始化变量、整数溢出、数值取整错误,以及超出预期的整数除法。

常见错误 1 :未声明、未初始化的变置和未使用的变量

  • 变量必须在使用之前声明为一个类型并且赋值。一个常见的错误是没有声明变量或者初始化一个变量。
  • 如果声明了一个变量,但是没有在程序中用到,将是一个潜在的编程错误。因此,应该从程序中将未使用的变量移除。
  • 使用诸如 Eclipse 和 NetBeans 这类 IDE ,将收到关于未使用变量的警告消息。

常见错误 2 :整数溢出

  • 数字以有限的位数存储。当一个变量被赋予一个过大(以存储大小而言的值),以至无法存储该值,称为溢出。
  • Java 不会给出关于溢出的警告或者错误。因此,当处理一个与给定类型的最大和最小范围很接近的数值时,要特别小心。
  • 如果存储的浮点数很小(很接近于0),这会引起向下溢出。Java 会将它近似为 0 。一般情况下不用考虑向下溢出的问题。

常见错误 3 :取整错误

  • 一个取整错误,也称为凑整错误,是在计算得到的数字的近似值和确切的算术值之间的不同。一个变量保存的位数是有限的,因此取整错误是无法避免的。
  • 涉及浮点数的计算都是近似的,因为这些数没有以准确的精度来存储。
  • 整数可以精确地存储。因此,整数计算得到的是精确的整数运算结果。

常见错误 4 :超出预期的整数除法

  • Java 使用同样的除法操作符来执行整数和浮点数的除法。
  • 当两个操作数是整数时,除法操作符执行一个整数除法,操作的结果是整数,小数部分被截去。
  • 要强制两个整数执行一个浮点数除法时,将其中一个整数转换为浮点数值即可。

常见陷阱:冗余的输入对象

  • 不需要为每个输入编写代码创建多个输入对象。这样虽然代码没有出错,但是效率低。而且创建多个不必要的输人对象,可能会导致一些不易发现的错误。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值