第二章 基本程序设计

第二章 基本程序设计

2.1 引言

本章的重点是学习程序设计基础技术、以进行问题求解。

2.2 编写简单的程序

下面我们求一个简单的问题。

问题:计算圆的面积。

解决思路:

对于本问题我们显然知道,圆的面积等于半径的平方,即: s = π ∗ r ∗ r s = \pi * r * r s=πrr

具体步骤:

  • 读入半径。
  • 通过面积公式计算。
  • 输出面积。

具体代码如下:

package com.Javabook.Demo; //所在包名

import java.util.Scanner; //Scanner类

public class P30_circle_area { //类名
    public static void main(String[] args) { //程序主入口
        Scanner sc = new Scanner(System.in); //创建 Scanner 对象,名为sc
        System.out.print("请输入圆的半径:"); //输出语句,输出“请输入圆的半径:”这句话
        double r = sc.nextDouble(); //将读入的半径赋值给r
        double area = Math.PI * r * r; //将计算的结果复制给area
        System.out.println(area); //输出area
    }
}

2.3 从控制台读取输入

Java使用System.out来表示标准输出设备,用System.in来表示标准输人设备。

默认情况下,输出设备是显示器,而输入设备是键盘。

为了完成控制台输出,只需使用println方法在控制台上显示基本数据类型值或字符串。

为了获得控制台输入,可以使用Scanner类创建一个对象,以读取来自System.in的输人,如下所示:

Scanner input = new Scanner(System.in);

语法new Scanner(System.in)表明创建了一个Scanner类型的对象。

语法Scanner input声明input是一个Scanner类型的变量。

整行的Scanner input=new Scanner(System.in)表明创建了一个Scanner对象,并且将它的引用值赋值给变量input

对象可以调用方法,调用对象的方法就是让这个对象执行某个任务。

下面是调用nextDouble()方法来读取一个double值:

double r = input.nextDouble();

该语句实现了从键盘读入一个数值,并且将其赋给r。

我们现在看下面这句代码。

import java.util.Scanner;

这句代码的作用是调用名为Scanner的类,而Scanner类在java.util包中。

因为我们导入这个类,所以我们可以直接调用。

如果我们不想通过这句代码来声明,但是仍然想使用Scanner类,那就需要在执行Scanner input = new Scanner(System.in);更改为java.util.Scanner input = new java.util.Scanner(System.in);可以起到同样的效果,其实本质是一样的,无非是一个提前进行全局声明,一个在调用时声明。

2.4 标识符

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

在程序设计术语中,类名、变量名等形如这样的命名称为标识符(identifer)所有的标识符必须遵从以下规则:

  • 标识符是由字母、数字、下划线(_)和美元符号($)构成的字符序列。

  • 标识符必须以字母、下划线(_)或美元符号($)开头,不能以数字开头。

  • 标识符不能是保留字(保留字列表参见下图)。保留字在Java语言中具有特定含义。关键字是保留字。

    请添加图片描述

  • 标识符可以为任意长度。

注意:由于Java是区分大小写的,所以area、Area和AREA是不同的标识符。

提示:标识符用于命名程序中的变量、方法、类和其他项。具有描述性的标识符可提高程序的可读性。避免采用缩写作为标识符,使用完整的词汇会更具有描述性。

提示:不要用字符$命名标识符。习惯上,字符$只用在机器自动产生的源代码中。

2.5 变量

变量用于表示在程序中可能被改变的值。

变量用于存储程序中后面要用到的值。它们被称为变量是因为他们的值可以被改变。

下面定义了三个变量,形如下面的式子,便是定义变量,在定义变量时可以赋值也可以不赋值。

int count; //定义一个名为count的int型变量。
double radius; //定义一个名为radius的double型变量。
double interestRate = 2; //定义一个名为interestRate的double型变量。

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

2.6 赋值语句和赋值表达式

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

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

variable = expression;

表达式(expression)表示包含值、变量和操作符的一次计算,它们组合在一起得出一个新值。

注意:在数学运算中, x = 2 ∗ x + 1 x=2*x+1 x=2x+1表示一个等式。但是,在Java中, x = 2 ∗ x + 1 x=2*x+1 x=2x+1是一个赋值语句,它计算表达式 2 ∗ x + 1 2*x+1 2x+1的值,并且将结果赋给x。

2.7 命名常量

命名常量是表示不变值的标识符。

变量的值在程序执行过程中可能会发生变化,但是命名常量(named constant,或简称常量)则表示从不改变的数据。Java中常量也称为final修饰的变量。例如,假设在程序中,π是一个常量。如果需要频繁使用,我们肯定不想重复地输人3.14159,替代方法就是声明一个常量π。下面就是声明常量的语法:

final datatype CONSTANTNAME = value;

例如声明一个常量π,我们用PI来代表π,声明如下:

final double PI = 3.14159

必须在同一条语句中对常量进行声明和赋值。单词final是声明常量的Java关键字。习惯上常量中的所有字母都大写。

使用常量有三个好处

  1. 当一个值多次使用的时候,不必重复输人;
  2. 如果必须修改常量值(例如,将P的值从3.14改为3.14159),只需在源代码中的一个地方做改动;
  3. 给常量赋一个描述性名字会提高程序易读性。

2.8 命名习惯

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

下面列出了命名变量、常量、方法和类的约定:

  • 使用小写字母命名变量和方法,例如,变量radius和area以及方法print。如果一个命名包含多个单词,就将它们连在一起,第一个单词的字母小写,而后面每个单词的首字母大写。例如,变量numberOfStudents。这种命名风格称为驼峰命名法,因为名字中的大写字符类似于骆驼的驼峰。
  • 类名中的每个单词的首字母大写。例如,类名ComputeArea和System。
  • 常量中的所有字母大写,两个单词间用下划线连接,例如,常量P和常量MAX_VALUE。

警告:命名类时不要选择Java库中已经使用的名称。例如,因为Java已定义了 System类,就不要用System来命名自己的类。

2.9 数值数据类型和操作

Java针对整数和浮点数有六种数值类型,以及+-*/、和%等操作符。

每个数据类型都有它的取值范围。编译器会根据每个变量或常量的数据类型为其分配内存空间。Java为数值、字符和布尔值数据提供了八种基本数据类型。

下图列出了六种数值数据类型及其范围和存储空间

请添加图片描述

请添加图片描述

IEEE 754是美国电气电子工程师协会通过的标准,用于在计算机上表示浮点数。该标准已被广泛采用。

  • Java使用四种类型的整数:byte、short、int和long。
  • Java使用两种类型的浮点数:float和double。double型的大小是float型的两倍。所以,double又称为双精度(double precision),而float称为单精度(single precision)。

2.9.1 从键盘读取数值

实际上,在Java中我们读取数值是通过Scanner对象来读取的,下表中的方法可以读取byte、short、int、long 以及 float 类型的数值。

请添加图片描述

下面是从键盘上读取各种类型数值的例子:

//创建一个名为input的Scanner对象
Scanner input = new Scanner(System.in);

//以下是四种方法
//==========================================
//byte型
System.out.print("Enter a byte value:");
byte byteValue =input.nextByte();

//short型
System.out.print("Enter a short value:");
short shortValue =input.nextShort();

//int型
System.out.print("Enter an int value:");
int intValue =input.nextInt();

//long型
System.out.print("Enter a long value:");
1ong 1ongValue =input.nextLong();

//float型
System.out.print("Enter a float value: ");
float floatValue =input.nextFloat();

double型我们前面已经展示过,这里不再展示。

请注意,形如语句System.out.print("Enter a datatypename value:");的句子可有可无,这里只是起到在控制台中提示输入的作用,没有这个句子也并不影响整体功能完整性。

2.9.2 数值操作符

下面是五个常用的数值操作符:

请添加图片描述

2.9.3 指数运算

使用方法Math.pow(a,b)来计算 a b a^b ab。pow方法定义在Java API的Math类中。运用语法Math.pow(a,b)可以调用该方法(比如,Math.pow(2,3)),并将返回结果 a b ( 2 3 ) a^b(2^3) ab(23)。这里,a和b是pow方法的参数,而数值2和3是调用方法时的真实值。比如:

System.out.println(Math.pow(23)); //Displays 8.0
System.out.println(Math.pow(40.5)); // Displays 2.0
System.out.println(Math.pow(2.52)); //Displays 6.25
System.out.println(Math.pow(2.5,-2)); // Displays 0.16

2.10 数值型字面值

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

2.10.1 整型字面值

只要整型字面值与整型变量相匹配,就可以将整型字面值赋值给该整型变量。如果字面值太大,超出该变量的存储范围,就会出现编译错误。例如:语句byte b=128就会造成一个编译错误,因为byte型变量存放不下128(注意:byte型变量的范围是-128~127)。

整型字面值默认是int型的,它的值在 − 2 31 -2^{31} 231(-2147483648)~ 2 31 − 1 2^{31}-1 2311(2147483647)。

为了表示一个1ong型的整型字面值,需要在其后加字母L或l(例如:2147483648L)。为了在Java程序中表示整数2147483648,必须将它写成2147483648L或者2147483648l,因为2147483648超出了int型的范围。推荐使用L,因为l(L的小写)很容易与1(数字1)混淆。

注意:默认情况下,整型字面值是一个十进制整数。要表示一个二进制整数字面值,在6数字前使用0b或者0B(零B):要表示一个八进制整数字面值,在数字前使用0(零);而要表示一个十六进制整数字面值,在数字前使用0x或0X(零x)。例如,

System.out.print1n(0B1111); // Displays 15
System.out.print1n(07777); //Displays 4095
System.out.printIn(0XFFFF); //Displays 65535

2.10.2 浮点型字面值

浮点型字面值带小数点,默认情况下是double型的。例如:5.0被认为是double型而不是float型。可以通过在数字后面加字母f或F表示该数为float型字面值,也可以在数字后面加d或D表示该数为double型字面值。例如:可以使用100.2f或100.2F表示float型值,用100.2d或100.2D表示double型值。

注意:double型值比float型值更精确。float型值有6~9个有效数字,double型值有15~17个有效数字。

2.10.3 科学记数法

浮点型字面值也可以用 a ∗ 1 0 b a*10^b a10b形式的科学记数法表示,例如,123.456的科学记数法形式是 1.23456 ∗ 1 0 2 1.23456*10^2 1.23456102,0.0123456的科学记数法是 1.23456 ∗ 1 0 − 2 1.23456*10^{-2} 1.23456102。一种特定的语法可以用于表示科学记数法的数值。例如, 1.23456 ∗ 1 0 2 1.23456*10^2 1.23456102可以写成1.23456E2或者1.23456E+2,而 1.23456 ∗ 1 0 − 2 1.23456*10^{-2} 1.23456102等于1.23456E-2。E(或e)表示指数,既可以用大写字母也可以用小写字母。

注意:float型和double型都用来表示带有小数点的数。为什么把它们称为浮点数呢?因为这些数在计算机内部都是以科学记数法的形式进行存储的。当一个像50.534的数被转换成科学记数法的形式时,它就是5.0534E+1,它的小数点移到(即浮动到)一个新的位置。

2.12 表达式求值和操作符优先级

Java表达式的求值和数学表达式求值是一样的。仅写法上有些许差别而已。

下面是操作符的优先级,请牢记:

请添加图片描述

2.13 示例学习:显示当前时间

需求:开发一个以GMT(格林尼治标准时间)来显示当前时间的程序,以小时:分钟:秒的格式来显示,例如13:19:08。

思路可以通过调用System.currentTimeMills()返回当前时间。

具体实现

package com.Javabook.Demo;

public class P48_currentTime {
    public static void main(String[] args) {
        //currentTimeMillis()返回从GMT 1970年1月1日零点开始到当前时刻的毫秒数
        //通过时间戳获取当前的总毫秒数
        long totalMilliseconds = System.currentTimeMillis();
        //获取当前的总秒数
        long totalSeconds = totalMilliseconds / 1000;
        //获取目前的秒数
        long currentSecond = totalSeconds % 60;
        //获取当前的总分钟数
        long totalMinutes = totalSeconds / 60;
        //获取目前的分钟数
        long currentMinute = totalMinutes % 60;
        //获取当前的总小时数
        long totalHours = totalMinutes / 60;
        //获取目前的小时数
        long currentHour = totalHours % 24;
        //打印当前时间
        System.out.println("当前时间是:" + currentHour + ":" + currentMinute + ":" + currentSecond + " GMT");
    }
}

2.14 增强赋值操作符

常用增强赋值操作符如下:

请添加图片描述

2.15 自增和自减操作符

常用自增自减操作符如下:

请添加图片描述

2.16 数值类型转换

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

两个不同类型的操作数可以进行二元运算吗?

**当然可以。**如果在一个二元运算中,其中一个操作数是整数,而另一个操作数是浮点数,Java会自动地将整数转换为浮点值。因此 3 ∗ 4.5 3*4.5 34.5等同于 3.0 ∗ 4.5 3.0*4.5 3.04.5​。

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

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

请注意:将一个int型变量赋值给short型或byte型变量,必须显式地使用类型转换。否则就会产生编译错误。

2.18 示例学习:计算货币单位

需求:假如你希望开发一个程序,将给定的钱数转换为较小的货币单位。这个程序要求用户输人一个 double型的值,该值是用美元和美分表示的总钱数。然后输出一个清单,依次列出和总钱数等价的最大数量的dollar(1美元)、quarter(2角5分)、dime(1角)、nickel(5美分)和 penny(1美分)的数目,从而使得硬币数最少。

思路

  1. 提示用户输入一个十进制数作为总钱数,例如11.56。
  2. 将该钱数(例如11.56)转换为分币数(例如1156)。
  3. 通过将分币数除以100,求出美元数。通过对分币数除以100求余,得到剩余分币数。
  4. 通过将剩余的分币数除以25,求出2角5分币的数目。通过对剩余的分币数除以25求余,得到剩余分币数。
  5. 将剩余的分币数除以10,求出1角币的数目。通过对剩余的分币数除以10求余得到剩余分币数。
  6. 将剩余的分币数除以5,求出5美分的数目。通过对剩余的分币数除以5求余,得到剩余的分币数。
  7. 剩余的分币数就是1美分的数目。
  8. 显示结果。

具体实现

package com.Javabook.Demo;

import java.util.Scanner;

public class P58_ComputeChange {
    public static void main(String[] args) {
        //创建一个Scanner对象
        Scanner sc = new Scanner(System.in);
        //提示用户输入一个十进制数的总金额
        System.out.print("请输入总金额,例如:11.56: ");

        //获取总金额amount
        double amount = sc.nextDouble();

        //获取总美分数
        int numberOfOnePennies = (int) (amount * 100);

        //获取1美元数
        int numberOfOneDollars = numberOfOnePennies / 100;
        numberOfOnePennies = numberOfOnePennies % 100;

        //获取25美分数
        int numberOfQuarters = numberOfOnePennies / 25;
        numberOfOnePennies = numberOfOnePennies % 25;

        //获取10美分数
        int numberOfDimes = numberOfOnePennies / 10;
        numberOfOnePennies = numberOfOnePennies % 10;

        //获取5美分数
        int numberOfNickels = numberOfOnePennies / 5;
        numberOfOnePennies = numberOfOnePennies % 5;
		
		//输出结果
        System.out.println("你的总金额为 " + amount + " 美元");
        System.out.println("已经兑换如下:");
        System.out.println("  " + numberOfOneDollars + " dollars");
        System.out.println("  " + numberOfQuarters + " quarters");
        System.out.println("  " + numberOfDimes + " dimes");
        System.out.println("  " + numberOfNickels + " nickels");
        System.out.println("  " + numberOfOnePennies + " pennies");
    }
}

2.19 常见错误和陷阱

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值