2091 空心三角形

空心三角形

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 30595    Accepted Submission(s): 8447


Problem Description
把一个字符三角形掏空,就能节省材料成本,减轻重量,但关键是为了追求另一种视觉效果。在设计的过程中,需要给出各种花纹的材料和大小尺寸的三角形样板,通过电脑临时做出来,以便看看效果。
 

Input
每行包含一个字符和一个整数n(0<n<41),不同的字符表示不同的花纹,整数n表示等腰三角形的高。显然其底边长为2n-1。如果遇到@字符,则表示所做出来的样板三角形已经够了。
 

Output
每个样板三角形之间应空上一行,三角形的中间为空。显然行末没有多余的空格。
 

Sample Input
X 2 A 7 @
 

Sample Output
X XXX   A A A A A A A A A A A AAAAAAAAAAAAA

这道题不难,不过挺复杂的,而且最坑的是格式...........

输出的格式要求是:只有每两组有效数据之间有空行(啥叫有效数据?当然是不是@呗),就这一个坑死人的格式,就pe了很多人

其实就是个很简单的题,只要掌控好循环就可以了,结果...只能说出题人太坑了....

不过这样提前输出空行的方法很实用。


#include<stdio.h>
#include<string.h>
int main()
{
    char x;int n,i,j,k=0;
    while(scanf("%c",&x)&&x!='@')
    {
        ++k;
        scanf("%d",&n);
        getchar();//这个也要注意
        if(k!=1)//注意这个格式!!!!!!!!!!!!!!!
        {
            printf("\n");//这个样子巧妙避免了那种情况,想想为什么
        }
        for(i=0;i<n-1;++i)
        {
            for(j=0;j<n+i;++j)//双循环控制格式
            {
                if(j==n-i-1||j==n+i-1)//判断控制输出
                {
                    printf("%c",x);
                }
                else
                {
                    printf(" ");
                }
            }
            printf("\n");
        }
        for(i=0;i<2*n-1;++i)//最后一行特殊处理
        {
            printf("%c",x);
        }
        printf("\n");
    }
    return 0;
}



<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、付费专栏及课程。

余额充值