第5章 函数

5.1 方法定义

  • 修饰符:Java语言提供了很多修饰符,主要分为以下两类:
    访问修饰符
    非访问修饰符
    修饰符用来定义类、方法或者变量,通常放在语句的最前端
  • 返回值类型:
  • 函数名:
  • 参数列表:
  • 函数体:

5.2方法调用

  • 函数调用函数
  • 函数递归调用

5.3实际参数和形式参数

  • 实际参数
  • 形式参数
  • 参数传值

5.4方法重载

  • 方法重载的定义
  • 方法重载的条件
  • 方法重载注意项

5.5变量的作用域

  • 局部变量
  • 全局变量

5.6常用数学函数

  • 三角函数
    在这里插入图片描述
  • 指数函数
    在这里插入图片描述
  • 取整函数
    在这里插入图片描述
  • min、max和abs方法
    min 和 max 方法用于返回两个数(int、 long、 float 或 double 型) 的最小值和最大值。
    abs 方法以返回一个数(int、 long、 float 或 double 型) 的绝对值。
  • random方法
    randomO 方 法, 生 成 大 于 等 于 0.0 且 小 于 1.0 的 double 型 随 机 数
    (0.0<»Math. randOm() <1.0)。
    在这里插入图片描述
  • Random类
    Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。
    相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。
  • 示例:计算三角形角度
    在这里插入图片描述
import java.util.Scanner;
import java.util.function.ToDoubleBiFunction;

public class Test1 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("Enter three points:");
		double x1=scanner.nextDouble();
		double y1=scanner.nextDouble();
		double x2=scanner.nextDouble();
		double y2=scanner.nextDouble();
		double x3=scanner.nextDouble();
		double y3=scanner.nextDouble();
		
		double a=getDistance(x2, y2, x3, y3);
		double b=getDistance(x1, y1, x3, y3);
		double c=getDistance(x1, y1, x2, y2);
		
		double A=getDegree(a,b,c);
		double B=getDegree(b,a,c);
		double C=getDegree(c,a,b);
		
		System.out.println("The three angles are "+A+","+B+","+C);
	}
	public static double getDegree(double across,double ling1,double ling2){
		double degree=Math.acos((Math.pow(across, 2)-Math.pow(ling1, 2)-Math.pow(ling2, 2))/(-2*ling1*ling2));
		return Math.toDegrees(degree);
	}
	public static double getDistance(double x1,double y1,double x2,double y2 ){
		double distance=Math.sqrt(Math.pow(x1-x2, 2)+Math.pow(y1-y2, 2));
		return distance;
	}
}

5.7String相关函数

  • 求字符串长度

  • 从字符串中获取字符

  • 连接字符串

  • 字符串的转换
    在这里插入图片描述

  • 从控制台读取字符串
    为了从控制台读取字符串, 调用 Scanner 对象上的 nextO 方法。

  • 从控制台读取字符
    为了从控制台读取字符, 调用 nextLineO 方法读取一个字符串, 然后在字符串上调用charAt(O)来返回一个字符。

  • 字符串比较
    在这里插入图片描述

  • 获取字符串中的字符或子串
    在这里插入图片描述

  • 字符串和数字间的转换
    可以将数值型字符串转换为数值。 要将字符串转换为 int 值, 使用 Integer.parselnt方法
  • 示例:将十六进制数转换为十进制数
    在这里插入图片描述
import java.util.Scanner;
public class lian4_18_16jingzhi {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("Enter the number:");
		int number=scanner.nextInt();
		String str="";
		while(true){
			int num=number%16;
			if(num>=10){
				switch(num){
					case 10:
						str="A"+str;
						break;
					case 11:
						str="B"+str;
						break;
					case 12:
						str="C"+str;
						break;
					case 13:
						str="D"+str;
						break;
					case 14:
						str="E"+str;
						break;
					case 15:
						str="F"+str;
						break;
				}
			}else{
				str=num+str;
			}
			number/=16;
			if(number==0){
				break;
			}
		}
		System.out.println("0X"+str);
	}
}

import java.util.Scanner;

public class Test2 {
	public static void main(String[] args) {
		System.out.print("Enter a hex number(without startswith 0X):");
		Scanner scanner=new Scanner(System.in);
		String str=scanner.nextLine();
		double number=hexToDecimal(str);
		System.out.println(number);
		
	}

	public static double hexToDecimal(String hex) {
		hex=hex.trim();//1.去高端空格
		hex=hex.toLowerCase();//2.转换成小写字母
		//3.遍历字符串所有字符  从尾到头
		double sum=0;
		int mi=0;
		for(int i=hex.length()-1;i>=0;i--){
			char c=hex.charAt(i);
			//4.判断是数字还是字符
			if(isDigit(c)){
				sum=sum+(c-48)*Math.pow(16,mi);
				mi++;
			}else if(isLetter(c)){
				sum=sum+(c-87)*Math.pow(16, mi);
				mi++;
			}else{
//				System.out.println("输入错误!");
				throw new IllegalArgumentException("非法字符!"+c);
			}
		}
		return sum;
	}
	public static boolean isDigit(char c){
		if(c>=48&&c<=57){
			return true;
		}else{
			return false;
		}
	}
	public static boolean isLetter(char c){
		if(c>=97&&c<=102){
			return true;
		}else{
			return false;
		}
	}
}

本章小结

1.程序模块化和可重用性是软件工程的中心目标之一。 Java 提供了很多有助于完成这一目标的有效结构。 方法就是一个这样的结构。
2.方法头指定方法的修饰符、 返回值类型、 方法名和参数。 本章所有的方法都使用静态修饰符static
3. 方法可以返回一个值。 返回值类型 returnValueType 是方法要返回的值的数据类型。 如果方法不返回值, 则返回值类型就是关键字 void。
4.参数列表是指方法中参数的类型、 次序和数置。 方法名和参数列表一起构成方法签名( methodsignature)。 参数是可选的, 也就是说, 一个方法可以不包含参数。
5. return 语句也可以用在 void 方法中, 用来终止方法并返回到方法的调用者。 在方法中, 有时用于改变正常流程控制是很有用的。
6.传递给方法的实际参数应该与方法签名中的形式参数具有相同的数目、 类型和顺序。
7. 当程序调用一个方法时, 程序控制就转移到被调用的方法。 被调用的方法执行到该方法的 return语句或到达方法结束的右括号时, 将程序控制还给调用者。
8.在 Java 中, 带返回值的方法也可以当作语句调用。 在这种情况下, 调用函数只要忽略返回值即可。
9.方法可以重载。 这就意味着两个方法可以拥有相同的方法名, 只要它们的方法参数列表不同即可。
10.在方法中声明的变量称作局部变量。 局部变量的作用域是从声明它的地方开始. 到包含这个变釐的块结束为止。 局部变量在使用前必须声明和初始化。
11.方法抽象是把方法的应用和实现分离。 用户可以在不知道方法是如何实现的情况下使用方法。 方法的实现细节封装在方法内, 对调用该方法的用户隐藏。 这称为信息隱藏或封装。
12.方法抽象将程序模块化为整齐、 层次分明的形式。 将程序写成简洁的方法构成的集合会比其他方式更容易编写、 调试、 维护和修改。 这种编写风格也会提高方法的可重用性。
13.当实现一个大型程序时, 可以使用自顶向下或自底向上的编码方法。 不要一次性编写完整个程序。这种方式似乎浪费了更多的编码时间(因为要反复编译和运行这个程序), 但实际上, 它会更节省时间并使调试更容易。

练习题

在这里插入图片描述

import java.util.Scanner;

public class lian5_1 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("Enter the number:");
		long number=scanner.nextLong();
		int sum=sumDigits(number);
		System.out.println(sum);
	}
	public static int sumDigits(long n){
		int sum=0;
		while(true){
			sum+=n%10;
			n/=10;
			if(n==0){
				break;
			}
		}	
		return sum;
	}
}

在这里插入图片描述

import java.util.Scanner;

public class lian5_2 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("Enter a number:");
		int number=scanner.nextInt();
		System.out.println(isPalindrome(number));
	}
	public static int reverse(int number){
		/*String str="";
		while(true){
			str+=number%10;
			number/=10;
			if(number==0){
				break;
			}
		}*/
		String str=""+number;
		String s="";
		for(int i=str.length()-1;i>=0;i--){
			s+=str.charAt(i);
		}
		return Integer.parseInt(s);
	}
	public static boolean isPalindrome(int number){
		return reverse(number)==number;
		
	}
}

在这里插入图片描述

import java.util.Scanner;

public class lian5_3 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("Enter a number:");
		int number=scanner.nextInt();
		System.out.println(reverse(number));
		
	}
	public static int reverse(int number) {
		String s="";
		while(true){
			s+=number%10;
			number/=10;
			if(number==0){
				break;
			}
		}
		return Integer.parseInt(s);
	}
}

在这里插入图片描述

import java.util.Scanner;

public class lian5_4 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("Enter three numbers:");
		double num1=scanner.nextInt();
		double num2=scanner.nextInt();
		double num3=scanner.nextInt();
		displaySortedNumber(num1, num2,num3);
	}
	public static void displaySortedNumber(double num1,double num2,double num3){
		double temp=0;
		if(num1>num2&&num1>num3){
			temp=num3;
			num3=num1;
			num1=temp;
			if(num1>num2){
				temp=num2;
				num2=num1;
				num1=temp;
			}
		}else if(num2>num1&&num2>num3){
			temp=num3;
			num3=num2;
			num2=temp;
			if(num1>num2){
				temp=num2;
				num2=num1;
				num1=temp;
			}
		}else if(num3>num1&&num3>num2){
			if(num1>num2){
				temp=num2;
				num2=num1;
				num1=temp;
			}
		}
		System.out.println(num1+"<"+num2+"<"+num3);
	}
}

在这里插入图片描述

import java.util.Scanner;

public class lian5_5 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("Enter the number:");
		int line=scanner.nextInt();
		displayPattern(line);
	}
	public static void displayPattern(int n){
		for(int i=1;i<=n;i++){
			for(int k=1;k<=n-i;k++){
				System.out.print(" ");
			}
			for(int j=i;j>=1;j--){
				System.out.print(j);
			}
			System.out.println();
		}
		
	}
}

在这里插入图片描述

public class lian5_6 {
	public static void main(String[] args) {
		for(int i=40;i>=31;i--){
			double fahrenheit=celsiusTOFahrenheit(i);
			System.out.println("celsiu :"+i+"fahrenheit "+fahrenheit);
		}
		for(int i=120;i>=30;i--){
			double celsius=fahrenheitToCelsius(i);
			System.out.println("fahrenheit :"+i+"celsius "+celsius);
		}
	}
	public static double celsiusTOFahrenheit(double celsius){
		double fahrenheit=(9.0/5)*celsius+35;
		return fahrenheit;
	}
	public static double fahrenheitToCelsius(double fahrenheit){
		double celsius=(5.0/9)*(fahrenheit-35);
		return celsius;
	}
}

在这里插入图片描述

public class lian5_8 {
	public static void main(String[] args) {
		for(int i=1;i<=100;i++){
//			System.out.println(i+":"+m(i));
			System.out.printf("%d:%4.4f\n",i,m(i));
		}
	}
	public static double m(int i){
		double sum=0;
		for(int k=1;k<=i;k++){
			sum+=1.0*k/(k+1);
		}
		return sum;
	}
}

在这里插入图片描述

public class lian5_9 {
	public static void main(String[] args) {
		for(int i=1;i<=10000;i++){
			System.out.printf("%d:%4f\n",i,m(i));
		}
	}
	public static double m(int i){
		double pi=0.0;
		double flag=1.0;
		for(int k=1;k<=i;k++){
			pi+=flag/(2*k-1);
			flag=-flag;
		}
		return 4*pi;
	}
}

在这里插入图片描述

import java.util.Random;
import java.util.Scanner;

public class lian5_10 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("Enter the line:");
		int n=scanner.nextInt();
		printMatrix(n);
	}
	public static void printMatrix(int n){
		Random random=new Random();
		for(int k=1;k<=n;k++){
			for(int l=1;l<=n;l++){
				System.out.print(random.nextInt(2)+" ");
			}
			System.out.println();
		}
	}
}

在这里插入图片描述

import java.net.PasswordAuthentication;
import java.util.Scanner;

public class lian5_11 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("Enter your password:");
		String password=scanner.nextLine();
		if(isPasswordInValid(password)){
			System.out.println("Valid Password");
		}else{
			System.out.println("InValid Password");
		}
	}
	public static boolean isPasswordInValid(String password){
		boolean condition1=isLengthMoreThanEight(password);
		boolean condition2=isOnlyContainsLetterAndDigit( password);
		boolean condition3=isContainMoreThanTwoDigits( password);
		if(condition1&&condition2&&condition3){
			return true;
		}else{
			return false;
		}
	}
	public static boolean isLengthMoreThanEight(String password){
		return password.length()>=8;
	}
	public static boolean isOnlyContainsLetterAndDigit(String password){
		for(int i=0;i<password.length();i++){
			char c=password.charAt(i);
			if(!(isLetter(c)||isDigit(c))){
				return false;
			}
		}
		return true;
	}
	private static boolean isDigit(char c) {
		return c>='0'&&c<='9';
	}
	private static boolean isLetter(char c) {
		return c>='a'&&c<='z'||c>='A'&&c<='Z';
	}
	public static boolean isContainMoreThanTwoDigits(String password){
		return getDigitCount(password)>=2;
		
	}
	private static int getDigitCount(String password) {
		int count=0;
		for(int i=0;i<password.length();i++){
			char c=password.charAt(i);
			if(isDigit(c)){
				count++;
			}
		}
		return count;
	}
}

在这里插入图片描述

import java.util.Scanner;

public class lian5_12 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("Enter three sides:");
		double side1=scanner.nextDouble();
		double side2=scanner.nextDouble();
		double side3=scanner.nextDouble();
		if(isValid(side1, side2, side3)){
			System.out.println(area(side1, side2, side3)); 
		}else{
			System.out.println("无效!");
		}
	}
	public static boolean isValid(double side1,double side2,double side3){
		if(side1+side2>side3&&side2+side3>side1&&side1+side3>side2&&side1-side2<side3&&side1-side3<side2&&side2-side3<side1){
			return true;
		}else{
			return false;
		}
	}
	public static double area(double side1,double side2,double side3){
		double area=0;
		double s=(side1+side2+side3)/2;
		return  area=Math.sqrt(s*(s-side1)*(s-side2)*(s-side3));
	}
}

在这里插入图片描述

import java.util.Scanner;

public class lian5_13 {
	public static void main(String[] args) {
		System.out.print("Enter a number:");
		System.out.println(sqrt(new Scanner(System.in).nextLong()));
	}
	public static double sqrt(long n){
		double nextGuess=0.0;
		double lastGuess=1.0;
		while(true){
			nextGuess=(lastGuess+n/lastGuess)/2;
			if(Math.abs(nextGuess-lastGuess)<0.0001){
				break;
			}else{
				lastGuess=nextGuess;
			}
		}
		return nextGuess;
	}
}

在这里插入图片描述

import java.util.Scanner;

public class lian5_14 {
	public static void main(String[] args) {
		
		System.out.println(count("ashdkgasdhjhsagdiasd", 'h'));
	}
	public static int count(String str,char a){
		int count=0;
		for(int i=0;i<str.length();i++){
			if(str.charAt(i)==a){
				count++;
			}
		}
		return count;
	}
}

在这里插入图片描述

public class lian5_16 {
	public static void main(String[] args) {
		int count=0;
		int num=2;
		while(true){
			if(isHuiWen(num)&&isHuiWen(num)){
				System.out.print(num+" ");
				count++;
				if(count%10==0){
					System.out.println();
				}
				if(count==100){
					break;
				}
			}
			num++;
		}
	}
	public static boolean isSuShu(int num){
		boolean flag=true;
		for(int i=2;i<num/2;i++){
			if(num%i==0){
				flag=false;
				break;
			}
		}
		return flag;
	}
	public static boolean isHuiWen(int num){
		String s="";
		int temp=num;
		while(true){
			s+=temp%10;
			temp/=10;
			if(temp==0){
				break;
			}
		}
		return Integer.parseInt(s)==num;
	}
}

在这里插入图片描述

public class lian5_17 {
	public static void main(String[] args) {
		int count=0;
		int num=2;
		while(true){
			if(!isHuiWen(num)&&isSuShu(num)&&isSuShu(reverse(num))){
				System.out.print(num+" ");
				count++;
				if(count%10==0){
					System.out.println();
				}
				if(count==100){
					break;
				}
			}
			num++;
		}
		
	}
	public static boolean isHuiWen(int num){
		return reverse(num)==num;
	}
	public static boolean isSuShu(int num){
		boolean flag=true;
		for(int i=2;i<Math.pow(num, 0.5);i++){
			if(num%i==0){
				flag=false;
				break;
			}
		}
		return flag;
	}
	public static int reverse(int num){
		String s="";
		int temp=num;
		while(true){
			s+=temp%10;
			temp/=10;
			if(temp==0){
				break;
			}
		}
	return Integer.parseInt(s);
	}
}

在这里插入图片描述

public class lian5_18 {
	public static void main(String[] args) {
		for(int p=1;p<=31;p++){
			int num=(int)(Math.pow(2, p)-1);
			if(isSuShu(num)){
				System.out.println(p+":"+num);
			}
		}
	}

	public static boolean isSuShu(int num) {
		boolean flag=true;
		for(int i=2;i<=num/2;i++){
			if(num%i==0){
				flag=false;
				break;
			}
		}
		return flag;
	}
}

在这里插入图片描述

public class lian5_19 {
	public static void main(String[] args) {
		for(int i=2;i<998;i++){
			if(lian5_18.isSuShu(i)&&lian5_18.isSuShu(i+2)){
				System.out.println("["+i+","+(i+2)+"]");
			}
		}
	}
	/*public static boolean isSuShu(int num) {
		boolean flag=true;
		for(int i=2;i<=Math.sqrt(num);i++){
			if(num%i==0){
				flag=false;
				break;
			}
		}
		return flag;
	}*/
}

在这里插入图片描述

public class lian5_20 {
	public static void main(String[] args) {
		boolean flag=false;
		int lastSum=0;
		while(true){
			int p1=(int)(1+Math.random()*6);
			int p2=(int)(1+Math.random()*6);
			int sum=p1+p2;
			System.out.println("You rolled "+p1+"+"+p2+"="+sum);
			if(flag){
				if(sum==2||sum==3||sum==12){
					System.out.println("You lose");
					break;
				}else if(sum==7||sum==11){
					System.out.println("You win");
					break;
				}else{
					System.out.println("Point is "+sum);
					lastSum=sum;
					flag=false;
				}
			}else{
				if(sum==lastSum){
					System.out.println("You win");
					break;
				}else if(sum==7){
					System.out.println("You lose");
					break;
				}else{
					System.out.println("Point is "+sum);
					lastSum=sum;
				}
			}
		}
	}
}

在这里插入图片描述

import java.util.Scanner;

public class lian5_22 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("Enter the number of sides:");
		int n=scanner.nextInt();
		System.out.println("Enter the side:");
		double side=scanner.nextDouble();
		System.out.println(area(n, side));
	}
	public static double area(int n,double side){
		double area=(n*side*side)/(4*Math.tan(Math.PI/n));
		return area;
	}
}

在这里插入图片描述

import java.util.Scanner;

public class lian5_23 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("Enter three point:");
		double x0=scanner.nextDouble();
		double y0=scanner.nextDouble();
		double x1=scanner.nextDouble();
		double y1=scanner.nextDouble();
		double x2=scanner.nextDouble();
		double y2=scanner.nextDouble();
		
		if(leftOfTheLine(x0, y0, x1, y1, x2, y2)){
			System.out.println("left");
		}else if(onTheSameLine(x0, y0, x1, y1, x2, y2)){
			System.out.println("on");
		}else if(onTheLineSegment(x0, y0, x1, y1, x2, y2)){
			System.out.println("right");
		}
	}
	public static boolean leftOfTheLine(double x0,double y0,
			double x1,double y1,double x2,double y2){
		
			return f(x0, y0, x1, y1, x2, y2)>0;
	}
	public static boolean onTheSameLine(double x0,double y0,
			double x1,double y1,double x2,double y2){
		
		return Math.abs(f(x0, y0, x1, y1, x2, y2)-0)<=0.00001;
	}
	
	public static boolean onTheLineSegment(double x0,double y0,
			double x1,double y1,double x2,double y2){
		
		return f(x0, y0, x1, y1, x2, y2)<0;
	}
	public static double f(double x0,double y0,
			double x1,double y1,double x2,double y2){
		
		return (x1-x0)*(y2-y0)-(x2-x0)*(y1-y0);
	}
}

猜你喜欢

转载自blog.csdn.net/sl1130398099/article/details/83115440