34,588
社区成员
发帖
与我相关
我的任务
分享
exec dbo.P_DrawSin 0,720
/*
*** ***
** ** ** **
* * * *
* * * *
* * * *
* * * *
* * * *
0 0 0 0 0
* * * *
* * * *
* * * *
* * * *
* * * *
** ** ** **
*** ***
*/
CREATE PROCEDURE P_DrawSin
(
@BeDegree decimal (10,2),
@EdDegree decimal (10,2)
)
AS
SET NOCOUNT ON
DECLARE @PAR VARCHAR(50)
SET @PAR=CONVERT(VARCHAR,@BeDegree)
IF (CONVERT(INT,@BeDegree)%10)<>0
BEGIN
RAISERROR('"%s" 不是10的倍数,请录入10的倍数参数',12,16,@PAR)
RETURN
END
SET @PAR=CONVERT(VARCHAR,@EdDegree)
IF (CONVERT(INT,@EdDegree)%10)<>0
BEGIN
RAISERROR('"%s" 不是10的倍数,请录入10的倍数参数',12,16,@PAR)
RETURN
END
DECLARE @TB TABLE (ADegrees Decimal (10,2),ASine Decimal (10,2))
DECLARE @TC TABLE (ADegrees Decimal (10,2),ASine Decimal (10,2))
DECLARE @Sine Decimal (10,2),@Radians Decimal (10,2),@Degrees Decimal (10,2),@Tmp1 Decimal (10,2),@Tmp2 INT
DECLARE @SQL VARCHAR(8000),@SQLTMP VARCHAR(8000),@RE VARCHAR(8000)
SELECT @Radians = Radians(Convert(Float,@BeDegree)),@Degrees=@BeDegree
WHILE (@Degrees<=@EdDegree)
BEGIN
SET @Sine=ROUND(SIN(@Radians)*10,0)
INSERT INTO @TB SELECT @Degrees,@Sine
SET @Degrees=@Degrees+10
SET @Radians= RADIANS(CONVERT(FLOAT,@Degrees))
END
DECLARE SinCURSOR CURSOR READ_ONLY FOR
SELECT ADegrees=MIN(ADegrees),ASine FROM @TB GROUP BY ASine ORDER BY ASine Desc
OPEN SinCURSOR
FETCH NEXT FROM SinCURSOR INTO @Degrees,@Sine
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF @Sine=0
SET @PAR='0'
ELSE
SET @PAR='*'
SET @SQL='SPACE('+CONVERT(VARCHAR(10),CEILING(@Degrees-@BeDegree))+'/10)+'''+@PAR+''''
IF EXISTS (SELECT 1 FROM @TB WHERE ADegrees<>@Degrees AND ASine=@Sine)
BEGIN
DELETE @TC
INSERT INTO @TC SELECT ADegrees,@Sine FROM @TB WHERE ASine=@Sine ORDER BY ADegrees
SELECT @Tmp1=NULL,@Tmp2=NULL
UPDATE @TC
SET @Tmp1=@Tmp2,
@Tmp2=ADegrees,
@SQLTMP=ISNULL(@SQLTMP,'')+'+SPACE('+CONVERT(VARCHAR(10),(ABS(ADegrees-@Tmp1)/10)-1)++')+'''+@PAR+''''
WHERE ASine=@Sine
END
SELECT @RE=CASE WHEN @RE IS NULL THEN '' ELSE @RE+'+CHAR(10)+CHAR(13)+' END + @SQL+ISNULL(@SQLTMP,'')
SET @SQL=''
SET @SQLTMP=''
FETCH NEXT FROM SinCURSOR INTO @Degrees,@Sine
END
CLOSE SinCURSOR
DEALLOCATE SinCURSOR
EXEC ('PRINT '+@RE)
SET NOCOUNT OFF
--测试
exec dbo.P_DrawSin 0,1800
/*
*** ***
** ** ** **
* * * *
* * * *
* * * *
* * * *
* * * *
0 0 0 0 0
* * * *
* * * *
* * * *
* * * *
* * * *
** ** ** **
*** ***
*/
declare @x float
declare @tb table(y float)
set @x = 0
while @x < 360
begin
insert into @tb select ROUND(SIN(RADIANS(@x)) * 100,0)
set @x = @x + 5
end
select space(201 + y - 100 )+ '*' from @tb
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*