一、对于只有一半的图形而言
Problem F: Print Graphics Problerm (I)
Time Limit: 1 Sec Memory Limit: 16 MB
Submit: 3123 Solved: 2067
[Submit][Status][Web Board]
Description
向标准输出上打印一些用ASCII字符组成的图形。
Input
输入为一个整数n,其中n大于0小于100。
Output
输出一个n层等腰三角形,格式见sample。
Sample Input
5
- 对于本题的一般做法是先找出 总行数 行数 空格 + 这四者之间的关系。
关系如下图
2.发现总框架是一行一行的来,所以说行数是最外层循环控制换行,并且这里的行数一般是从1开始的。
3.一般当空格或者+变化趋势与行数的变化趋势不同的时候,比如这里是空格,这样控制空格的变量一般必须要有总行数与单个行的联系来不断凑出这个数字,有时候这个数字还要扩大来不断的凑。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int i,j;
int n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=0;j<n-i;j++)\\这里是总行数与单个行数来凑数字
{
printf(" ");
}
for(j=0;j<2*i-1;j++)
{
printf("+");
}
printf("\n");
}
return 0;
}
这个题还有另外一种做法,即为坐标法
**注意坐标法排列的顺序是从上到下从左向右 **
#include <stdio.h>
#include <stdlib.h>//这个为abs的头文件
int main()
{
int n;
int x,y;
scanf("%d",&n);
for(y=n-1;y>=0;y--)\\这里要注意x与y到底谁为大循环**这里y必须从正数开始,不可从负数开始到0,如果从负数开始的话,图形将倒过来**
{
for(x=-(n-1);x<=(n-1);x++)
{
if(abs(y)+abs(x)>=n&&x>0)\\这里要注意结束条件,因为没有空格所以要break;
break;
else
{
if(abs(y)+abs(x)<=(n-1))
printf("+");
else
printf(" ");
}
}
printf("\n");
}
return 0;
}
二、对于上下对称等图形来说
Problem G: Print Graphics Problerm (II)
Time Limit: 1 Sec Memory Limit: 16 MB
Submit: 6783 Solved: 2841
[Submit][Status][Web Board]
Description
向标准输出上打印一些用ASCII字符组成的图形。
Input
输入为多个整数n,其中n大于0小于100,当n为0时结束输入。
Output
若n为偶数,则输出一个正向的n层等腰三角形;n为奇数,则输出一个倒向的n层等腰三角形。三角形由“+”组成。任意两个图形之间有一个空行分隔,格式见sample。
Sample Input
5
4
0
1、方法一
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j,n;
while(scanf("%d",&n)&&n!=0)
{
if(n%2!=0)
{
for(i=1; i<=n; i++)
{
for(j=0; j<i-1; j++)
printf(" ");
for(j=0; j<2*n-(2*i-1); j++)
{
if(j==2*n-(2*i-1)-1)
printf("+\n");
else
printf("+");
}
}
printf("\n");
}
else
{
for(i=1;i<=n;i++)
{
for(j=0;j<n-i;j++)
printf(" ");
for(j=1;j<=2*i-1;j++)
{
if(j==2*i-1)
printf("+\n");
else
printf("+");
}
}
printf("\n");
}
}
return 0;
}
2、方法二
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i,j;
int isfirst=1;
while(scanf("%d",&n)&&n!=0)
{
if(isfirst==0)**\\这个题来说有点特别,因为上下两半图形中间有一个空行,这个空行不太好控制,所以这里用了isfirst来控制**
printf("\n");
if(n%2!=0)
{
for(i=0; i>=-(n-1); i--)
{
for(j=-(n-1); j<=(n-1); j++)
{
if(j>0&&abs(i)+abs(j)>=n)
break;
else
{
if(abs(i)+abs(j)<=(n-1))
printf("+");
else
printf(" ");
}
}
printf("\n");
}
}
else
{
for(i=n-1; i>=0; i--)
{
for(j=-(n-1); j<=(n-1); j++)
{
if(abs(i)+abs(j)>=n&&j>0)
break;
else
{
if(abs(i)+abs(j)<n)
printf("+");
else
printf(" ");
}
}
printf("\n");
}
}
isfirst=0;
}
return 0;
}
三、编写函数的形式来打印图形
Problem H: Print Graphics Problerm (III) (Append Code)
Time Limit: 1 Sec Memory Limit: 16 MB
Submit: 4973 Solved: 2700
[Submit][Status][Web Board]
Description
向标准输出上打印一些用ASCII字符组成的图形。
编写一个函数用于输出ASCII图形。
用C语言实现:append.c中函数原型为
int print_graphic(int n, char c);
用C++实现:append.cc中函数原型为
int printGraphic(int n, char c);
功能:输出n层有字符c组成的图形。
函数的调用格式见“Append Code”。
Input
输入为一个整数n和一个字符c,其中n大于0小于100。
Output
输出一个n层等腰三角形,由字符c组成,格式见sample。
Sample Input
5 *
int main()
{
char c;
int num;
scanf("%d %c", &num, &c);
print_graphic(num, c);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int print_graphic(int n, char c)
{
int i,j;
for(i=1; i<=n; i++)
{
for(j=0; j<n-i; j++)
printf(" ");
for(j=1; j<=2*i-1; j++)
{
if(j==2*i-1)
printf("%c\n",c);
else
printf("%c",c);
}
}
return 0;
}
int main()
{
char c;
int num;
scanf("%d %c", &num, &c);
print_graphic(num, c);
return 0;
}
四、打印字母菱形
1、
Problem F: Print Graphics Problerm (V)
Time Limit: 1 Sec Memory Limit: 16 MB
Submit: 2074 Solved: 1173
[Submit][Status][Web Board]
Description
向标准输出上打印一些用ASCII字符组成的图形。
Input
输入为多个奇数n,其中n大于0小于100,至文件尾结束。
Output
输出为多个n层的空心菱形,任意两个图形之间有一个空行分隔,格式见sample。
Sample Input
3
7
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i,j;
while(~scanf("%d",&n))\\这里表示!=EOF的另外一种做法
{
for(i=-(n-1)/2; i<=(n-1)/2; i++)
{
for(j=-(n-1)/2; j<=(n-1)/2; j++)
{
if(j>0&&abs(i)+j>(n-1)/2)
break;
else
{
if(abs(i)+abs(j)==(n-1)/2)
printf("*");
else
printf(" ");
}
}
printf("\n");
}
printf("\n");
}
return 0;
}
2、
Problem G: 打印字母菱形图案
Time Limit: 1 Sec Memory Limit: 16 MB
Submit: 3151 Solved: 2155
[Submit][Status][Web Board]
Description
输出N(N为奇数)行由字母组成的菱形,第1行为字母A,第2行为BCD,第三行为CDEFG,以此类推。菱形上下对称。
Input
一个奇数N。其中N大于0小于18。
Output
N行字母组成的菱形图案。
Sample Input
7
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=-(n-1)/2;i<=(n-1)/2;i++)
{
char c='A'+(n-1)/2-abs(i);\\注意这里ABC等的控制
for(j=-(n-1)/2;j<=(n-1)/2;j++)
{
if(j>0&&abs(i)+abs(j)>(n-1)/2)
break;
else
{
if(abs(i)+abs(j)>(n-1)/2)
printf(" ");
else
{
putchar(c);
c++;
}
}
}
printf("\n");
}
return 0;
}