PAT乙级(图形输出) 1036、1027

简介: PAT乙级(图形输出) 1036、1027

1036 跟奥巴马一起编程

美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!

输入格式:

输入在一行中给出正方形边长 N(3≤N≤20)和组成正方形边的某种字符 C,间隔一个空格。

输出格式:

输出由给定字符 C 画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的 50%(四舍五入取整)。

输入样例:

10 a

输出样例:

aaaaaaaaaa
a        a
a        a
a        a
aaaaaaaaaa

代码:

#include<stdio.h>
int main(){
    char a;//用于存放要打印的字符
    int i, length;//i用于控制打印的次数,length用于存放要打印的边长
    scanf("%d %c", &length, &a);
    for(i = 1; i <= length; i++){//第一行打印length个字符
        printf("%c", a);
    }
    printf("\n");//换行到第二行
    int high;//存放高度
    if (length % 2 == 0){//对高度进行赋值,长度的50%,四舍五入
        high = length / 2;
    }
    else{
        high = length / 2 + 1;
    }
    for(i = 2; i <= high - 1; i++){//控制第二行到倒数第二行的输出
        for(int j = 1; j <= length; j++){//控制每行输出的元素个数
            if(j == 1 || j== length){//如果是第一个元素和最后一个元素,输出字符
                printf("%c", a);
            }
            else{//其余元素,输出空格
                printf(" ");
            }
        }
        printf("\n");//结束每行的输出后换行
    }
    for(i = 1; i <= length; i++){//输出最后一行的元素
        printf("%c", a);
    }
    return 0;
}

1027 打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2

代码:

(1)

#include<stdio.h>
int count(int current, int total, int floor) {//求出最多能存下几层的符号(半边)
    current = 2 * floor - 1 + current;//current指的是当前层的符号数
    if (total >= current) {//判断当前符号的总数是否超过了指定的总数
        count(current, total, floor + 1);//未超过,则进行递归运算,计算下一层的情况
    }
    else {//如果已经超过,则说明当前数量过多,需要退回一层,返回上一层的层数
        return floor - 1;
    }
}
int above(int floor, int quantity, char symbol) {//打印上半个沙漏,最中间那层上层循环不打印
    int k1 = 1, k2 = 1, j1 = floor, j2 = floor;
    for (int i = 1; i < floor; i++) {//一共打印floor - 1层
        for (j2 = j1; j2 < floor; j2++) {//打印空格
            printf(" ");
        }
        for (k2 = k1; k2 <= 2 * floor - 1; k2++) {//打印符号,并记录打印符号的总数
            printf("%c", symbol);
            quantity++;
        }
        k1 += 2;//下层比当前层少打印两个符号
        j1 -= 1;//下层比当前层多打印一个空格
        printf("\n");
    }
    return quantity;//返回上半个沙漏总共打印了多少个符号
}
int below(int floor, int quantity, char symbol) {
    int k1 = floor, k2 = floor, j1 = 1, j2 = 1;
    for (int i = 1; i <= floor; i++) {//一共打印floor层,最中间那层由下层循环打印
        for (j2 = j1; j2 < floor; j2++) {
            printf(" ");
        }
        for (k2 = k1; k2 <= floor; k2++) {
            printf("%c", symbol);
            quantity++;
        }
        k1 -= 2;//下层比当前层多打印两个符号
        j1 += 1;//下层比当前层少打印一个空格
        printf("\n");
    }
    return quantity;
}
int main() {
    int floor = 1, total, used = 0, initialCount = 0, initialFloor = 1;//left记录剩余的字符个数,floor记录层数
    char symbol;
    scanf("%d %c", &total, &symbol);
    if (total == 1) {//特殊情况:当输入的数字为1时,打印一个符号,并且输出0,return结束程序
        printf("%c\n", symbol);
        printf("0");
        return 0;
    }
    else {
        floor = count(initialCount, total / 2, initialFloor);//通过count函数计算层数
    }
    used = above(floor, used, symbol);//通过above函数打印上半个沙漏
    used = below(floor, used, symbol);//通过below函数打印下半个沙漏
    printf("%d", total - used);//输出剩余的符号数,总数减去已使用数
    return 0;
}

(2)

#include<stdio.h>
#include<math.h>
int main() {
  int n;
  char c;
  scanf("%d %c", &n, &c);
  int bottom = (int)sqrt(2.0 * (n + 1)) - 1;//三角形底边拥有的字符数
  if (bottom % 2 == 0) {//如果bottom为偶数,使他为奇数
    bottom--;
  }
  int used = (bottom + 1) * (bottom + 1) / 2 - 1;//计算总共输出的非空格字符数
  //输出倒三角
  for (int i = bottom; i >= 1; i -= 2) {
    for (int j = 0; j < (bottom - i) / 2; j++) {
      printf(" ");
    }
    for (int j = 0; j < i; j++) {
      printf("%c", c);
    }
    printf("\n");
  }
  //输出正三角
  for (int i = 3; i <= bottom; i += 2) {
    for (int j = 0; j < (bottom - i) / 2; j++) {
      printf(" ");
    }
    for (int j = 0; j < i; j++) {
      printf("%c", c);
    }
    printf("\n");
  }
  printf("%d\n", n - used);
  return 0;
}
相关文章
|
7月前
|
计算机视觉 Python
使用Python进行多点拟合以确定标准球的球心坐标
使用Python进行多点拟合以确定标准球的球心坐标
156 1
|
7月前
22.图形输出
22.图形输出
36 0
|
机器学习/深度学习 人工智能 Python
输入描述语,Ai自动帮你画图!圆你艺术家的梦!
你能想象,下面两张图是独一无二的,也近乎于“原创”了吧,而且它出自并不会绘画的 @不坑老师 之手。
261 0
|
C语言
创建各类三角形图案
C 语言实例 - 创建各类三角形图案
64 1
|
机器学习/深度学习 人工智能 图形学
计算机图形学中的图形输入详解
计算机图形学中的图形输入详解
269 2
|
机器学习/深度学习 索引
一行代码绘制高分SCI限制立方图
Restricted cubic splines (RCS)是一种基于样条函数的非参数化模型,它可以可靠地拟合非线性关系,可以自适应地调整分割结点。在统计学和机器学习领域,RCS通常用来对连续型自变量进行建模,并在解释自变量与响应变量的关系时更加准确和精细。之前有写一篇RCS的文章,但是还是有一定的难度,经过一段时间的研究,发现rcssci包更为简便好用。
347 0
|
Python
Python|打印给定高度和笔宽的叉
Python|打印给定高度和笔宽的叉
63 0
16题箴淦,来带领大家循环输出各种图形
16题箴淦,来带领大家循环输出各种图形
88 0
16题箴淦,来带领大家循环输出各种图形
python 如何通过海表面高度数据计算海表地转流速、并绘制流线图
最近,学习海气相互作用时,老师布置了一个小作业。通过卫星高度计测得的海表面高度异常数据,计算其表层地转流速,并研究其与海表面高度异常的关系。
python 如何通过海表面高度数据计算海表地转流速、并绘制流线图
|
存储 Python
python绘图--由逐日风场数据计算月平均风场数据并绘制二维填色图
python绘图--由逐日风场数据计算月平均风场数据并绘制二维填色图
python绘图--由逐日风场数据计算月平均风场数据并绘制二维填色图