C:图案打印

news2024/11/14 13:10:05

引言

 本篇文章讲了一些常见的图形编程题,并总结了一些规律。

1、打印空心正方形

1.1 代码展示:

#include<stdio.h>
int main()
{
	int a = 0;//边长初始化
	scanf("%d", &a);//输入边长的值
	{
		int i = 0;
		for (i = 0; i < a; i++)//控制行数
		{
			int j = 0;
			for (j = 0; j < a; j++)//控制列数
			{
				if (i == 0 || i == a - 1)//判断行数是否打印 *
				{
					printf("* ");//*后面留一个空格
				}
				else if (j == 0 || j == a - 1)//判断列数是否打印 *
				{
				    printf("* ");//*后面留一个空格
			    }
			    else
			    {
				    printf("  ");//这里留两个空格
			    }				
			}
			printf("\n");//换行
		}			
	}
	return 0;
}

图案展示:

1.2 代码解析:

1.通过scanf函数获得输入的边长值

2.通过两层循环来控制每行每列的输出

  • 外层循环控制行数,当行号为 0(第一行)或 a - 1(最后一行)时,整行打印 *。
  • 内层循环控制列数,当列号为 0(第一列)或 a - 1(最后一列)且当前行不是第一行和最后一行时,打印 * ,其他位置打印两个空格。

3.每行打印完换行。

1.3  分析i == 0 || i == a - 1

 为什么满足这个条件就打印*就可以得到空心正方形?看下图:

这里就用图解释了,如果还有些不明白,可以私我

2、空心三角形

2.1 思路分析

  1. 使用两个嵌套的循环,外层循环控制行数,内层循环控制每行的输出。
  2. 对于每行,先打印一定数量的空格,使得三角形对齐。
  3. 然后判断当前行的位置,如果是第一行、最后一行或者是每行的第一个和最后一个字符位置,打印 * ,否则打印空格。

2.2  代码展示:

#include <stdio.h>

int main() {
    int rows = 0;
    scanf("%d", &rows);//输入行数

    for (int i = 1; i <= rows; i++) {  // 外层循环控制行数
        for (int j = 1; j <= rows - i; j++) {  // 打印每行前面的空格
            printf(" ");
        }
        for (int k = 1; k <= 2 * i - 1; k++) {  // 处理每行的字符输出
            if (k == 1 || k == 2 * i - 1 || i == rows) {  // 第一行、最后一行、每行的首尾位置打印*
                printf("*");
            } else {  // 中间位置打印空格
                printf(" ");
            }
        }
        printf("\n");  // 换行
    }
    return 0;
}

2.3 代码解析:

  1. 定义一个变量rows用来存储行数
  2. 内层的第一个 for 循环 for (int j = 1; j <= rows - i; j++) 用于在每行的开头打印适当数量的空格,以使三角形对齐。
  3. 内层的第二个 for 循环 for (int k = 1; k <= 2 * i - 1; k++) 处理每行的字符输出。if (k == 1 || k == 2 * i - 1 || i == rows) 这个条件判断用于确定是否打印 * 。当是每行的第一个字符k == 1、最后一个字符k == 2 * i - 1或者是最后一行i == rows时,打印 * ,否则打印空格。

3、X形图案

3.1代码展示:

#include <stdio.h>

int main()
{
	int size = 0;  // 初始化
    scanf("%d", &size);//输入值
    int i = 0;
	for ( i = 0; i < size; i++)  // 行循环
	{ 
        int j = 0;
		for ( j = 0; j < size; j++)// 列循环
		{  
			if (i == j || i + j == size - 1)// 判断是否为对角线上的位置
			{  
				printf("*");  // 打印 '*'
			}
			else 
			{
				printf(" ");  // 否则打印空格
			}
		}
		printf("\n");  // 换行
	}
	return 0;
}

 图案展示:

3.2 代码解析:

1.先定义一个变量size来表示图案的大小;

2.使用两个嵌套的for循环,外层控制行数,内层控制列数;

3.你可以将图案看作在一张表格上,对于每个位置( i , j ),通过条件判断 i == j 表示主对角线(从左上角到右下角)上的位置,

 i + j == size - 1表示副对角线(从右上角到左下角)上的位置。

4.如果当前位置在对角线上,则打印 *,否则打印空格。

5.每行打印完后,记得换行。

3.3 i == j || i + j == size - 1解释

假设我们有一个 size*size 的二维矩阵(例如 5×5)。

对于主对角线(从左上角到右下角),行索引 i 和列索引 j 是相等的,即 i == j 。(索引即下标);

例如,在 5*5 的矩阵中,主对角线上的点为 (0, 0)、(1, 1)、(2, 2)、(3, 3)、(4, 4),都满足 i == j 。

对于副对角线(从右上角到左下角),行索引 i 与列索引 j 的和等于矩阵的边长减 1,即 i + j == size - 1 。

例如,在 5*5 的矩阵中,副对角线上的点为 (0, 4)、(1, 3)、(2, 2)、(3, 1)、(4, 0),都满足 i + j == 4 (因为 5 - 1 = 4)。

所以,当满足 (i == j || i + j == size - 1) 这个条件时,就可以确定是在这两条对角线上。

3.4 注意事项:

printf("\n");  //换行不要写到内循环里面去了,否则会出现下面这种情况

4.沙漏

4.1  代码展示:

#include <stdio.h>
int main() {
    int a = 0;
    printf("请输入沙漏的行数(奇数): ");
    scanf("%d", &a);//输入行数

    for (int i = 1; i <= a; i++) {  //外层循环控制上半部分沙漏的行数,从第 1 行到第 a 行
        for (int j = 1; j < i; j++) { //内层循环打印每行开头的空格,空格数量逐行递增
            printf(" ");
        }
        for (int k = 1; k <= 2 * (a - i + 1) - 1; k++) {
            printf("*");//内层循环打印星号,星号数量逐行递减
        }
        printf("\n");//换行
    }
    for (int i = a - 1; i >= 1; i--) { // 外层循环控制下半部分沙漏的行数,从倒数第 2 行到第 1 行
        for (int j = 1; j < i; j++) { // 内层循环打印每行开头的空格,空格数量逐行递减
            printf(" ");
        }
        for (int k = 1; k <= 2 * (a - i + 1) - 1; k++) {
            printf("*");// 内层循环打印星号,星号数量逐行递增
        }
        printf("\n");
    }
    return 0;
}

图案演示:

4.2 分析(结合注释)

对于上半部分:

  • 随着 i 的增加,每行前面的空格数量也增加,因为 j < i 。
  • 同时,星号的数量通过 2 * (a - i + 1) - 1 计算得到,随着 i 的增加而减少。

对于下半部分:(对称)

  • 随着 i 的减小,每行前面的空格数量减少。
  • 星号的数量通过相同的公式计算,随着 i 的减小而增加,从而形成与上半部分对称的沙漏形状。

5、一些规律

1 使用嵌套的循环结构

外层循环通常控制图形的行数。内层循环控制每行的输出内容,比如空格数量、特定字符的数量等。

2 利用对称性

对于对称的图形,常常可以利用上半部分和下半部分的对称关系,通过修改循环的条件和范围来减少重复的代码。

3 注意边界条件

例如对于三角形、矩形等图形,要正确处理第一行、最后一行、第一列和最后一列的输出,以确保图形的形状完整和准确。

4 使用控制语句

如 if-else 语句来区分不同的行或列的输出模式。

5 以行列的思想为基础

学会逐行逐列构造图形。


结语: 

图形化编程题目对于帮助我们熟悉循环和控制结构的使用非常有帮助。通过这些题目,我们可以更加深入地理解循环和控制结构的工作原理,并且能够在实践中更好地应用它们。

明天开始更新C语言的知识模块!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1964499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试经典算法150题系列-数组/字符串操作之多数元素

序言&#xff1a;今天是第五题啦&#xff0c;前面四题的解法还清楚吗&#xff1f;可以到面试算法题系列150题专栏 进行复习呀。 温故而知新&#xff0c;可以为师矣&#xff01;加油&#xff0c;未来的技术大牛们。 多数元素 给定一个大小为 n 的数组 nums &#xff0c;返回其…

Python 提取excel中嵌入的图片

注意&#xff1a;是嵌入在单元格里的图片&#xff0c;嵌入在单元格里的图片&#xff0c;嵌入在单元格里的图片 会显示这种类似的命令&#xff08;office好像不支持查看&#xff0c;wps可以查看这个位置显示的图片&#xff09; 网上好多都说用 _image 提取&#xff0c;经测试,…

精装房、旧房改造智能家居,单火线也有“救”了单火模块 零线发生器

精装房、旧房改造智能家居&#xff0c;单火线也有“救”了单火模块 零线发生器 史新华 以前写过关于智能家居没有预留零线&#xff0c;导致无法安装零火开关&#xff0c;也没办法装触控屏&#xff0c;主要原因还是无法通过零火线给设备供电。今年最火的一款思万奇零线发生器救…

LCM接口通讯说明

LCM&#xff08;Liquid Crystal Module&#xff0c;液晶模块&#xff09;接口通讯说明涉及多种接口类型和通讯方式&#xff0c;这些接口和通讯方式的选择取决于具体的应用场景和需求。 最常见的LCD模块接口协议是&#xff1a; 1.并行接口 2.串行接口 3.串行或并行配置到微处…

MySql的中的MVCC解决事务隔离性

MVCC 如何保证事务的隔离性&#xff1f; 1.排他锁&#xff1a;如一个事务获取了一个数据行的排他锁&#xff0c;其他事务就不能再获取改行的其他锁。 2.MVCC&#xff1a;多版本并发控制。 MVCC&#xff1a; 1.隐藏字段 1.DB_TRX_ID&#xff1a;最近修改事务的id。默认值从0开…

ShardingSphere-Jdbc + Spring Security + Redis 实现简单JWT认证

1. 项目结构 2. 数据库相关操作 create database user_profiles; use user_profiles; CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(255) NOT NULL UNIQUE,password VARCHAR(255) NOT NULL,email VARCHAR(255) UNIQUE,role VARCHAR(2…

数据结构之《二叉树》(上)

在之前的数据结构的学习中&#xff0c;我们了解了顺序表、链表等线性表&#xff0c;接下来在本篇中将要学习一种非线性的数据结构——树&#xff0c;我们将来了解树的相关概念和性质&#xff0c;在树当中将重点学习二叉树的结构和特性。学习完相关概念后将试着实现二叉树&#…

我是怎么解决一个电力采集问题的全过程分享

行业设备联网&#xff0c;没人开发/开发太慢/投入太大 怎么办&#xff1f;用合宙DTU整体解决方案&#xff01; 一、整体解决方案内容 合宙DTU整体解决方案 DTU硬件&固件SIM卡业务云平台APP&小程序&web h5页面看板&#xff1b; 合宙提供的DTU整体解决方案&#x…

免费【2024】springboot 宠物中心信息管理系统app

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

【超级宠物】-对战游戏

【超级宠物】是一款轻松好玩的休闲趣味卡通宠物模拟养成游戏,游戏中玩家需要不断的训练你的小宠物以参加比赛,你将会是一名专业的训宠物大师,成功的培养自己的宠物成为宠物之星。 超级宠物是一款充满趣味的休闲趣味宠物养成模拟竞技游戏&#xff0c;游戏中玩家需要培养你的狗狗…

Ollama0.3.0 + llama3.1本地部署

Ollama0.3.0 llama3.1本地部署 安装Ollama 官网下载安装包 https://ollama.com/download ​​ 根据系统选择对应版本 安装完成后&#xff0c;电脑右下角会出现ollama程序图标&#xff0c;表示ollama正在运行。 ​​ 打开cmd命令 下载Llama3.1 输入ollama&#xff0c…

51单片机嵌入式开发:22、STC89C52R控制 实现单总线温度传感器DS18b20的温度读取

STC89C52R控制 实现单总线温度传感器DS18b20的温度读取 1 概述1.1 介绍1.2 特点1.3 应用领域 2 DS18B20原理详解2.1 内部机理2.2 读写时序2.3 DS18B20操作代码程序 3 演示4 总结 配套演示例程 1 概述 DS18B20是一款数字温度传感器&#xff0c;由Maxim Integrated&#xff08;美…

linux下frambuffer的使用

什么是Framebuffer&#xff1f; Framebuffer是一个内存区域&#xff0c;操作系统可以通过它直接控制显示设备的像素。与传统的图形加速硬件不同&#xff0c;framebuffer不依赖于图形处理器&#xff0c;而是通过CPU来处理图形数据。这种方式虽然在性能上可能不如硬件加速&#…

vegecad画线及调整功能

vegecad添加了绘制直线和层颜色&#xff0c;目前没有线型&#xff0c;点击工具按钮"画线"&#xff0c;画线是连续的画&#xff0c;右键结束&#xff0c;下面是画的 vegetable&#xff0c;目前画线没有捕捉和引导线画特定角度的线&#xff0c;所以现在还是涂鸦式的&am…

昇思25天学习打卡营第XX天|RNN实现情感分类

希望代码能维持开源维护状态hhh&#xff0c;要是再文件整理下就更好了&#xff0c;现在好乱&#xff0c;不能好fork tutorials/application/source_zh_cn/nlp/sentiment_analysis.ipynb MindSpore/docs - Gitee.com

Redis架构之主从复制

Redis主从架构 主从集群&#xff0c;实现读写分离 主从数据同步 主从同步流程 slave节点向master节点发送replicaof命令建立连接&#xff0c;随后发送 psync {repID} {offset} 指令&#xff0c;repID表示主节点唯一标识&#xff0c;offset为复制偏移量。如果是第一次同步&…

软件测试——Bug篇

什么是BUG 定义&#xff1a; ⼀个计算机bug指在计算机程序中存在的⼀个错误(error)、缺陷(flaw)、疏忽(mistake)或者故障(fault)&#xff0c;这些bug使程序⽆法正确的运⾏。Bug产⽣于程序的源代码或者程序设计阶段的疏忽或者错误。 准确的来说&#xff1a; 1. 当且仅当规格说…

Java面试——Tomcat

优质博文&#xff1a;IT_BLOG_CN 一、Tomcat 顶层架构 Tomcat中最顶层的容器是Server&#xff0c;代表着整个服务器&#xff0c;从上图中可以看出&#xff0c;一个Server可以包含至少一个Service&#xff0c;用于具体提供服务。Service主要包含两个部分&#xff1a;Connector和…

【C语言】“void” 如何在 C 语言中开创无限可能

目录 C语言void关键字详解void关键字的功能和应用详细说明 1. void作为函数返回类型示例代码输出结果 2. void作为函数参数示例代码输出结果 3. void*通用指针示例代码输出结果 4. void与NULL示例代码输出结果 5. void与函数指针示例代码输出结果 6. void的限制和注意事项6.1 不…

AI技术革命对未来就业的影响

一、引言 AI技术革命带来的就业结构变化是双面的&#xff0c;既存在着挑战也蕴含着机遇。过去的几次技术革命例如工业革命和信息技术革命都对就业结构产生了深刻的影响&#xff0c;使一些工作消失&#xff0c;也催生了许多新的工作类型。当前和未来的AI技术发展也必将推动类似…