過去の桐井戸端BBS (桐ver.8)
17096 タイムを比較して何秒の差があるかを計算したい。 まる 2002/08/27-07:12
タイムの比較をしようとしています。以前の記録との比較で、級及び何秒差があるかを知りたいのです。


記録表には 次のような形式で表示されています。
1級  50.33  ・・・50秒33のこと
2級 1:02.22  ・・・1分2秒22のこと
3級 2:05.66  ・・・2分5秒66のこと
つまり、分が ”:”となっています。
このような表があるとき、2分05秒は   3級で -0.66と判定します。
               1分02秒22は 2級で  0と判定します。

今は、1分を60秒換算して、秒に加算して、それを計算する手作業をやっていますが、
表形式で置換表示できないかと思っています。
アドバイスをお願いします。
17108 もう少し、具体的な表のイメージを pokopon 2002/08/27-22:19
記事番号17096へのコメント
まるさん こんばんは

>以前の記録との比較で、級及び何秒差が
>あるかを知りたいのです。

は分かりますが、

>記録表には 次のような形式で表示されています。
>1級  50.33  ・・・50秒33のこと
>2級 1:02.22  ・・・1分2秒22のこと
>3級 2:05.66  ・・・2分5秒66のこと

は、こういう並びでデータ(表)があるというとですか?
その値と、今回のデータを比較して、「一番時間差が小さい級と時間差」を出したいということですか?

>このような表があるとき、2分05秒は   3級で -0.66と判定します。
>            1分02秒22は 2級で  0と判定します。

いまいち、現在の表のイメージがつかめません?
もう少し、具体的な表の構造と処理したい内容を示し下さい。

(最近、ボケが激しくなって、意味が理解しにくくなっています)


17114 Re:もう少し、具体的な表のイメージを まる 2002/08/28-07:05
記事番号17108へのコメント
pokoponさん

説明不足ですみません。
この表は、スポーツの級(能力)を表すものです。たとえば水泳競技にたとえるなら、
100メートルを50秒(a)、1分(b) 2分(c) 49秒(d)で泳いだ人がいるとすると、
この表から
   aは 1級 -0.33
   bは 2級
   cは 4級
   dは 1級 -1.33
と、判定します。
aとdは同じ級なので、その差からdがaより優れていると判断します。


              記録表
    自由形     平泳ぎ
1級  50.33     1:01.01
2級 1:02.22     1:40.30
3級 1:10.66     2:00.01
4級 2:01.00

こんな感じですが。


17115 Re:もう少し、具体的な表のイメージを pokopon 2002/08/28-11:41
記事番号17114へのコメント
まるさん へ

>もう少し、具体的な表の構造と処理したい内容を示し下さい。
皆さんが知りたいのは、現在処理している表の
項目とかデータの並びです。

>100メートルを50秒(a)、1分(b) 2分(c) 49秒(d)で泳いだ人がいるとすると、
>この表から
>   aは 1級 -0.33
>   bは 2級
>   cは 4級
>   dは 1級 -1.33
>と、判定します。aとdは同じ級なので、その差からdがaより優れていると判断しま
>す。

ですから、なぜaが1級なんですか?
級ごとに基準値があるのですね。
その基準値は?

>              記録表
>    自由形     平泳ぎ
>1級  50.33     1:01.01
>2級 1:02.22     1:40.30
>3級 1:10.66     2:00.01
>4級 2:01.00

これが、基準値ですか?それとも、実際のデータですか?

「実際の表の構造とデータの中身の例」をお示しください。

まるさんは当事者ですので、
全てが事情が分かっているとは思いますけど、いまいち私には理解できないでいます。

(私は本当にボケが始まったのだろうか?)


17116 Re:もう少し、具体的な表のイメージを まる 2002/08/28-12:21
記事番号17115へのコメント
pokoponさん


              記録表
    自由形                  平泳ぎ
1級  50.33(以内で泳ぐことができる)     1:01.01
2級 1:02.22(以内で泳ぐことができる)     1:40.30
3級 1:10.66(以内で泳ぐことができる)     2:00.01
4級 2:01.00(以内で泳ぐことができる)     

上記は基準値です。

実際に50秒で泳ぐことができたら1級で、1分だと2級となります。
このような説明でよろしいでしょうか。


17117 Re:もう少し、具体的な表のイメージを pokopon 2002/08/28-13:06
記事番号17116へのコメント
>上記は基準値です。
と、最初から書いて欲しかったのです。

当初の目的は
>タイムの比較をしようとしています。以前の記録との比較で、級及び何秒差が
>あるかを知りたいのです。

ですので、実際の桐の表はどういった構成ですか?
が、次に知りたい内容でした。

[氏名]    [自由型記録] [自由型級] [自由型タイム差]
イアンソープ  1:00.56    1級    0.56

ですか?

[自由型記録]の欄にタイムを入れると、上記の基準値で自動計算して、級とタイム差を得たいということ?

再度ご提示下さい。具体的な表の構成を!!


17120 Re:もう少し、具体的な表のイメージを まる 2002/08/28-17:01
記事番号17117へのコメント
pokoponさん

>>上記は基準値です。
>と、最初から書いて欲しかったのです。
>
>当初の目的は
>>タイムの比較をしようとしています。以前の記録との比較で、級及び何秒差が
>>あるかを知りたいのです。
>
>ですので、実際の桐の表はどういった構成ですか?
>が、次に知りたい内容でした。

 競技.tbl

文字列    文字列     文字列   数値    
 [氏名]   [自由型記録] [自由型級] [自由型タイム差]
イアンソープ  1:00.56    1級    0.56

上記の通りです。基準表は 基準表.tbl にあって、 
競技.tbl に自由型記録を入力することによって、

自由形級、自由形タイム差を計算で出したいのです。
17128 Re:もう少し、具体的な表のイメージを pokopon 2002/08/29-00:04
記事番号17120へのコメント
(どっちが質問者なんだろう。(^^ゞ)

最後の質問です。

>4級 2:01.00
だったら、3:00.00の人は「何級?」
すなわち、最大基準値を越えた人の場合の表示はどうします?


もうひとつ、時間の入力方法ですが、
>1級  50.33
の場合、「0:50.33」
としては駄目ですか? 1分以内は、必ず「0:」を省略しなければなりませんか?


こういうのって、「表引き」で簡単に処理可能だと思うのですけど。
そのためには、上記の内容がはっきりしませんと・・・・。

お試しください。

17129 Re:もう少し、具体的な表のイメージを まる 2002/08/29-07:05
記事番号17128へのコメント
pokoponさん
>(どっちが質問者なんだろう。(^^ゞ)
>
>最後の質問です。
>
>>4級 2:01.00
>だったら、3:00.00の人は「何級?」
>すなわち、最大基準値を越えた人の場合の表示はどうします?
圏外、つまり級なしです。
>
>もうひとつ、時間の入力方法ですが、
>>1級  50.33
>の場合、「0:50.33」
>としては駄目ですか? 1分以内は、必ず「0:」を省略しなければなりませんか?

省略は可能です。

>こういうのって、「表引き」で簡単に処理可能だと思うのですけど。

0:50.33が文字列なので、詰まっています。


17130 訂正 まる 2002/08/29-07:13
記事番号17129へのコメント
>もうひとつ、時間の入力方法ですが、
>1級  50.33
>の場合、「0:50.33」
>としては駄目ですか? 1分以内は、必ず「0:」を省略しなければなりませんか?

「0:」は入力してもいいのですが、自動計測装置でタイムを取り込むので、1分以内場合は
「0:」は表示されません。
17132 Re:文字列でも表引きはできます pokopon 2002/08/29-10:00
記事番号17129へのコメント
>>こういうのって、「表引き」で簡単に処理可能だと思うのですけど。

>0:50.33が文字列なので、詰まっています。

データが文字列であっても、表引きは可能です。
(>= や <= の条件での検索は可能です)
17136 Re:タイムの比較 今村 誠 2002/08/29-16:56
記事番号17096へのコメント
まるさん
>今は、1分を60秒換算して、秒に加算して、それを計算する手作業をやってい
>ますが、表形式で置換表示できないかと思っています。
>アドバイスをお願いします。
pokoponさんのアドバイスの方法でもうまくいくとは思いますが、
最初の要望に戻ると、文字を数値に変えて、基準値と比較して
何級かを求めたらいかがでしょうか。
(基準値も数値に変えないといけないと思います。)
とりあえず、まるさんの文字から数値に替える場合の計算式は
#progn(
#setq(&STR,
#sstr([自由型記録],#文字位置([自由型記録],"."))),
#setq(&実行リターン,
#cond(#L(&STR)>2,
#num(#sstr(&STR,2))*10,
#L(&STR)>1,
#num(#sstr(&STR,2))*100,1,0)),
#setq(&STR,
#s(
#cond(&STR="",[自由型記録],
1,#s([自由型記録],&STR,"")),":",",")),
#setq(&昭和年,
#L(&STR)-#L(#s(&STR,",",""))),
#setq(&秒,
#cond(&昭和年>1,
#num(#対応文字列(&STR,1))*60*60*1000+
#num(#対応文字列(&STR,2))*60*1000+
#num(#対応文字列(&STR,3))*1000+
&実行リターン,
&昭和年>0,
#num(#対応文字列(&STR,1))*60*1000+
#num(#対応文字列(&STR,2))*1000+
&実行リターン,
&STR="",
&実行リターン,
1,
#num(&STR)*1000+
&実行リターン
)))
参考までに、数値を時間形式に替える計算式は
#時間値([変換数値],5)

17137 表引きによる方法 pokopon 2002/08/29-18:57
記事番号17096へのコメント
まるさん こんばんは
やっと全体像が見えてきました。(^^ゞ

今回の問題点として、「時間」の表示方法があります。
桐では時間値というのがありますが、
時:分:秒
の形式です。ですので、0分50秒01なんてものは
0:0:50.01と表示させれば計算は簡単です。
しかし、50.01と省略されると、ややっこしくなるわけです。
また、表引きする際には、データの形式がきちんと統一されている必要がありますので、
入力されたデータの形式が不備であれば文字列による表引きもうまくいきません。
たとえば、1分3秒45を「1:03.45」とすればよいのですが、「1:3.45」と入力されればうまく表引きできません。
そこで、やはり時間(秒)を計算しておくのが安全策です。

■基準表.tblにおいて、下記の項目を増やしてください(自由形だけです)。
文字列 文字列   文字列     数値
[級]  [基準値] [タイム1] 「タイム秒1」 
1級   50.33
2級  1:02.22
3級  1:10.66
4級  2:01.00

計算式
[タイム1]
 #COND([基準値]<>#U,#COND(#文字位置([基準値],":")<1,"0:0:"+[基準値],1,"0:"+[基準値]))
[タイム秒1]
 #時間数値(#時間値([タイム1]),3)

そして、この基準表は、[タイム秒1]で昇順にデータが並んでいることが前提です。
「タイム秒1順」で並び替え条件名を設定しておきましょう。

■競技.tblにおいて、下記の項目を設定してください。
文字列     文字列    文字列    数値      文字列   数値
 
[氏名]    [自由型記録] [自由型級] [自由形タイム差] [タイム2] [タイム秒2]
イアンソープ  1:00.56    1級    0.56

計算式
[タイム2]
 #COND([自由形記録]<>#U,#COND(#文字位置([自由形記録],":")<1,"0:0:"+[自由形記録],1,"0:"+[自由形記録]))
[タイム秒2]
 #時間数値(#時間値([タイム2]),3)
[自由型級]
 #表引き([タイム秒2],<=,"基準表.tbl",[タイム秒1],[級],"タイム秒1順")
[自由形タイム差]
 #COND([自由形級]<>#U,[タイム秒2]-#表引き([タイム秒2],<=,"基準表.tbl",
[タイム秒1],[タイム秒1],"タイム秒1順"),1,#U)

もちろん、文字列型でも表引きは可能ですが、この場合には、入力するデータの形式を、
x:yy.zzzz
と秒の部分を必ず「2桁」にする必要があります。


17138 表引きによらない方法 pokopon 2002/08/29-19:17
記事番号17096へのコメント
よく考えたら、基準の級って、4級までなんでしょ。
だったら、表引きなんてせずとも、そのまま計算式で#CONDで場合分けをしたらどうでしょう。

競技.tblの構成は、既に示してありますので、それに従って、

計算式
[自由形級]
 #COND([タイム秒2]=#U,#U,[タイム秒2]<=50.33,"1級",[タイム秒2]
<=62.22,"2級",[タイム秒2]<=70.66,"3級",[タイム秒2]<=121,"4級",1,#U)
[自由形タイム差]
 #COND([自由形級]<>#U,[タイム秒2]-#COND([タイム秒2]=#U,#U,[タイム秒2]
<=50.33,50.33,[タイム秒2]<=62.22,62.22,[タイム秒2]<=70.66,70.66,[タイム秒2]<=121,121),1,#U)

で、表引せずとも、直接タイム差が計算できます。すなわち、"基準表.tbl"は不要です。

計算は、やはり秒に変換してから計算した方が無難でしょうか?
時間のデータ形式が
h:mm:ss.ssに統一されていれば(自動で計算させていれば)
#時間
という関数も使えると思います。

ただし、過去の計算(負)はできなかった?? ような。
その場合には、
-#時間
と符号を単に変えればよいと思います。


17139 Re:表引きによる方法 pokopon 2002/08/29-19:19
記事番号17137へのコメント
補足ですが、
もちろん、項目を増やさなくとも計算式にすべて記述できるでしょうが、複雑になりますので、あえて、項目を増やした次第です。
こうして、データの変化を追えば、置換式の結果とか、関数の意味とか内容が理解できるかと思います。


17140 Re:表引きによる方法 今村 誠 2002/08/29-20:23
記事番号17137へのコメント
pokoponさんこんにちは、大変すっきりした式で見通しがよいのがいいです。
タイム2に整形して時間値を求める方法がよくわからなかったので、長い式を書いてしまいました。
マラソンなどで時間も考慮する必要があるときも考えて、以下のように変更したらいかがでしょうか。
>計算式
>[タイム2]
> #COND([自由形記録]<>#U,#COND(#文字位置([自由形記録],":")<1,"0:0:"+[自由
>形記録],1,"0:"+[自由形記録]))

#計算(#代入(&実行リターン,
#文字数([自由型記録])-#文字数(#文字置換([自由型記録],":",""))),
#cond(&実行リターン>1,[自由型記録],
&実行リターン>0,"0:"+[自由型記録],
1,"0:0:"+[自由型記録]))

17145 Re:表引きによらない方法 まる 2002/08/31-08:45
記事番号17138へのコメント
pokoponさん,今村さんアドバイスありがとうございました。
研究してみます。

戻る