老题新解|画矩形

《信息学奥赛一本通》第82题:画矩形

题目描述
根据输入的四个参数: a , b , c , f a,b,c,f a,b,c,f 参数,画出对应的矩形。
前两个参数 a , b a,b a,b 为整数,依次代表矩形的高和宽;
第三个参数 c c c 是一个字符,表示用来填充的矩形符号;
第四个参数 f f f 为整数, 0 0 0 代表空心,否则代表实心。
具体例子请见样例。
输入格式
第一行:a,b,c,f。
输出格式
一个矩形。
输入输出样例 #1
输入 #1
7 7 @ 0
输出 #1

@@@@@@@
@     @
@     @
@     @
@     @
@     @
@@@@@@@

说明/提示
数据范围:
3 ≤ a ≤ 100 3 \le a \le 100 3a100
5 ≤ b ≤ 100 5 \le b \le 100 5b100
保证 c c c 是一个可见的字符(ASCII 码在 [ 33 , 126 ] [33,126] [33,126] 内)。 0 ≤ f ≤ 1 0 \le f \le 1 0f1

大家好,我是莫小特。
这篇文章给大家带来《信息学奥赛一本通》中的第 82题:画矩形。

image.png

一、题目描述

洛谷的题号是:B2083 画矩形

image.png

二、题意分析

这道题是信息学奥赛一本通练习题的第 82 题。

根据输入格式的描述,输入有四个参数,前两个为整数 a 和 b,数据范围: 3 ≤ a ≤ 100 3 \le a \le 100 3a100 5 ≤ b ≤ 100 5 \le b \le 100 5b100,可以选用 int 类型,第三个为字符 c,使用 char 类型,第四个为整数 f,数据范围: 0 ≤ f ≤ 1 0 \le f \le 1 0f1,使用 int 类型。

此处要注意输入顺序,千万不能写错了,否则很难发现错误的,先两个整数,再接着一个字符,最后再一个整数。

int a,b,f;
char c;
cin>>a>>b>>c>>f;

根据题目意思,需要根据 f 的值输出结果,如果 f 等于 0 代表空心,其他则代码实心,因此需要先判断 f 的值,使用 if 双分支语句。

if(f==0)//空心的情况
{
	
}
else//实心的情况
{
	
}

空心的话需要输出高为 a,宽为 b 的矩形,也就是 a 行 b 列的矩形,使用 for 循环嵌套来实现。

for(int i=1;i<=a;i++)//行
{
	for(int j=1;j<=b;j++)//列
	{
		
	}
}

根据题目中所说,空心即除了四条边用字符所描述的符合代替,其他的用空格代替,所以直接进行特殊判断,四条边,也就是第一行和最后一行,第一列和最后一列,注意行的结束是 a,列的结束是 b,不能搞错了,使用逻辑运算符或者 || 连接。

for(int i=1;i<=a;i++)//行
{
	for(int j=1;j<=b;j++)//列
	{
		//第一行 最后一行 第一列 最后一列
		if(i==1||i==a||j==1||j==b)	
		{
			cout<<c;
		}
		else
		{
			cout<<" ";//输出空格
		}
	}
	cout<<endl;//不能忘记换行
}

而实心就不需要考虑空格情况,直接输出字符 c 即可。

for(int i=1;i<=a;i++)//行
{
	for(int j=1;j<=b;j++)//列
	{
		cout<<c;
	}
	cout<<endl;//不能忘记换行
}

整合一下。

if(f==0)//空心的情况
{
	for(int i=1;i<=a;i++)//行
	{
		for(int j=1;j<=b;j++)//列
		{
			//第一行 最后一行 第一列 最后一列
			if(i==1||i==a||j==1||j==b)	
			{
				cout<<c;
			}
			else
			{
				cout<<" ";//输出空格
			}
		}
		cout<<endl;//不能忘记换行
	}
}
else//实心的情况
{
	for(int i=1;i<=a;i++)//行
	{
		for(int j=1;j<=b;j++)//列
		{
			cout<<c;
		}
		cout<<endl;//不能忘记换行
	}
}

按照样例输入对数据进行验证。

image.png

符合样例输出,到网站提交测评。

image.png

测试通过!

三、完整代码

该题的完整代码如下:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a,b,f;
	char c;
	cin>>a>>b>>c>>f;
	if(f==0)//空心的情况
	{
		for(int i=1;i<=a;i++)//行
		{
			for(int j=1;j<=b;j++)//列
			{
				//第一行 最后一行 第一列 最后一列
				if(i==1||i==a||j==1||j==b)	
				{
					cout<<c;
				}
				else
				{
					cout<<" ";//输出空格
				}
			}
			cout<<endl;//不能忘记换行
		}
	}
	else//实心的情况
	{
		for(int i=1;i<=a;i++)//行
		{
			for(int j=1;j<=b;j++)//列
			{
				cout<<c;
			}
			cout<<endl;//不能忘记换行
		}
	}
    return 0;
}

四、总结

这道题考察了循环嵌套、条件判断和格式化输出,有以下知识点:

1、输入参数:要注意顺序(高、宽、字符、标志位),尤其字符 c 的读取。

2、f 的作用:决定矩形是空心还是实心,属于典型的分支结构应用。

3、循环实现:通过两层 for 循环分别控制行和列,再配合边界条件判断,就能输出对应的矩形。

常见易错点:

符号必须是英文字符,换行不能遗漏,否则会导致格式错误。

---end---

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!
如果有更好的方法也可以在评论区评论哦,我都会看哒~

我们下集见~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员莫小特

谢谢你~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值