寒一总结

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("\n");
    break;
    }
    else{
    printf(" ");
    }
    }
    else{
    printf("%c",ch);
    }
    if(j==a-1){
    printf("\n");
    }
    }
    }
    printf("%d\n",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\n”,number-temp)。
    3、 本题调试过程中遇到的问题及解决办法。
    1、 为什么引用y1,y2?
    解决办法://在如下的代码中之所以引入y1,y2的原因是因为,将比较大的行转化为比较小行的操作中需要用到,因为不能直接对代表行数的i,j进行直接的操作,假使这样做会是使源代码无限循环。

猜你喜欢

转载自www.cnblogs.com/neir/p/10292065.html