标题: 批处理脚本实现C语言趣味编程百例003:绘制圆 [打印本页]
作者: jinzeyu 时间: 2012-2-29 10:21 标题: 批处理脚本实现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;
- }
复制代码
*备注:sqrt是C语言中计算平方根的函数 详情请看平方根计算
*思考题
实现函数y=x2的图形与圆的图形叠加显示
作者: batman 时间: 2012-2-29 10:29
因为换行的原因就是做出来了,在屏幕上也不会是一个真正的圆。。。
作者: jinzeyu 时间: 2012-2-29 10:31
回复 2# batman
只是像一个圆......
作者: batman 时间: 2012-2-29 11:09
来个简单的(求平方根为牛顿迭代法):- @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>nul
复制代码
作者: jinzeyu 时间: 2012-2-29 11:13
回复 4# batman
额 这个应该是八边形...
作者: jinzeyu 时间: 2012-2-29 11:15
回复 4# batman
在我这里是这样的:
作者: batman 时间: 2012-2-29 11:28
这个好一点:- @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>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 编辑
再跟一个:- @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>nul
复制代码
作者: fatcat 时间: 2012-3-4 16:17
- @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 /b
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |