数据类型:
数据类型分为基本数据类型和引用数据类型。
基本数据类型一共有四种(整数、浮点数、字符、布尔)。
其中整数又分为四类:byte,short,int,long。之所以分为四类,原因是主要看我们数字的取值范围。
byte大小为一字节,取值范围为-2^7~2^7 - 1 = -128~127。short大小为二字节,取值范围为-2^15~2^15 - 1 = -32768~32767
int大小为四字节,取值范围为-2^31~2^31 - 1。long大小为八字节,取值范围为-2^63 ~ 2^63 - 1。
浮点数分为两类:float、double。float大小为四字节,double大小为八字节。(取值范围同上)
浮点型常量默认为double类型。
字符分为 char (2字节)和0~65535(字符的编号)。
布尔的结果只有true和false ,在Java当中并没有给boolean一个明确的大小,主要和底层虚拟机相关。如果boolean是一个变量的话,大小为1字节。如果boolean是一个数组的话,每个空间的大小是4个字节。
引用数据类型分为四种 (字符串,null,数组,对象)
String 也不存在具体的大小,它的大小是根据字符串的内容而决定的。目前而言,可以像用基本类型一样去使用String类型数据 。String其实是java中自带的一个类
那么如何定义变量呢?
数据类型 变量名=常量;数据类型 变量;变量=常量;
运算符
算数运算符(+:加法运算;-:减法运算;*:乘法运算;/:除法运算;%取余运算;++:自加运算;--:自减运算)
在除法运算中,如果两边都是整数 结果就是整数(整除) ,如果两边至少存在一个小数,结果就是小数。
取余运算中,相当于是整除运算,但是得到的结果是余数。
自加运算有前++和后++,前++为 ++i(意为i本身直接+1再参与运算),后++为i++(意为i先参与运算再本身+1)
赋值运算符(+=;-=,*=,/=,%=,=)
比较运算符(>;<;>=;<=;==;!=)
在==中,不管是在基本数据类型还是在后期面向对象 ==永远比的是两个变量(常量)当中所存储的那个数据的地址!
常量在常量池中的地址;对象在堆内存中的地址。比较运算符的运算的结果肯定是一个boolean类型(true或false)。
逻辑运算符(与,或,非,异或)
与:同真则真,遇假则假。单与&,双与&&。双与的话,左边一旦为假,右边无论真假,结果都是假,所以右边可以不运行。
或:有真则真,同假则假。单或|,双或||,双或的话,左边一旦为真,右边无论真假,结果都是真,所以右边可以不运行。
非:非真就是假,非假就是真。表示为!。
异或:相同为假,不同为真。表示为^。
逻辑运算符的结果肯定是一个布尔类型(true或false)
位运算符(&;|;^;>>;<<)
位运算符指的就是二进制之间的运算。
三目运算符(表达式为 变量=布尔表达式 ? 值1 : 值2; )
布尔表达式的意思是,计算的结果必须是boolean类型。如果布尔表达式的结果是true,则将值1赋予变量。如果布尔表达式的结果是false,则将值2赋予变量。它在一定程度上简化了if语句的功能。
流程控制语句
顺序结构(代码从主函数开始逐行向下运行),是一种宏观的代码运行结构 。
选择结构(if语句;switch语句)。
if语句:
基本格式
if(条件表达式){
当条件为true时执行的代码;
}else{
当条件为false时执行的代码;
}单if形式
if(条件表达式){
当条件为true时执行的代码;
}嵌套if-else形式
if(条件1){
条件1为true时执行的代码;
if(条件2){
条件2为true时执行的代码;
}else{
条件2为false时执行的代码;
}
}else{
条件1为false时执行的代码;
}if-else-if形式
if(条件1){}else if(条件2){
}else if(条件3){
}else{
}
switch语句:一般在多选情况下使用。
switch(变量){
case 值1:
执行语句1;
break;
case 值2:
执行语句2;
break;
case 值3:
执行语句3;
break;
........
deafult:
执行语句n;
break;
}if语句既可以对一个单一的值进行判断,也可以对一个区间的值进行判断。switch语句只能判断单一的值。
switch所要求的变量的数据类型:byte short int char String 枚举。
循环结构:主要解决重复性执行的代码。 (已知重复次数的循环,用for循环;不知重复次数但是已知结束条件的循环,用while循环)
循环的四要素: 1.循环初始化(指的就是循环从什么时候开始执行)2.循环继续条件(什么情况循环继续执行/反过来说,循环何时结束)3.循环体(就是我们需要被多次循环执行的代码块)4.循环的周期,步长,间距(当前循环和下一次循环之间的变更)。
for循环:for(1循环的初始化 ; 2循环的继续条件 ; 4循环的步长 ){
3循环体
}执行的顺序为:1->2->3->4->2->3->4>2->……一直到循环的条件满足
例题
3-1 解一元二次方程
import java.util.Scanner;
class test01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入a,b,c:");
double a=scanner.nextDouble();
double b=scanner.nextDouble();
double c=scanner.nextDouble();
if(b*b-4*a*c<0){
System.out.printf("无实数根");
}else if(b*b-4*a*c>0){
double r1=((-b+Math.sqrt(b*b-4*a*c))/(2*a));
double r2=((-b-Math.sqrt(b*b-4*a*c))/(2*a));
System.out.printf("r1=%.2f,r2=%.2f",r1,r2);
}else{
double r=((-b+Math.sqrt(b*b-4*a*c))/(2*a));
System.out.printf("r=%.2f",r);
}
}
}
3-2 解2-2线性方程
import java.util.Scanner;
class test02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入a,b,c,d,e,f:");
double a=scanner.nextDouble();
double b=scanner.nextDouble();
double c=scanner.nextDouble();
double d=scanner.nextDouble();
double e=scanner.nextDouble();
double f=scanner.nextDouble();
if(a*d-b*c==0){
System.out.printf("方程式无解");
}else{
double x=((e*d-b*f)/(a*d-b*c));
double y=((a*f-e*c)/(a*d-b*c));
System.out.printf("x=%.2f,y=%.2f",x,y);
}
}
}
3-3 找到将来的日期
import java.util.Scanner;
class test03 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("今天是周几");
int today = scanner.nextInt();
System.out.print("未来的几天:");
int future=scanner.nextInt();
String todayStr="";
String futureDayStr="";
if(today==0){
todayStr="周日";
}else if(today==1){
todayStr="周六";
}else if(today==2){
todayStr="周五";
}else if(today==3){
todayStr="周四";
}else if(today==4){
todayStr="周三";
}else if(today==5){
todayStr="周二";
}else if(today==1){
todayStr="周一";
}
}
}
3-4 回文数字
import java.util.Scanner;
class test04{
public static void main(String[] args){
//1.输入一个数字
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个三位数:");
int num=scanner.nextInt();
int temp=num;
//2.拼接出该数字的反序
int sum=0;
sum=sum*10+num%10;
num/=10;
sum=sum*10+num%10;
num/=10;
sum=sum*10+num%10;
num/=10;
if(sum==temp){
System.out.println("是回文");
}else{
System.out.println("不是回文");
}
}
}
3-5 彩票游戏
import java.util.*;
class test05{
public static void main(String[] args){
//1.
Scanner scanner=new Scanner(System.in);
int cp = 0;
int r = new Random().nextInt(99 - 10 + 1) + 10;
System.out.println("请输入一个两位数");
int input = scanner.nextInt();
if (input < 10 || input > 99) {
System.out.println("请输入10-99");
return;
}
int sw = r / 10; //随机数十位
int gw = r % 10;//随机数个位
int s = input / 10; //输入数十位
int g = input % 10; //输入数个位
if (r == input) {
cp = 10000;
} else if ((gw == g || sw == s) && (gw == s || sw == g)) {
cp = 3000;
} else if (sw == s || gw == g) {
cp = 1000;
} else {
System.out.println("您未中奖");
}
System.out.println("本次中奖的号码为" + r);
System.out.println("你的奖金为" + cp);
}
}
3-6 石头剪刀布游戏
import java.util.Random;
import java.util.Scanner;
class test06{
public static void main(String[] args){
//1.
Scanner scanner=new Scanner(System.in);
System.out.print("请输入 剪刀0 石头1 布2:");
int usr=scanner.nextInt();
//2.
Random random=new Random();
int com=random.nextInt(3);
String usrStr="";
String comStr="";
switch(usr){
case 0: //if usr==0
usrStr="剪刀";
break;
case 1:// if usr==1
usrStr="石头";
break;
case 2:// if usr==2
usrStr="布";
break;
}
switch(com){
case 0:
comStr="剪刀";
break;
case 1:
comStr="石头";
break;
case 2:
comStr="布";
break;
}
//3.
if(usr==com){
System.out.printf("用户是%s,电脑是%s,平局",usrStr,comStr);
}else if(usr==0&&com==2 || usr==1&&com==0 || usr==2&&com==1){
System.out.printf("用户是%s,电脑是%s,用户赢",usrStr,comStr);
}else{
System.out.printf("用户是%s,电脑是%s,用户输",usrStr,comStr);
}
}
}
3-7 某天是星期几
import java.util.*;
class test07{
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.print("Enter year(e.g 2012):");
int year=input.nextInt();
System.out.print("Enter month(1-12):");
int month=input.nextInt();
System.out.print("Enter the day of the month(1-31):");
int day=input.nextInt();
int h=(day+(26*(month+1)/10)+year%100+(year%100/4)+year/100/4+5*year/100)%7;//克里斯汀-泽勒计算某天是星期几的算法公式
switch(h){
case 0: System.out.println("是星期六");
break;
case 1: System.out.println("是星期日");
break;
case 2: System.out.println("是星期一");
break;
case 3: System.out.println("是星期二");
break;
case 4: System.out.println("是星期三");
break;
case 5: System.out.println("是星期四");
break;
case 6: System.out.println("是星期五");
break;
}
}
}
3-8 点是否在圆内
import java.util.Scanner;
class test08{
public static void main(String[] args){
//1.
Scanner scanner=new Scanner(System.in);
System.out.print(" 请输入坐标点:");
double x=scanner.nextDouble();
double y=scanner.nextDouble();
double xo=0;
double yo=0;
double radius=10;
double distance=Math.sqrt(Math.pow(x-xo,2)+Math.pow(y-yo,2));
if(distance>radius){
System.out.println("点在圆外");
}else if(distance==radius){
System.out.println("点在圆上");
}else{
System.out.println("点在圆内");
}
}
}
3-9 判断点是否在三角形内
import java.util.Scanner;
class test09{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("输入一个坐标点(x,y): ");
double x = input.nextDouble();
double y = input.nextDouble();
double a = (200 - x ) / 200 * 100;
double b = (100 - y ) / 100 * 200;
if(x <= b && y <= a){
System.out.println("这个点在三角形内");
} else{
System.out.println("这个点在三角形外");
}
}
}
3-10 判断两个矩形
import java.util.Scanner;
class test10{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
System.out.print("Enter r1's center x-,y-coordinates,width,and height:");
double r1_xCoordinates=input.nextDouble();
double r1_yCoordinates=input.nextDouble();
double r1_width=input.nextDouble();
double r1_height=input.nextDouble();
System.out.print("Enter r2's center x-,y-coordinates,width,and height:");
double r2_xCoordinates=input.nextDouble();
double r2_yCoordinates=input.nextDouble();
double r2_width=input.nextDouble();
double r2_height=input.nextDouble();
// double dis=Math.sqrt(Math.pow((r2_xCoordinates-r1_xCoordinates), 2)+Math.pow((r2_yCoordinates-r1_yCoordinates), 2));
//两点之间的距离计算公式
if(Math.abs(r1_xCoordinates-r2_xCoordinates)>(r1_width/2+r2_width/2)&&Math.abs(r1_yCoordinates-r2_yCoordinates)>(r1_height/2+r2_height/2)){
System.out.println("相离");
}else if(Math.abs(r1_xCoordinates-r2_xCoordinates)<=(Math.abs(r1_width-r2_width))*0.5&&Math.abs(r1_yCoordinates-r2_yCoordinates)<=(Math.abs(r1_height-r2_height))*0.5){
System.out.println("包含");
}else
System.out.println("相交");
}
}
3-11 判断最大公约数
import java.util.*;
class test12{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入两个数字:");
int n1=scanner.nextInt();
int n2=scanner.nextInt();
int gcd=1;
for(int i=n1<n2?n1:n2;i>=1;i++){
if(n1%i==0&&n2%i==0){
gcd=i;
break;
}
}
System.out.println(gcd);
}
}
3-13 找出一个整数的因子
import java.util.*;
class test13{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个数字:");
int num=scanner.nextInt();
while(true){
for(int i=2;i<=num;i++){
if(num%i==0){
System.out.print(i+" ");
num=num/i;
break;
}
}
if(num==1){
break;
}
}
}
}
3-14 显示金字塔
import java.util.*;
class test14{
public static void main(String[] args){
// 显示数字金字塔
Scanner input = new Scanner(System.in);
for(int i = 1; i <= 7; i++){ //行数为设定的那个数值
for(int j = 0; j <= 7-i;j++){ //空格站位
System.out.print(" ");
}
for(int m = i; m > 0 ; m--){ //打印从设定的数自减到1
System.out.print(m+" ");
}
for(int k = 2; k <= i; k++){ //打印从2开始自增到设定的数
System.out.print(k+" ");
}
System.out.println(); //换行打印
}
}
}
3-15 打印四个图案
import java.util.*;
class test15_1{
public static void main(String[] args){
// 显示数字金字塔
Scanner input = new Scanner(System.in);
for(int i=1;i<=6;i++){
for(int j=1;j<=6-i;j++);{
System.out.print(" ");
}
for(int j=1;j<=i;j++){
System.out.print(j+" ");
}
System.out.println();
}
}
}
import java.util.*;
class test15_2{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
for (int i = 1;i <= 7;i++) {
for(int j = 1;j <=7-i;j++){
System.out.print(j+" ");
}
System.out.println();
}
}
}
import java.util.*;
class test15_3{
public static void main(String[] args){
// 显示数字金字塔
Scanner input = new Scanner(System.in);
for(int i=1; i<=6; i++) {
for(int j=(6-i)*3-1; j>=0; j--) {
System.out.print(" ");
}
for(int j=i; j>=1; j--) {
if(j<10)
System.out.print(" ");
System.out.print(j);
}
System.out.println("");
}
}
}
import java.util.*;
class test15_4{
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
for(int i=1; i<=6; i++) {
for(int k=1; k<i; k++) {
System.out.print(" ");
}
for(int j=1;j<=(6-i)+1;j++) {
System.out.print(" ");
System.out.print(j);
}
System.out.println("");
}
}
}
3-16 打印2的n次幂数字金字塔
import java.util.Scanner;
public class test16{
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
for(int i=1;i<=8;i++){
for(int j=0;j<8-i;j++){
System.out.print("\t"); //\t表示从数字算起到下一个数字之间的间隔为8
}
for(int j=1;j<Math.pow(2, i);j*=2){ //j*2一直到j>=i^2
System.out.print("\t"+j);
}
for(int j=(int)Math.pow(2, i-2);j>0;j/=2){ //j/2一直到j>0
System.out.print("\t"+j);
}
System.out.println();
}
}
}
3-17 打印2-1000之间的素数
//打印2-1000之内的素数
import java.util.*;
class test17{
public static void main(String[] args){
int count=0;
for(int num=2;num<=1000;num++){
boolean flag=true;
for(int i=2;i<=num-1;i++){
if(num%i==0){
flag=false;
break;
}
}
if(flag){
count++;
System.out.print(num+" ");
if(count%8==0){
System.out.println();
}
}
}
}
}
3-18
//计算 Π
import java.util.*;
class test18{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个数字:");
int n=scanner.nextInt();
double sum=0;
double flag=1;
for(int i=1;i<=n;i++){
//sum+=Matn.pow(-1.0,i+1)/(2*i-1)
sum+=flag/(2*i-1);
flag=-flag;
}
double pi=sum*4;
System.out.print(pi);
}
}
3-19
//计算e
import java.util.*;
class test19{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个数字:");
int imax=scanner.nextInt();
double e=1;
double item=1.0;
for(int i=1;i<=imax;i++){
item=item*i; //n!=(n-1)*n;
e+=1/item;
}
System.out.println(e);
}
}
3-20
//显示闰年
import java.util.*;
class test20{
public static void main(String[] args){
int count=0;
for(int i=101;i<=2100;i++){
if(i%4==0&&i%100!=0 || i%400==0){
count++;
System.out.print(i+" ");
if(count%10==0){
System.out.println();
}
}
}
System.out.println("\n闰年一共有"+count+"个");
}
}
3-21
//10000以内的完全数
import java.util.*;
class test21{
public static void main(String[] args){
int sum=0;
for(int n=2;n<=10000;n++){
for(int i=1;i<=n/2;i++){
if(n%i==0){
sum+=i;
}
}
if(n==sum){
System.out.println("完全数"+n);
}
}
}
}
3-22 剪刀石头布游戏,输出先赢两次的结果
import java.util.*;
class test22{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
Random random=new Random();
int usrWin=0;
int comWin=0;
while(true){
System.out.print("请输入剪刀0 石头1布2:");
int usr=scanner.nextInt();
int com=random.nextInt(3);
String usrStr = "";
String comStr = "";
switch(usr){
case 0:
usrStr = "剪刀";
break;
case 1:
usrStr = "石头";
break;
case 2:
usrStr = "布";
break;
}
switch(com){
case 0:
comStr = "剪刀";
break;
case 1:
comStr = "石头";
break;
case 2:
comStr = "布";
break;
}
if(usr==com){
System.out.printf("用户是%s,电脑是%s,平局\n",usrStr,comStr);
}else if(usr==0&&com==2 || usr==1&&com==0 || usr==2&&com==1){
System.out.printf("用户是%s,电脑是%s,用户赢\n",usrStr,comStr);
usrWin++;
}else{
System.out.printf("用户是%s,电脑是%s,用户输\n",usrStr,comStr);
comWin++;
}
if(usrWin==2||comWin==2){
break;
}
}
if(usrWin==2){
System.out.println("最终玩家赢!");
}else{
System.out.println("最终电脑赢!");
}
}
}
3-23
//十进制转二进制
import java.util.Scanner;
class test23{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个数字:");
int num=scanner.nextInt();
String binStr="";
while(true){
binStr=num%2+binStr;//"1100"
num/=2;
if(num==0){
break;
}
}
System.out.println(binStr);
}
}
3-24
//最大数的出现次数
import java.util.Scanner;
class test24{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
int num=0;
int max=0;
int count=0;
System.out.print("请输入数字:");
while(true){
num=scanner.nextInt();
if(num==0){
break;
}else if(num>max){
max=num;
count=1;
}else if(num==max){
count++;
}
}
System.out.println("max="+max+",count="+count);
}
}