寒假作业1

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语句判断numbertemp+2(a+2)?如果是则将行数改为那个更大沙漏图形的行数,跳出循环,再根据temp=temp+2(a+2)
a=a+2得出那个更大的行数。
第七步:如果给出的数比下个更大的沙漏图形所需的符号数还要大,则将其的行数变为下个沙漏图形的行数,再进行下次循环,输入else语句,再其中输入temp=(temp+2(a+2))
a=a+2。
第八步:输入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/chenzg90826/p/10408477.html