第7关 - 2017佛山市图书馆GoC初赛

image.png

164.(201706比赛)第1题:品形(pin)

题目描述

小P刚学会goc时最喜欢画汉字,请你帮忙使用GoC编程绘制个用3个正方形拼成的像“品”字的如下图形。

image.png

注意:上图的每个线段长度都是50。

题解

本题解法比较多,下面给出moveTo()的方法,其它方法大家自行测试

int main(){
    p.up().moveTo(25,25).r(50,50)
        .moveTo(75,75).r(50,50)
        .moveTo(125,25).r(50,50);
    
    return 0;
}

165.(201706比赛)第2题 笔(pen)

题目描述

小P设计了如下图的“笔”,请你帮忙使用GoC编程绘制。

image.png

注意:笔身的长度是100,笔头正三角形的边长是30。

题解

把起点放在交叉点比较多的地方可以有效的减少绘图的复杂度。

int main(){
    p.bk(100).rt(90).fd(30).lt(90).fd(100);
    p.lt(30).fd(30)
        .lt(120).fd(30)
        .lt(120).fd(30);
    
    return 0;
}

166.(201706比赛)第3题:梯形(ladder)

题目描述

小P现在学会使用颜色命令,他使用2种新的颜色:红色(1号)和深绿色(10号)设计了如下图的“梯形”,请你帮忙使用GoC编程绘制。

image.png

注意:正三角形的边长都是80。

题解

方法一:(98 分)

int main(){
    p.c(1).hide()
        .rt(90).fd(80)
        .lt(120).fd(80)
        .up()
        .lt(60).fd(80)
        .down()
        .lt(60).fd(80)
        .lt(120).fd(80);
    
    p.c(10)
        .lt(60).fd(80)
        .lt(120).fd(80)
        .lt(120).fd(80);
    
    return 0;
}

方法二:

void draw(){
    p.fd(80).rt(120)
        .fd(80).rt(120)
        .fd(80).rt(120);
}

int main(){
    p.c(1).rt(30);
    draw();
    p.lt(120);
    draw();
    p.c(10).rt(60);
    draw();
    
    return 0;
}

167.(201706比赛)第4题:跑道(runway)

题目描述

在学习了画圆命令(o,oo)和矩形(r,rr)后,小P能画出很多漂亮的图形。但下课路过操场时,如下图的跑道形状吸引了他的注意。他觉得应该可以画,可又没想清楚怎样画,请你帮忙使用GoC编程绘制。

image.png

注意:2个半圆的半径是50; 上、下直线长度是200;颜色色号6。

题解

int main(){    
    p.c(6).rt(90)
        .oo(50).fd(100)
        .rr(200,100).fd(100)
        .oo(50);
    return 0;
}

168.(201706比赛)第5题 三角形(tri)

题目描述

小P对人类历史很着迷,特别喜欢埃及的金字塔。他设计了一个N层的使用正三角形构成的金字塔图形。例如N=4时图形如下:

image.png

注意:正三角形的边长是50。

输入格式 一正整数N,N范围[1,10]。

输出格式 相应的图形。

输入/输出例子1

输入:

2

输出:

image.png

题解

方法一:

int main(){
    int n;
    cin >> n;
    p.rt(30).speed(1);
    for(int i= 1; i<=n;i++){
        //绘制多个 ^ 图形,形成多个 ^^^^再画最下面一横线
        for(int j=1;j<=i;j++){
            p.fd(50).rt(120).fd(50).lt(120);
        }
        p.rt(60).bk(i*50);
        
        // 移到下一行起点
        if(i!=n){
            p.lt(60).bk(50);
        }
    }
    return 0;
}

方法二: 绘多个方向的同顶点三角形进行叠加

image.png

void draw(int n){
    p.rt(120);
    for(int i = 1; i<= n;i++){
        p.fd(50*i).rt(120)
            .fd(50*i).rt(120)
            .fd(50*i).rt(120);
    }
}

int main(){
    int n;
    cin >> n;
    p.rt(30).speed(10);
    
    draw(n);
    
    p.fd(50*n);
    draw(n);
    
    p.fd(50*n);
    draw(n);
    
    return 0;
}

169.(201706比赛)第6题:小草(grass)

题目描述

小P同学这天学习了输入语句cin,在goc课上想画一个N个分叉的“小草”。例如:N=5时小草如下图:

image.png

注意:小草的颜色编号是3号,每个边长是100,每个边平均分布,角度相同。

输入格式 一正整数N,范围[3,90]。

输出格式 相应的图形。

输入/输出例子1

输入:

10

输出:

image.png

题解

int main(){
    
    int n;
    cin >> n;
    int t = n ;
    pen.lt(90).c(3);
    while(n--){
        p.fd(100).bk(100)
            .rt(180.0/(t-1));
    }
    return 0;
}

170.(201706比赛)第7题:分数(score)

题目描述

老师要求小P把成绩表用直方图表示出来。具体的要求是:输入N个分数,用宽度是20,高度是分数的N个矩形拼在一起表示。进一步,为了一眼看出好、中、差3个分数段的情况,规定:如果分数大于等于90,使用绿色(3号颜色)矩形;如果分数在89到60之间,使用蓝色(2号颜色)矩形;如果分数小于60,使用红色(1号颜色)矩形。例如:N=5,分数为 70 95 48 90 60,对应的图形如下: image.png

输入格式 第1行:一个正整数N,范围在[1,15]。 第2行:有N个分数,每个分数范围在[10,100]。

输出格式 相应的图形。

输入/输出例子1

输入:

4

80 50 90 60

输出:

image.png

输入/输出例子2

输入:

5

55 60 80 93 100

输出:

image.png

题解

int main(){
    int n,x;
    cin >> n;
    
    p.rt(90).up();
    for(int i=0;i<n;i++){
        cin >> x;
        if(x>=90) p.c(3);
        else if(x<60) p.c(1);
        else p.c(2);
        
        p.moveTo(20*i,x/2.0).rr(20,x);
    }
    
    return 0;
}

171.(201706比赛)第8题:数列(series)

题目描述

小P昨天数学留了一道关于数列的作业: 数列的前几项是:50,51,53,56,60,65,…。要求找到规律,计算出前N项。 作为goc高手,小P设计了一个用图形表示这个数列的方案。具体的设计是: 把一周均匀分成N个角度,画N个射线。这N条射线的长度就是数列的值%200(模运算避免太长画出边界),射线的颜色号按照1,2,3,1,2,3,1,2,3…变化。为了醒目,在直线的顶端画一个半径是10的实心圆(例如:p.fd(50).oo(10).bk(50); )。

输入格式 第1行,一个正整数N:范围在[1,120]。

输出格式 相应的图形。

输入/输出例子1

输入:

5

输出:

image.png

输入/输出例子2

输入:

10

输出:

image.png

输入/输出例子3

输入:

50

输出:

image.png

题解

int main()
{
    int n,ans=50;
    cin>>n;
    
    for(int i=1;i<=n;i++)
    {
        // 循环 计算出 1,2,3 ,1,2,3 ,1,2,3
        p.c((i-1)%3 +1);
        
        pen.fd(ans%200)
            .oo(10)
            .bk(ans%200);
        pen.rt(360.00/n);
        ans+= i ;
    }
    
    return 0;
}

172.(201706比赛)第9题:拼图(puzzle)

题目描述

小P有N个圆形和N个正方形的图形,如果拿一个半径是20的圆和一个边长是30的正方形小P就能摆出下面的图形:

image.png

他妹妹喜欢圆,希望他选的圆(11号色)尽量大,而正方形(10号色)尽量小。请你帮忙画出这个图形。

输入格式 第1行,一个正整数N:范围在[1,10]。 第2行,有N个正整数,表示每个正方形的边长。 第3行,有N个正整数,表示每个圆的半径。

输出格式 相应的图形。

输入/输出例子1

输入:

3

100 60 80

30 20 10

输出:

image.png

输入/输出例子2

输入:

2

30 40

40 15

输出:

image.png

int main(){
    int n,maxa=0,minb=10000,x;
    cin >> n;
    
    for(int i=0;i<n;i++){
        cin >> x;
        if( x < minb) minb = x;
    }
    for(int i=0;i<n;i++){
        cin >> x;
        if( x > maxa) maxa = x;
    }
    
    p.oo(maxa,11).up()
        .bk((minb)/2.0+maxa)
        .rr(minb,minb,10);
    
    return 0;
}