C语言打印正弦曲线、直线、圆等等

一:打印正弦曲线

#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轴开始打,此为方法

此题还有对称与重复

二:打印cosxy=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打印

 

你可能感兴趣的:(算法,图形)