坪数計算
DOS版jw_cadで使用していたものなのでWindows版では扱えない機能があるかも知れません。唯一、残っていたスクリプトなのでプログラム作成時の参考用に保存。
uni_conv.bat——————————————————————————-
@REM 坪数計算
@REM uni_conv.bat 2001/01/20 更新
@echo off
copy jwc_temp.txt temp.txt > nul
jgawk -f uni_conv.awk temp.txt /h1 /k2 /c1 %1 %2 %3 %4 %5 > jwc_temp.txt
GOTO END
rem
REM #jw
REM #h3
REM #g1
REM #hc [F1-10] |×|÷|+|-|式|^|√|SIN|COS|ATAN|
REM #hc【坪数計算】文字列を範囲指定.
REM #0表示【横】小数点位置指示(L)Free(R)Read【縦】現位置
REM #k項目選択 |①M2→坪(L)|②坪→M2(R)|③m→mm|④mm→m|⑤数値入力| [F1-10] /_/m
REM #k計算結果 |①新規表示(L)|②書換え(R)|③上書き| [F1-3] /_/h
REM #i小数以下(2)桁表示(L)(R)|1桁|2桁|3桁|4桁|5桁|6桁|7|8|9| 0桁| [F1-10] /_/k
REM #i表示未満切捨て(L)(R) |①四捨五入|②切上げ | /_/u
REM #iカンマ表示無(L)(R) |① 有 |② 半角スペース | /_/c
REM #gc
REM #mc
REM #e
rem
:END
uni_conv.awk——————————————————————————-
# 坪数計算 (uni_conv.awk)
#
# 1999/07/18 作成
# 2001/01/20 更新
# 2003/10/28 更新
#
BEGIN {
CONVFMT = "%.10f"
for(i = 2; i <= ARGC; i++){
if(ARGV[i]~/^\/m/)menu =substr(ARGV[i],3)+0 # 項目選択
if(ARGV[i}~/^\/h/)chng =substr(ARGV[i],3)-1 # 計算結果 0:新規 1:書換 2:上書き
if(ARGV[i]~/^\/k/)keta =substr(ARGV[i],3)+0 # 小数以下 1~9桁 10:0桁
if(ARGV[i]~/^\/u/)updn =substr(ARGV[i],3)+0 # 表示未満 0:切捨 1:四捨五入 2:切上
if(ARGV[i]~/^\/c/)canma=substr(ARGV[i],3)+0 # カンマ 0:無 1:有 2:半角スペース
}
for(i = 2; i <= ARGC; i++) ARGV[i] = ""
if( keta > 10) canma = (canma) ? 0 : 1 # F1~10:カンマ表示切替
if(!(keta %= 10)){ # 整数の文字基準点
yn = 2 # 【横】を右に固定
while( yn !~ /^[0-2]$/ ){
yn = stdinS( "文字基準点【横】左[0] 中[1] 右[2] ") + 0
}
}
if( chng >= 10) unit = 1 # F1~10:前後の文字を残す
if( (chng %= 10) !~ /^[0-2]$/) chng = 0
# 整数の文字基準点
# 計算式の登録
if( menu == 20){ calcu = "ATAN"; invar = "ATAN(a)" } # F10
if( menu == 19){ calcu = "SIN "; invar = "SIN(a)" } # F9
if( menu == 18){ calcu = "COS "; invar = "COS(a)" } # F8
if( menu == 17){ calcu = "平方根"; invar = "SQRT(a)" } # F7
if( menu == 16){ calcu = "べき乗"; invar = "a^b" } # F6
if( menu == 15){ calcu = "計算式"; invar = "b" } # F5
if( menu == 14){ calcu = "ひき算"; invar = "a-b" } # F4
if( menu == 13){ calcu = "たし算"; invar = "a+b" } # F3
if( menu == 12){ calcu = "わり算"; invar = "a/b" } # F2
if(!invar ){ calcu = "かけ算"; invar = "a*b" } # F1
if( menu == 4){ calcu = "mm→m"; invar = "a/1000" } #
if( menu == 3){ calcu = "m→mm"; invar = "1000a" } #
if( menu == 2){ calcu = "坪→㎡"; invar = "a/0.3025" } #
if( menu == 1){ calcu = "㎡→坪"; invar = "0.3025a" } #
if(invar ~ /b/){ # bの数値
varB = stdinV( calcu "=" invar ":bの数値")
sub( /b/, varB, invar)
}
while(invar !~ /a/){ # 変数aを含む計算式
invar = stdinV( "計算式=" invar ":変数[a]を含む式")
}
split(", - 0 1 2 3 4 5 6 7 8 9", Haa)
split(", - 0 1 2 3 4 5 6 7 8 9", Zea)
dc = ec = 0
}
!hed {
if( /^hq/ && chng) printf "%s\n", "hd"
if( /^hs/ ) for(i = 0; i <= 15; i++) s[sprintf( "lg%x", i)] = $(i + 2)
if( /^hcw/) for(i = 1; i <= 10; i++) cw["cn" i] = $(i + 1)
if( /^hcd/) for(i = 1; i <= 10; i++) cd["cn" i] = $(i + 1)
if( /^#$/ ) hed = FNR
if( /^h/ ) next
}
/^lg/ { if(!wlg) wlg = $1; lg = $1; next }
/^ly/ { if(!wly) wly = $1; ly = $1; next }
/^cn/ { if(!wcn) wcn = $1; cn = $1; next }
/^c[hvsroptkz2]/ {
++dc
MJ = substr( $0, index( $0, "\"") + 1)
match( MJ, /[+\-+-]?([0-90-9]+[\, , ])*[0-90-9]+[\..]?[0-90-9]*/)
if(!Lookup(MJ)){
++ec; if(chng) print_MJ( $0); next
}
$6 = Lo[1]
$7 = Lo[2]
$8 = Lo[3]
ZH = 0
for( h in Zea) ZH += gsub( Zea[h], Haa[h], $7)
ZH += gsub( /./, "\.", $7)
gsub( /[\, ]/, "", $7)
varA = invar
while( match( varA, /a/)){ # 変数aに数値を代入
Lookup(varA)
mark = (Lo[1] ~ /[0-9]$/) ? "*" : ""
varA = Lo[1] mark $7 Lo[3]
}
$7 = keisan2(varA) + 0 # 計算
split(sprintf("%f", $7 * 10^keta), v, /[\.]/) # 四捨五入、切上げ
v[1] += ((updn==1 && v[2]~/^[5-9]/) || (updn==2 && v[2]>0)) ? 1: 0
$7 = (keta) ? sprintf("%.*f", keta, v[1] * 10^-keta): v[1] # 小数以下桁数
if(canma >= 1) $7 = inCANMA($7)
if(canma == 2) gsub( /\,/, " ", $7)
w = cw[cn] * s[lg]
d = cd[cn] * s[lg]
if(ZH){
for(h in Haa) gsub( Haa[h], Zea[h], $7)
gsub( /\./, ".", $7)
pf = "."
}else{
w /= 2
d /= 2
pf = "\."
}
if(unit) $7 = $6 $7
p = jindex( $7, pf)
p2 = (p) ? p - 1 : jlength( $7)
if( chng == 2){
p = jindex( MJ, pf)
p3 = (p) ? p - 1 : jlength( MJ)
p3 -= p2
$2 += (p) ? p3 * (w + d) : p3 * (w + d) * yn / 2
}else{
$2 = (p) ? 0 - p2 * (w + d) - w / 2 : 0 - p2 * (w + d) * yn / 2
}
if(unit) $7 = $7 $8
$5 = 0
$4 = jlength($7) * (w + d) - d
print_MJ( sprintf( "%s %e %e %e %e \"%s", $1, $2, $3, $4, $5, $7))
next
}
END{
lg = wlg
ly = wly
cn = wcn
print_MJ(0)
printf "h#《 %s=%s 小数以下(%d)桁 》文字数 %d/%d個 ",calcu,invar,keta,dc-ec,dc
}
#----ユーザー定義関数----
# 文字列書出
function print_MJ(MJ){
if( rlg != lg) printf "%s\n", lg; rlg = lg
if( rly != ly) printf "%s\n", ly; rly = ly
if( rcn != cn) printf "%s\n", cn; rcn = cn
if( MJ) printf "%s\n", MJ
}
# カンマ付加
function inCANMA(MJ){
if(!index( MJ, "\.")) MJ = MJ "\."
while( match( MJ, /[0-9][0-9][0-9][0-9][\,\.]/))
MJ = substr( MJ, 1, RSTART) "\," substr( MJ, RSTART + 1)
sub( /\.$/, "", MJ)
return MJ
}
# 検索
function Lookup(MJ){
Lo[1] = substr(MJ, 1, RSTART - 1)
Lo[2] = substr(MJ, RSTART, RLENGTH)
Lo[3] = substr(MJ, RSTART + RLENGTH)
return RSTART
}
# エラー表示
function echoE(Str){
printf "he%s\n", Str
printf "\a" > "/dev/stderr"
exit( E = 1)
}
# キーボード入力(番号選択)
function stdinS(Dsp, Res){
while(1){
printf "[f[0K[SPC]《 %s 》番号選択:", Dsp > "/dev/stderr"
getline Res < "/dev/stdin"
if( Res ~ /^ $/ ) echoE(" 中止 ")
if( Res ~ /^[0-9]+$/ || !Res) break
}
return Res
}
# キーボード入力(計算式、値を入力)
function stdinV(Dsp, Res){
while(1){
printf "[f[0K[SPC]《 %s 》入力:", Dsp > "/dev/stderr"
getline Res < "/dev/stdin"
if( Res ~ /^ $/ ) echoE(" 中止 ")
if( Res ~ /a/ ){
Ok = stdinS("計算式 =" Res " 確定[0] 変更[1]")
if(!Ok) break
continue
}
Res = keisan2( Res)
if( Res ~ /^[+-]?[0-9]+\.?[0-9]*$/ ) break
if( Res ~ /^E/){
printf "[;60f[0K式エラー" > "/dev/stderr"
start = systime()
while(1) if(systime() >= start + 2) break # 式エラー表示(2秒)
}
}
return Res
}
# かっこ付計算
function keisan2(MJ){
gsub( /[ \t]+/, "", MJ)
a = gsub( /[{\[\(]/, "\(", MJ)
b = gsub( /[\)\]}]/, "\)", MJ)
if(a != b) return( MJ = "E")
while( match( MJ, /\([^\(\)]+\)/)){
Lookup( MJ)
for( a = 1; a <= 3; a++) paren[a] = Lo[a]
gsub( /(^\(|\)$)/, "", paren[2])
paren[2] = keisan3( paren[2])
MJ = paren[1] paren[2] paren[3]
}
MJ = keisan3( MJ)
return MJ
}
# かっこ無計算
function keisan3(MJ){
MJ = toupper(MJ)
while( match( MJ, /ATAN[+-]?[0-9]+\.?[0-9]*/)){ # 逆正接
Lookup(MJ)
sub( /^ATAN/, "", Lo[2])
Lo[2] = atan2( Lo[2], 1) / PI() * 180
MJ = Lo[1] Lo[2] Lo[3]
}
while( match( MJ, /SIN[+-]?[0-9]+\.?[0-9]*/)){ # 正弦
Lookup(MJ)
sub( /^SIN/, "", Lo[2])
Lo[2] = sin( Lo[2] * PI() / 180)
MJ = Lo[1] Lo[2] Lo[3]
}
while( match( MJ, /COS[+-]?[0-9]+\.?[0-9]*/)){ # 余弦
Lookup(MJ)
sub( /^COS/, "", Lo[2])
Lo[2] = cos( Lo[2] * PI() / 180)
MJ = Lo[1] Lo[2] Lo[3]
}
while( match( MJ, /SQRT[+-]?[0-9]+\.?[0-9]*/)){ # 平方根
Lookup(MJ)
sub( /^SQRT/, "", Lo[2])
if( Lo[2] < 0) return( MJ = "E")
Lo[2] = sqrt( Lo[2])
MJ = Lo[1] Lo[2] Lo[3]
}
while( match( MJ, /[+-]?[0-9]+\.?[0-9]*\^[+-]?[0-9]+\.?[0-9]*/)){ # べき乗
Lookup(MJ)
split( Lo[2], power, /\^/)
if(!power[1]) return( MJ = "E")
Lo[2] = power[1] ^ power[2]
MJ = Lo[1] Lo[2] Lo[3]
}
while( match( MJ, /[+-]?[0-9]+\.?[0-9]*[\*\/][+-]?[0-9]+\.?[0-9]*/)){ # 乗除算
Lookup(MJ)
if( sub( /\*/, " ", Lo[2])){
split( Lo[2], multi)
Lo[2] = multi[1] * multi[2]
}else{
sub( /\//, " ", Lo[2])
split( Lo[2], divid)
if(!divid[2]) return( MJ = "E")
Lo[2] = divid[1] / divid[2]
}
MJ = Lo[1] Lo[2] Lo[3]
}
if( match( MJ, /[^\+\-\.0-9]+/)) return( MJ = "E")
gsub( /[+-]/, " &", MJ) # 加減算
if( split( MJ, sum)){
MJ = 0
for(i in sum) MJ += sum[i]
}
gsub( / /, "", MJ)
return MJ
}
# π計算
function PI(){
return( atan2( 0, -1))
}
-------------------------------------------------------------------------------