【C语言】打印图案问题(下卷)

news/2024/9/21 7:48:35/

前言

哎呀,看来上卷的打印金字塔和菱形都满足不了你啊,那我只好再拿出两题考考你了。相信在看完这两题的解说后,你对打印图案的理解一定能更上一层楼。

话不多说,继续闯关吧!

崭露头角:空心正方形图案

提示:

这题找到规律并不难,但是怎么打代码写得整洁、简单呢?这是一个问题。这里给出改造前后对比的两种写法,大家感受一下。

题目:

输入一个整数,表示输出的行数,也表示组成正方形边的“*”的数量。针对输入的整数,输出用“*”组成的“空心”正方形,每个“*”后面有一个空格。

法一
分析:

我们不难想到应该去用循环与判断语句来完成打印任务。然后不难想到规律就是第一行和最后一行打印的全是星号,其他行的首尾打印星号,中间打印空格。所以我们可以使用双层循环,外循环为行数,内循环为列数,就像一个二维数组,每一个元素要么是星号要么就是空格(这样非此即彼的关系可以用if和else来处理),只不过我们不使用数组存储而是直接输出。

这样讲还有点抽象,我们直接来看代码:

代码参考

这时,代码是写出来,也能完成任务,但循环(循环(判断(判断)))的结构着实看起来不太舒服。 

法二
分析:

其实只要一点修改,这个代码瞬间就可以变得更简洁易读。我们为何不在内层循环中,将i和j整合在一起判断呢?

代码参考

运行效果:

这个写法在思路上其实是和前一种写法相同的,只不过前一种与它相比就像是不加思考,直接生硬地把自然语言转化成了代码,而我们在写代码的时候应该更灵活一些,带着思考去写。

规律还是第一行和最后一行打印的全是星号,其他行的首尾打印星号,中间打印空格,但这一次我们浓缩成一句判断:if(i==1 || i==num || j==1 || j==num) printf("*");不过其实对这句更贴切的规律是:在四条边的任意一边上(体现于代码为i==1 || i==num || j==1 || j==num)时就打印星号。这一点细微的不同,可能导致写出的代码乍一看效果十分不同。

渐入佳境:X形图案

提示:

这道题的逻辑与上一题的法二非常相似,首先肯定还是有控制行和列的变量i与就,在找规律时我们去从i和j下手,对于这道题,我们没法向上一题一样,一眼就看出来i和j应该满足什么条件时打印星号,所以我们不妨有耐心地寻找一下。

题目:

输入一个整数,表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。

分析:

输入的5代表了行数和列数,以及每条斜线方向上的星号个数,所以在用i表示行数,j表示列数后,我们不难写出循环条件,重要的是,规律应该怎么找呢?

这个图案如果想像打印图案(上卷)中打印金字塔那样先打印空格再打印星号显然是十分困难的,而正如前面也说过的,无法做到我想在屏幕哪个位置打印就打印在哪,我们需要有空格才能将星号的位置控制在我们要的位置,比如我们想要在第二行的“第二个”位置打印星号,我们就不得不在前面打印一个空格。所以大的思路仍然是我们if什么什么就打印星号,else就打印空格。

所以我们现在重点关注什么时候要打印星号。我们很清楚就是要两个星号的斜线,一条正斜线和一条反斜线,然后我们有意识要去找i和j在打印斜线时的规律。反斜线的规律并不难找,只要我们观察一下,就能发现是i==j。

看下图,n是输入值,在这个例子中是6。i和j变量一个控制行一个控制列,不妨让i和j从1开始取值,那么i和j的值和行数、列数恰好相等。在反斜线中,看我圈出来的这个星号位置,它的i==j都为2,你再看每一个反斜线上的星号,都满足这一点。所以当i==j时,我们要打印星号。

那么正斜线呢?请看我圈出来的这个星号,它的i+j的值可不是一个随便的数,而恰好是n+1,你再去看正斜线上每一个星号都满足i+j==n+1,所以当i+j=n+1时,我们要打印星号。

分析到这里,就只差写出代码了。

代码参考 

vs2022运行效果:

打印图案总结 

看到这里,恭喜你已经斩获了四道打印图案的题目啦,感觉如何?其实打印图案类的题目就是要紧紧抓住规律,而且是要有用的规律,一般是与循环控制变量有关的规律。然后记得善用逻辑运算符,逻辑或'||'来简洁负责打印星号的代码。希望大家发现文章的错误可以及时向我反馈,共同进步,吃透打印图案问题!


http://www.ppmy.cn/news/1461951.html

相关文章

上班族兼职新篇章:10大实战攻略,轻松年赚1-20万

对于众多上班族而言,如何在工作之余赚取额外收入,开启自己的第一份副业,已成为许多人心中的疑问。每个人的才能和兴趣点不尽相同,但都有机会找到适合自己的兼职方式。接下来,就让我们一起探索这10大实战攻略&#xff0…

动态顺序表实现

目录 1. 顺序表的概念 2. 实现的功能 3. 顺序表的定义 4.顺序表的实现 4.1 seqlist.c 4.2 seqlist.h 4.3 test.c 5. 顺序表的优缺点 5.1优点 5.2缺点 1. 顺序表的概念 用一段物理地址连续的内存依次存储数据元素的线性结构 本质就是数组,在数组基础上要求…

音视频--AAC编码解析和示例

目录 1:AAC编码介绍 2:AAC格式介绍 3:AAC -ADTS帧组成 4:AAC-ADTS:(adts_fixed_header)格式介绍 5:AAC-ADTS:(adts_variable_header)格式介绍…

Flutter 中的 GridView 小部件:全面指南

Flutter 中的 GridView 小部件:全面指南 在 Flutter 中,GridView 是一个展示数据网格的滚动小部件,类似于表格视图,其中子控件被组织成行和列。它非常适合于展示图像网格、小部件集合等。GridView 同样支持懒加载,这意…

GD32F103RCT6/GD32F303RCT6-UCOSIII底层移植(1)工程建立

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 后续项目主要在下面该专栏中发布: 手把手教你嵌入式国产化_不及你的温柔的博客-CSDN博客 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转: 手把手教你嵌入式国产化-实战项目-无刷电机驱动&am…

R语言数据分析案例-股票可视化分析

一、数据整合的对象 # Loading necessary libraries library(readxl) library(dplyr)# Reading the data from Excel files data_1 <- read_excel("云南白药.xlsx") data_2 <- read_excel("冰山.xlsx")二、数据整合的代码 # Reading the data from…

vue2 双向数据绑定的实现及原理

Oject.defineProperty() 是 JavaScript 中用于定义或修改对象的属性的方法&#xff0c;可以控制属性的特性&#xff08;如可枚举性、可配置性、可写性等&#xff09; Object.defineProperty(obj, prop, descriptor) obj&#xff1a;要在其上定义属性的对象。 prop&#xff1a;要…

基于Pytorch深度学习神经网络MNIST手写数字识别系统源码(带界面和手写画板)

第一步&#xff1a;准备数据 mnist开源数据集 第二步&#xff1a;搭建模型 我们这里搭建了一个LeNet5网络 参考代码如下&#xff1a; import torch from torch import nnclass Reshape(nn.Module):def forward(self, x):return x.view(-1, 1, 28, 28)class LeNet5(nn.Modul…