Java打印实心、空心的三角形和菱形

本文详细介绍如何使用Java编程语言绘制各种图形,包括实心和空心的三角形、菱形。通过具体代码示例,读者可以学习到如何控制图形的大小、形状及填充方式,适用于初学者和希望深化Java图形编程技能的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.实心三角形

代码:

 1 import java.util.Scanner;
 2 
 3 public class Test {
 4 
 5     public static void main(String[] args) {
 6         int rows;
 7         Scanner sc = new Scanner(System.in);
 8         System.out.println("Please input rows:");
 9         rows = sc.nextInt();
10         sc.close();
11         for (int i = 1; i <= rows; i++) {//控制打印行数
12             for (int j = 1; j <= rows - i; j++) {//控制每行打印空格数
13                 System.out.print(" ");
14             }
15             for (int j = 1; j <= i * 2 - 1; j++) {//控制打印星号数
16                 System.out.print("*");
17             }
18             System.out.println();//每打一行,换行
19         }
20     }
21 
22 }
View Code

2.空心三角形

代码:

 1 import java.util.Scanner;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         int rows;
 6         Scanner sc = new Scanner(System.in);
 7         System.out.println("Please input rows:");
 8         rows = sc.nextInt();
 9         sc.close();
10         for (int i = 1; i <= rows; i++) {
11             for (int j = 1; j <= rows - i; j++) {
12                 System.out.print(" ");
13             }
14             for (int j = 1; j <= 2 * i - 1; j++) {
15                 if (i == 1 || i == rows) { // 如果是第一行或最后一行,打印所有星号
16                     System.out.print("*");
17                 } else if (j == 1 || j == 2 * i - 1) { // 如果是每行的第一个或者最后一个,打印星号
18                     System.out.print("*");
19                 } else { // 其余打印空格
20                     System.out.print(" ");
21                 }
22             }
23             System.out.println();
24         }
25     }
26 }
View Code

3.实心菱形

代码:

 1 import java.util.Scanner;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         int rows;
 6         Scanner sc = new Scanner(System.in);
 7         System.out.println("Please input odd rows:");// 只能是奇数行
 8         rows = (sc.nextInt() + 1) / 2;// 上半部分行数
 9         sc.close();
10         for (int i = 1; i <= rows; i++) {
11             for (int j = 1; j <= rows - i; j++) {
12                 System.out.print(" ");
13             }
14             for (int j = 1; j <= 2 * i - 1; j++) {
15                 System.out.print("*");
16             }
17             System.out.println();
18         }
19         for (int i = rows - 1; i >= 1; i--) { // 下半部分不可重复打印上半部分最后一行,i=rows-1)
20             for (int j = 1; j <= rows - i; j++) {
21                 System.out.print(" ");
22             }
23             for (int j = 1; j <= 2 * i - 1; j++) {
24                 System.out.print("*");
25             }
26             System.out.println();
27         }
28     }
29 }
View Code

4.空心菱形

代码:

 1 import java.util.Scanner;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         int rows;
 6         Scanner sc = new Scanner(System.in);
 7         System.out.println("Please input odd rows:");// 只能是奇数行
 8         rows = (sc.nextInt() + 1) / 2;// 上半部分行数
 9         sc.close();
10         sc.close();
11         for (int i = 1; i <= rows; i++) {
12             for (int j = 1; j <= rows - i; j++) {
13                 System.out.print(" ");
14             }
15             for (int j = 1; j <= 2 * i - 1; j++) {
16                 if (i == 1) {
17                     System.out.print("*");
18                 } else if (j == 1 || j == 2 * i - 1) {
19                     System.out.print("*");
20                 } else {
21                     System.out.print(" ");
22                 }
23             }
24             System.out.println();
25         }
26         for (int i = rows - 1; i >= 1; i--) {// 此处只需i=rows-1即可
27             for (int j = 1; j <= rows - i; j++) {
28                 System.out.print(" ");
29             }
30             for (int j = 1; j <= 2 * i - 1; j++) {
31                 if (i == 1) {
32                     System.out.print("*");
33                 } else if (j == 1 || j == 2 * i - 1) {
34                     System.out.print("*");
35                 } else {
36                     System.out.print(" ");
37                 }
38             }
39             System.out.println();
40         }
41     }
42 }
View Code

转载于:https://www.cnblogs.com/linkchen/p/10453366.html

<think>在UML(统一建模语言)中,箭头用于表示类之间的关系。对于继承关系,我们使用三角形箭头。这里解释实心三角形空心三角形的区别:1.**实心三角形(▲)**:表示**泛化(Generalization)**,即继承关系。箭头从子类指向父类。-在C++中对应:`classDerived:publicBase`2.**空心三角形(△)**:表示**实现(Realization)**,即类实现接口(抽象类)的关系。箭头从实现类指向接口。-在C++中对应:实现一个纯虚类(抽象类)###详细说明####1.实心三角形(泛化/继承)-**含义**:表示一个类(子类)继承另一个类(父类)。子类继承了父类的属性方法,并可以添加自己的属性方法,或者重写父类的方法。-**C++代码示例**:```cpp//基类(父类)classAnimal{public:voideat(){std::cout<<"Animaleats"<<std::endl;}};//派生类(子类)继承AnimalclassDog:publicAnimal{public:voidbark(){std::cout<<"Dogbarks"<<std::endl;}};```-**UML表示**:```Dog▲|▼Animal```####2.空心三角形(实现/接口实现)-**含义**:表示一个类实现了一个接口(即抽象类,包含纯虚函数)。实现类必须提供接口中所有纯虚函数的实现。-**C++代码示例**:```cpp//接口(抽象类)classFlyable{public:virtualvoidfly()=0;//纯虚函数};//实现类:实现Flyable接口classBird:publicFlyable{public:voidfly()override{std::cout<<"Birdflies"<<std::endl;}};```-**UML表示**:```Bird△|▼Flyable```###对比表格|关系类型|箭头|含义|C++实现方式||----------|------------|----------------|--------------------------||泛化|实心三角形▲|继承(is-a)|`classDerived:publicBase`||实现|空心三角形△|实现接口|`classClass:publicInterface`(接口为抽象类)|###注意事项-在C++中,没有内置的“接口”关键字,接口是通过抽象类(包含纯虚函数的类)来模拟的。-泛化(实心三角形)用于类与类之间的继承(包括非抽象类)。-实现(空心三角形)用于类与接口(抽象类)之间的关系。###示例:两种关系同时存在```cpp//抽象类(接口)classSwimmable{public:virtualvoidswim()=0;};//基类classAnimal{public:virtualvoideat()=0;//也可以是纯虚函数,使Animal成为抽象类};//派生类:继承Animal并实现SwimmableclassFish:publicAnimal,publicSwimmable{public:voideat()override{std::cout<<"Fisheats"<<std::endl;}voidswim()override{std::cout<<"Fishswims"<<std::endl;}};```对应的UML图:-`Fish`用实心三角形指向`Animal`(继承)-`Fish`用空心三角形指向`Swimmable`(接口实现)§§相关问题§§:1.在C++中,抽象类普通类的区别是什么?2.多重继承在C++中如何实现?可能带来什么问题?3.如何解决多重继承中的菱形继承问题?4.虚函数纯虚函数在实现多态时有什么不同?</think>在 UML(统一建模语言)中,**实心三角形(▲)** **空心三角形(△)** 都表示继承关系,但用于不同的场景。以下是它们的详细区别代码实现: ### 核心区别总结 | 特征 | 实心三角形(▲) | 空心三角形(△) | |--------------|-------------------------------------|-------------------------------------| | **正式名称** | 泛化(Generalization) | 实现(Realization) | | **关系类型** | 类与类之间的继承 | 类与接口之间的实现关系 | | **箭头方向** | 子类 → 父类 | 实现类 → 接口类 | | **代码表现** | `class Derived : public Base` | `class Impl : public Interface` | | **使用场景** | 具体类继承具体类/抽象类 | 具体类实现纯抽象接口 | | **生命周期** | 共享基类生命周期 | 无生命周期关联 | --- ### 1. 实心三角形(▲):泛化关系(类继承类) 表示**具体类或抽象类之间的继承关系**,是 "is-a" 关系的直接体现。 **代码示例**: ```cpp #include <iostream> // 基类(可以是具体类或抽象类) class Shape { public: virtual double area() const { std::cout << "Shape area called\n"; return 0; } virtual ~Shape() = default; }; // 派生类(实心三角形指向 Shape) class Circle : public Shape { // ▲ 关系 double radius; public: Circle(double r) : radius(r) {} double area() const override { return 3.14159 * radius * radius; } }; int main() { Shape* s = new Circle(5.0); std::cout << "Area: " << s->area() << "\n"; // 多态调用 delete s; } ``` **关键特征**: - 基类可以有数据成员实现方法 - 派生类继承基类的实现接口 - 支持多态(通过虚函数) - UML 图示: ```plaintext [Circle] ▲ | ▼ [Shape] ``` --- ### 2. 空心三角形(△):实现关系(类实现接口) 表示**类实现纯抽象接口**的关系,是契约式编程的体现。 **代码示例**: ```cpp #include <iostream> // 纯抽象接口(只有纯虚函数) class Drawable { // 接口类 public: virtual void draw() const = 0; // 纯虚函数 virtual ~Drawable() = default; }; // 具体实现类(空心三角形指向 Drawable) class Circle : public Drawable { // △ 关系 double radius; public: Circle(double r) : radius(r) {} void draw() const override { std::cout << "Drawing circle with radius " << radius << "\n"; } }; int main() { Drawable* d = new Circle(3.0); d->draw(); // 调用接口实现 delete d; } ``` **关键特征**: - 接口类只包含纯虚函数(C++ 无原生接口关键字) - 实现类必须提供所有接口方法的实现 - 无共享实现代码(纯接口) - UML 图示: ```plaintext [Circle] △ | ▼ [Drawable] ``` --- ### 混合使用场景 ```cpp // 纯抽象接口 class Serializable { public: virtual std::string serialize() const = 0; virtual ~Serializable() = default; }; // 抽象基类(有部分实现) class Shape { public: virtual double area() const = 0; // 纯虚函数 virtual void scale(double factor) = 0; virtual ~Shape() = default; }; // 具体类:继承Shape + 实现Serializable class Circle : public Shape, // ▲ 实心三角形(继承) public Serializable { // △ 空心三角形(接口实现) double radius; public: Circle(double r) : radius(r) {} // 实现Shape接口 double area() const override { return 3.14159 * radius * radius; } void scale(double factor) override { radius *= factor; } // 实现Serializable接口 std::string serialize() const override { return "Circle{radius:" + std::to_string(radius) + "}"; } }; ``` UML 表示: ```plaintext [Circle] ▲ △ | | | | ▼ ▼ | [Shape] | | | ▼ └──[Serializable] ``` --- ### 设计原则对比 | **原则** | 实心三角形(▲) | 空心三角形(△) | |-------------------------|-------------------------------------|-------------------------------------| | **开闭原则** | 通过继承扩展功能 | 通过新实现类扩展功能 | | **依赖倒置** | 依赖具体基类 | 依赖抽象接口 | | **接口隔离** | 可能继承不需要的功能 | 只实现必要接口 | | **组合优于继承** | 直接继承可能违反 | 天然符合(通过接口组合) |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值