Java程序设计基础入门指南

计算机程序(Computer program),也称为软件(software),简称程序(Program)是指一组指示计算机或其他具有信息处理能力装置每一步动作的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。就跟我们日常生活中做饭一样,一道菜的完成需要从买菜,洗菜,炒菜,出锅等步骤完成。
程序:为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合,通过程序实现人机对话的过程

进制转换

什么是二进制

二进制是计算技术中广泛采用的一种数制。二进制数据是用 0 和 1 两个数码来表示的数。它的基数为 2,进位规则是 “逢二进一”,借位规则是 “借一当二”,由 18 世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用 “开” 来表示 1,“关”来表示 0。 [百度百科]

特点

优点

数字装置简单可靠,所用元件少;
只有两个数码 0 和 1,因此它的每一位数都可用任何具有两个不同稳定状态的元件来表示;
基本运算规则简单,运算操作方便。

缺点

用二进制表示一个数时,位数多。因此实际使用中多采用送入数字系统前用十进制,送入机器后再转换成二进制数,让数字系统进行运算,运算结束后再将二进制转换为十进制供人们阅读。

采用原因
  1. 技术实现简单,计算机是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用 “1” 和“0”表示。
  2. 简化运算规则:两个二进制数和、积运算组合各有三种,运算规则简单,有利于简化计算机内部结构,提高运算速度。
  3. 适合逻辑运算:逻辑代数是逻辑运算的理论依据,二进制只有两个数码,正好与逻辑代数中的 “真” 和“假”相吻合。
  4. 易于进行转换,二进制与十进制数易于互相转换。
  5. 用二进制表示数据具有抗干扰能力强,可靠性高等优点。因为每位数据只有高低两个状态,当受到一定程度的干扰时,仍能可靠地分辨出它是高还是低。
为什么不采用电压高低来模拟十进制

因为电阻受热后会发生改变,导致电压不稳,造成存储的数据不确定性。

代码实现十进制转二进制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class toBinary {
//定义用于连接余数的字符串。
private static String s = "";
public static void IntToBinary(int num){
//当num等于1的时候,是最后一位数。
while(num >= 1){
s = num % 2 + s;
num = num / 2;
}
System.out.println(s);
}
}
public class toBinaryTest{
public static void main(String[] args){
//用十进制129测试一下这个类
toBinary.IntToBinary(129);
}
}

程序,软件和计算机语言的关系

  • 可以被计算机连续执行的指令集合称为计算机程序
  • 软件是为了完成某些特定功能而编写的一到多个程序文件的集合
  • 计算机语言是人们发明的可以和计算机进行沟通交流的一种工具

计算机语言的分类

  • 机器语言

    • 计算机唯一能接受和执行的语言
    • 由二进制组成
    • 每一串二进制称为一条指令,一条指令规定了计算机执行的一个动作
    • 一台计算机所能懂的指令的全体,叫做这个主计算机的指令系统
    • 不同型号的计算机的指令系统不同
      特点
    1. 编写出来的程序全部都是由 0 和 1 组成‘
    2. 计算机可以直接识别。
    3. 机器语言对不同型号的计算机一般不同,所以又被称为面向机器的语言
      缺点
      • 指令难以记忆。
      • 代码实现复杂,开发周期长
      • 不便于推广,交流,合作。
      • 严重的依赖具体的计算机,可移植性差,重用性差。
  • 汇编语言

    • 用助记符表示指令功能的计算机语言
    • 汇编语言编写的代码计算机无法直接识别
  • 高级语言

    • 与自然语言现金并为计算机所接受和执行的计算机语言

翻译程序

计算机并不能直接地接受和执行用高级语言编写的源程序, 源程序在输入计算机时, 通过 “翻译程序” 翻译成机器语言形式的目标程序, 计算机才能识别和执行。
翻译分成了两种形式

  • 编译
    • 编译型语言的首先将源代码编译生成机器语言,再由机器运行机器码(二进制)。像 C/C++ 等都是编译型语言。
  • 解释
    • 解释性语言在运行程序的时候才翻译,比如解释性 java 语言,专门有一个解释器能够直接执行 java 程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。

算法

算法:解决问题的具体方法和步骤
例如:
计算长方形的面积

  1. 接收用户输入的长方形长度和宽度两个值;
  2. 判断长度和宽度的值是否大于零;
  3. 如果大于零,将长度和宽度两个值相乘得到面积,否则显示输入错误;
  4. 显示面积。

算法的基本特征

有穷性:一个算法必须在执行有限个操作步骤后终止。
确定性:算法中每一步的含义必须是确切的,不可出现任何二义性。
有效性:算法中的每一步操作都应该能有效执行,一个不可执行的操作是无效的。例如,一个数被 0 除的操作就是无效的,应当避免这种操作。
有零个或多个输入:这里的输入是指在算法开始之前所需要的初始数据。这些输入的多少取决于特定的问题。
有一个或多个输出:所谓输出是指与输入有某种特定关系的量,在一个完整的算法中至少会有一个输出。例如,要计算从 1 累加到 100,如果这个程序没有输出结果,那么它将变得毫无意义。

程序设计的五个步骤

  • 分析
    • 清楚业务流程(做什么)
    • 清楚输入输出要求(已知什么 & 要得到什么)
    • 清楚开发期限
  • 设计
    • 优秀的程序在开发前以及开发中,都要精心设计
    • 对于程序员而言,最重要的是确立算法。(怎么做)
    • 在编程之前,应该先设计一下。试图不遵循设计而编写程序,就好像没有房屋平面图就建造房屋,我们无法确定最终会做成什么样子。
  • 编码实现
    • 编写源代码
    • 将原代码编译成字节码
    • 让计算机运行我们的程序
  • 调试
    • 程序中最易出现的几种不同类型错误是语法错误、逻辑错误和运行错误。
  • 维护

用 java 实现猜数字

第一种

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* @describe 猜数字 用户给出的数字跟电脑随机给出的数字对比,
* 知道猜中为止。最后给出猜数的次数。
*/
import java.util.Scanner;

class GuessNumber{
public static void main(String[] args) {
int count = 0;
int num = (int)(Math.random()*100)+1;
System.out.println(num);
Scanner sc = new Scanner(System.in);
int user ;
while(true){
System.out.println("请输入你猜的数字");
user = sc.nextInt();
count++;
if(num > user) {
System.out.println("小了");
}else if(num < user){
System.out.println("大了");
}else{
System.out.println("猜中了");
break ;
}
}
if(count <= 5)
System.out.println("天才猜了 "+ count+ " 次");
else
System.out.println("笨蛋猜了 "+ count+ " 次");
}
}

第二种

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/**
* @describe 猜数字改进版 让计算机帮我们猜数字
* 实现:1.随机给出一个1到100的数字
* 2.定义一个数组,里面存放从1到100的数字
* 3.在数组中用二分法查找这个值
*/

class GuessNumber2 {
//二分法查找法(折半查找)
public static int checkNumber(int[] arr, int a ) {
//low指向数组的低位
int low = 0;
//指向数组的中间
int middle;
//hight指向数组的高位
int hight = arr.length - 1;
//次数
int count = 0;
//当指向低位的low大于指向高位的hight时,说明
while(low <= hight) {
count++;
middle = (low + hight) / 2;
if(a > arr[middle]){
System.out.println("第 "+count+" 次查找的数字为 "+arr[middle]);
//如果计算机找出的值比随机值小,就应该在数组的后半部分去查找。
low = middle + 1;
}

else if(a < arr[middle]) {
System.out.println("第 "+count+" 次查找的数字为 "+arr[middle]);
//如果找出的值比随机数大,则在数组的前半部找。
hight = middle - 1 ;
}

//如果arr[middle] == a ,则找到了随机数。
else {
System.out.println("查找了 "+ count +" 次");
return arr[middle];
}
}
return -1 ;
}
}
public class GuessNumberTest {
public static void main(String[] args) {
//给出一个1到100的随机数
int a = (int)(Math.random() * 100) + 1;
System.out.println("计算机随机给出的值:" + a);
//定义一个数组,存放1到100的数字
int[] arr = new int[100];
for(int i = 0 ;i < arr.length ;i++) {
arr[i] = i + 1;
//System.out.println(arr[i]);
}
int value = GuessNumber2.checkNumber(arr,a);
if ( value != -1)
System.out.println("计算机猜到随机数的值= "+ value );
else
System.out.println("未猜到");

}
}