打印沙漏
打印沙漏
一、目的
-掌握判断折半后求最大奇数的用法
-掌握双重循环
二、实验内容与设计思想
打印沙漏
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
2
函数相关伪代码
1.int a,char m(输入字符)
2.判断第一层个数
3.sum来表示个数,k来表示空格个数,p来表示每一层进行循环次数
4.双重循环输出上半部分
5.双重循环输出下半部分
6.a-sum表示剩余个数
函数代码
#include<iostream>
using namespace std;
int main()
{
int a, i, b, n, k,p,l,sum=0;
char m;
cin >> a >> m;
int total = 1;
int layer = 1;
while (total + 2 * (layer + 2) <= a) {
layer += 2;
total += 2 * layer ;
}
b=layer;
p = b;
k = 0;
l =b;
for (;b > 0;b=b-2) {
for (i = 0;i < p;i++) {
if (i < k) {
cout << " ";
}
else {
cout << m;
sum++;
}
}
cout << endl;
k++;
p--;
}
k = k - 2;
p = p + 2;
for (i = 3;i <= l;i = i + 2) {
for (b = 0;b <p;b++) {
if (b < k) {
cout << " ";
}
else {
cout << m;
sum++;
}
}
k--;
p++;
cout << endl;
}
sum = a - sum;
cout << sum;
return 0;
}
三、实验使用环境
以下请根据实际情况编写
- 操作系统:Windows 11专业版
- 编程语言:C++
- 开发工具:[Visual Studio 2022]
四、实验步骤和调试过程
打印沙漏
本机运行截图
五、实验小结
遇到的问题及解决方法:
- 问题:第一行输出个数判断错误
- 解决方法:优化代码,修改求个数的方法
实验体会和收获:
这段代码的主要功能是打印一个由字符组成对称的沙漏图案,并计算输出剩余未使用的字符数量。程序首先要接收两个输入值:一个int型a和一个char型m。a来代表总共可用的字符数量,m用于构成对称沙漏的字符。 由于要确保程序中m要对称输出且还不能超过字符总数,所以可以通过循环相加来找到沙漏输出的最大个数,每层字符数呈递增关系,直至找到最大可能的值。接着,我分成两部分来打印沙漏图形,要先打印沙漏的上半部分,包括最中间的一行;然后打印下半部分(去除只打印1个字符那行)。这个打印过程需要通过双重循环来实现,还要通过k和p(内层循环总数)来调整空格数和字符m的数量和换行符来形成沙漏的形状。每成功打印一个字符m,就会将计数器sum增加1,用于跟踪已使用的字符数量。最后,程序计算并输出剩余未使用的字符数。