输出平行四边形图案(多种方案)

2023-05-16

问题描述:
使用*在控制台打印平行四边形
例如:平行四边形中最长的一行输出的*是5个,则平行四边为:

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

方法1:
把平行四边形分成上下两个部分,循环打印。

参考代码:

#include<stdio.h>

int main()
{
    int nStarNumber, i, j;
    printf("输入平行四边形最长的那一行*的个数: ");
    scanf_s("%d", &nStarNumber);
    if (nStarNumber <= 1)
    {
        printf("为了能看出是个平行四边形,请保证最长的那一行*的个数大于1\n");
        return 0;
    }
    for (i = 1; i <= nStarNumber; i++)
    {
        for (j = 1; j <= i; j++) //控制上半部分的*输出
            printf("* ");
        printf("\n");
    }

    for (i = 1; i <= nStarNumber - 1; i++)
    {
        for (j = 1; j <= 2 * i; j++)//控制下半部分的空格输出
            printf(" ");

        for (j = nStarNumber - i; j > 0; j--) //控制上半部分的*输出
            printf("* ");

        printf("\n");
    }
    return 0;
}

方法2:
根据平行四边形的性质,求出边框的范围,然后输出内部的所有点。

参考代码:

#include<stdio.h>

int main()
{
    int nStarNumber, i, j, k, mini, maxi;
    printf("输入平行四边形最长的那一行*的个数: ");
    scanf_s("%d", &nStarNumber);
    if (nStarNumber <= 1)
    {
        printf("为了能看出是个平行四边形,请保证最长的那一行*的个数大于1\n");
        return 0;
    }

    nStarNumber--;//建立直角坐标系,下标从0开始
    for (i = 0; i <= 2 * nStarNumber; i++)//行数
    {
        maxi = 0; mini = nStarNumber;
        for (j = 0; j <= nStarNumber; j++)
        {
            if ((i >= 0 && i <= nStarNumber && j == 0) ||
                (i >= nStarNumber && i <= 2 * nStarNumber && j == nStarNumber) ||
                (i == j && i >= 0 && i <= nStarNumber) ||
                (i - j == nStarNumber && i >= nStarNumber && i <= 2 * nStarNumber))
            {
                if (j < mini)
                    mini = j;
                if (j > maxi)
                    maxi = j;
            }
        }
        for (k = 0; k < mini; k++)
            printf(" ");
        for (k = mini; k <= maxi; k++)
            printf("*");
        printf("\n");
    }

    return 0;
}

方法3:
分别写两个函数判断当前点是否位于平行四边形上和平行四边形内部,判断位于平行四边形内部的方法思路参看代码注释。

参考代码:

#include<stdio.h>

#define MINI(a, b) (a < b ? a : b)
#define MAXI(a, b) (a > b ? a : b)

typedef struct POINT
{
    int x;
    int y;
}POINT;

int IsPointInPolygon(POINT pt, POINT p1, POINT p2, POINT p3, POINT p4)
{
    //判断某个点是否在多边形内部(不包括边上),如果是返回1,否则返回0
    //这种方法比方法2要通用,可以使用任意凸多边形
    //有个地方需要注意一下:参数传递点的时候,需要按照依次连接四边形的点来给
    //思路:以当前点像x轴做平行线,判断和四变形有几个交点,如果交点为奇数在内部,为偶数在外部
   if (pt.x == 4 && pt.y == 3)
   {
       int zzz = 0;
   }
   POINT arr[] = { {p1.x, p1.y},{p2.x, p2.y}, {p3.x, p3.y}, {p4.x, p4.y} };
    int nPointCount = sizeof(arr) / sizeof(arr[0]);
    int nCrossCount = 0, i;
    for (i = 0; i < nPointCount; i++)
    {
        POINT startPt = arr[i];
        POINT endPt = arr[(i + 1) % nPointCount];
        if (startPt. y == endPt. y)
            continue;

        if (pt.y < MINI(startPt.y, endPt.y) && pt.y > MAXI(startPt.y, endPt.y))
            continue;

        double x = (double)(pt.y - startPt.y) * (double)(endPt.x - startPt.x) / (double)(endPt.y - startPt.y) + startPt.x;
        if (x > pt.x)
            nCrossCount++;
    }
    //交点个数为奇数则在多边形内部
    return nCrossCount % 2 == 1;
}

int IsOnEdge(int i, int j, int nStarNumber)
{
    if ((i >= 0 && i <= nStarNumber && j == 0) ||
        (i >= nStarNumber && i <= 2 * nStarNumber && j == nStarNumber) ||
        (i == j && i >= 0 && i <= nStarNumber) ||
        (i - j == nStarNumber && i >= nStarNumber && i <= 2 * nStarNumber))
        return 1;
    return 0;
}

int main()
{
    int nStarNumber, i, j;
    POINT p1, p2, p3, p4, curPt;
    printf("输入平行四边形最长的那一行*的个数: ");
    scanf_s("%d", &nStarNumber);
    if (nStarNumber <= 1)
    {
        printf("为了能看出是个平行四边形,请保证最长的那一行*的个数大于1\n");
        return 0;
    }

    nStarNumber--;//建立直角坐标系,下标从0开始
    p1.x = 0; p1.y = 0;
    p2.x = nStarNumber; p2.y = 0;
    p3.x = 2 * nStarNumber; p3.y = nStarNumber;
    p4.x = nStarNumber; p4.y = nStarNumber;
    for (i = 0; i <= 2 * nStarNumber; i++)//行数
    {
        for (j = 0; j <= nStarNumber; j++)
        {
            curPt.x = i;
            curPt.y = j;
            if (IsOnEdge(i, j, nStarNumber) || IsPointInPolygon(curPt, p1, p2, p3, p4))
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }

    return 0;
}

方法4:
通过4条直线的方程,锁定区域的范围

参考代码:

#include<stdio.h>

int main()
{//思路:通过直线锁定区域范围
    int nStarNumber, i, j;
    printf("输入平行四边形最长的那一行*的个数: ");
    scanf_s("%d", &nStarNumber);
    if (nStarNumber <= 1)
    {
        printf("为了能看出是个平行四边形,请保证最长的那一行*的个数大于1\n");
        return 0;
    }

    nStarNumber--;//建立直角坐标系,下标从0开始
    for (i = 0; i <= 2 * nStarNumber; i++)//行数
    {
        for (j = 0; j <= nStarNumber; j++)
        {
            if (i >= j && j <= nStarNumber && j >= 0 && j >= i - nStarNumber)
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }

    return 0;
}

运行结果:
这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

输出平行四边形图案(多种方案) 的相关文章

  • [iOS] WKWebView 于JavaScript传值

    如果在项目中采用WKWebView的方法加载网页 OC向JS传值方法总结 xff1a 1 OC gt JS 传数组的方法 xff1a NSString arrStr 61 self arr componentsJoinedByString
  • iOS日历中的日程生成VCalendar 2.0(.vcs)格式的字符串和解析

    获取 VCalendar2 0 的格式字符串 43 NSString getVCalendar20StrWithEvents NSArray lt EKEvent gt events NSString vcalendar 61 NSStri
  • 数传电台术语详解

    数传电台 xff08 data radio xff09 是指借助DSP 技术和无线电技术实现的高性能专业数据传输电台 数传电台的使用从最早的按键电码 电报 模拟电台加无线MODEM xff0c 发展到目前的数字电台和DSP 软件无线电 xf
  • 无线数传电台的发展趋势

    摘自 专业无线通信 传媒 无线数传电台作为一种最简洁的通行方式 xff0c 具有很长的历史 xff0c 其基本的特征是通联方便 简捷 xff0c 同时也存在着封闭性强的特点 xff0c 正是由于上述原因 xff0c 无线数传电台产品的生命期
  • wget 提交post请求

    格式 xff1a wget post data 34 item1 61 value1 amp item2 61 value2 34 http xxx xxx com 示例 xff1a wget post data 34 username 6
  • 欧拉角、轴角与四元数

    1 欧拉角 欧拉角使用最简单的x y z值来分别表示在x xff0c y xff0c z轴上的旋转角度 xff0c 其取值为0 360 或者0 2pi xff09 xff0c 一般使用roll xff0c pitch xff0c yaw来表
  • Linux 系统投屏显示

    最近使用电脑跑Linux时需要用到显示器投屏 xff0c 于是快乐的拿上我的笔记本连上了投影仪 emmm 然鹅并没有什么卵用 果断问度娘 xff0c 看到好多人说使用xrandr命令设置 xff0c 于是便上手试了下 xff0c 看到我运行
  • C++ 判断一个 int 型整数是否为 2 的 N 次方(幂次)

    判断一个整数是否为2的幂次方法有以下几种 xff1a 1 循环除2 这是最简单最好理解的方式 对于一个数如果是2的幂次 xff0c 则其肯定可以被2一直整除直到其值为1 所以可以通过一个while循环判断 xff1a void judge
  • Dijkstra算法图文详解

    Dijkstra算法算是贪心思想实现的 xff0c 首先把起点到所有点的距离存下来找个最短的 xff0c 然后松弛一次再找出最短的 xff0c 所谓的松弛操作就是 xff0c 遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近 xff
  • 需求中如何画用例图

    UML用例图 用例图主要用来图示化系统的主事件流程 xff0c 它主要用来描述客户的需求 xff0c 即用户希望系统具备的完成一定功能的动作 xff0c 通俗地理解用例就是软件的功能模块 xff0c 所以是设计系统分析阶段的起点 xff0c
  • 反光板导航SLAM(二)VEnus代码浅析

    上一章简单介绍了VEnus中几个主要函数的作用 xff0c 这里详细展开看一下每个函数的具体思路 xff0c 通过研究具体的代码我们可以简单了解VEnus中对于反光柱定位的具体流程 1 IntensityExtraction Extract
  • TEB算法详解(TebLocalPlannerROS::computeVelocityCommands(3))

    第一章主要分析了teb算法的准备条件 xff0c 包括获取当前位姿与速度 对全局路径的裁减以获取局部路径等以及局部地图的获取等 第二章主要讲述了在获取前置条件后 xff0c 如何根据前置条件进行位姿优化 xff0c teb的路径优化主要是调
  • TEB算法详解 参数详解

    teb算法的基本思路之前已经看完了 xff0c 今天主要看一下teb算法的参数配置文件 xff0c 分析一下每个配置参数的作用 xff1a teb的参数主要可以包含以下几个部分 xff1a 1 Trajectory Trajectory的参
  • ROS 如何用自己的电脑连接其他设备查看Rviz

    Rviz的使用在ROS开发中是很常见的东西 xff0c 有时候为了方便我们需要查看某台设备的一些数据 xff0c 但是又没有一些直观的连接工具例如向日葵之类的 这些工具是要基于屏幕的 xff0c 如果设备上没有屏幕是无法使用的 那在只有ss
  • 调试时正常,maven install 找不到符号

    找不到符号 很可能是引用的自己的库没有加载最新版 把所有库都clean gt install一下 或root项目下clean gt install
  • 【springboot】org.aspectj.lang.ProceedingJoinPoint获取返回类型、参数名称/值等

    1 参数值 span class token class name Object span span class token punctuation span span class token punctuation span args s
  • no opencv_java455 in java.library.path

    直接把 opencv build java x64下的文件opencv java455 dll复制到Java JDK安装的bin目录下就解决了这个问题
  • openssl pem 生成公钥和私钥及文件

    下载 xff1a http slproweb com products Win32OpenSSL html 首先得安装OpenSSL软件包openssl xff0c 安装了这个软件包之后 xff0c 我们可以做这些事情 xff1a o Cr
  • DebugDiag 2 收集Dump

    DebugDiag简介 Debug Diagnostic Tool DebugDiag 是微软提供的工具 xff0c 可以用来追踪windows平台下的程序崩溃 xff0c 卡死 xff0c 内存泄漏等一些疑难问题的原因 xff0c 按照问
  • Stream List 的排序

    1 list的正序 span class token class name List span span class token generics span class token punctuation lt span span clas

随机推荐

  • 嵌入式WebSocket的实现

    系统硬件采用STM32 43 DM9000AEP xff0c 具体实现步骤如下 xff0c 第一步建立TCP监听端口可以随意 xff0c 等待浏览器发出http请求 Chrome浏览器发出的请求 第二步建立握手 服务端需要解析最少4个头字段
  • spring boot 注册成 windows 服务

    1 windows系统下将 34 java jar 34 注册成 windows 服务 demo bat 64 echo off d span class token builtin class name cd span d span cl
  • Golang UI

    GUI库 Fyne 跨平台 xff0c 移动端 相对复杂 https github com fyne io fyne Walk 精于 windows https github com lxn walk
  • 解决golang编译提示dial tcp 172.217.160.113:443: connectex: A connection attempt failed

    废话不多说 xff0c 直接开讲 还多新手朋友在编译go的过程中是不是经常会遇到这样的报错 module Get https proxy golang org dial tcp 172 217 160 113 443 connectex A
  • 更新后报错

    更新后 xff0c 运行程序就报这个错 no required module provides package xxx go mod file not found in current directory or any parent dir
  • go: go.mod file not found in current directory or any parent directory; see ‘go help modules‘

    go go mod file not found in current directory or any parent directory see go help modules 此时还需要初始化Go moudle go mod init
  • vc++ 6.0bug C1853

    c documents and settingsstudent桌面musicplayermaindlg cpp 1 fatal error C1853 Debug MusicPlayer pch is not a precompiled h
  • 人工智能知识点汇总

    一 AI应用领域 AI目前主要的应用领域有3个方向 xff0c 包括 xff1a 计算机视觉 语音交互 自然语言处理 1 1 计算机视觉 xff08 CV xff09 计算机视觉是一门研究如何使机器 看 的科学 xff0c 就是指用摄影机和
  • Java17(291)之后 , 禁用了TLS1.1 , 使JDBC无法用SSL连接SqlServer怎么办,以下是解决办法

    修改java security文件 1 找到jre的java security文件 2 打开java security并搜索 jdk tls disabledAlgorithms 61 3 删掉TLSv1 TLSv1 1 4 保存 可以了
  • NumPy、Torch和Tensorflow 代码对比

    深度学习 在深入学习的基本单位上实施初级到高级操作 gt Excerpts 我习惯于为不同的问题创建新的深度学习架构 xff0c 但选择哪个框架 xff08 Keras Pytorch TensorFlow xff09 通常比较困难 由于其
  • 2023年 机器学习常用算法

    01 线性回归 线性回归 xff08 Linear Regression xff09 可能是最流行的机器学习算法 线性回归就是要找一条直线 xff0c 并且让这条直线尽可能地拟合散点图中的数据点 它试图通过将直线方程与该数据拟合来表示自变量
  • STM32上SPI+DMA实现大批量读取flash数据

    最近做项目需要使用SPI 43 DMA xff0c 为了做实验感受DMA传输数据块 xff0c 本人以SPI 43 DMA来读取flash中的数据 网上有很多例程是spi直接读取flash xff0c 无法提高性能 因为只是简单的实验SPI
  • stm32通用定时器1s延时实现LED闪烁

    stm32有很多定时器 xff0c 每种定时器的功能也不尽相同 xff0c 今天学习了如何用通用定时器实现1s延时 xff0c 使LED灯闪烁 xff0c 现总结如下 xff1a 步骤总结 xff1a 使能定时器时钟 gt 配置定时器结构体
  • JDK 中使用js调用java类、方法

    最近研究阅读这个APP 其主要功能就是通过一个个书源 从而实现移动端阅读的体验 比如说某些在线小说阅读网站 会加上相应的广告 从而影响用户阅读体验 于是阅读这个APP就是做了类似净化阅读体验 但是小说阅读网站千千万万 如果去适配每个小说阅读
  • Spring项目在tomcat启动时调用action

    1 实现ServletContextListener接口 添加 64 WebListener注解 2 按照示例写代码 xff1a 第一个是开启时 xff0c 第二个是销毁时
  • ubuntu16.04安装opencv3.4

    参考blog https blog csdn net u013066730 article details 79411767 直接进行 完全没问题 sudo apt get install build essential libgtk2 0
  • 使用switch-case语句输出成绩等级

    问题描述 xff1a 输入一个0 100范围内发分数 xff0c 在不同的等级范围内输出不同的值 xff0c 要求使用switch case控制 0 60 等级为E 60 70 等级为D 70 80 等级为C 80 90 等级为B 90 1
  • 输出图案(六)---输出空心矩形

    输入矩形的宽 xff0c 高 xff0c 输出该空心矩形 xff0c 用 来进行表示 参考代码1 xff1a span class hljs comment include lt stdio h gt span span class hlj
  • C语言中交换两个数的方法

    问题描述 xff1a 程序中有两个数a b 其中a 61 4 b 61 5 xff0c 现在希望交换两个数的值 xff0c 使得a 61 5 b 61 4 在这里我总结了一下目前我已经掌握的C语言中交换两个数的方法 xff0c 主要如下几种
  • 输出平行四边形图案(多种方案)

    问题描述 xff1a 使用 在控制台打印平行四边形 例如 xff1a 平行四边形中最长的一行输出的 是5个 xff0c 则平行四边为 xff1a span class hljs bullet span span class hljs emp