打印沙漏

打印沙漏


一、目的

-掌握判断折半后求最大奇数的用法
-掌握双重循环

二、实验内容与设计思想

打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定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]

四、实验步骤和调试过程

打印沙漏

本机运行截图


五、实验小结

遇到的问题及解决方法:

  1. 问题:第一行输出个数判断错误
  • 解决方法:优化代码,修改求个数的方法

实验体会和收获:

这段代码的主要功能是打印一个由字符组成对称的沙漏图案,并计算输出剩余未使用的字符数量。程序首先要接收两个输入值:一个int型a和一个char型m。a来代表总共可用的字符数量,m用于构成对称沙漏的字符。 由于要确保程序中m要对称输出且还不能超过字符总数,所以可以通过循环相加来找到沙漏输出的最大个数,每层字符数呈递增关系,直至找到最大可能的值。接着,我分成两部分来打印沙漏图形,要先打印沙漏的上半部分,包括最中间的一行;然后打印下半部分(去除只打印1个字符那行)。这个打印过程需要通过双重循环来实现,还要通过k和p(内层循环总数)来调整空格数和字符m的数量和换行符来形成沙漏的形状。每成功打印一个字符m,就会将计数器sum增加1,用于跟踪已使用的字符数量。最后,程序计算并输出剩余未使用的字符数。

posted @ 2025-04-23 23:02  穗和  阅读(39)  评论(0)    收藏  举报