A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

题目:
1、在屏幕上用"*"显示0-360度的余弦cos(x)曲线;
2、在屏幕上用"*"显示0-360度的余弦sin(x)曲线;

    作为一个初学者的体会,这两道题看似简单,但是自己做起来还是挺有难度的,因为不知道有没有其他高级的方法,过程中只能靠着用反函数的提示自己做,期间也画出了各种莫名其妙的图案。过程比较痛苦但是做出来之后想想也没有那么困难。尤其是画正弦的时候怎么画看着都不流畅,说多了都是泪。总之,大家也可以说说有没有更简单的方法。
  1. /*
  2. 1、在屏幕上用"*"显示0-360度的余弦cos(x)曲线;
  3. */
  4. //分析:
  5. //cos关于x=π对称
  6. //在控制台打印是一行一行打印的从上往下打印,所以我们不能直接用x坐标控制打印顺序
  7. //这里要沿着y坐标往下打印,所以要用到arccos(y)反余弦范围[-1,1]
  8. //把坐标大小放大10倍,即-10 <= y && y <= 10;0 < x && x < 62(角度转化为弧度乘以10取整而来)
  9. //在打印第一个"*"之前需要打印n < arccos(y/10) 个" ",不需要换行,
  10. //在打印第二个"*"之前还要打印n < 62 - arccos(y/10)个" ";
  11. //打印余弦
  12. class PrintCos {
  13.         public static void main(String[] args) {
  14.                 //关于x=31对称
  15.                 for(int y = 10; y >= -10; y--) {
  16.                         int x =1;
  17.                         //注意在带入反余弦的时候y需要除以10.转化为正常弧度
  18.                         int value = (int)(Math.acos((double)y/10) * 10);
  19.                         for( ; x < value; x++) {
  20.                                 //打印之前的" ",不需要换行
  21.                                 System.out.print(" ");                       
  22.                         }
  23.                         //第一个点,不需要换行,因为还有对称的点
  24.                         System.out.print("*");
  25.                         //打印对称
  26.                         for( ;x < 62 - value; x++) {
  27.                                 System.out.print(" ");
  28.                         }
  29.                         //打印第二个"*",并且换行
  30.                         System.out.println("*");       
  31.                 }
  32.         }
  33. }
复制代码

  1. /*
  2. 2、在屏幕上用"*"显示0-360度的余弦sin(x)曲线;
  3. */
  4. //分析:
  5. //同理这道题,sin它是关于x = π中心对称的
  6. //我们也用反余弦函数做arcsin(y),并把坐标放大10倍
  7. //先打印0 < y && y < 10,arcsin(y/10)的图形,
  8. //但是他又是关于x = π/2对称的,这里,我们把x放大10倍,即关于x = 16对称
  9. //先打印y为负数的部分,把得到的图形取反,再关于x = π/2对称
  10. //再向右移动即可以拼接得到

  11. class PrintSin {
  12.         public static void main(String[] args) {
  13.                 //从上往下打印sin的正数部分
  14.                 for(int y = 10; y > 0; y--) {
  15.                         int x = 1;
  16.                         int value = (int)(Math.asin((double)y/10)*10);
  17.                         //打印sin前π/2的空格
  18.                         for(; x < value; x++) {
  19.                                 System.out.print(" ");
  20.                         }
  21.                         //打印第一个点
  22.                         System.out.print("*");
  23.                         for(; x < 31 - value; x++) {
  24.                                 System.out.print(" ");
  25.                         }
  26.                         //打印第二个点,并换行
  27.                         System.out.println("*");
  28.                 }
  29.                 //中心对称;先打印y为负数的部分,把得到的图形取反,再关于x = π/2对称,
  30.                 //然后向右移动,即多打印32个" "
  31.                 for(int y = 0; y >= -10; y--) {
  32.                         int x = 1;
  33.                         int value = -(int)(Math.asin((double)y/10)*10);
  34.                         //比0-31要多打印32个空格
  35.                         for(; x < value + 32; x++) {
  36.                                 System.out.print(" ");
  37.                         }
  38.                         //打印第一个点
  39.                         System.out.print("*");
  40.                         for(; x < 62 - value; x++) {
  41.                                 System.out.print(" ");
  42.                         }
  43.                         //打印第二个点,并换行
  44.                         System.out.println("*");
  45.                 }
  46.                        
  47.         }
  48. }
复制代码


顺便问问,同时画出正弦和余弦该怎么搞?脑子不够用了

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马