打印一个N*N的方阵,N为每边字符的个数( 3〈N〈20 ),写出来真是泪牛满面啊。
本程序可以完美输出,效果如下:
相信你已经很期待代码实现了吧,其实代码真的不难,关键是思想。我说说我的想法吧,首先我构造了一个数组,保存了上面图片中字符一行的一半。聪明的你肯定看出来了,上面多数字符都是相同的,是的我只不过是一行一行的打印了这些重复的字符,当然是用下标访问那个数组了。我把上面图片看成上下对称,左右对称,一行分为左中右。一行的左和右刚好相反,中间则是固定的字符。这是我的思想。那么大家拭目以待吧。下面代码奉上。
/*
打印一个N*N的方阵,N为每边字符的个数( 3〈N〈20 ),
要求最外层为“X”,第二层为“Y”,从第三层起每层依次打印数字0,1,2,3,...
例子:当N =5,打印出下面的图形:
X X X X X
X Y Y Y X
X Y 0 Y X
X Y Y Y X
X X X X X
** 本代码是将矩阵从对角线分割,每一行可分为左、中、右部分
** 我构造了一个数组,根据当前的n生成,对应一条对角线一半的数值。
** 我先输出上半部分,再输出下半部分,因为是对称的,所以i值在一半后面
** 改变增长方向
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
int i, j, n = 0, s, flag;
char num[10] = {'X', 'Y'};
while ((n < 3) || (n > 20)) {
scanf("%d", &n); // 不符合范围则一直循环
}
j = (n + 1) / 2;
for (i = 2;i < j;i++) {
num[i] = j - i - 1 + '0';
} // 根据当前输入n,构造一个数组
flag = 1; // 标记当前是上部分还是下部分
s = (n / 2) + 1; // 上下一半的地方
for (i = 0;i >= 0;) {
for (j = 0;j < i;j++) { // 一行的左边
printf("%c,", num[j]);
}
for (j = i;j < (n - i);j++) { // 一行的中间
printf("%c,",num[i]);
}
for (j = i - 1;j >= 0;j--) { // 一行的右边
printf("%c,",num[j]);
}
printf("\n"); // 一行结束
if (flag) { // 当前为上半部分
i++; // 上半部分i要自增
if (i == s) { // 直到自增到一半位置
flag = 0; // 标记值改变
i = s - ((n % 2) ? 2 : 3); // 奇数要输出上两行及以上,偶数要输出上3行及以上
}
} else {
i--; // 下半部分只是减
}
}
return 0;
}
打印一个N*N的方阵,N为每边字符的个数( 3〈N〈20 ),写出来真是泪牛满面啊。的更多相关文章
- 编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)。不在范围内的不作统计。
题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127).不在范围内的不作统计. 输入描述: 输入N个字符,字符在ACSII码范围内. 输出描述: 输出范围在( ...
- js快速打印一个五分制(五颗星)的评分情况
1.函数 下面这个函数实现了在html页面中快速打印一个五分制(五颗星)的评分情况: function getRating(rating) { if(rating > 5 || rating & ...
- excel表格中打开可以显示整个表格但是打印却只能打印一个单元格
excel表格中打开可以显示整个表格但是打印却只能打印一个单元格 如下图显示 解决办法 2007 版菜单栏上 ----->页面布局----->打印区域----->取消打印.即可正常. ...
- 每隔10秒钟打印一个“Helloworld”
/** * 每隔10秒钟打印一个“Helloworld” */ public class Test03 { public static void main(String[] args) throws ...
- 检索并打印一个DNS主机条目
检索并打印一个DNS主机条目的 C 程序 --- Linux/Unix /*************************************************************** ...
- python3 练习题100例 (二十五)打印一个n层金字塔
题目内容: 打印一个n层(1<n<20)金字塔,金字塔由“+”构成,塔尖是1个“+”,下一层是3个“+”,居中排列,以此类推. 注意:每一行的+号之后均无空格,最后一行没有空格. 输入格式 ...
- java算法面试题:有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数 按值的降序排序,如果值相同则按键值的字母顺序
package com.swift; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; publi ...
- java,编写一个从1循环到150并在每行打印一个值,另外在每个3的倍数行上打印出foo,在每个5的倍数行上打印biz,在每个7的倍数上打印baz.
需求:编写一个从1循环到150并在每行打印一个值,另外在每个3的倍数行上打印出foo,在每个5的倍数行上打印biz,在每个7的倍数上打印baz. package study01; public cla ...
- C++之旋转矩阵和打印一个有规律的矩阵
旋转数组 描述: 某个图像通过一个整数组成的m*n矩阵表示,其中每个整数表示一个像素值.写出一种方法,根据flag变量的值将图像向右或者向左旋转90°.如果flag值为0,则向左旋转,如果flag为1 ...
随机推荐
- Zookeeper源码解读
1.1. 客户端源码 1.1.1. 总体流程 启动客户端 zkCli.sh文件里面的配置 实际运行 public static void main(String args[]) throws Keep ...
- Python爬取NBA虎扑球员数据
虎扑是一个认真而有趣的社区,每天有众多JRs在虎扑分享自己对篮球.足球.游戏电竞.运动装备.影视.汽车.数码.情感等一切人和事的见解,热闹.真实.有温度. 受害者地址 https://nba.hupu ...
- LC算法技巧总结(二):双指针和滑动窗口技巧
我把双指针技巧再分为两类,一类是「快慢指针」,一类是「左右指针」.前者解决主要解决链表中的问题,比如典型的判定链表中是否包含环:后者主要解决数组(或者字符串)中的问题,比如二分查找. 一.快慢指针的常 ...
- 文件操作和OS模块的简单操作
文件的作用 大家应该听说过一句话:“好记性不如烂笔头”. 不仅人的大脑会遗忘事情,计算机也会如此,比如一个程序在运行过程中用了九牛二虎之力终于计算出了结果,试想一下如果不把这些数据存放起来,相比重启电 ...
- Beauty Contest(POJ 2187)
原题如下: Beauty Contest Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 42961 Accepted: ...
- 万字详解 TDengine 2.0 数据复制模块设计
导读:TDengine分布式集群功能已经开源,集群功能中最重要的一个模块是数据复制(replication),现将该模块的设计分享出来,供大家参考.欢迎大家对着设计文档和GitHub上的源代码一起看 ...
- 深入浅出Calcite与SQL CBO(Cost-Based Optimizer)优化
目录 Calcite简介与CBO介绍 Calcite背景与介绍 SQL优化与CBO Calcite优化器 HepPlanner优化器与VolcanoPlanner优化器 Calcite优化样例代码介绍 ...
- 没使用Spring Cloud的版本管理导致Eureka服务无法注册到Eureka服务注册中心
创建了一个Eureka Server的服务注册集群(两个Eureka服务),都能相互注册,写了一个Eureka客户端服务无法注册到服务发现注册中心 注册中心1: 注册中心2: 服务正常: pom依赖文 ...
- Linux实战(5):Centos8安装python
Centos8正式版已经发布了,已经尝鲜的小伙伴们会发现与其他Linux发行版不同,CentOS 8默认不安装Python.接下来的操作指导大家如何安装python3. 转自链接 安装python3 ...
- zabbix邮件报警设置(加密)
邮件设置如下 端口号选择465