VFP矩阵变换

FUNCTION ARRAYTO()
 PARAMETER A_TXT
 SET TALK OFF
 CLEAR                                        &&確定文件名格式
 IF EMPTY(A_TXT)
  LFILE='array.txt'
 ELSE
  SNO=ATC('.TXT',A_TXT)
  IF (SNO=0)
   FILE=A_TXT+'.TXT'
  ELSE
   FILE=A_TXT
  ENDIF
 ENDIF
 IF !FILE(LFILE)
  print'默認目錄下名為arrayto.txt的文件不存在!!!'
  RETURN 0
 ENDIF
 GFILE = FOPEN(LFILE,12)
 IF GFILE<0
  print '打開文件出錯!!!'
  FCLOSE(GFILE)
  RETURN 0
 ELSE
  LCNT=0
  DO WHILE !FEOF(GFILE)
   LCNT=LCNT+1                        &&統計文件行數
   STR1=FGET(GFILE)
  ENDDO
  FCLOSE(GFILE)
 ENDIF
 DECLARE ARR(LCNT)
 GFILE = FOPEN(LFILE,12)
 IF GFILE<0
  print '打開文件出錯!!!'
  FCLOSE(GFILE)
  RETURN 0
 ELSE
  K=1
  DO WHILE !FEOF(GFILE)
   ARR(K)=ALLTRIM(FGET(GFILE))
   K=K+1
  ENDDO
  FCLOSE(GFILE)
 ENDIF
 IF MOD(LCNT,2)<>1
  print '此變換,行列,必須為基數!!!'
  RETURN 0
 ENDIF
 DECLARE TEMP(LCNT,LCNT)
 FOR I=1 TO LCNT
  STR2=ARR(I)
  FOR J=1 TO LCNT
   S=SUBSTR(STR2,1,2)
   TEMP(I,J)=ALLTRIM(S)
   STR2=ALLTRIM(SUBSTR(STR2,3))         &&讀取字符串
  NEXT J
 NEXT I
 DECLARE RST(LCNT,LCNT))
 RST='0'
 CMID=INT(LCNT/2)+1                           &&取中間值
 FOR I=1 TO LCNT
  FOR J=1 TO LCNT
   DO CASE                             &&中心數據不變
    CASE I=CMID AND J=CMID
     RST(I,J)=TEMP(I,J)
    CASE I<CMID AND J<=CMID         &&第一象限變換
     K=CMID-I
     AI=I+1
     BJ=J-1
     IF BJ<1
      BJ=1
      AI=AI-1+2*K
     ENDIF
     RST(I,J)=TEMP(AI,BJ)
    CASE I<=CMID AND J>=CMID        &&第二象限變換
     K=J-CMID
     AI=I-1
     BJ=J-1
     IF AI<1
      AI=1
      BJ=BJ+1-2*K
     ENDIF
     RST(I,J)=TEMP(AI,BJ)

    CASE I>=CMID AND J<CMID        &&第三象限變換
     K=CMID-J
     AI=I+1
     BJ=J+1
     IF AI>LCNT
      AI=LCNT
      BJ=BJ-1+2*K
     ENDIF
     RST(I,J)=TEMP(AI,BJ)
    CASE I>CMID AND J>=CMID         &&第四象限變換
     K=I-CMID
     AI=I-1
     BJ=J+1
     IF BJ>LCNT
      BJ=LCNT
      AI=AI+1-2*K
     ENDIF
     RST(I,J)=TEMP(AI,BJ)
   ENDCASE
  NEXT J
 NEXT I
 FOR I=1 TO LCNT
  FOR J=1 TO LCNT
   printprint TEMP(I,J)+SPACE(2)               &&輸出原始數據
  NEXT J
  print
 NEXT I
 print
 FOR I=1 TO LCNT
  FOR J=1 TO LCNT
   printprint RST(I,J)+SPACE(2)               &&輸出轉換后的數據
  NEXT J
  print
 NEXT I
ENDFUNC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值