java输出流
常用输出语句
System.out.println();//换行打印,输出之后会自动换行
System.out.print();//不换行打印
System.out.printf();//按格式输出
java输入流:Scanner类
从键盘获取不同类型的变量
具体实现步骤
-
导包:import java.util.Scanner;
-
Scanner的实例化:Scanner scan = new Scanner(System.in);
-
调用Scanner类的相关方法(next() / nextXXX()),来获取指定类型的变量
- 对于char型的获取,Scanner没有提供相关的方法,只能获取一个字符串
注意:
需要根据相应的方法,来输入指定类型的值,如果输入的数据类型与要求的类型不匹配时,会报异常:InputMisMatchException,导致程序终止。
import java.util.Scanner; public class test { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入您的姓名:"); String name = scan.next(); System.out.println("请输入您的年龄:"); int age = scan.nextInt(); System.out.println("请输入您的体重:"); double weight = scan.nextDouble(); System.out.println("您是否单身:(true / false)"); boolean isLove = scan.nextBoolean(); System.out.println("请输入您的性别:"); String gender = scan.next(); char genderChar = gender.charAt(0);//获取索引为0的字符 System.out.println("您的姓名是:" + name); System.out.println("您的年龄是:" + age); System.out.println("您的体重是:" + weight); System.out.println(isLove); System.out.println("您的性别是:" + genderChar); } }
if else 语句
else结构是可选的
针对条件表达式
- 互斥
- 交集
- 包含
如何获取一个随机数
double value = Math.random() * 100;//[0.0],[1.0) --> [0.0],[100.0)
double value = Math.random() * 90 + 10;//[0.0],[1.0) --> [0.0],[90.0) --> [10.0],[100.0)
int value = (int)Math.random() * 90 + 10;//[0],[1) --> [0],[90) --> [10],[99]//强制转换
公式
//[a,b] : (int)(Math.random() * (b - a + 1) + a)
switch-case语句
/*switch(表达式){
case 常量1:
执行语句1;
//break;
case 常量2:
执行语句2;
//break;
......
default:
执行语句n;
//break;
}
*/
说明
-
根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或此switch-case结构末尾结束为止。
-
break可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出。
-
switch结构中的表达式只能是如下六种数据类型之一:byte 、 short 、 char 、 int 、 枚举类型 、 String类型
-
case后只能声明常量,不能声明范围。
-
break关键字是可选的
-
default相当于if-else中的else,default是可选的而且位置是灵活的一般放在最后一个
-
凡是可以使用switch-case的结构,都可以转变为if-else。反之不成立。
循环结构
循环语句的四个组成部分
初始化部分(init_statement)
循环条件部分(text_exp) -->boolean类型
循环体部分(body_statement)
迭代部分(alter_statement)
for循环结构
/*
for(初始化 ; 循环条件 ; 迭代条件)
{
循环体;
}
*/
while循环结构
/*
while(循环条件)
{
循环体;
迭代条件;
}
*/
说明
写while循环千万不要丢了迭代条件,丢了可能导致死循环
算法具有有限性
避免出现死循环
- for 和 while 可以相互转换
do-while循环结构
/*
初始化;
do
{
循环体;
迭代条件;
}while(循环条件);
*/
最简单的“无限”循环
//while(True)
//for(;;)
//结束循环的方式:
// 循环条件部分返回false
// 在循环体中执行break
无限循环存在的意义是:并不知道循环多少次,需要根据循环体内部某些条件,来控制循环的结束。
循环嵌套的使用
说明
外层循环控制行数,内层循环控制列数
算法的优化检测 一个小玩意
long start = System.currentTimeMillis();//获取当前时间距离1970-01-01 00:00:00的毫秒数
.......
....
long end = System.currentTimeMillis();//获取当前时间距离1970-01-01 00:00:00的毫秒数
System.out.println("所花费时间为:" + (end - start));//此算法所需时间
小题:输出100000内的质数(算法优化)
代码
public class demo7 {
public static void main(String[] args) {
boolean isFlag = true;
long start = System.currentTimeMillis();
int cout = 0;
for (int i = 2; i < 100000; i++)
{
for (int j = 2; j < Math.sqrt(i); j ++)
{
if (i % j == 0)
{
isFlag = false;
break;
}
}
if (isFlag)
{
//System.out.println(i);
cout++;
}
isFlag = true;
}
long end = System.currentTimeMillis();
System.out.println("质数个数:" + cout);
System.out.println("所花费时间为:" + (end - start) + "毫秒");
//未优化14171 没有break
//优化1后1511 加上break
//优化2后124 加上break和根号
//优化3后17 加上break和根号 取消输出质数
}
}
break和continue使用上的比较
break一般
但是break可以
public class demo8 {
public static void main(String[] args) {
label:for (int i = 1; i <= 4; i++)
{
for (int j = 1; j <= 10; j++)
{
if ( j % 4 == 0)
{
break label;//结束指定标识的一层循环结构
}
System.out.print(j);
}
System.out.println();
}
}
}
利用continue进行算法优化
public class 算法优化 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
int cout = 0;
label:for(int i = 2; i < 100000; i++)
{
for(int j = 2; j < Math.sqrt(i);j++)
{
if (i % j == 0)
{
continue label;
}
}
cout ++;
}
long end = System.currentTimeMillis();
System.out.println("质数个数:" + cout);
System.out.println("计算时长:" + (end - start) + "毫秒");
}
}