R7-6 打印沙漏
题目:
分析:
(1)每行输出的数相当与 an=2n-1;总数相当于一个上三角加一个下三角再减去1;上三角=下三角=n+(n-1)*n/2*2;即总数=2n*n-1。
(2)题目中要求相邻两行符号数差2,中间对齐——>在每一行前面输出空格数为对应三角形所在行数-1。
#include<stdio.h> int main() { int i,kong,n=0,N,fuhao; char op; scanf("%d ",&N); scanf("%c",&op); while(N>=2*n*n-1){ n++;} if(2*n*n-1>N){ //让n回到 达到离开循环条件前的值 n--;} for(i=1;i<=n;i++) //先输入上三角 { for(kong=1;kong<i;kong++) //输出所需个数的空格 printf(" "); for(fuhao=1;fuhao<=2*n-2*i+1;fuhao++) //输出所需个数的符号 printf("%c",op); printf("\n"); //行末换行 } for(i=n-1;i>=1;i--) //基本与上个循环基本相同,只是修改循环起始计数数和判断条件,且不用输出下三角的尖尖 { for(kong=1;kong<i;kong++) printf(" "); for(fuhao=1;fuhao<=2*n-2*i+1;fuhao++) printf("%c",op); printf("\n"); } printf("%d",N-2*n*n+1); //输出剩余的符号数量 return 0; }
解题的难点:
(1)找出循环输出的条件——>重点是要找出规律
(2)让每行靠中对齐——每换一行变换两个数,在上三角中则每换一行就比上一行多出一个空格。
7-7 打印沙漏
分析:
(1)题目要求:测试数据有多组,处理到文件尾。——意味着没有循环的范围,由此引出对于EOF的使用
对于题目并没有给定输入多少次的情况,只说输入到文件结尾的情况
(2)其他部分与上面那题差不多。
代码:
#include<stdio.h>
int main()
{
int n,i,kong,fuhao;
while(scanf("%d",&n)!=EOF){
for(i=1;i<=n;i++)
{
for(kong=1;kong<i;kong++)
printf(" ");
for(fuhao=1;fuhao<=2*n-2*i+1;fuhao++)
printf("*");
printf("\n");
}
for(i=n-1;i>=1;i--)
{
for(kong=1;kong<i;kong++)
printf(" ");
for(fuhao=1;fuhao<=2*n-2*i+1;fuhao++)
printf("*");
printf("\n");
}
}
return 0;
}
——————————————————————————————————————————————————————————————————————————————————————————
做题就像上楼,不能还没有搭好梯子,就想着一步飞上去,不然容易掉下来。