问题描述:
使用*在控制台打印平行四边形
例如:平行四边形中最长的一行输出的*是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("*");elseprintf(" ");}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("*");elseprintf(" ");}printf("\n");}return 0;
}

运行结果:

输出平行四边形图案(多种方案)相关推荐

  1. 图案输出(二)----输出平行四边形图案:(难度系数:小于半颗星)

    题目描述: 输出下面图案: * * * * * * * * * ** * * * * * 参考代码: #include<stdio.h>#define ROW 4 //最长的一行的行号in ...

  2. python循环语句打印三角形_python循环输出三角形图案的例子

    python循环输出三角形图案的例子 我就废话不多说了,直接上代码吧! #Copyright (c)2017, 东北大学软件学院学生 # All rightsreserved #文件名称:a.py # ...

  3. 【两个数交换】实现a与b的互换的多种方案

    本次需求:请尝试编写多种方案,实现a与b的互换 (以int类型数据举例,五种解题思路,更多方法大家自行发散) 方法一:利用第三方赋值的办法 直接上代码: public class ChangeTest ...

  4. R语言对dataframe进行行数据筛选(row selection)多种方案:使用R原生方法、data.table、dplyr等方案

    R语言对dataframe进行行数据筛选(row selection)多种方案:使用R原生方法.data.table.dplyr等方案 目录

  5. python编程*三角形图形创意图片_python循环输出三角形图案的例子

    我就废话不多说了,直接上代码吧! #Copyright (c)2017, 东北大学软件学院学生 # All rightsreserved #文件名称:a.py #作 者:孔云 #问题描述:编写程序,使 ...

  6. python获取终端输出流_Linux下用Python获取命令行输出的几个方案

    Python在慢慢成为脑影像数据处理中的主流语言.而在做脑影像处理时,不免有时候需要用到一些别人开发好的工具包,而这些包并不都是python包.下面是学习啦小编收集整理的Linux下用Python获取 ...

  7. 2015年4月27日---C语言:输出特殊图案,请在c环境中运行,看一看,Very Beautiful!...

    ---恢复内容开始--- 题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful! 1.程序分析:字符共有256个.不同字符,图形不一样. 2.程序源代码: [code=c] #i ...

  8. MAC 安装brew raw.githubusercontent.com port 443: Connection refused 本人亲自认证过,踩过多种方案,最终认证的解决方案

    MAC 安装brew raw.githubusercontent.com port 443: Connection refused 本人亲自认证过,踩过多种方案,最终认证的解决方案 原因:由于某些你懂 ...

  9. 实验1-5 输出菱形图案 (5 分)

    实验1-5 输出菱形图案 (5 分) 本题要求编写程序,输出指定的由"A"组成的菱形图案. 输入格式: 本题无输入 输出格式: 按照下列格式输出由"A"组成的菱 ...

最新文章

  1. 韩顺平循序渐进学java 第10.11讲 继承.重载.覆盖
  2. mysql在线复制_mysql如何在线修改主从复制选项
  3. hdu1873 看病要排队-优先队列
  4. Java 集合-集合介绍
  5. 记录一次uni-app页面跳转无效 来回跳转问题
  6. 2、Redis入门介绍
  7. SpringBoot使用ControllerAdvice和ExceptionHandler进行统一异常处理
  8. 09-解决服务器被黑上不了网的问题
  9. PhpStorm连接docker容器内的php XDebug进行断点调试
  10. 实验一 SNMP网络管理架构的验证
  11. 黑金花大理石_不同产地的黑金花大理石有哪些特点?
  12. 2021-2027全球与中国锁模激光器市场现状及未来发展趋势
  13. 2020叉车司机考试及叉车司机模拟考试题库
  14. 技术美术自学——PBR材质通道基础 常见贴图种类列举(求dalao轻喷)
  15. 网页瘦身方法-金瑞帆高端建站
  16. Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(十一)阶段性小结
  17. 线性代数_4、行列式按行展开,异乘变零,拉普拉斯定理
  18. 戏说Android四大组件之ContentProvider
  19. Java程序通过代理访问网络
  20. 小白的柳州麻将黑科技.Part1 = 你不知道的门清

热门文章

  1. 史上最牛老丈人,三个朝代全是自家人
  2. 齐天大圣蟠桃园吃桃子
  3. 中国科学院大学重庆学院继续教育学院学前教育专业
  4. 10的负8次方用python_matplotlib;10的分数次幂;科学记数法
  5. Yocto系列讲解[理论篇]23 - BitBake全过程(1)
  6. 微信去除 防欺诈或盗号请不要输入qq密码 的方法
  7. VO、 PO、DO、DTO、 BO、 QO、DAO、POJO定义
  8. Linux —— wget -qO- 命令详解
  9. css超出两行省略号没效果,Css 设置超过再两行显示省略号
  10. a-tabs defaultActiveKey默认值无效