paper=paper*2;
count++;
}
//sout可以直接输出打印语句
System.out.println(count);
}
}
回文数
给定一个整数X,如果是一个回文数(从左往右读和从右往左读都是一样的数),打印true,否则就是false.
import java.util.Scanner;
public class text4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入数字:");
int x = sc.nextInt();
//临时存储x原来的值,后面进行比较
int temp = x;
//记录倒过来的数
int num = 0;
//循环获取右往左的数
while (x != 0) {
int ge = x % 10;
x = x / 10;
//把当前的数记录拼接在最右边
num = num * 10 + ge;
}
System.out.println(num == temp);
}
}
do while循环
初始化语句;
do{
循环体语句;
条件控制语句;
}while(条件判断语句);
高级循环
无限循环
for(;;){
System.out.println("掌握规则,才能打破规则");
}
while(true){
System.out.println("掌握规则,才能打破规则");
}
do{
System.out.println("掌握规则,才能打破规则");
}while(true);
一般用while循环
无限循环下面不能写其他代码,因为根本停不下来!
跳转控制语句
小老虎吃包子,第三个包子是坏的需要跳过
public class text5 {
//main可以直接输入
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
if (i == 3) {
//结束本次循环,继续下次循环
continue;
}
System.out.println("宫百万在吃第" + i + "个包子");
}
}
}
小老虎吃三个包子就饱了
public class text5 {
//main可以直接输入
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
System.out.println("宫百万在吃第" + i + "个包子");
if (i == 3) {
//结束整个循环
break;
}
}
}
}
练习
逢7过
任意一个数字开始报数,当报的数字是包含7或者7的倍数的时候要说:过。打印1-100满足逢7过的数据
public class text5 {
public static void main(String[] args) {
for (int i = 1; i <= 100; i++) {
if (i % 10 == 7 || i / 10 % 10 == 7 || i % 7 == 0) {
System.out.println("过");
continue;
}
System.out.println(i);
}
}
}
求平方根
键盘录入一个大于2的整数,计算返回x的平方根只保留整数部分。
import java.util.Scanner;
public class text6 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = sc.nextInt();
//num.fori+tab直接输入
for (int i = 1; i < num; i++) {
if(i*i==num){
System.out.println(i+"就是"+num+"的平方根");
break;
}else if(i*i>num){
System.out.println((i-1)+"就是"+num+"平方根的整数部分");
break;
}
}
}
}
计算整数1~10的和,注意打印效果需要严格符合下面的示例。
打印示例:1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55
public class example04 {
public static void main(String[] args) {
int i = 0;
int sum = 0;
do {
i++;
if(i==10) { //在i=10的只打印它本身
System.out.print(i);
}else {// 否则就在i打印的后面加个+号
System.out.print(i+"+");
}
sum += i;
} while (i <10);
System.out.print("="+sum);
}
}
求质数
键盘录入一个整数,判断改整数是否为质数。(如果这个数可以被1和他本身整除,则就是质数,否则为合数)例如7可以被1和7整除,但是8可以被1和8整除,也可以被2和4整除那他就是合数。
import java.util.Scanner;
public class text7 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个正整数:");
int num = sc.nextInt();
boolean flag = true;
for (int i = 2; i < num; i++) {
//i依次表示这个范围的数字,看num是否被i整除就行
if (num % i == 0) {
flag = false;
break;
}
}
//当整个循环结束了,表示这个范围的数都判断完了,才能认为num是一个质数
if (flag) {
System.out.println(num + "是一个质数");
} else {
System.out.println(num + "不是一个质数");
}
}
}
猜数字游戏
程序生成1-100之间的随机数字,使用程序实现猜出这个数字。
首先要获取一个随机数,java帮我们写好了一个类叫Random,可以生成随机数。
使用教程和Scanner一样
Random r = new Random();
int num = r.nextInt(随机数范围);
import java.util.Random;
import java.util.Scanner;
public class text8 {
public static void main(String[] args) {
Random r = new Random();
//包头不包尾,包左不包右,从0开始,到这个数减1结束
// 生成任意范围的数。1.让这个范围的头减一个值,尾巴加1
int num = r.nextInt(100) + 1;//1-100,默认是0-100.
//猜这个数是多少
Scanner sc = new Scanner(System.in);
//保底机制计数
int count = 0;
//循环猜数字
while (true) {
System.out.print("请输入您猜的数字:");
int guestnum = sc.nextInt();
count++;
//保底机制10次就可以猜中
if (count == 10) {
System.out.println("保底成功,猜对了");
break;
}
//判断猜的数字大了还是小了
if (guestnum > num) {
System.out.println("您猜的数字大了哦!请重新猜呢!");
} else if (guestnum < num) {
System.out.println("您猜的数字小了哦!请重新猜呢!");
} else {
System.out.println("恭喜您,猜对了呢!");
break;
}
}
}
}
数组
数组是一种容器,可以同时用来存储同种数据类型的多个值。
存储数据的时候有隐形转换,int类型可以存byte、short、int。double可以存所有数字类型的数。
数组的初始化:在内存中,为数组容器开辟新空间,将数据存入容器的过程
静态初始化:
格式:数据类型[ ] 数组名 = new 数据类型[ ]{元素1,元素2,...元素n};
注意:元素和数据库一样,创建了几个就只能用几个。
int[] array = new int[]{11,12,13};
double[] array2 = new double[]{11.1,12.2,13.3};
//日常使用
int[]array = {11,12,12};
double[] array2 = {11.1,12.2,13.3};
public class text9 {
public static void main(String[] args) {
//存储5个学生的年龄
int[] arr1=new int[]{11,12,13,14,15};
int[] arr2={11,12,13,14,15};
//存储5个学生姓名
String[] arr3=new String[]{"张三","李四","王五","老六","宋七"};
String[] arr4={"张三","李四","王五","老六","宋七"};
//存储学5个学生身高
double[] arr5=new double[]{1.92,1.73,1.85,1.68,1.75};
double[] arr6={1.92,1.73,1.85,1.68,1.75};
}
}
数组的元素访问
格式:数组名[索引];
注意:一旦覆盖后原来的数就不存在了
数组名[索引]=具体数据/变量
arr[0] = 100;
数组遍历
遍历是指取出数据的过程。将数组中的所有类容取出来进行操作。
public class text10 {
public static void main(String[] args) {
int[] arr={1,2,3,4,5};
/* System.out.println(arr[0]);
//Ctrl+D可以直接向下复制
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println(arr[4]);*/
/*for (int i = 0; i < 5; i++) {
System.out.println(arr[i]);
}*/
//关于数组的长度属性,length。调用方式:数组名.length
//System.out.println(arr.length);
//数组名.fori:arr.fori回车/tab
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
遍历的数组求和
定义一个数组,存储1,2,3,4,5遍历数组得到每一个元素,求数组里面所有的数据和。
public class text11 {
public static void main(String[] args) {
//定义数组
int[] arr = {1, 2, 3, 4, 5};
//求和变量
int sum = 0;
//遍历得到数组的每一个数据
for (int i = 0; i < arr.length; i++) {
//i表示数组里面的索引,arr[i]依次表示数组里面的数。
sum = sum + arr[i];
}
System.out.println(sum);
}
}
统计个数
定义一个数组,存储1-10,遍历得到每一个元素,统计里面有多少个能被3整除的数字。
public class text11 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//arr.fori回车
int count=0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 3 == 0) {
count++;
}
}
System.out.println("数组中能被3整除的个数有"+count+"个");
}
}
变化数据
定义一个数组,存储1-10,遍历得到每一个元素,如果是奇数,则将当前的数字扩大两倍,如果是偶数则变成二分之一。
public class text12 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 2 == 0) {
arr[i] = arr[i] / 2;
} else {
arr[i] = arr[i] * 2;
}
}
//遍历数组
//一个循环只做一件事
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
数组的动态初始化
动态初始化指定数组长度,由系统分配初始值
格式:数据类型[ ] 数组名=new 数据类型[数组长度];
例:int[] arr = new in[3];
练习:定义一个数组,用来存班级中50名学生的姓名,姓名未知,学生报道后才知道。
public class text13 {
public static void main(String[] args) {
//数据类型[] 数组名 = new 数据类型[数组长度];
String[] arr=new String[50];
arr[0]="zhangsan";
arr[1]="lisi";
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);//null
//默认初始化的规律
//整数类型为:0。小数类型为0.0。字符类型为:‘\u0000’ 空格。布尔类型为:false。引用数据类型:null
}
}
数组动态初始化和静态初始化的区别
动态初始化:手动指定数组的长度,由系统分配默认初始化值。
只明确元素个数,不确定数值,用动态初始化。
静态初始化:手动指定数组的元素,系统根据元素个数,计算数组的长度。
明确了要用的数据,就用静态初始化。
数组的常见问题
当访问了数组中不存在的索引,就会发生索引越界的异常。
最小索引是:0,最大索引是:数组的长度减1。
数组的常见操作
1.求最值
已知数组元素为{33,5,23,44,55}求数组中最大的值。打印出来。
public class text14 {
public static void main(String[] args) {
int[] arr = {33, 5, 23, 44, 55};
//暂时认为0索引是最大的
int max = arr[0];
//循环获取每一个元素做比较
//为了提高效率循环开始条件可以写1
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
System.out.println(max);
}
}
2.求和
生成10个1-100的随机数存入数组。求出他们的和,求出他们的平均数,求出有多少个数比平均数小。
import java.util.Random;
public class text15 {
public static void main(String[] args) {
int[] arr = new int[10];
Random r = new Random();
//每循环一次就会生成新的随机数。
for (int i = 0; i < arr.length; i++) {
int num = r.nextInt(100) + 1;
//把生成的的数添加到数组中,数组名[索引] = 数据;
arr[i] = num;
}
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum = sum + arr[i];
}
System.out.println("数组中所有数据的和是:" + sum);
int avg = sum / arr.length;
System.out.println("数组中的平均数是:" + avg);
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] < avg) {
count++;
}
}
System.out.println("数组中有"+count+"个数比平均数小");
}
}
3.交换数据
定义一个数组,存入{1,2,3,4,5}。按要求交换索引对应数据{5,2,3,4,1}。
public class text16 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
/*int temp=arr[0];
arr[0]=arr[4];
arr[4]=temp;
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}*/
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
4.打乱数据
定义一个数组,存入1-5,打乱所有数据的顺序。
import java.util.Random;
public class text17 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
//随机索引
int randomIndex = r.nextInt(arr.length);
int temp = arr[i];
arr[i]=arr[randomIndex];
arr[randomIndex]=temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
}
数组的内存图
java内存分配
1.栈:方法运行时使用的内存,比如main方法运行,进入方法栈中执行
2.堆:存储对象或者数组,new来创建的,都存储在堆内存
**简单的说就是int[] arr = new int[2];在堆内存里面创建了一个地址用来存储数组,如果打印只arr这个变量就会打印出内存值,如果加上变量索引就可以从堆内存中读取数据,流程是先找到数组——找到对应的内存地址——找到对应的索引。包括修改数组中的值也是先读取堆内存再修改对应索引值,每一个数组互不影响,相互独立,就想像住的房子一样,每个住户都不会互相影响。如果把数组1赋值给数组2那么他们会共用同一个地址。改变数组2的值也会改变结果。**
方法
方法是程序中最小的执行单元。重复的代码,具有独立功能的代码可以抽取到方法中。可以提高代码的复用性,提高代码的可维护性。
方法的格式
要在main的大括号外面定义方法。
public static void 方法名(){
方法体(打包起来的代码);
}
例如:
public static void game(){
几个打印语句;
}
方法的调用
调用格式:方法名(); 【在main里面调用】
public class text18 {
public static void main(String[] args) {
System.out.println("a");
System.out.println("b");
printInfo();//就会打印出abcd
printInfo();//在多打印一个cd
}
public static void printInfo() {
System.out.println("c");
System.out.println("d");
}
}
按照顺序执行,看到方法会先执行方法,不管有几个方法,只要调用了就会执行,直到main方法里面的代码全部执行结束。
带参数的方法定义和调用
格式:方法名(参数1,参数2,...);
getSum(变量1,变量2,...);
注意:方法调用是,参数数量与类型必须与方法定义中小括号里面的变量一一对应,否则会报错。
public class text19 {
public static void main(String[] args) {
getSum(10,20);
}
public static void getSum(int num1,int num2) {
int result = num1+num2;
System.out.println("结果是:"+result);
}
}
形参和实参
形参:形式参数,是指方法定义中的参数。
实参:实际参数,方法调用中的参数。
定义方法小技巧:1.我要干什么?2.我干这个需要什么才可以完成?
public class text20 {
public static void main(String[] args) {
getLength(3.2,4.5);
}
//1.要干什么?求矩形的周长
//2.需要什么?长和宽
public static void getLength(double len,double width){
double result = (len+width)*2;
System.out.println("矩形的周长是:"+result);
}
}
带返回值方法的定义和调用
格式:
public static 返回值类型 方法名(参数){
方法体;
return 返回值;
}
public class text21 {
public static void main(String[] args) {
//直接调用为空
getSum(10,20,30);
//赋值调用
int sum = getSum(10,20,30);
System.out.println(sum);
//输出调用
System.out.println("结果是:"+getSum(10,20,30));
}
public static int getSum(int num1, int num2, int num3) {
int result = num1 + num2 + num3;
return result;//返回给方法调用处
}
}
方法的重载
在同一个类中,定义了多个同名的方法,这些同名的方法具有共同的功能。每个方法具有不同的参数类型或参数个数,这些同名的方法就构成了重载关系。
public class text22 {
public static void main(String[] args) {
compare(10,20);//调用
byte b1 = 10;
byte b2 = 20;
compare(b1,b2);//也可以赋值调用
}
//可以把相同功能的方法起一样的名字,但是参数列表必须不同
//调用的时候更加简单,系统会根据数据类型自己调用方法
public static void compare(byte b1,byte b2) {
System.out.println(b1==b2);
}
public static void compare(short s1,short s2) {
System.out.println(s1==s2);
}
public static void compare(int i1,int i2) {
System.out.println(i1==i2);
}
public static void compare(long n1,long n2) {
System.out.println(n1==n2);
}
}
练习1设计一个方法求数组的最大值,并将最大值返回
public class text23 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int max = getMax(arr);
System.out.println(max);
}
public static int getMax(int[] arr) {
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
}