Java随笔记录第二章:输入输出&流程控制


前言

所有编程语言里流程控制都是最关键的一点,流程控制是实现算法的基础,无论多复杂的程序,归到底层都是由基本的流程控制语句来辅助实现的。完全掌握了流程控制对后期的学习会有极大的帮助。而在前期的学习过程中,输入输出语句更多是协助进行代码测试时使用的 。为了方便后续代码的编写本文将先介绍完输入输出后再进行流程控制的介绍
毕竟这年头基本上命令行程序挺少见了……

一、输入输出

1、输出

输出相对于输入会简单很多,而且大部分的测试都是以输出结果来进行判断所以将优先介绍输出。

废话不多说,直接搂代码先:

/**
 * @author Silence_Lurker潜默
 */
public class App{
	public static void main(String[] args){
		System.out.println("Hello World!");	// 没错,是各位最喜闻乐见的Hello World
		return;
	}
}

Java比较常见的几个输出方法为:

System.out.println();	// 和print方法不同的地方在于输出完内容后自动换行,根据情况自行决定使用哪一个就好。
System.out.print();
System.out.printf();	// 和C一样的printf方法,用法也一样,就不做过多解释了。

// 以下为System.err中的方法,和out对象类似,但输出的文字为红色表示为错误信息(如果你希望一些信息更加引人注目些可以考虑使用,并不一定非得在有报错时使用。)

System.err.println();
System.err.print();
System.err.printf();

在部分编辑器中可以通过sysout来快速补全System.out.println()方法。

2、输入

在Java中,通过命令行获取输入相对于C来说会麻烦一点,但是随着后续的学习和对面向对象编程的思想的理解,会更容易理解和接受。
在Java中,获取命令行内容的输入是通过Scanner类实现的,代码如下:

import java.util.Scanner;	// 从java.util包内导入 Scanner 类

/**
 * @author Silence_Lurker潜默
 */
public class App{
	public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        // 实例化一个Scanner类对象,这里还不需要深入了解System.in的具体含义。感兴趣可以自行搜索一下。
        System.out.print("请输入一个人名:");
        String name = sc.next();
        sc.nextLine();
        // 用于消除掉行位的换行符。
        System.out.print("请输入想对Ta说的真心话:");
        String secret = sc.next();
        sc.nextLine();
        // 用于消除掉行位的换行符。
        System.out.println(name + ",我想对你说:" + secret);

        sc.close();
        // 记得关闭sc,平时可能感觉不明显,但是在实际开发中为了安全性考虑记得随手加上。
        return;
	}
}

相对应的,Scanner类对象还有nextInt(),nextShort(),nextLong()之类的方法。根据所需要的数据内容选择相应的方法进行数据的获取即可。
注意一点,Scanner类对象在关闭之前可以一直使用以进行获取,若关闭则需重新实例化一个对象。(当初一堆人刚学习的时候为了获取一个数据,用循环玩了命的实例化Scanner对象,基本上一个变量一个Scanner类对象……用循环的还算不错,还有几个大聪明一个变量实例化一个,能想那么多名字也是不容易……


以上就是输入输出的基础了。


二、流程控制

1、条件语句

if else语句

if是最常见的的条件语句,具体使用方式如下:

import java.util.Random;

/**
 * @author Silence_Lurker
 */
public class App{
    public static void main(String[] args) {
        int r = new Random().nextInt();
		// 实例化一个随机类匿名对象随机获取一个整型数据

        if (r % 2 == 0) {
            System.out.println("随机数为偶数");
        } else {
            System.out.println("随机数为奇数");
        }
    }
}

如上,会根据if内的布尔型表达式判断是否执行,需要注意一个关键点,在C/C++中这个问题会更加明显,但是Java会相对好一些。即数据不能连续进行比较。如下例:

import java.util.Random;

/**
 * @author Silence_Lurker
 */
public class App{
    public static void main(String[] args) {
        int r = new Random().nextInt();

        if (1 <= r <= 2) {
        // 此处会报错:The operator <= is undefined for the argument type(s) boolean, int
        // 意为:你不能将int型数据和boolean型数据进行比较。
            // TODO:在[1,2]区间内
        } else {
            // TODO:其他情况
        }
    }
}

这里提一个知识点,在C语言中所有数据都是可以直接转成数值表达的,在C语言中布尔型数据true表示1,false表示0,非布尔型数据则是根据是否为0判断是否为真,在C语言中这种写法不会报错,但无论r的值为多少都会认为在[1,2]的区间里。因为1<=r无论是否为真都小于2(无论true(1)还是false(0)都是小于2的)。
在Java中只有同类型数据可以进行比较避免了这种问题的发生。所以在判断一个数是否存在于另外两个数据之间会相对麻烦一点,代码如下:

import java.util.Random;

/**
 * @author Silence_Lurker
 */
public class App{
    public static void main(String[] args) {
        int r = new Random().nextInt();

        if (1 <= r && r <= 2) {
            // TODO:在[1,2]区间内
        } else {
            // TODO:其他情况
        }
    }
}

这里我们要明确两个逻辑运算符:||和&&

||(逻辑或)

如同字面意思,使用方法:
[布尔型表达式1]||[布尔型表达式2]
逻辑或的意思即表达式1或表达式2中只要有任意一个表达式为真,即整个表达式为真。

&&(逻辑与)

和逻辑或相似,使用方法:
[布尔型表达式1]&&[布尔型表达式2]
逻辑与的意思即只有表达式1和表达式2均为真,整个表达式才为真。(也就是说只要有任意一个为假,则整个表达式为假。)

!(逻辑非)

和另外两个逻辑运算符不同,此为单目运算符,使用方法如下:
![布尔型表达式]
逻辑非也如其字面意思,即表达式本身为真时整个表达式为假,若表达式本身为假则整个表达式为真。

if else if…else语句

和if else相似,即一堆if else嵌套使用,如下:

import java.util.Random;

/**
 * @author Silence_Lurker
 */
public class App{
    public static void main(String[] args) {
        int r = new Random().nextInt();

        if (r <= 1) {
            System.out.println("小于等于1");
        } else 
        	if (r <= 2) {
            	System.out.println("小于等于2");
        	} else 
        		if (r <= 3) {
            		System.out.println("小于等于3");
        		} else {
            		System.out.println("大于3");
        		}
    }
}

若将所有的括号补全则会变成这样

import java.util.Random;

/**
 * @author Silence_Lurker
 */
public class App{
    public static void main(String[] args) {
        int r = new Random().nextInt();

        if (r <= 1) {
            System.out.println("小于等于1");
        } else {
        	if (r <= 2) {
            	System.out.println("小于等于2");
        	} else {
        		if (r <= 3) {
            		System.out.println("小于等于3");
        		} else {
            		System.out.println("大于3");
        		}
        	}
        }
    }
}

这是按照代码所属关系进行缩进得到的结果,但是这样缩进很难看出来代码条件间的相关性,若对代码本身进行优化则得到以下缩进结果

import java.util.Random;

/**
 * @author Silence_Lurker
 */
public class App{
    public static void main(String[] args) {
        int r = new Random().nextInt();

        if (r <= 1) {
            System.out.println("小于等于1");
        } else if (r <= 2) {
            System.out.println("小于等于2");
        } else if (r <= 3) {
            System.out.println("小于等于3");
        } else {
            System.out.println("大于3");
        }
    }
}

代码的可读性会提高且更加美观。

switch语句

switch相对更适合顺序分级式处理,如下:

import java.util.Random;

/**
 * @author Silence_Lurker
 */
public class App{
    public static void main(String[] args) {
        int r = new Random().nextInt(4);

        switch(r){
        case 3:
            System.out.println("等于3");
            break;
        case 2:
            System.out.println("等于2");
            break;
        case 1:
            System.out.println("等于1");
            break;
        default:
            System.out.println("4!");
		}
    }
}

若无break语句截止则会自动向下执行,无论是否符合条件,但利用这个特性也可以优化代码。

循环语句

while循环和for循环是最常使用的循环,只要了解到一定程度后两者可以随意替换,看个人爱好吧(Java中增加了foreach用法,可以理解为增强型for循环,后面的内容中会讲)。

while循环

最常见的循环之一,用法如下:

/**
 * @author Silence_Lurker
 */
public class App{
    public static void main(String[] args) {
        int sum = 1;

        while (sum < 10) {
            sum *= (sum + 1);
            // 随手写的个玩意,没细考虑啥意思
        }
    }
}

其中sum<10即循环条件,当循环条件为真时则执行一次循环。
注意,最好结束循环的条件和循环本身绑定,或多线程开发中循环条件为某布尔型变量,随变量的改变结束线程。一定要保留好结束循环的节点,否则会卡成死循环。

do…while循环

和while循环类似,用法如下:

/**
 * @author Silence_Lurker
 */
public class App{
    public static void main(String[] args) {
        int sum = 1;
		do{
            sum *= (sum + 1);
            // 随手写的个玩意,没细考虑啥意思
        }while (sum < 10);
    }
}

和while循环的区别在于while循环是先判断后执行,do…while为先执行后判断,即不符合循环条件也先执行一次循环的操作内容(然后有的人就寻思利用do让不符合的条件强行符合?主动死循环?

相比while和for循环do…while使用频率相对较少。

for循环

for循环相对来说会更节约代码量,且很容易取代while循环。
代码如下:


/**
 * @author Silence_Lurker
 */
public class App {
    public static void main(String[] args) {
		// 举个例子求1~100的和
		int sum = 0;
		for(int i = 0 ; i < =100 ; i++){
			sum += i;
		}
		System.out.print("1~100的和为:" + sum);
    }
}

同样的功能用while写则为:

/**
 * @author Silence_Lurker
 */
public class App {
    public static void main(String[] args) {
		// 举个例子求1~100的和
		int sum = 0;
		int i = 0;
		while(i < =100){
			sum += i;
			i++;
		}
		System.out.print("1~100的和为:" + sum);
    }
}

其中区别在于for循环可以直接在行内声明一个局部变量,也就是说变量i的声明周期仅存在于for循环内,离开for循环后,变量名i又被释放,可以再次利用(虽然并不推荐这样使用就是了……个人并不推荐 )且仅需一行就可以实现while三行才能实现的功能。但相对应如果只需要进行单个独立条件的判断的话while循环更加实用。
在后期学到数组需要通过循环来进行数据下标操作时for循环会更加实用。

foreach循环(强化型for循环)

其实个人感觉并不适合叫做强化型for循环,因为这种方法进行循环获取的数据是只读的,而且主要应用于数组。用法如下:

/**
 * @author Silence_Lurker
 */
public class App {
    public static void main(String[] args) {
    	int i[] = {1,2,3,4,5,6,8,9};

		for(int j : i){
			System.out.print(j + ",");
		}
    }
}

具体用法就是for([数据类型] [变量名] : [数组名])
这个方法的变量名也是局部变量且数据为只读,其中各种操作都不会改变原数据的内容。在仅需要对数据进行获取的情况下相对可以节约代码量。

总结

以上就是今天要讲的内容,本文简单Java的流程控制语句和基础输入输出操作。对流程控制的理解和应用的熟练在后期学习算法的时候会有很大的帮助(应该吧……

祝各位Java的学习能够轻松愉快。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silence_Lurker 潜默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值