第 4 关 2019四年级下乙组比赛(DL)

image.png

轴对称(2019DL)

题目描述

小Q用一张纸对折后,在纸的一边画了一个边长为100的正三角形,在纸的另一边沿纸上的痕迹画图。展开后得到的是一个以折线为轴的对称图形。 如下图。你能把它用程序画出来吗?颜色为默认色,长度如图所示。

image.png

题解

对于需要抬笔才能完成的图形建议使用moveTo() 更简便,使用 setAngle() 可以快速恢复面向的方向

int main(){
    
    p.moveTo(-120,0);
    p.fd(100).rt(120).fd(100).rt(120).fd(100).rt(120);
    
    p.moveTo(120,0).setAngle(0);
    
    p.fd(100).lt(120).fd(100).lt(120).fd(100).lt(120);
    
    p.moveTo(0,0).setAngle(0).fd(200);
    
    return 0;
}

恒温杯垫(2019DL)

题目描述

天气渐冷,小Q妈妈为他准备的加热杯垫还真的好用,早晨起床先把牛奶或酸奶倒一杯放在加热垫,然后刷牙洗脸,正好温温的一杯牛奶,就可以美美的享用了。

但是这个加热杯垫也有一个小缺点,就是不能显示温度。这样就不能准确判断,杯中的温度是否刚好适合。于是,小Q决定设计一个根据杯垫温度,改变杯垫的颜色的程序。

功能如下:

  • 当杯垫检测的温度大于55°C时,杯垫显示红色。
  • 当杯垫检测的温度在50°C到55°C之间(包含50和55)时,杯垫显示绿色。
  • 当杯垫检测的温度小于50°C时,杯垫显示黑色。
  • 现在给出杯垫温度,请你编程画出相应的图形。

提示:

杯垫是一个宽为120,高100的长方形。中间显示有“55°C ”的提醒字样。你可以使用命令“p.text(“55°C”);”显示文字。

image.png

输入格式 输入只有一个整数,表示杯垫温度a。

输出格式 画出相应的图形。

输入/输出例子1

输入:

62

输出:

image.png

输入/输出例子2

输入:

52

输出:

image.png

题解

int main(){
    
    int col,n ;
    cin >> n;
    if(n > 55) col = 1;
    else if(n < 50) col = 0;
    else col = 3;
    p.rr(120,100,col).text("55°C");
    
    return 0;
}

圆内圆(2019DL)

题目描述

数学课上,老师教了小Q用圆规画圆。聪明的小Q设计了一个圆内有圆的图形。如下图所示,它是由三个圆心在同一直线上的圆构成,两个白色(15号色)圆的直径之和等于绿色(3号色)的大圆。现在已知两个白色圆的直径为d和D。请你编程画出相应的图形。

image.png

输入格式 输入两个数据,即两个白色圆的直径d和D。

【数据范围】

0<=d,D<=300。

输出格式 画出相应的图形。

输入/输出例子1

输入:

70 120

输出:

image.png

题解

int main(){
    int d,D,r;
    cin >> d >> D;
    d /= 2;
    D /= 2;
    r = d + D;
    p.oo(r,3).up();
    p.fd(r).bk(d).oo(d,15);
    p.bk(d+D).oo(D,15);
    
    return 0;
}

旋转的弹珠(2019DL)

题目描述

在一个环形轨道上内嵌了四种颜色的弹珠,它们均匀的分布在轨道内,如图所示。当开启按钮,四个弹珠会以10度/秒的速度顺时针围绕环形轨道上旋转。

该轨道外圆半径是140,弹珠的半径是20。四个弹珠的颜色分别是黑(0号色)、红(1号色)、蓝(2号色)、绿(3号色)。

请你编程画出k 秒后每个弹珠在环形轨道上的位置。

image.png

输入格式 第一行有一个整数 K。

【数据范围】

0<=K<=1000。

输出格式 请你编程画出k 秒后每个弹珠在环形轨道上的位置。

输入/输出例子1

输入:

9

输出:

image.png

题解

int main(){
    
    p.o(140).o(100).hide().up();
    
    int k,n= 4;
    cin >> k;
    
    k = k*10 % 360;
    p.rt(k);
    
    for(int i = 0; i < 4; i++){
        p.fd(120).oo(20,i).bk(120).rt(90);
    }
    
    return 0;
}

翻硬币(2019DL)

题目描述

小 Q 面前的桌子上有N个硬币,有些正面朝上,有些反面朝上。现在他将x至y连续一段的硬币翻转一面,请问这N个硬币中有多少个硬币正面朝上?

假设我们用半径为10的橙色(13号色)实心圆表示硬币正面,用半径为10的灰色(8号色)实心圆表示硬币反面。请编程画出翻转后每个硬币的状态。

image.png

输入格式 第一行一个整数N,表示桌子上有 N 个硬币。

第二行为 N个0和1,表示硬币 i的状态。其中0表示正面,1表示反面。

第三行为两个整数x和y(x<=y),表示x至y连续一段需要翻转。

输出格式 请编程画出翻转后每个硬币的状态。

输入/输出例子1

输入:

8

1 0 0 1 1 0 1 0

4 7

输出:

image.png

题解

goc 中 三目运算不能使用,所以只能用if…else…

int arr[105];
int main(){
    int n,col;
    cin >> n;
    // 初始化硬件
    for(int i = 1;i<= n;i++) {
        cin >> arr[i];
    }
    int x,y;
    cin >> x >> y;
    // 翻转硬币
    for(int i = x; i <= y; i++){
        arr[i] = ! arr[i];
    }
    
    p.rt(90).up();
    // 取值显示
    for(int i = 1;i <= n ; i++){
        if(arr[i]){
            col = 8;
        }else{
            col = 13;
        }
        p.fd(20).oo(10,col);
    }

    return 0;
}

益智游戏(2019DL)

题目描述】

小 Q一直在玩的一款益智游戏如下:已知三角形每边中间的三个数,请根据三角形三条边上的数,计算出三角形三个角上的数,使得每边之和为15。

例如:按顺时针方向,三角形三条边上的数为2,6,9 时:

image.png

提示:它是一个边长为200的正三角形,边和角上均匀分布了六个半径为20的圆形。图形中数字和边都是黑色(0号色),圆的底色的色号是圆中的数字。例如:数字为2的圆,底色为2号色。 数字为9的圆,底色为9号色。

请根据三角形三条边上的数,编程画出对应的图形。

输入格式 第一行有三个正整数a,b,c ,表示分别按顺时针方向,依次给出三角形三条边上的数。

(测试的输入数据保证有答案)

输出格式 请编程画出对应的图形。

输入/输出例子1

输入:

2 6 9

输出:

image.png

题解

由图中推导可知,左下角顶点计算公式

a = (15 + y - x -z) / 2;

image.png

int main(){
    cinWin();
    int x , y, z,a,b,c;
    cin >> x >> y >> z;
    
    // 两条边相加,去除底下两个洞,去除两边的洞,
    // 顶点的洞被计算两次
    a = (15 + y - x -z) / 2;
    b = 15 - a - x;
    c = 15 - a - z;
    
    cout << a << " " << b << " " << c;
    
    p.c(0).rt(30)
        .fd(200).rt(120)
        .fd(200).rt(120)
        .fd(200).rt(120);
    
    p.up();
    p.oo(20,a).o(20).text(a).fd(100);
    p.oo(20,x).o(20).text(x).fd(100).rt(120);
    
    p.oo(20,b).o(20).text(b).fd(100);
    p.oo(20,y).o(20).text(y).fd(100).rt(120);
    
    p.oo(20,c).o(20).text(c).fd(100);
    p.oo(20,z).o(20).text(z);
    
    return 0;
}