问题分析:
在0~360度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第一行信息后,只能向下一行输出,不能再返回到上一行。为了获得题目要求的图形就必须在一行中一次输出两个“*”。
思路:
利用sin (x)和cos(x)的左右对称性;
利用反余弦函数asin和acos计算坐标(x,y)的对应关系。
程序如下:
#include"stdio.h"
#include"math.h"
void main()
{
double y;
int x,m;
/*先打印0到180度,利用sin (x)在0到90度的左右对称性,
序中利用反正弦函数asin计算坐标(x,y)的对应关系。*/
for(y=1;y>=0;y-=0.1) /*y为列方向,值从1到0,步长为0.1*/
{
m=asin(y)*10; /*计算出y对应的弧度m,乘以10为图形放大倍数*/
for(x=1;x<m;x++) printf(" ");
printf("*"); /*控制打印左侧的 * 号*/
for(;x<31-m;x++)printf(" ");
printf("*\n"); /*控制打印同一行中对称的右侧*号*/
}
/*再打印180到360度,利用cos (x)在90到270度的左右对称性,
序中利用反余弦函数acos计算坐标(x,y)的对应关系,
记得把横坐标x的值右移90度。*/
for(y=0;y>=-1;y-=0.1) /*y为列方向,值从0到-1,步长为0.1*/
{
m=acos(y)*10+15; /*计算出y对应的弧度m,乘以10为图形放大倍数,
x的值右移90度*/
for(x=1;x<m;x++)printf(" ");
printf("*"); /*控制打印左侧的 * 号*/
for(;x<92-m;x++)printf(" "); /*92=62+15+15,why?:)*/
printf("*\n"); /*控制打印同一行中对称的右侧*号*/
}
getch();
}
/*如果你觉得两段曲线的接点的断点不好看,把第9句改为:
for(y=1;y>=0.2;y-=0.1) 再看看结果:)*/
解决办法2:
若题目规定不能使用数组,这样做的确烦人得很。
如果允许使用数组,这个问题就简单多了。
#include"stdio.h"
main()
{
char b[30];
int xx;
double pii,a,sin(),cos();
pii= 3.1415926/180 ;
printf(" -1 0 1\n"); /*空3格,后两个空9格*/
printf(" I..........I...........I\n"); /*空3格,后两个空10格*/
for(a=0;a<=360;a=a+15)
{strcpy(b," I "); /*空10格*/
xx=(int)(10+10*sin(pii*a)) ;
b[xx]='*';
printf("%3.0f %s\n",a,b);
}
getch();
}
/*如果你看不到最上部的头,把第10句改为a<=300,就可以看到最上部的效果*/
评论