返回列表 发帖

批处理脚本实现C语言趣味编程百例003:绘制圆

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

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

因为换行的原因就是做出来了,在屏幕上也不会是一个真正的圆。。。
***共同提高***

TOP

回复 2# batman


    只是像一个圆......

TOP

来个简单的(求平方根为牛顿迭代法):
@echo off&setlocal enabledelayedexpansion
for /l %%a in (1,1,20) do (
  for /l %%b in (1,1,20) do (
    set /a a=10-%%a,b=10-%%b
    for %%c in (a b) do set "%%c=!%%c:-=!"
    set /a a=a*a+b*b
  rem 牛顿迭代法求平方根
    if !a! neq 0 for /l %%a in (1,1,10) do set /a "r=(a+r/a)/2"
    if !r! equ 10 (
       set /p=*<nul
       ) else (
       set /p=  <nul
    )
  )
  echo,
)
pause>nulCOPY
1

评分人数

***共同提高***

TOP

回复 4# batman


    额 这个应该是八边形...

TOP

回复 4# batman


    在我这里是这样的:
              *      *

          *              *



          *              *

              *      *

TOP

这个好一点:
@echo off&setlocal enabledelayedexpansion
echo,&echo,
for /l %%a in (0,1,20) do (
  set /p=          <nul
  for /l %%b in (0,1,20) do (
    set /a a=10-%%a,b=10-%%b
    for %%c in (a b) do set "%%c=!%%c:-=!"
    set /a a=a*a+b*b,r=a-100
    set "r=!r:-=!"
    if !r! leq 5 (
       set /p=* <nul
       ) else (
       set /p=  <nul
    )
  )
  echo,
)
pause>nulCOPY
1

评分人数

***共同提高***

TOP

回复 7# batman


    好 这回像个圆了.........

TOP

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

修改if !r! leq 5中的5,可以得到很多种“圆”
***共同提高***

TOP

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



    我认为5是最好的

TOP

TOP

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

再跟一个:
@echo off&setlocal enabledelayedexpansion
mode con lines=35&echo,&echo,
for /l %%a in (0,1,30) do (
  set /p=          <nul
  for /l %%b in (0,1,30) do (
    set /a a=15-%%a,b=15-%%b&set "flag="
    for %%c in (a b) do set "%%c=!%%c:-=!"
    set /a a=a*a+b*b
    if !a! gtr 92 if !a! lss 204 set "flag=a"
    if !a! gtr 31 if !a! lss 69 set "flag=a"
    if !a! gtr 6 if !a! lss 19 set "flag=a"
    if defined flag (
      set /p=  <nul
      ) else (
      set /p=* <nul
    )
  )
  echo,
)
pause>nulCOPY
***共同提高***

TOP

@echo off & setlocal enabledelayedexpansion
set /a sz=28, wid=2*sz+1, Cols=2*wid, iMax=wid*wid
for /l %%i in (1 1 !iMax!) do set "scr= !scr!"
color 0a & mode con cols=!Cols! lines=!wid!
set /a xC=25, yC=30, r=15 & rem 指定圆心及半径
for /l %%n in (1 1 5) do (
  call :mpc
  set /a "xC=!random!%%wid, yC=!random!%%wid, r=!random!%%(wid*2/3-10)+10"
)
echo !scr!& pause & exit /b
:mpc rem midpoint circle algorithm 中点画圆算法
set /a x=0, y=r, d=-r
for /l %%i in (1 1 999) do (
  for %%# in (1 2) do (
    for %%x in (-!x! !x!) do for %%y in (-!y! !y!) do (
      set /a xd=%%x+xC, yd=%%y+yC, "inScr=(xd-1^xd-wid)&(yd-1^yd-wid)
      if !inScr! lss 0 (
        set /a ind=xd+yd*wid+1, lenL=ind-1, lenR=iMax-ind
        for /f "tokens=1,2,3" %%a in ("!lenL! !ind! !lenR!") do (set scr=!scr:~0,%%a!·!scr:~%%b,%%c!)
      )
    )
    set tmp=!x!&set x=!y!& set y=!tmp!
  )
  set /a x+=1, d+=1+(x"<<1)
  if !d! geq 0 set /a y-=1, d-=y"<<1
  if !y! lss !x! exit /b
)
exit /bCOPY

TOP

返回列表