第7关 - 2017佛山市图书馆GoC初赛
164.(201706比赛)第1题:品形(pin)
题目描述
小P刚学会goc时最喜欢画汉字,请你帮忙使用GoC编程绘制个用3个正方形拼成的像“品”字的如下图形。
注意:上图的每个线段长度都是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编程绘制。
注意:笔身的长度是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编程绘制。
注意:正三角形的边长都是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编程绘制。
注意: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时图形如下:
注意:正三角形的边长是50。
输入格式 一正整数N,N范围[1,10]。
输出格式 相应的图形。
输入/输出例子1
输入:
2
输出:
题解
方法一:
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;
}
方法二: 绘多个方向的同顶点三角形进行叠加
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时小草如下图:
注意:小草的颜色编号是3号,每个边长是100,每个边平均分布,角度相同。
输入格式 一正整数N,范围[3,90]。
输出格式 相应的图形。
输入/输出例子1
输入:
10
输出:
题解
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,对应的图形如下:
输入格式 第1行:一个正整数N,范围在[1,15]。 第2行:有N个分数,每个分数范围在[10,100]。
输出格式 相应的图形。
输入/输出例子1
输入:
4
80 50 90 60
输出:
输入/输出例子2
输入:
5
55 60 80 93 100
输出:
题解
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
输出:
输入/输出例子2
输入:
10
输出:
输入/输出例子3
输入:
50
输出:
题解
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就能摆出下面的图形:
他妹妹喜欢圆,希望他选的圆(11号色)尽量大,而正方形(10号色)尽量小。请你帮忙画出这个图形。
输入格式 第1行,一个正整数N:范围在[1,10]。 第2行,有N个正整数,表示每个正方形的边长。 第3行,有N个正整数,表示每个圆的半径。
输出格式 相应的图形。
输入/输出例子1
输入:
3
100 60 80
30 20 10
输出:
输入/输出例子2
输入:
2
30 40
40 15
输出:
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;
}