1、Scanner的使用
- 需要这个包:import java.util.Scanner;
- 对于char型的获取,Scanner没有提供相应的方法,只能获取一个字符串
例如以下输入:nan 通过 gender.charAt(0)可得到第0个字符串。即 n
//Scanner的实例化
Scanner scanner = new Scanner(System.in);
System.out.println("请输入期末成绩:");
int score = scanner.nextInt();
if(score==100){
System.out.println("奖励一台BMW");
} else if (80<score &&score<=99) {
System.out.println("一台iphone");
} else if (60<=score && score<=80) {
System.out.println("一台ipad");
}else {
System.out.println("none");
}
//对于char型的获取,Scanner没有提供相关的方法,只能获取一个字符串
System.out.println("请输入你的性别(男或女)");
String gender = scanner.next();
char genderchar = gender.charAt(0); //获取索引为0位置上的字符
System.out.println(genderchar);
结果如下:
2、if-else的有关例题
2.1、彩票问题
说明:
- 需要用到Math.random()方法获得随机数,要想获得[a,b] 范围内的数,有公式:
(int) (Math.random()*(b-a+1)+a);
- 如何获得两位数的个位数和十位数?个位数需要 此两位数%10,十位数需要此两位数/10
- 后面根据题目,进行逻辑判断即可
public static void main(String[] args) {
//彩票问题
//如何获取一个随机数:10-99
int value = (int) (Math.random()*90+10);
System.out.println(value);
//公式:[a,b] : (int) (Math.random()*(b-a+1)+a);
//获得十位数以及个位数
int valueshi = value/10;
int valuege = value%10;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入两位数");
int num = scanner.nextInt();
int numshi = num/10;
int numge = num%10;
if(num == value){
System.out.println("奖金10000元");
}else if (valueshi == numge && valuege == numshi){
System.out.println("奖金3000元");
}else if(valueshi==numshi || valuege == valuege){
System.out.println("奖金1000元");
}else if(valueshi==numge || valuege == numshi){
System.out.println("奖金500元");
}else {
System.out.println("没中奖");
}
System.out.println("中将号码是" + value);
}
2.2、高富帅问题
说明:
- 这里需要用到equals方法来判断输入的字符串与给定字符串是否一样(即帅的是与否)shu
//高富帅问题
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("身高(cm):");
int height = scanner.nextInt();
System.out.println("金钱(千万):");
int money = scanner.nextInt();
/*System.out.println("帅吗(true/false):");
boolean face = scanner.nextBoolean();
if (height>180 && money>10000000 && face==true){
System.out.println("一定嫁");
} else if (height>180 || money>10000000 || face==true) {
System.out.println("勉强");
}else {
System.out.println("不嫁");
}*/
//方式二
System.out.println("帅吗(是/否):");
String face = scanner.next();
if (height>180 && money>10000000 && face.equals("是")){
System.out.println("一定嫁");
} else if (height>180 || money>10000000 || face.equals("是") ){
System.out.println("勉强");
}else {
System.out.println("不嫁");
}
}
3、Switch - case有关例题
说明:
- switch结构中的表达式,只能是如下的6种数据类型之一: byte . short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)
- case 之后只能声明常量,不能声明范围
- break关键字是可选的
- default相当于if-else结果中的else default结构是可选的。 default位置是灵活的
3.1对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。
- 可以通过成绩除60来进行简化,比60大则得到1,比60小则得到0
//对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。
public static void main(String[] args) {
/*Scanner scanner = new Scanner(System.in);
System.out.println("请输入成绩");
int score = scanner.nextInt();
switch (score/10){
case(0):
case(1):
case(2):
case(3):
case(4):
case(5):
System.out.println("不及格");
break;
case(6):
case(7):
case(8):
case(9):
case(10):
System.out.println("及格");
break;*/
//更优的解决方法
switch (score/60){
case (0):
System.out.println("不及格");
break;
case (1):
System.out.println("及格");
break;
}
3.2、从键盘分别输入年、月、日,判断这一天是当年的第几天
- 需要判断输入的年份是否是闰年来判断当前2月份有多少天(闰年有29天)
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入yaer:");
int year = scanner.nextInt();
System.out.println("请输入month:");
int month = scanner.nextInt();
System.out.println("请输入day:");
int day = scanner.nextInt();
int sumDays = 0;
switch (month){
case 12:
sumDays += 30;
case 11:
sumDays +=31;
case 10:
sumDays +=30;
case 9:
sumDays +=31;
case 8:
sumDays +=31;
case 7:
sumDays +=30;
case 6:
sumDays +=31;
case 5:
sumDays +=30;
case 4:
sumDays +=31;
case 3:
if((year % 4 ==0 && year % 100 !=0)|| year % 400 ==0) {
sumDays +=29;
}else {
sumDays +=28;
}
case 2:
sumDays +=31;
case 1:
sumDays +=day;
}
System.out.println(year + "年"+month + "月" + day + "是当年的第" + sumDays + "天");
}
4、for循环
4.1、输入两个正整数m和n,求其最大公约数和最小公倍数。比如:12和20的最大公约数是4,最小公倍数是60。
说明:
- 最大公约数需要取两个数中的较小值进行if操作(最大公约数比较小值小,但是比1大)
- 最小公倍数需要取两个数中较大的值(最小公倍数比较大值大,但是小于两数的积)
Scanner scanner = new Scanner(System.in);
System.out.println("输入第一个正整数");
int m = scanner.nextInt();
System.out.println("输入第二个正整数");
int n = scanner.nextInt();
//获取两个数中的较小值
int min = (m>=n)? n : m;
for (int i = min;i>=1;i--){
if(m % i ==0 && n % i ==0){
System.out.println("最大公约数为:" + i);
break;//
}
}
int max = (m>=n)? m: n;
for(int i = max;i<=m*n;i++){
if(i % m == 0 && i % n ==0){
System.out.println("最小公倍数为:" + i);
break;
}
}
4.2、输出所有三位水仙花数
水仙花数:水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
说明:
- 三位数取个位需要对10取余
- 三位数取十位数需要/10在对10取余
- 三位数取白位需要/10
public static void main(String[] args) {
for (int i = 100; i < 1000; i++) {
int j = i % 10; //个位
int k = i / 10 % 10; //十位
int l = i / 100; //百位
if (i==(j*j*j)+(k*k*k)+(l*l*l)) {
System.out.println("三位数的水仙花数有"+ i + " " );
}
}
}
4.3、编写程序从1循环到150,并在每行打印一个值,另外在每个3的倍数行,上打印出“foo",在每个5的倍数行上打印“biz",在每个7的倍数行上打印输出“baz”。
说明:
- 写上if循环继续写下一个if循环,因为有的数即是3的倍数也是5的倍数,需要判断多次
public static void main(String[] args) {
for (int num = 1; num <= 150 ; num++){
System.out.print(num + " ");
if(num % 3 == 0){
System.out.print("foo ");
}
if(num % 5 == 0){
System.out.print("biz " );
}
if (num % 7 == 0) {
System.out.print("baz ");
}
//换行
System.out.println();
}
}
5、while循环
5.1、输出0-100的偶数
while循环与for循环区别:while循环定义的变量,出了循环还能用,但是for循环不行
public static void main(String[] args) {
//输出0-100的偶数
int i = 1;
while(i<=100){
if(i % 2 == 0){
System.out.println(i);
}
i++;
}
//与for循环有区别,i出了循环还能用
System.out.println(i);
}
6、do--while
do - while循环至少会执行一次循环体! 例如以下代码,会输出do-while,不会输出while
6.1输出0-100的偶数 并计算偶数的和以及所有偶数的个数
public static void main(String[] args) {
//输出0-100的偶数 并计算偶数的和以及所有偶数的个数
int i = 1;
int sum = 0;
int count = 0;
do{
if(i % 2 ==0){
System.out.println(i);
sum +=i;
count++;
}
i++;
}while(i<=100);
System.out.println("总和为:" + sum);
System.out.println("个数为:" + count);
int num1 = 10;
while (num1>10){
System.out.println("while");
num1--;
}
int num2 = 10;
do {
System.out.println("dowhile");
num2--;
}while (num2>10);
}
7、嵌套循环
内层循环结构遍历一遍,只相当于外层循环结构体执行了一次
假设外层循环需要执行m次,内层循环需要执行n次。此时内层循环的循环体一共执行了m*n次
7.1输出九九乘法表、三角形以及倒三角
外层变量控制行数
内层变量控制列数
public static void main(String[] args) {
//System.out.println("******");
for (int i = 1; i <= 6; i++) {
System.out.print('*');
}
System.out.println("\n ");
System.out.println("-------------------------");
/*想要以下输出
* ******
* ******
* ******
* ******
* */
for (int j = 1; j <= 4; j++) {
for (int i = 1; i <= 6; i++) {
System.out.print("*");
}
System.out.println();
}
System.out.println("-------------------------------");
/* 想要以下输出 i (行号) j(*的个数)
* * 1 1
* ** 2 2
* *** 3 3
* **** 4 4
* ***** 5 5
* */
for (int i = 1; i <= 5; i++) { //控制行数
for (int j = 1; j <= i; j++) { //控制列数
System.out.print("*");
}
System.out.println();
}
System.out.println("---------------------------");
/* 想要以下输出 i (行号) j(*的个数) i+j = 5 j=5-i
* **** 1 4
* *** 2 3
* ** 3 2
* * 4 1
* */
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 5 - i; j++) {
System.out.print("*");
}
System.out.println();
}
System.out.println("-----------------------------------");
/* 想要以下输出
* *
* **
* ***
* ****
* *****
* ****
* ***
* **
* *
* */
for (int i = 1; i <= 5; i++) { //控制行数
for (int j = 1; j <= i; j++) { //控制列数
System.out.print("*");
}
System.out.println();
}
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 5 - i; j++) {
System.out.print("*");
}
System.out.println();
}
System.out.println("-----------------------");
//九九乘法表
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i + "*" + j + "=" + (i*j) + " ");
}
System.out.println();
}
7.2、输出100以内的质数(优化方法以及比较)
比较可通过System.currentTimeMillis()方法来比较,此方法为获取当前时间距离1970-01-01 00:00:00 的毫秒数,可通过比较时间来比较算法的优化程度
优化1 只对本身非质数的自然数是有效的。
优化2 对本身是质数的自然数是有效的。
public static void main(String[] args) {
boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值
int count = 0;//记录质数的个数
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long start = System.currentTimeMillis();
for(int i = 2;i <= 100000;i++){//遍历100000以内的自然数
//优化二:对本身是质数的自然数是有效的。
//for(int j = 2;j < i;j++){
for(int j = 2;j <= Math.sqrt(i);j++){//j:被i去除
if(i % j == 0){ //i被j除尽
isFlag = false;
break;//优化一:只对本身非质数的自然数是有效的。
}
}
//
if(isFlag == true){
//System.out.println(i);
count++;
}
//重置isFlag
isFlag = true;
}
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long end = System.currentTimeMillis();
System.out.println("质数的个数为:" + count);
System.out.println("所花费的时间为:" + (end - start));//17110 - 优化一:break:1546 - 优化二:13
}
时间比较:17110 - 优化一:break:1546 - 优化二:13
最终简便代码,通过continue标签来进行处理
说明:
- Math.sqrt为平方根运算函数
- break为结束当前循环
- continue为结束当次循环
public static void main(String[] args) {
int count = 0;//记录质数的个数
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long start = System.currentTimeMillis();
label:for(int i = 2;i <= 100000;i++){//遍历100000以内的自然数
for(int j = 2;j <= Math.sqrt(i);j++){//j:被i去除
if(i % j == 0){ //i被j除尽
continue label;
}
}
//能执行到此步骤的,都是质数
count++;
}
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long end = System.currentTimeMillis();
System.out.println("质数的个数为:" + count);
System.out.println("所花费的时间为:" + (end - start));//17110 - 优化一:break:1546 - 优化二:13
}
}
补充:可能有的表达不清楚,可以看看代码,代码里面有注释。