当前位置:   article > 正文

C++程序设计 - 习题4 - 打印沙漏_本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列

练习时间

2023年1月30日15:28 广东省深圳市

题目描述

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印:

*****
 ***
  *
 ***
*****
  • 1
  • 2
  • 3
  • 4
  • 5

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例

19 *
  • 1

输出样例

*****
 ***
  *
 ***
*****
2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

错误代码(一)

#include <iostream>
#include <cmath>
using namespace std;

#define N 1000

int main()
{
    int input_n;
    int remain_n;
    
    char input_c;
    
    cin >> input_n;
    cin >> input_c;
    
    int i;
    int i_range;
    
    i_range = ceil(sqrt((N + 1) / 2));
    
    int row_count;
    int row_num;
    
    for (i = 0; i < i_range; i ++)
    {
        int i_num = (i * i) * 2 - 1;
        if (input_n > i_num)
        {
            continue;
        }
        else
        {
            row_count = i;
            row_num = 2 * row_count - 1;
            remain_n = input_n - (2 * (row_count * row_count) - 1);
            break;
        }
    }
    
    for (int j = 0; j < row_num; j ++)
    {
        if (j <= ((row_num - 1) / 2))
        {
            for (int k1 = 0; k1 < j; k1 ++)
            {
                cout << ' ';
            }
            for (int k2 = 0; k2 < (row_num - 2 * j); k2 ++)
            {
                cout << input_c;
            }
            for (int k3 = 0; k3 < j; k3 ++)
            {
                cout << ' ';
            }
        }
        else
        {
            for (int k1 = 0; k1 < (row_num - j - 1); k1 ++)
            {
                cout << ' ';
            }
            for (int k2 = 0; k2 < (2 * j + 2 - row_num); k2 ++)
            {
                cout << input_c;
            }
            for (int k3 = 0; k3 < (row_num - j - 1); k3 ++)
            {
                cout << ' ';
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

在这里插入图片描述

原因分析:该代码在输入输出流时,没有断行(应当在cout末尾加入endl或/n)。同时,输入19时,顶行、底行,应为5个字符,而上图显示是7个字符,对应的数列超出了一项,说明计算也存在一定问题,该问题定位至第一个for循环,要重点检查row_count、row_num。另外,该代码没有输出最后的剩余字符数量,应予以补上。

错误代码(二)

#include <iostream>
#include <cmath>
using namespace std;

#define N 1000

int main()
{
    int input_n;
    int remain_n;
    
    char input_c;
    
    cin >> input_n;
    cin >> input_c;
    
    int i;
    int i_range;
    
    i_range = ceil(sqrt((N + 1) / 2));
    
    int row_count;
    int row_num;
    
    for (i = 0; i < i_range; i ++)
    {
        int i_num = (i * i) * 2 - 1;
        if (input_n > i_num)
        {
            continue;
        }
        else
        {
            row_count = i - 1;
            row_num = 2 * row_count - 1;
            remain_n = input_n - (2 * (row_count * row_count) - 1);
            break;
        }
    }
    
    for (int j = 0; j < row_num; j ++)
    {
        if (j <= ((row_num - 1) / 2))
        {
            for (int k1 = 0; k1 < j; k1 ++)
            {
                cout << ' ';
            }
            for (int k2 = 0; k2 < (row_num - 2 * j); k2 ++)
            {
                cout << input_c;
            }
            for (int k3 = 0; k3 < j; k3 ++)
            {
                cout << ' ';
            }
            cout << endl;
        }
        else
        {
            for (int k1 = 0; k1 < (row_num - j - 1); k1 ++)
            {
                cout << ' ';
            }
            for (int k2 = 0; k2 < (2 * j + 2 - row_num); k2 ++)
            {
                cout << input_c;
            }
            for (int k3 = 0; k3 < (row_num - j - 1); k3 ++)
            {
                cout << ' ';
            }
            cout << endl;
        }
    }
    cout << remain_n << endl;
    
    cout << endl;
    
    cout << "input_n is " << input_n << endl;
    cout << "row_count is " << row_count << endl;
    cout << "row_num is " << row_num << endl;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

原因分析:当输入为1时,出现了错误,说明极端值取值存在问题,需要对输入为1、999、1000、1001等边界情况,进行重新检查。因此,以后要注意cin输入的边界值,判断程序在极端情况下是否有可能出错。

修改后代码

#include <iostream>
#include <cmath>
using namespace std;

#define N 1000

int main()
{
    int input_n;
    int remain_n;
    
    char input_c;
    
    cin >> input_n;
    cin >> input_c;
    
    int i;
    
    int row_count;
    int row_num;
    
    for (i = 0; i < 1000; i ++)
    {
        int i_num = (i * i) * 2 - 1;
        if (input_n == 1)
        {
            row_count = 1;
            row_num = 1;
            remain_n = 0;
            break;
        }
        if (input_n > i_num)
        {
            continue;
        }
        else
        {
            row_count = i - 1;
            row_num = 2 * row_count - 1;
            remain_n = input_n - (2 * (row_count * row_count) - 1);
            break;
        }
    }
    
    for (int j = 0; j < row_num; j ++)
    {
        if (j <= ((row_num - 1) / 2))
        {
            for (int k1 = 0; k1 < j; k1 ++)
            {
                cout << ' ';
            }
            for (int k2 = 0; k2 < (row_num - 2 * j); k2 ++)
            {
                cout << input_c;
            }
            for (int k3 = 0; k3 < j; k3 ++)
            {
                cout << ' ';
            }
            cout << endl;
        }
        else
        {
            for (int k1 = 0; k1 < (row_num - j - 1); k1 ++)
            {
                cout << ' ';
            }
            for (int k2 = 0; k2 < (2 * j + 2 - row_num); k2 ++)
            {
                cout << input_c;
            }
            for (int k3 = 0; k3 < (row_num - j - 1); k3 ++)
            {
                cout << ' ';
            }
            cout << endl;
        }
    }
    cout << remain_n << endl;
    
    cout << endl;
    
    cout << "input_n is " << input_n << endl;
    cout << "row_count is " << row_count << endl;
    cout << "row_num is " << row_num << endl;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87

运行结果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/935761
推荐阅读
相关标签
  

闽ICP备14008679号