Board logo

标题: 批处理脚本实现C语言趣味编程百例003:绘制圆 [打印本页]

作者: jinzeyu    时间: 2012-2-29 10:21     标题: 批处理脚本实现C语言趣味编程百例003:绘制圆

本帖最后由 jinzeyu 于 2012-2-29 10:24 编辑

用批处理在屏幕上用“*”画一个空心的圆
加分:1个技术分
*问题分析与算法设计
打印圆可利用图形的左右对称性。根据圆的方程:
R*R=X*X+Y*Y
可以算出圆上每一点行和列的对应关系。
*程序说明与注释
  1. #include<stdio.h>
  2. #include<math.h>
  3. int main()
  4. {
  5. double y;
  6. int x,m;
  7. for(y=10;y>=-10;y–)
  8. {
  9. m=2.5*sqrt(100-y*y); /*计算行y对应的列坐标m,2.5是屏幕纵横比调节系数因为屏幕的
  10. 行距大于列距,不进行调节显示出来的将是椭圆*/
  11. for(x=1;x<30-m;x++) printf(" "); /*图形左侧空白控制*/
  12. printf("*"); /*圆的左侧*/
  13. for(x<30+m;x++) printf(" "); /*图形的空心部分控制*/
  14. printf("*\n"); /*圆的右侧*/
  15. }
  16. return 0;
  17. }
复制代码
*备注:sqrt是C语言中计算平方根的函数 详情请看平方根计算
*思考题
实现函数y=x2的图形与圆的图形叠加显示
作者: batman    时间: 2012-2-29 10:29

因为换行的原因就是做出来了,在屏幕上也不会是一个真正的圆。。。
作者: jinzeyu    时间: 2012-2-29 10:31

回复 2# batman


    只是像一个圆......
作者: batman    时间: 2012-2-29 11:09

来个简单的(求平方根为牛顿迭代法):
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,20) do (
  3.   for /l %%b in (1,1,20) do (
  4.     set /a a=10-%%a,b=10-%%b
  5.     for %%c in (a b) do set "%%c=!%%c:-=!"
  6.     set /a a=a*a+b*b
  7.   rem 牛顿迭代法求平方根
  8.     if !a! neq 0 for /l %%a in (1,1,10) do set /a "r=(a+r/a)/2"
  9.     if !r! equ 10 (
  10.        set /p=*<nul
  11.        ) else (
  12.        set /p=  <nul
  13.     )
  14.   )
  15.   echo,
  16. )
  17. pause>nul
复制代码

作者: jinzeyu    时间: 2012-2-29 11:13

回复 4# batman


    额 这个应该是八边形...
作者: jinzeyu    时间: 2012-2-29 11:15

回复 4# batman


    在我这里是这样的:
              *      *

          *              *



          *              *

              *      *

作者: batman    时间: 2012-2-29 11:28

这个好一点:
  1. @echo off&setlocal enabledelayedexpansion
  2. echo,&echo,
  3. for /l %%a in (0,1,20) do (
  4.   set /p=          <nul
  5.   for /l %%b in (0,1,20) do (
  6.     set /a a=10-%%a,b=10-%%b
  7.     for %%c in (a b) do set "%%c=!%%c:-=!"
  8.     set /a a=a*a+b*b,r=a-100
  9.     set "r=!r:-=!"
  10.     if !r! leq 5 (
  11.        set /p=* <nul
  12.        ) else (
  13.        set /p=  <nul
  14.     )
  15.   )
  16.   echo,
  17. )
  18. pause>nul
复制代码

作者: jinzeyu    时间: 2012-2-29 12:02

回复 7# batman


    好 这回像个圆了.........
作者: batman    时间: 2012-2-29 12:18

本帖最后由 batman 于 2012-2-29 12:19 编辑

修改if !r! leq 5中的5,可以得到很多种“圆”
作者: jinzeyu    时间: 2012-2-29 12:45

本帖最后由 jinzeyu 于 2012-2-29 12:47 编辑
修改if !r! leq 5中的5,可以得到很多种“圆”
batman 发表于 2012-2-29 12:18



    我认为5是最好的
作者: CrLf    时间: 2012-2-29 15:16

http://bbs.bathome.net/viewthread.php?tid=14276
作者: batman    时间: 2012-3-1 12:00

本帖最后由 batman 于 2012-3-1 12:34 编辑

再跟一个:
  1. @echo off&setlocal enabledelayedexpansion
  2. mode con lines=35&echo,&echo,
  3. for /l %%a in (0,1,30) do (
  4.   set /p=          <nul
  5.   for /l %%b in (0,1,30) do (
  6.     set /a a=15-%%a,b=15-%%b&set "flag="
  7.     for %%c in (a b) do set "%%c=!%%c:-=!"
  8.     set /a a=a*a+b*b
  9.     if !a! gtr 92 if !a! lss 204 set "flag=a"
  10.     if !a! gtr 31 if !a! lss 69 set "flag=a"
  11.     if !a! gtr 6 if !a! lss 19 set "flag=a"
  12.     if defined flag (
  13.       set /p=  <nul
  14.       ) else (
  15.       set /p=* <nul
  16.     )
  17.   )
  18.   echo,
  19. )
  20. pause>nul
复制代码

作者: fatcat    时间: 2012-3-4 16:17

  1. @echo off & setlocal enabledelayedexpansion
  2. set /a sz=28, wid=2*sz+1, Cols=2*wid, iMax=wid*wid
  3. for /l %%i in (1 1 !iMax!) do set "scr= !scr!"
  4. color 0a & mode con cols=!Cols! lines=!wid!
  5. set /a xC=25, yC=30, r=15 & rem 指定圆心及半径
  6. for /l %%n in (1 1 5) do (
  7.   call :mpc
  8.   set /a "xC=!random!%%wid, yC=!random!%%wid, r=!random!%%(wid*2/3-10)+10"
  9. )
  10. echo !scr!& pause & exit /b
  11. :mpc rem midpoint circle algorithm 中点画圆算法
  12. set /a x=0, y=r, d=-r
  13. for /l %%i in (1 1 999) do (
  14.   for %%# in (1 2) do (
  15.     for %%x in (-!x! !x!) do for %%y in (-!y! !y!) do (
  16.       set /a xd=%%x+xC, yd=%%y+yC, "inScr=(xd-1^xd-wid)&(yd-1^yd-wid)
  17.       if !inScr! lss 0 (
  18.         set /a ind=xd+yd*wid+1, lenL=ind-1, lenR=iMax-ind
  19.         for /f "tokens=1,2,3" %%a in ("!lenL! !ind! !lenR!") do (set scr=!scr:~0,%%a!·!scr:~%%b,%%c!)
  20.       )
  21.     )
  22.     set tmp=!x!&set x=!y!& set y=!tmp!
  23.   )
  24.   set /a x+=1, d+=1+(x"<<1)
  25.   if !d! geq 0 set /a y-=1, d-=y"<<1
  26.   if !y! lss !x! exit /b
  27. )
  28. exit /b
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2