PTA第4、5次大作業及期中考試總結

来源:https://www.cnblogs.com/zsl-236236/archive/2022/05/16/16276465.html
-Advertisement-
Play Games

期中考試題目總結 (1)總結:期中考試主要考察的是點線面類的設計,之前沒有接觸過類,或者說對類沒有什麼很清晰的概念和認知。現在才發現“類”是一個非常強大的工具,可以大大方便我們平時解決問題的過程。期中考試這幾道題目難度適中,很適合我們平時拿來練手,不過也需要抓住各種細節,以防出現一些不該出現的錯誤。 ...


  1. 期中考試題目總結
    (1)總結:期中考試主要考察的是點線面類的設計,之前沒有接觸過類,或者說對類沒有什麼很清晰的概念和認知。現在才發現“類”是一個非常強大的工具,可以大大方便我們平時解決問題的過程。期中考試這幾道題目難度適中,很適合我們平時拿來練手,不過也需要抓住各種細節,以防出現一些不該出現的錯誤。
    (2)
    1、7-1 點與線(類設計)

設計一個類表示平面直角坐標繫上的點Point,私有屬性分別為橫坐標x與縱坐標y,數據類型均為實型數,除構造方法以及屬性的getter與setter方法外,定義一個用於顯示信息的方法display(),用來輸出該坐標點的坐標信息,格式如下:(x,y),數值保留兩位小數。為簡化題目,其中,坐標點的取值範圍設定為(0,200]。若輸入有誤,系統則直接輸出Wrong Format

設計一個類表示平面直角坐標繫上的線Line,私有屬性除了標識線段兩端的點point1、point2外,還有一個字元串類型的color,用於表示該線段的顏色,同樣,除構造方法以及屬性的getter與setter方法外,定義一個用於計算該線段長度的方法getDistance(),還有一個用於顯示信息的方法display(),用來輸出線段的相關信息,輸出格式如下:

    The line's color is:顏色值
    The line's begin point's Coordinate is:
    (x1,y1)
    The line's end point's Coordinate is:
    (x2,y2)
    The line's length is:長度值

其中,所有數值均保留兩位小數,建議可用String.format("%.2f", data)方法。

設計類圖如下圖所示。

** 題目要求:在主方法中定義一條線段對象,從鍵盤輸入該線段的起點坐標與終點坐標以及顏色,然後調用該線段的display()方法進行輸出。**

以下情況為無效作業
無法運行
設計不符合所給類圖要求
未通過任何測試點測試
判定為抄襲
輸入格式:
分別輸入線段的起點橫坐標、縱坐標、終點的橫坐標、縱坐標以及顏色,中間可用一個或多個空格、tab或者回車分隔。

輸出格式:
The line's color is:顏色值
The line's begin point's Coordinate is:
(x1,y1)
The line's end point's Coordinate is:
(x2,y2)
The line's length is:長度值
輸入樣例1:
在這裡給出一組輸入。例如:

5
9.4
12.3
84
Red
輸出樣例1:
在這裡給出相應的輸出。例如:

The line's color is:Red
The line's begin point's Coordinate is:
(5.00,9.40)
The line's end point's Coordinate is:
(12.30,84.00)
The line's length is:74.96
輸入樣例2:
在這裡給出一組輸入。例如:

80.2356
352.12
24.5
100
Black
輸出樣例2:
在這裡給出相應的輸出。例如:

Wrong Format

我的代碼如下:

點擊查看代碼
package pta.mid_term_examination;

import java.text.DecimalFormat;
import java.util.Scanner;

public class Main1 {
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        Point point1=new Point();
        double x1=in.nextDouble();
        double y1=in.nextDouble();
        point1.setX(x1);
        point1.setY(y1);
        Point point2=new Point();
        double x2=in.nextDouble();
        double y2=in.nextDouble();
        point2.setX(x2);
        point2.setY(y2);
        //double a=x1*x1-x2*x2;
        //double b=y1*y1-y2*y2;
        //double dis=Math.sqrt(a+b);
        String color=in.next();
        Line line=new Line();
        line.setPoint1(point1);
        line.setPoint2(point2);
        line.setColor(color);
        if ((x1<=0||x1>200)||(y1<=0||y1>200)||(x2<=0||x2>200)||(y2<=0||y2>200))
            System.out.println("Wrong Format");
        else line.display();
    }
}

class Point{
    private double x;//橫坐標
    private double y;//縱坐標

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public Point() {
    }

    public double getX() {
        return x;
    }

    public void setX(double x) {
        this.x = x;
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        this.y = y;
    }

    public void display(){
        DecimalFormat two=new DecimalFormat("0.00");
        System.out.println("("+two.format(getX())+","+two.format(getY())+")");
    }
}

class Line{
    private Point point1 = new Point();
    private Point point2 = new Point();
    String color;

    public Line(Point point1, Point point2, String color) {
        this.point1 = point1;
        this.point2 = point2;
        this.color = color;
    }

    public Line() {
    }

    public Point getPoint1() {
        return point1;
    }

    public void setPoint1(Point point1) {
        this.point1 = point1;
    }

    public Point getPoint2() {
        return point2;
    }

    public void setPoint2(Point point2) {
        this.point2 = point2;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public double getDistance(Point p1,Point p2){

        double a=p1.getX()-p2.getX();
        double b=p1.getY()-p2.getY();

        return Math.sqrt(a*a+b*b);
    }
    public void display(){
        Line line=new Line();
        DecimalFormat two=new DecimalFormat("0.00");
        System.out.println("The line's color is:"+getColor());
        System.out.println("The line's begin point's Coordinate is:");
        point1.display();
        System.out.println("The line's end point's Coordinate is:");
        point2.display();
        System.out.println("The line's length is:" + two.format(line.getDistance(point1,point2)));
    }
}

本題把我困擾住的地方是Line類裡面的getDistance方法
public double getDistance(Point p1,Point p2){

    double a=p1.getX()-p2.getX();
    double b=p1.getY()-p2.getY();

    return Math.sqrt(a*a+b*b);
}

這裡一開始我並沒有添加函數括弧裡面的參數,導致後面運行的時候一直顯示的不是正確的答案,而是一直顯示0.00。
在括弧中加上參數併在其它地方做出一些修改,最後的問題才得以解決。
在這裡我知道了仔細觀察題目和平時基礎的重要性,這大大影響了我做題時候的思考方式和速度。

2、7-2 點線面問題重構(繼承與多態)
在“點與線(類設計)”題目基礎上,對題目的類設計進行重構,以實現繼承與多態的技術性需求。

對題目中的點Point類和線Line類進行進一步抽象,定義一個兩個類的共同父類Element(抽象類),將display()方法在該方法中進行聲明(抽象方法),將Point類和Line類作為該類的子類。
再定義一個Element類的子類面Plane,該類只有一個私有屬性顏色color,除了構造方法和屬性的getter、setter方法外,display()方法用於輸出面的顏色,輸出格式如下:The Plane's color is:顏色
在主方法內,定義兩個Point(線段的起點和終點)對象、一個Line對象和一個Plane對象,依次從鍵盤輸入兩個Point對象的起點、終點坐標和顏色值(Line對象和Plane對象顏色相同),然後定義一個Element類的引用,分別使用該引用調用以上四個對象的display()方法,從而實現多態特性。示例代碼如下:
element = p1;//起點Point
element.display();

  element = p2;//終點Point
  element.display();
  
  element = line;//線段
  element.display();
  
  element = plane;//面
  element.display();

類結構如下圖所示。

其中,所有數值均保留兩位小數,建議可用String.format("%.2f", data)方法。

以下情況為無效作業
無法運行
設計不符合所給類圖要求
未通過任何測試點測試
判定為抄襲
輸入格式:
分別輸入線段的起點橫坐標、縱坐標、終點的橫坐標、縱坐標以及顏色,中間可用一個或多個空格、tab或者回車分隔。

輸出格式:
(x1,y1)
(x2,y2)
The line's color is:顏色值
The line's begin point's Coordinate is:
(x1,y1)
The line's end point's Coordinate is:
(x2,y2)
The line's length is:長度值
The Plane's color is:顏色值
輸入樣例1:
在這裡給出一組輸入。例如:

5
9.4
12.3
84
Red
輸出樣例1:
在這裡給出相應的輸出。例如:

(5.00,9.40)
(12.30,84.00)
The line's color is:Red
The line's begin point's Coordinate is:
(5.00,9.40)
The line's end point's Coordinate is:
(12.30,84.00)
The line's length is:74.96
The Plane's color is:Red
輸入樣例2:
在這裡給出一組輸入。例如:

5
9.4
12.3
845
Black
輸出樣例2:
在這裡給出相應的輸出。例如:

Wrong Format

以下是我的代碼:

點擊查看代碼
package pta.mid_term_examination;

import java.text.DecimalFormat;
import java.util.Scanner;

public class Main2 {
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        Point1 p1=new Point1();
        double x1=in.nextDouble();
        double y1=in.nextDouble();
        p1.setX(x1);
        p1.setY(y1);
        Point1 p2=new Point1();
        double x2=in.nextDouble();
        double y2=in.nextDouble();
        p2.setX(x2);
        p2.setY(y2);
        String color=in.next();
        Line1 line=new Line1();
        line.setPoint1(p1);
        line.setPoint2(p2);
        line.setColor(color);
        Plane plane=new Plane();
        plane.setColor(color);
        Element element=new Element() {
            @Override
            public void display() {

            }
        };
        if ((x1<=0||x1>200)||(y1<=0||y1>200)||(x2<=0||x2>200)||(y2<=0||y2>200))
            System.out.println("Wrong Format");
        else{
            element = p1;//起點Point
            element.display();

            element = p2;//終點Point
            element.display();

            element = line;//線段
            element.display();

            element = plane;//面
            element.display();
        }
    }
}

abstract class Element{
    public abstract void display();
}

class Point1 extends Element{
    private double x;//橫坐標
    private double y;//縱坐標

    public Point1(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public Point1() {
    }

    public double getX() {
        return x;
    }

    public void setX(double x) {
        this.x = x;
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        this.y = y;
    }

    public void display(){
        DecimalFormat two=new DecimalFormat("0.00");
        System.out.println("("+two.format(this.x)+","+two.format(this.y)+")");
    }
}

class Line1 extends Element{
    private Point1 point1 = new Point1();
    private Point1 point2 = new Point1();
    String color;

    public Line1(Point1 point1, Point1 point2, String color) {
        this.point1 = point1;
        this.point2 = point2;
        this.color = color;
    }

    public Line1() {
    }

    public Point1 getPoint1() {
        return point1;
    }

    public void setPoint1(Point1 point1) {
        this.point1 = point1;
    }

    public Point1 getPoint2() {
        return point2;
    }

    public void setPoint2(Point1 point2) {
        this.point2 = point2;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public double getDistance(Point1 p1,Point1 p2){

        double a=p1.getX()-p2.getX();
        double b=p1.getY()-p2.getY();

        return Math.sqrt(a*a+b*b);
    }
    public void display(){
        Line1 line=new Line1();
        DecimalFormat two=new DecimalFormat("0.00");
        System.out.println("The line's color is:"+getColor());
        System.out.println("The line's begin point's Coordinate is:");
        point1.display();
        System.out.println("The line's end point's Coordinate is:");
        point2.display();
        System.out.println("The line's length is:" + two.format(line.getDistance(point1,point2)));
    }
}

class Plane extends Element{
    private String color;

    public Plane(String color) {
        this.color = color;
    }

    public Plane() {
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
    public void display(){
        System.out.println("The Plane's color is:"+this.color);
    }
}

第二次作業是在第一次作業的基礎上加上了繼承與多態的運用,繼承和多態是我們Java學習中非常非常非常重要的兩個知識點,它們有以下好處:
使用繼承的好處是父類的內部細節對子類可見
使用多態可以使程式有良好的擴展,並可以對所有類的對象進行通用處理
使用繼承和多態可以增強我們代碼的靈活性,介面性,可擴充性,也可以消除類型之間的耦合關係。

第二次作業除了加上了繼承和多態等操作,還定義了抽象類,這也是一個新的知識,抽象類加上抽象方法。咋一聽很嚇人,但是只要我們去仔細閱讀題目要求,仔細審題,然後再看,就可以有更多的體會以及解題思路。

3、7-3 點線面問題再重構(容器類)
在“點與線(繼承與多態)”題目基礎上,對題目的類設計進行重構,增加容器類保存點、線、面對象,並對該容器進行相應增、刪、遍歷操作。

在原有類設計的基礎上,增加一個GeometryObject容器類,其屬性為ArrayList類型的對象(若不瞭解泛型,可以不使用
增加該類的add()方法及remove(int index)方法,其功能分別為向容器中增加對象及刪除第index - 1(ArrayList中index>=0)個對象
在主方法中,用戶迴圈輸入要進行的操作(choice∈[0,4]),其含義如下:
1:向容器中增加Point對象
2:向容器中增加Line對象
3:向容器中增加Plane對象
4:刪除容器中第index - 1個數據,若index數據非法,則無視此操作
0:輸入結束
示例代碼如下:
choice = input.nextInt();
while(choice != 0) {
switch(choice) {
case 1://insert Point object into list
...
break;
case 2://insert Line object into list
...
break;
case 3://insert Plane object into list
...
break;
case 4://delete index - 1 object from list
int index = input.nextInt();
...
}
choice = input.nextInt();
}
輸入結束後,按容器中的對象順序分別調用每個對象的display()方法進行輸出。
類圖如下所示:

以下情況為無效作業
無法運行
設計不符合所給類圖要求
未通過任何測試點測試
判定為抄襲
輸入格式:
switch(choice) {
case 1://insert Point object into list
輸入“點”對象的x,y值
break;
case 2://insert Line object into list
輸入“線”對象兩個端點的x,y值
break;
case 3://insert Plane object into list
輸入“面”對象的顏色值
break;
case 4://delete index - 1 object from list
輸入要刪除的對象位置(從1開始)
...
}
輸出格式:
Point、Line、Plane的輸出參考題目2
刪除對象時,若輸入的index超出合法範圍,程式自動忽略該操作
輸入樣例:
在這裡給出一組輸入。例如:

1
3.4
5.6
2
4.4
8.0
0.98
23.888
Red
3
Black
1
9.8
7.5
3
Green
4
3
0
輸出樣例:
在這裡給出相應的輸出。例如:

(3.40,5.60)
The line's color is:Red
The line's begin point's Coordinate is:
(4.40,8.00)
The line's end point's Coordinate is:
(0.98,23.89)
The line's length is:16.25
(9.80,7.50)
The Plane's color is:Green

題目代碼如下:

點擊查看代碼
package pta.mid_term_examination;

import java.util.ArrayList;
import java.util.Scanner;

abstract class Element3 {
	public abstract void display();

}

class Plane3 extends Element3 {
	private String color;	

	public Plane3() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Plane3(String color) {
		super();
		this.color = color;
	}
	

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("The Plane's color is:" + this.color);

	}

}

class Point3 extends Element3{
	private double x,y;
	
	public Point3(){
		
	}
	
	public Point3(double x,double y){
		this.x = x;
		this.y = y;
	}
	
	public double getX(){
		return this.x;
	}
	
	public void setX(double x){
		this.x = x;		
	}
	
	public double getY(){
		return this.y;
	}
	
	public void setY(double y){
		this.y = y;
	}
	
	@Override
	public void display(){
		System.out.println("(" + String.format("%.2f", x) + "," + String.format("%.2f",y) + ")");
	}

}

class Line3 extends Element3{
	private Point3 point1,point2;
	private String color;
	
	public Line3(){
		
	}
	
	public Line3(Point3 p1,Point3 p2,String color){
		this.point1 = p1;
		this.point2 = p2;
		this.color =  color;
	}

	public Point3 getPoint1() {
		return point1;
	}

	public void setPoint1(Point3 point1) {
		this.point1 = point1;
	}

	public Point3 getPoint2() {
		return point2;
	}

	public void setPoint2(Point3 point2) {
		this.point2 = point2;
	}

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}
	
	public double getDistance(){
		return Math.sqrt(Math.pow(this.point1.getX() - this.point2.getX(), 2) +
				Math.pow(this.getPoint1().getY() - this.getPoint2().getY(), 2));
	}
	
	@Override
	public void display(){
		System.out.println("The line's color is:" + this.getColor());
		System.out.println("The line's begin point's Coordinate is:"); 
		this.getPoint1().display();
		System.out.println("The line's end point's Coordinate is:"); 
		this.getPoint2().display();
		System.out.println("The line's length is:" + String.format("%.2f", this.getDistance()));
	}

}

class GeometryObject{
	private ArrayList<Element3> list = new ArrayList<>();
	
	public GeometryObject() {
		
	}
	
	public void add(Element3 element) {
		list.add(element);
	}
	
	public void remove(int index) {
		if(index < 1 || index > list.size()) {
			return;
		}
		
		list.remove(index - 1);
	}	
	
	public ArrayList<Element3> getList(){
		return this.list;
	}
}

public class Main3 {

	public static void main(String[] args) {
		double x1,y1,x2,y2;
		String color;
		Scanner input = new Scanner(System.in);
		int choice = 0,index = 0;
		
		GeometryObject container = new GeometryObject();		
		
		choice = input.nextInt();
		while(choice != 0) {
			switch(choice) {
			case 1:
				x1 = input.nextDouble();
				y1 = input.nextDouble();
				container.add(new Point3(x1,y1));
				break;
			case 2:
				x1 = input.nextDouble();
				y1 = input.nextDouble();
				x2 = input.nextDouble();
				y2 = input.nextDouble();
				color = input.next();
				container.add(new Line3(new Point3(x1,y1),new Point3(x2,y2),color));
				break;
			case 3:
				color = input.next();
				container.add(new Plane3(color));
				break;
			case 4:
				index = input.nextInt();
				container.remove(index);
				break;
			}
			choice = input.nextInt();
		}
		
		for(Element3 element:container.getList()) {
			element.display();
		}
	}

}

第三題是本次期中考試難度最大的一題,因為加上了容器類和泛型的應用,從上面的類圖我們也可以發現類圖也是明顯比前兩題要複雜很多。
所以當時考試的時候由於時間問題,這題我並沒有解決,後面看了老師發的源碼才有了些許體會。

  1. PTA第4次大作業總結
    1、7-1 sdut-String-2 識蛟龍號載人深潛,立科技報國志(II)(正則表達式)
    背景簡介:

“蛟龍號”載人深潛器是我國首台自主設計、自主集成研製的作業型深海載人潛水器,設計最大下潛深度為7000米級,也是目前世界上下潛能力最強的作業型載人潛水器。“蛟龍號”可在占世界海洋面積99.8%的廣闊海域中使用,對於我國開發利用深海的資源有著重要的意義。

中國是繼美、法、俄、日之後世界上第五個掌握大深度載人深潛技術的國家。在全球載人潛水器中,“蛟龍號”屬於第一梯隊。目前全世界投入使用的各類載人潛水器約90艘,其中下潛深度超過1000米的僅有12艘,更深的潛水器數量更少,目前擁有6000米以上深度載人潛水器的國家包括中國、美國、日本、法國和俄羅斯。除中國外,其他4國的作業型載人潛水器最大工作深度為日本深潛器的6527米,因此“蛟龍號”載人潛水器在西太平洋的馬利亞納海溝海試成功到達7020米海底,創造了作業類載人潛水器新的世界紀錄。

從2009年至2012年,蛟龍號接連取得1000米級、3000米級、5000米級和7000米級海試成功。下潛至7000米,說明蛟龍號載人潛水器集成技術的成熟,標志著我國深海潛水器成為海洋科學考察的前沿與制高點之一。

2012年6月27日11時47分,中國“蛟龍”再次刷新“中國深度”——下潛7062米。6月3日,“蛟龍”出征以來,已經連續書寫了5個“中國深度”新紀錄:6月15日,6671米;6月19日,6965米;6月22日,6963米;6月24日,7020米;6月27日,7062米。下潛至7000米,標志著我國具備了載人到達全球99%以上海洋深處進行作業的能力,標志著“蛟龍”載人潛水器集成技術的成熟,標志著我國深海潛水器成為海洋科學考察的前沿與制高點之一,標志著中國海底載人科學研究和資源勘探能力達到國際領先水平。

‘蛟龍’號是我國載人深潛發展歷程中的一個重要里程碑。它不只是一個深海裝備,更代表了一種精神,一種不畏艱險、趕超世界的精神,它是中華民族進軍深海的號角。

瞭解蛟龍號”載人深潛器“的驕人業績,為我國海底載人科學研究和資源勘探能力達到國際領先水平而自豪,小伙伴們與祖國同呼吸、共命運,一定要學好科學文化知識、提高個人能力,增強創新意識,做事精益求精,立科技報國之志!

請編寫程式,實現如下功能:讀入關於蛟龍號載人潛水器探測數據的多行字元串,從給定的信息找出數字字元,輸出每行的數字之和。

提示 若輸入為“2012年2月”,則該行的輸出為:2014。若幹個連續的數字字元作為一個整體,以十進位形式相加。

輸入格式:
讀入關於蛟龍號載人潛水器探測數據的多行字元串,每行字元不超過80個字元。

以"end"結束。

輸出格式:
與輸入行相對應的各個整數之和。

輸入樣例1:
2012年6月27日11時47分,中國“蛟龍”再次刷新“中國深度”——下潛7062米
6月15日,6671米
6月19日,6965米
6月22日,6963米
6月24日,7020米
6月27日,7062米
下潛至7000米,標志著我國具備了載人到達全球99%以上海洋深處進行作業的能力
end
輸出樣例1:
9165
6692
6990
6991
7050
7095
7099
輸入樣例2:
全世界投入使用的各類載人潛水器約90艘,下潛深度超過1000米的僅有12艘,更深的潛水器數量更少
6000米以上深度載人潛水器的國家包括中國、美國、日本、法國和俄羅斯
日本深潛器下潛6527米,蛟龍號在馬利亞納海溝海試成功到達7020米海底,創造了新的世界紀錄
從2009年至2012年,蛟龍號接連取得1000米級、3000米級、5000米級和7000米級海試成功
下潛至7000米,說明蛟龍號載人潛水器集成技術的成熟
end
輸出樣例2:
1102
6000
13547
20021
7000

代碼如下:

點擊查看代碼
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while (true){
            String str = in.nextLine();
            String[] s = str.split("\\D+");
            // \\d表示數字  \\D表示所有非數字字元,加上+號表示一個或多個
            int sum = 0;//用於計算總和
            int count = 0;//用於統計每一行被強制轉化的字元串
            if (str.equals("end"))
                break;
            for (int i = 0;i < s.length;i++){
                if (!s[i].equals("")){
                    count = Integer.parseInt(s[i]);
                    sum += count;
                }

            }
            System.out.println(sum);
        }
    }
}

踩坑心得:Java spilt方法的使用和next()與nextLine()的區別
String[] s = str.split("\D+");
// \d表示數字 \D表示所有非數字字元,加上+號表示一個或多個
nextLine()方法返回的是Enter鍵之前的所有字元,它是可以得到帶空格的字元串的。

next()會自動消去有效字元前的空格,只返回輸入的字元,不能得到帶空格的字元串。

(簡單點說,next我只要字,nextLine我啥都要)

2、7-2 點線形系列4-凸四邊形的計算
用戶輸入一組選項和數據,進行與四邊形有關的計算。
以下四邊形頂點的坐標要求按順序依次輸入,連續輸入的兩個頂點是相鄰頂點,第一個和最後一個輸入的頂點相鄰。
選項包括:
1:輸入四個點坐標,判斷是否是四邊形、平行四邊形,判斷結果輸出true/false,結果之間以一個英文空格符分隔。
2:輸入四個點坐標,判斷是否是菱形、矩形、正方形,判斷結果輸出true/false,結果之間以一個英文空格符分隔。 若四個點坐標無法構成四邊形,輸出"not a quadrilateral"
3:輸入四個點坐標,判斷是凹四邊形(false)還是凸四邊形(true),輸出四邊形周長、面積,結果之間以一個英文空格符分隔。 若四個點坐標無法構成四邊形,輸出"not a quadrilateral"
4:輸入六個點坐標,前兩個點構成一條直線,後四個點構成一個四邊形或三角形,輸出直線與四邊形(也可能是三角形)相交的交點數量。如果交點有兩個,再按面積從小到大輸出四邊形(或三角形)被直線分割成兩部分的面積(不換行)。若直線與四邊形或三角形的一條邊線重合,輸出"The line is coincide with one of the lines"。若後四個點不符合四邊形或三角形的輸入,輸出"not a quadrilateral or triangle"。
後四個點構成三角形的情況:假設三角形一條邊上兩個端點分別是x、y,邊線中間有一點z,另一頂點s:
1)符合要求的輸入:頂點重覆或者z與xy都相鄰,如x x y s、x z y s、x y x s、s x y y。此時去除冗餘點,保留一個x、一個y。
2) 不符合要求的輸入:z 不與xy都相鄰,如z x y s、x z s y、x s z y
5:輸入五個點坐標,輸出第一個是否在後四個點所構成的四邊形(限定為凸四邊形,不考慮凹四邊形)或三角形(判定方法見選項4)的內部(若是四邊形輸出in the quadrilateral/outof the quadrilateral,若是三角形輸出in the triangle/outof the triangle)。如果點在多邊形的某條邊上,輸出"on the triangle或者on the quadrilateral"。若後四個點不符合四邊形或三角形,輸出"not a quadrilateral or triangle"。

輸入格式:
基本格式:選項+":"+坐標x+","+坐標y+" "+坐標x+","+坐標y。點的x、y坐標之間以英文","分隔,點與點之間以一個英文空格分隔。

輸出格式:
基本輸出格式見每種選項的描述。
異常情況輸出:
如果不符合基本格式,輸出"Wrong Format"。
如果符合基本格式,但輸入點的數量不符合要求,輸出"wrong number of points"。
註意:輸出的數據若小數點後超過3位,只保留小數點後3位,多餘部分採用四捨五入規則進到最低位。小數點後若不足3位,按原始位數顯示,不必補齊。例如:1/3的結果按格式輸出為 0.333,1.0按格式輸出為1.0

選項1、2、3中,若四邊形四個點中有重合點,輸出"points coincide"。
選項4中,若前兩個輸入線的點重合,輸出"points coincide"。

輸入樣例1:
選項1,點重合。例如:

1:-1,-1 -1,-1 1,2 1,-2
輸出樣例:
在這裡給出相應的輸出。例如:

points coincide
輸入樣例2:
不符合基本格式。例如:

1:-1,-1 1,2 -1,1 ++1,0
輸出樣例:
在這裡給出相應的輸出。例如:

Wrong Format
輸入樣例3:
選項1,輸入點數量不對。例如:

1:-1,-1 -1,2
輸出樣例:
在這裡給出相應的輸出。例如:

wrong number of points
輸入樣例4:
選項1,正確輸入判斷。例如:

1:-1,-1 -1,1 1,2 1,-2
輸出樣例:
在這裡給出相應的輸出。例如:

true false
輸入樣例5:
選項2,輸入點不構成四邊形。例如:

2:10,10 1,1 0,0 1,20
輸出樣例:
在這裡給出相應的輸出。例如:

not a quadrilateral
輸入樣例6:
選項2,正方形。例如:

2:0,0 0,80 80,80 80,0
輸出樣例:
在這裡給出相應的輸出。例如:

true true true
輸入樣例7:
選項2。例如:

2:0,0 -10,80 0,160 -10,80
輸出樣例:
在這裡給出相應的輸出。例如:

not a quadrilateral
輸入樣例8:
選項3,凸四邊形。例如:

3:-1,-1 -1,1 1,2 1,-2
輸出樣例:
在這裡給出相應的輸出。例如:

true 10.472 6.0
輸入樣例9:
選項3,。例如:

3:0,0 -10,100 0,99 10,100
輸出樣例:
在這裡給出相應的輸出。例如:

false 221.097 990.0

我的代碼:

點擊查看代碼
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        boolean flag = true;
        String regStr = "[\\-\\+]?\\d+(\\.\\d+)?,[\\-\\+]?\\d+(\\.\\d+)?(\\s[\\-\\+]?\\d+(\\.\\d+)?,[\\-\\+]?\\d+(\\.\\d+)?\\s?){0,}";
        if (str.length() > 2){
            String str1 = str.substring(0,1);
            String str2 = str.substring(2,str.length());
            if (str2.matches(regStr))
                flag = true;
            else flag = false;
            if (!flag) {
                System.out.println("Wrong Format");
                return;
            }else {
                String[] s = str2.split(",|\\s");
                for (int i = 0;i < s.length;i++){
                    if (s[i].matches("0\\d+"))
                        System.out.println("Wrong Format");
                }
                Quadrilateral qua = new Quadrilateral(Double.parseDouble(s[0]),Double.parseDouble(s[1]),Double.parseDouble(s[2]),Double.parseDouble(s[3]),Double.parseDouble(s[4]),Double.parseDouble(s[5]),Double.parseDouble(s[6]),Double.parseDouble(s[7]));
                if (qua.isCoincide()){
                    System.out.println("points coincide");
                    return;
                }else System.out.println(qua.isQuadrilateral()+" "+qua.isParallelogram());
                if (!qua.isQuadrilateral())
                    System.out.println("not a quadrilateral");
                else System.out.println(qua.isDiamond()+" "+qua.isRectangle()+" "+qua.isSquare());
               
            }
        }
    }
}

class Quadrilateral{
    //定義四邊形類
    private double x1,y1,x2,y2,x3,y3,x4,y4;

    public Quadrilateral(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
        this.x3 = x3;
        this.y3 = y3;
        this.x4 = x4;
        this.y4 = y4;
    }

    public Quadrilateral() {
        super();
    }

    public double getX1() {
        return x1;
    }

    public void setX1(double x1) {
        this.x1 = x1;
    }

    public double getY1() {
        return y1;
    }

    public void setY1(double y1) {
        this.y1 = y1;
    }

    public double getX2() {
        return x2;
    }

    public void setX2(double x2) {
        this.x2 = x2;
    }

    public double getY2() {
        return y2;
    }

    public void setY2(double y2) {
        this.y2 = y2;
    }

    public double getX3() {
        return x3;
    }

    public void setX3(double x3) {
        this.x3 = x3;
    }

    public double getY3() {
        return y3;
    }

    public void setY3(double y3) {
        this.y3 = y3;
    }

    public double getX4() {
        return x4;
    }

    public void setX4(double x4) {
        this.x4 = x4;
    }

    public double getY4() {
        return y4;
    }

    public void setY4(double y4) {
        this.y4 = y4;
    }

    public boolean isCoincide(){
        //判斷四邊形的點是否重合的函數
        if((x1==x2&&y1==y2)||(x2==x3&&y2==y3)||(x3==x4&&y3==y4)||(x4==x1&&y4==y1))
            return true;
        return false;
    }

    public boolean isQuadrilateral(){
        //判斷是否為四邊形
        Line a1 = new Line(x2,y2,x3,y3,x1,y1,x4,y4);
        Line a2 = new Line(x4,y4,x3,y3,x1,y1,x2,y2);
        if((x1==x3&&y1==y3)||(x2==x4&&y2==y4)||(x1==x2&&y1==y2)||(x4==x3&&y4==y3)||a1.three()||a2.three())
            return false;
        else if((x1==x2&&x1==x3)||(x1==x2&&x1==x4)||(x1==x3&&x1==x4)||(x3==x2&&x3==x4))
            return false;
        else if(Math.abs((y1-y2)/(x1-x2)-(y1-y3)/(x1-x3))<0.01||Math.abs((y1-y2)/(x1-x2)-(y1-y4)/(x1-x4))<0.01||Math.abs((y1-y4)/(x1-x4)-(y1-y3)/(x1-x3))<0.01||Math.abs((y3-y2)/(x3-x2)-(y2-y4)/(x2-x4))<0.01)
            return false;
        else return true;
    }

    public boolean isParallelogram() {
        //判斷是否為平行四邊形
        if(isQuadrilateral()) {
            if((x1==x2&&x3==x4||(y1-y2)/(x1-x2)==(y4-y3)/(x4-x3))&&(x3==x2&&x1==x4||(y3-y2)/(x3-x2)==(y4-y1)/(x4-x1)))
                return true;
            else return false;
        }
        else return false;
    }

    public boolean isDiamond() {
        //判斷是否為菱形
        if(isParallelogram()) {
            if(((y1==y3&&x2==x4)||(y2==y4&&x1==x3))||(((y1-y3)/(x1-x3))*((y4-y2)/(x4-x2))==-1)) return true;
            else return false;
        }
        else return false;
    }

    public boolean isRectangle() {
        //判斷是否為矩形
        if(isParallelogram()) {
            if((x1==x2&&y2==y3)||(y1==y2&&x2==x3)||((y1-y2)/(x1-x2))*((y3-y2)/(x3-x2))==-1) return true;
            else return false;
        }
        else return false;
    }

    public boolean isSquare() {
        //判斷是否為正方形
        if(isRectangle()&&isDiamond()) return true;
        else return false;
    }
    public boolean isBump() {
        //判斷是否為凸四邊形
        double x = -((x2-x4)*(x3*y1-x1*y3)-(x1-x3)*(x4*y2-x2*y4))/((y2-y4)*(x1-x3)-(y1-y3)*(x2-x4));
        double y = -((y2-y4)*(y3*x1-y1*x3)-(y1-y3)*(y4*x2-y2*x4))/((x2-x4)*(y1-y3)-(x1-x3)*(y2-y4));
        if ((((x>=x3&&x<=x1)||(x<=x3&&x>=x1))&&((y>=y3&&y<=y1)||(y<=y3&&y>=y1)))&&(((x>=x2&&x<=x4)||(x<=x2&&x>=x4))&&((y>=y2&&y<=y4)||(y<=y2&&y>=y4))))
            return true;
        else return false;
    }
}

class Line{
    //定義直線類
    private double x1,y1,x2,y2,x3,y3,x4,y4;

    public Line() {
        super();
    }

    public Line(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) {
        super();
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
        this.x3 = x3;
        this.y3 = y3;
        this.x4 = x4;
        this.y4 = y4;
    }

    public double getX1() {
        return x1;
    }

    public void setX1(double x1) {
        this.x1 = x1;
    }

    public double getY1() {
        return y1;
    }

    public void setY1(double y1) {
        this.y1 = y1;
    }

    public double getX2() {
        return x2;
    }

    public void setX2(double x2) {
        this.x2 = x2;
    }

    public double getY2() {
        return y2;
    }

    public void setY2(double y2) {
        this.y2 = y2;
    }

    public double getX3() {
        return x3;
    }

    public void setX3(double x3) {
        this.x3 = x3;
    }

    public double getY3() {
        return y3;
    }

    public void setY3(double y3) {
        this.y3 = y3;
    }

    public double getX4() {
        return x4;
    }

    public void setX4(double x4) {
        this.x4 = x4;
    }

    public double getY4() {
        return y4;
    }

    public void setY4(double y4) {
        this.y4 = y4;
    }

    public boolean isCoincide(){
        if(Math.abs((y4-y3)*x1+(x3-x4)*y1+x4*y3-y4*x3)/Math.sqrt((y4-y3)*(y4-y3)+(x4-x3)*(x4-x3))<0.01&&(Math.abs((y1-y2)/(x1-x2)-(y3-y4)/(x3-x4))<0.01||((x1==x2)&&(x3==x4))))
            return true;
        else return false;
    }
    public boolean three(){
        //小數點後三位
        double x = -((x3-x4)*(x2*y1-x1*y2)-(x1-x2)*(x4*y3-x3*y4))/((y3-y4)*(x1-x2)-(y1-y2)*(x3-x4));
        double y = -((y3-y4)*(y2*x1-y1*x2)-(y1-y2)*(y4*x3-y3*x4))/((x3-x4)*(y1-y2)-(x1-x2)*(y3-y4));
        if(Math.abs((y1-y2)/(x1-x2)-(y3-y4)/(x3-x4))<0.01)
            return false;
        else if (((x>=x3&&x<=x4)||(x<=x3&&x>=x4))&&((y>=y3&&y<=y4)||(y<=y3&&y>=y4))&&((x>=x1&&x<=x2)||(x<=x1&&x>=x2))&&((y>=y1&&y<=y2)||(y<=y1&&y>=y2)))
            return true;
        else return false;
    }
}

需要註意的地方:小數點的位數以及錯誤的情況

3、7-3 設計一個銀行業務類
編寫一個銀行業務類BankBusiness,具有以下屬性和方法:
(1)公有、靜態的屬性:銀行名稱bankName,初始值為“中國銀行”。
(2)私有屬性:賬戶名name、密碼password、賬戶餘額balance。
(3)銀行對用戶到來的歡迎(welcome)動作(靜態、公有方法),顯示“中國銀行歡迎您的到來!”,其中“中國銀行”自動使用bankName的值。
(4)銀行對用戶離開的提醒(welcomeNext)動作(靜態、公有方法),顯示“請收好您的證件和物品,歡迎您下次光臨!”
(5)帶參數的構造方法,完成開戶操作。需要賬戶名name、密碼password信息,同時讓賬戶餘額為0。
(6)用戶的存款(deposit)操作(公有方法,需要密碼和交易額信息),密碼不對時無法存款且提示“您的密碼錯誤!”;密碼正確、完成用戶存款操作後,要提示用戶的賬戶餘額,例如“您的餘額有1000.0元。”。
(7)用戶的取款(withdraw)操作(公有方法,需要密碼和交易額信息)。密碼不對時無法取款且提示“您的密碼錯誤!”;密碼正確但餘額不足時提示“您的餘額不足!”;密碼正確且餘額充足時扣除交易額並提示用戶的賬戶餘額,例如“請取走鈔票,您的餘額還有500.0元。”。

編寫一個測試類Main,在main方法中,先後執行以下操作:
(1)調用BankBusiness類的welcome()方法。
(2)接收鍵盤輸入的用戶名、密碼信息作為參數,調用BankBusiness類帶參數的構造方法,從而創建一個BankBusiness類的對象account。
(3)調用account的存款方法,輸入正確的密碼,存入若幹元。密碼及存款金額從鍵盤輸入。
(4)調用account的取款方法,輸入錯誤的密碼,試圖取款若幹元。密碼及取款金額從鍵盤輸入。
(5)調用account的取款方法,輸入正確的密碼,試圖取款若幹元(取款金額大於餘額)。密碼及取款金額從鍵盤輸入。
(6)調用account的取款方法,輸入正確的密碼,試圖取款若幹元(取款金額小於餘額)。密碼及取款金額從鍵盤輸入。
(7)調用BankBusiness類的welcomeNext()方法。

輸入格式:
輸入開戶需要的姓名、密碼
輸入正確密碼、存款金額
輸入錯誤密碼、取款金額
輸入正確密碼、大於餘額的取款金額
輸入正確密碼、小於餘額的取款金額

輸出格式:
中國銀行(銀行名稱)歡迎您的到來!
您的餘額有多少元。
您的密碼錯誤!
您的餘額不足!
請取走鈔票,您的餘額還有多少元。
請收好您的證件和物品,歡迎您下次光臨!

輸入樣例:
在這裡給出一組輸入。請註意,輸入與輸出是交替的,具體順序請看測試類中的說明。例如:

張三 123456
123456 1000
654321 2000
123456 2000
123456 500
輸出樣例:
在這裡給出相應的輸出。請註意,輸入與輸出是交替的,具體順序請看測試類中的說明。例如:

中國銀行歡迎您的到來!
您的餘額有1000.0元。
您的密碼錯誤!
您的餘額不足!
請取走鈔票,您的餘額還有500.0元。
請收好您的證件和物品,歡迎您下次光臨!

我的代碼如下:

點擊查看代碼
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String name = in.next();//賬戶名
        int input = in.nextInt();//密碼
        BankBusiness bank = new BankBusiness(name,input);
        int rightPassword = in.nextInt();//正確密碼
        double save = in.nextDouble();//存款金額
        int wrongPassword = in.nextInt();//錯誤密碼
        double withdrawal = in.nextDouble();//取款金額
        int right1 = in.nextInt();//取款金額大於餘額時的正確密碼
        double withdrawal1 = in.nextDouble();//取款金額(大於餘額)
        int right2 = in.nextInt();//取款金額小於餘額時的正確密碼
        double withdrawal2 = in.nextDouble();//取款金額(小於餘額)
        BankBusiness.welcome();//直接用類名調用靜態方法
        bank.deposit(rightPassword,save);
        bank.withdraw(wrongPassword,withdrawal);
        bank.withdraw(right1,withdrawal1);
        bank.withdraw(right2,withdrawal2);
        BankBusiness.welcomeNext();
    }
}

class BankBusiness{
    //編寫一個銀行業務類
    public static String bankName = "中國銀行";//銀行名稱
    private String name;//賬戶名
    private int password;//密碼
    private double balance;//賬戶餘額

    public BankBusiness(String name, int password) {
        super();
        this.name = name;
        this.password = password;
        balance =0;
    }
    public static void welcome(){
        System.out.println(bankName + "歡迎您的到來!");
    }

    public static void welcomeNext() {
        System.out.println("請收好您的證件和物品,歡迎您下次光臨!");
    }

    public void deposit(int input,double save){
        //參數是用戶輸入的密碼和存款
        if (input != password)
            System.out.println("您的密碼錯誤!");
        else {
            balance = balance + save;
            System.out.println("您的餘額有" + balance + "元。");
        }
    }

    public void withdraw(int input,double withdrawal){
        //參數是用戶輸入的密碼和取款
        if (input != password)
            System.out.println("您的密碼錯誤!");
        else{
            if (balance < withdrawal)
                System.out.println("您的餘額不足!");
            else {
                balance = balance - withdrawal;
                System.out.println("請取走鈔票,您的餘額還有" + balance + "元。");
            }
        }
    }
}

本題比較簡單,我們需要提高代碼的效率。

3.PTA第5次大作業總結
1、7-1 點線形系列5-凸五邊形的計算-1
用戶輸入一組選項和數據,進行與五邊形有關的計算。
以下五邊形頂點的坐標要求按順序依次輸入,連續輸入的兩個頂點是相鄰頂點,第一個和最後一個輸入的頂點相鄰。
選項包括:
1:輸入五個點坐標,判斷是否是五邊形,判斷結果輸出true/false。
2:輸入五個點坐標,判斷是凹五邊形(false)還是凸五邊形(true),如果是凸五邊形,則再輸出五邊形周長、面積,結果之間以一個英文空格符分隔。 若五個點坐標無法構成五邊形,輸出"not a pentagon"
3:輸入七個點坐標,前兩個點構成一條直線,後五個點構成一個凸五邊形、凸四邊形或凸三角形,輸出直線與五邊形、四邊形或三角形相交的交點數量。如果交點有兩個,再按面積從小到大輸出被直線分割成兩部分的面積(不換行)。若直線與多邊形形的一條邊線重合,輸出"The line is coincide with one of the lines"。若後五個點不符合五邊形輸入,若前兩點重合,輸出"points coincide"。

以上3選項中,若輸入的點無法構成多邊形,則輸出"not a polygon"。輸入的五個點坐標可能存在冗餘,假設多邊形一條邊上兩個端點分別是x、y,邊線中間有一點z,另一頂點s:
1)符合要求的輸入:頂點重覆或者z與xy都相鄰,如:x x y s、x z y s、x y x s、s x y y。此時去除冗餘點,保留一個x、一個y。
2) 不符合要求的輸入:z不與xy都相鄰,如:z x y s、x z s y、x s z y

輸入格式:
基本格式:選項+":"+坐標x+","+坐標y+" "+坐標x+","+坐標y。點的x、y坐標之間以英文","分隔,點與點之間以一個英文空格分隔。

輸出格式:
基本輸出格式見每種選項的描述。
異常情況輸出:
如果不符合基本格式,輸出"Wrong Format"。
如果符合基本格式,但輸入點的數量不符合要求,輸出"wrong number of points"。
註意:輸出的數據若小數點後超過3位,只保留小數點後3位,多餘部分採用四捨五入規則進到最低位。小數點後若不足3位,按原始位數顯示,不必補齊。例如:1/3的結果按格式輸出為 0.333,1.0按格式輸出為1.0

輸入樣例1:
選項1,點重合。例如:

1:-1,-1 1,2 -1,1 1,0
輸出樣例:
在這裡給出相應的輸出。例如:

wrong number of points

點擊查看代碼
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        String[] s = str.split(" ");//將字元串按照空格分開,便於後面判斷格式合法的坐標點數量
        boolean flag = true;
        String regStr = "([\\+\\-]?([0]|[1-9]+))(\\.\\d+)?\\,([\\+\\-]?([0]|[1-9]+))(\\.\\d+)?(\\s([\\+\\-]?([0]|[1-9]+))(\\.\\d+)?\\,([+\\-]?([0]|[1-9]+))(\\.\\d+)?)+";
        if (str.matches(regStr))
            flag = true;
        else flag = false;
        if (!flag){
            System.out.println("Wrong Format");
            return;
        }else {
            if (s.length != 2)
                System.out.println("wrong number of points");
            else {
                String[] s1 = s[0].split(",");
                String[] s2 = s[1].split(",");
                double x1 = Double.parseDouble(s1[0]);
                double y1 = Double.parseDouble(s1[1]);
                double x2 = Double.parseDouble(s2[0]);
                double y2 = Double.parseDouble(s2[1]);
                //double x1 = Double.parseDouble(String.valueOf(str.charAt(0)));//取出字元串第一個字元強制轉化為double
                //double y1 = str.charAt(2);
                //double x2 = str.charAt(5);
                //double y2 = str.charAt(7);
                double a = x1 - x2;
                double b = y1 - y2;
                //System.out.println(x1);
                System.out.println(Math.sqrt(a*a+b*b));
            }
        }
    }
}

本次作業難度很大,超出了我的能力範圍。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • sort包簡介 官方文檔 Golang的sort包用來排序,二分查找等操作。本文主要介紹sort包里常用的函數,通過實例代碼來快速學會使用sort包 sort包內置函數 sort.Ints(x []int) ints := []int{1, 4, 3, 2} fmt.Printf("%v\n", i ...
  • 本文mybatis-spring-boot探討在springboot工程中mybatis相關對象的註冊與載入。 建議先瞭解mybatis在spring中的使用和springboot自動裝載機制,再看此文章。 傳送門:Mybatis源碼解讀-配置載入和Mapper的生成 問題 @MapperScan和 ...
  • 一個工作了7年的粉絲,遇到了一個Zookeeper的問題。 因為接觸過Zookeeper這個技術,不知道該怎麼回答。 我說一個工作了7年的程式員,沒有接觸過主流技術,這不正常。 於是我問了他工資以後,我理解了! 好吧,關於“Zookeeper中Watch機制的實現原理”,看看普通人和高手的回答。 普 ...
  • 作者:何甜甜在嗎 鏈接:https://juejin.cn/post/6916150628955717646 寫在前面 在介紹具體方案之前,首先先介紹一下常見的加密演算法。加密演算法可以分為三大類: 對稱加密演算法 非對稱加密演算法 Hash演算法 對稱加密演算法 加密和解密使用相同的密鑰。對稱加密演算法加密解密 ...
  • RocketMQ學習 1.基本概念 RocketMQ是阿裡巴巴團隊使用java語言開發的一款分散式消息中間件,是一款低延遲,高可用,擁有海量消息堆積能力和靈活拓展性的消息隊列。 rocketmq的官網:http://rocketmq.apache.org gitee倉庫:https://gitee. ...
  • 多線程筆記(四) 1. Atomic框架包 Atomic包里放著所以保證線程安全的原子類 大致分為7類 基本數據類型的原子操作類 引用類型的原子操作類 數組類型的原子操作類 修改屬性欄位的原子操作類 帶版本的引用類型的原子操作類 增強的基本數據類型的原子操作類 增強操作的公共輔助類 2. Count ...
  • 驗證碼的功能是防止非法用戶惡意去訪問登錄介面而設置的一個功能,今天我們就來看看在前後端分離的項目中,SpringBoot是如何提供服務的。 SpringBoot版本 本文基於的Spring Boot的版本是2.6.7 。 引入依賴 captcha一款超簡單的驗證碼生成,還挺好玩的.還有中文驗證碼,動 ...
  • 作者:等不到的口琴 鏈接:https://www.cnblogs.com/Courage129/p/14446586.html 本文準備圍繞七個點來講網關,分別是網關的基本概念、網關設計思路、網關設計重點、流量網關、業務網關、常見網關對比,對基礎概念熟悉的朋友可以根據目錄查看自己感興趣的部分。 什麼 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...