寒一总结

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





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

include<stdio.h>

int main(){

int number,temp=7,a=3;
char ch;
int y1,y2;
scanf("%d %c",&number,&ch);
do{
    if(number>=temp){
        if(number<(temp+2*(a+2))){
            break;
        }
        else if(number==(temp+2*(a+2))){
            temp=(temp+2*(a+2));
            a=a+2;
            break;
        }
        else{
            temp=(temp+2*(a+2));
            a=a+2;
        }
    }
}while(1);
for(int i=0;i<a;i++){
    y1=i;
    if(y1>a/2){
        y1=a-y1-1;
    }
    for(int j=0;j<a;j++){
        y2=j;
        if(y2>a/2){
            y2=a-y2-1;
        }
        if(y2<y1){
            if(j>a/2){
                printf("
");
                break;
            }
            else{
                printf(" ");
            }
        }
        else{
            printf("%c",ch);
        }
        if(j==a-1){
            printf("
");
        }
    }
}
printf("%d
",number-temp);

}
2、 设计思路。
第一步:编译预处理命令,输入主函数。
第二步:定义整型函数变量,并赋值number,temp=7,temp=7是打印沙漏图形至少所需的符号量,a=3是打印沙漏的最少行数,a=3,y1,y2。
第三步:定义字符型函数变量,ch。
第四步:调用scanf语句接收变量number和ch。
第五步:输入do-while语句,在其中嵌套if语句判断number>=temp?判断数字number是否可以打印沙漏,再利用if语句判断给定的数字number是否可以打印下一个更大的沙漏及number<(temp+2(a+2))?,再输入break语句,如果不符合条件,则跳出循环打印沙漏。
第六步:如果符合条件,则进入下步循环,输入else-if语句判断number==temp+2
(a+2)?如果是则将行数改为那个更大沙漏图形的行数,跳出循环,再根据temp=temp+2(a+2)
a=a+2得出那个更大的行数。
第七步:如果给出的数比下个更大的沙漏图形所需的符号数还要大,则将其的行数变为下个沙漏图形的行数,再进行下次循环,输入else语句,再其中输入temp=(temp+2
(a+2))
a=a+2。
第八步:再根据以下的打印与此匹配的沙漏图形
http://files.git.oschina.net/group1/M00/06/56/PaAvDFxC4ZyAOkTaAAAtLKuAr5Y460.png?token=d10a9b6460dd5527632a149e6c0281d0&ts=1547887360&attname=image001.png
//i代表行数,j代表列数
第九步:输入for(int i=0;i<a;i++)根据这条语句使行数逐渐增加,使y1=i。
第十步:输入if(y1>a/2),y1=a-y1-1。如果行数大于a/2(中心行),那么将比较大的行转化为与此行一样的更小的行。
第十一步:输入for(int j=0;j<a;j++),y2=j, 如果 列数大于a/2(中心列),那么将比较大的列转化为与此列一样的更小的列。
第十二步:输入if(y2>y1),如果符合条件,再进入if(j>a/2)语句,如果列数大于中心列则跳出行,换行,如果小于a/2中心列则输出空格。
第十三步:如果转换为列数y2>=y1,则输出字符。
第十四步:输入if(j==a-1), 进行末尾列换行,最后输出多余符号,即printf(“%d ”,number-temp)。
3、 本题调试过程中遇到的问题及解决办法。
1、 为什么引用y1,y2?
解决办法://在如下的代码中之所以引入y1,y2的原因是因为,将比较大的行转化为比较小行的操作中需要用到,因为不能直接对代表行数的i,j进行直接的操作,假使这样做会是使源代码无限循环。

原文地址:https://www.cnblogs.com/neir/p/10292065.html