编程总结1

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

*****
 ***
  *
 ***
*****  

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

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

输出格式:

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

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2  

1)实验代码

#include <stdio.h>
int main()
{
    int n;
    char op;
    scanf("%d %c",&n,&op);
    int a=1;
int i=1;
    while(a<=n)
    {
        a=a+2*(2*(i+1)-1);
        if(a<=n)
            i++;
    }
    int j,h;
    for(j=1;j<=i;j++)
    {
            for(h=1;h<j;h++)
            printf(" ");
        for(h=1;h<=2*(i-j)+1;h++)
        {
            printf("%c",op);
        }
        printf("
");
    }
    for(j=2;j<=i;j++)
    {
           for(h=1;h<=i-j;h++)
            printf(" ");
        for(h=1;h<=2*j-1;h++)
        {
            printf("%c",op);
        }
        printf("
");
    }
    printf("%d",n-(a-2*(2*(i+1)-1)));
return 0;
}  

2)设计思路

第一步: 定义变量n,符号型变量op,scanf语句输入变量值;
第二步:定义变量a,i,a表示所需要的符号数的最大值,将沙漏以中心为界分成两部分,i表示半个三角的行数,用while循环计算共需要多少个符号,及所得到的行数,以中心为起点,每增加一行符号增加2个;
第三步:定义变量j,h,j表示行,先打印上半部分,每行的空格数为行数减1,j的初始值是1,则每行打印的符号数为2(i-j)+1个,打印完一行就换行。
第四步:打印下半部分,打印上部分时已经打印了中心,则下部分从j=2开始,打印空格,打印符号,每行打印2*j-1个,打印完就换行;
第五步:输出剩余符号数。

3)本题调试过程碰到的问题及其解决办法

1.不知如何在符号两边都打印空格;
解决方案:只需打印符号左边的空格,右边直接换行。
2.最后输出剩余符号数错误;
解决方案:a在结束while循环后多加了个2(2(i+1)-1),a需减去1个2(2(i+1)-1),n再减a。

4)运行截图

原文地址:https://www.cnblogs.com/LeeMayZ/p/10390799.html