一:打印正弦曲线
#include <stdio.h>
#include <math.h>
int main()
{
double y;
int x,m;
for(y=1;y>=0;y-=0.1)
{
m=asin(y)*10;
for(x=1;x<m;x++)
printf(" ");
printf("*");
for(;x<32-m;x++)
printf(" ");
printf("*\n");
}
for(y=0;y<=1;y+=0.1)
{
m=asin(y)*10+34;
for(x=1;x<m;x++)
printf(" ");
printf("*");
for(;x<99-m;x++)
printf(" ");
printf("*\n");
}
return 0;
}
结果:
思考:
缩放,由程序一横列代表0.1,对应的一竖列也是0.1才可以清楚的表示cosx的图像
从方程入手,从y轴开始打,此为方法
此题还有对称与重复
二:打印cosx和y=1-1/3x的图像
#include "stdio.h"
#include <math.h>
void main()
{
int x,m,n;
double y;
for(y=1;y>=-1;y-=0.1)
{
m=acos(y)*10;
n=(3-3*y)*10;
for(x=0;x<=62;x++)
if(x==m&&x==n)
printf("+");
else if(x==n)
printf("+");
else if(x==m||x==62-m)
printf("*");
else printf(" ");
printf("\n");
}
}
结果:
思考:
打印第二个for循环的最后的换行很重要
打印时注意y值应从大变小
打印*和+的方法可用于程序一中且易懂
同一要注意缩放,直线和曲线都有缩放,为十倍
三:打印余弦和正弦曲线
#include "stdio.h"
#include <math.h>
void main()
{
int x,m,n;
double y;
for(y=1;y>=0;y-=0.1)
{
m=acos(y)*10;
n=asin(y)*10;
for(x=0;x<=62;x++)
if(x==m&&x==n)
printf("+");
else if(x==m||x==62-m)
printf("*");
else if(x==n||x==31-n)
printf("+");
else printf(" ");
printf("\n");
}
for(y=0.1;y<=1;y+=0.1)
{
m=acos(-y)*10;
n=asin(y)*10+32;
for(x=0;x<=62;x++)
if(x==m&&x==n)
printf("+");
else if(x==m||x==62-m)
printf("*");
else if(x==n||x==95-n)
printf("+");
else printf(" ");
printf("\n");
}
}
结果:
思考:
思维的变通,程序一是将打印分成上下两部分,程序三依照此法亦可
四:打印圆
#include <stdio.h>
#include <math.h>
void main()
{
int m,x;
double y;
for(y=1;y>=-1;y-=0.1)
{
m=sqrt(1-y*y)*20+20;
for(x=0;x<=40;x++)
if(x==m||x==40-m)
printf("*");
else printf(" ");
printf("\n");
}
}
结果:
思考:
此题的标准做法:
#include <stdio.h>
#include <math.h>
void main()
{
int x,m;
double y;
for(y=10;y>=-10;y--)
{
m=2*sqrt(100-y*y);
for(x=1;x<30-m;x++)
printf(" ");
printf("*");
for(;x<30+m;x++)
printf(" ");
printf("*\n");
}
}
答案引入了屏幕纵横比调节系数(红色),实际与上程序中的缩放是一个意思
另一个重点是圆方程的应用,这是核心算法
另外打印时与我的思路不太相同,一为平移图像,一为对称打印,但都与算法相符,值得注意
五:打印y=x*x和圆叠加的图形
#include <stdio.h>
#include <math.h>
void main()
{
int x,m,n;
double y;
for(y=1;y>=-1;y-=0.1)
{
m=sqrt(1-y*y)*20+20;
if(y>0)
n=sqrt(y)*20+20;
else n=100;
for(x=0;x<=40;x++)
if(x==m||x==n)
printf("+");
else if(x==m||x==40-m)
printf("*");
else if(x==n||x==40-n)
printf("+");
else printf(" ");
printf("\n");
}
}
结果:
思考:
y=x*x图形只有y>0部分,这点要考虑
打印时先打的其实是右边部分,再用40-m大的左边
总结:方法大致为从图形找关系,从y轴入手,考虑好缩放,用for语句打印
流程也较固定:
#include <math.h> 包含函数
int x,m,n; 定义整形
double y; 定义实型
for(y=1;y>=-1;y-=0.1) y轴的循环
m=sqrt(1-y*y)*20+20; 得m值,即x轴值
for(x=0;x=40;x++) 用for打印