- PR -

最小値〜最大値内かのチェック

投稿者投稿内容
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-01-23 10:28
おふとぴで。。。
ども、ほむらです。
C言語の範囲調節の定石手法の応用ですが。。
-----
文字列→数値変換の部分は終わっているとして
return ( thisValue == (Math.Max(最小値, Math.Min(最大値, thisValue))) )
なんて、技もあります。。。

さて、M.H氏として作成したプログラムでなにが起こっているのか
理解しているのでしょうか?
課題は提出して終わってしまったようですがCheckminmax内部でやっていることを
ステップとして説明してみてください。
日本語で処理を書く程度でよいです。
(なにをやるべきなのかとか。。。条件の意味するところとか)

#なんか、書き込みが変なことになっていたので修正^^;;;;;

[ メッセージ編集済み 編集者: ほむら 編集日時 2004-01-23 18:02 ]
まち
常連さん
会議室デビュー日: 2003/03/02
投稿数: 26
お住まい・勤務地: 東京都
投稿日時: 2004-01-23 17:49
OKが出たという言い方がよくありませんでしたね。
とりあえずは・・・というところです。

まだ、やり始めたばかりなのでどこがどうだめなのか良くわからずにやっていたのですが・・・
ここに出したものだと
数値チェックと最大値〜最小値の関数が
CheckminmaxとCheckvalueに分かれていますが、
分ける必要がないということをここでもご指摘いただいていましたので、
現在もう一度作り直しています。



日本語でプログラムの意味を書く・・・
少し待っていただけるとありがたいです。


[ メッセージ編集済み 編集者: M.H 編集日時 2004-01-23 17:51 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-24 15:00
引用:

M.Hさんの書き込み (2004-01-23 17:49) より:

日本語でプログラムの意味を書く・・・
少し待っていただけるとありがたいです。


 それは「あなたが理解していますか?」という意味で、「ここに書いてください」という意味ではないですよ、きっと。というのは、明らかな「ムダ」があるからです。例えば、「長さが0かどうかのチェック」をした後に、「空文字列かどうかのチェック」は必要ないですよね。両方とも同じことをチェックしているわけですから。さすがのオプティマイザ君も、最適化できないでしょう(^^;

 結果だけが求められるならそれでも良いのでしょうが、この業界、結果だけでなく過程も大事です。過程というか、プログラムコードです。プログラムコードは「保守」していかなければなりません。その時に「ムダ」は、読む人を迷わせるのです。きっと、何人かは「何でこんなチェックする?必要があるのか?」と、止まったはずです(よね?)。

 また、やっていることを理解する、裏に返して、やることを理解して作業単位に分けることは、プログラムやシステムを設計する上でとても重要なことです。これができないと、これができないから、プログラムが書けないのです。
 失礼ですが、質問を見たとき、「なんでやねん」と思いました。「最小値より小さいか見て、最大値より大きいかみるだけやん」と。でも、M.Hさんはどうにかして「最小値<検査値<最大値」と1つの式にまとめようとされ、わからずに質問されたのではないでしょうか。または、「数値と文字列をどうやって比較するの?」とか。
 ギョロ目の漫才師政治家じゃないですが、「小さなことからコツコツと」やる必要があるので、その点注意してみてください。
まち
常連さん
会議室デビュー日: 2003/03/02
投稿数: 26
お住まい・勤務地: 東京都
投稿日時: 2004-01-26 14:58
引用:

Jittaさんの書き込み (2004-01-24 15:00) より:
 それは「あなたが理解していますか?」という意味で、「ここに書いてください」という意味ではないですよ、きっと。というのは、明らかな「ムダ」があるからです。例えば、「長さが0かどうかのチェック」をした後に、「空文字列かどうかのチェック」は必要ないですよね。両方とも同じことをチェックしているわけですから。さすがのオプティマイザ君も、最適化できないでしょう(^^;


そうだったのですね。
でも、無駄に気がついていなかったというのは、
コードを理解していなかったということですね
これから、プログラムを作る上で自分が何をやっているのかを考えながらやっていかなくてはならないことが良くわかりました。
プログラムを作成すること自体が初めてでしたので、今回はとても勉強になりました。

この記事を読んで、今度は無駄がないように再度作成しなおしました。
今度作成したものは、無駄がないといいのですが・・・
ちょっと長いので、次の書き込みでのせたいと思います。

引用:

 ギョロ目の漫才師政治家じゃないですが、「小さなことからコツコツと」やる必要があるので、その点注意してみてください。


次からは良く考えてプログラムを作成していきたいと思います。
まち
常連さん
会議室デビュー日: 2003/03/02
投稿数: 26
お住まい・勤務地: 東京都
投稿日時: 2004-01-28 15:12
昨日はネットワークがおかしかったらしく、途中で書き込みが出来なくなってしまいました。
と言うことで、作り直したコードです。

'エラーメッセージ
Dim str_errmsg As String
Const Err_1 As String = "最小値が最大値より大きく設定されています。"
Const Err_2 As String = "入力されていません。"
Const Err_3 As String = "数値ではありません。"
Const Err_4 As String = "最小値〜最大値内の数値ではありません。"

Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles Button1.Click
Dim bool_rtn As Boolean

bool_rtn = Checkminmax(TextBox1.Text, 0, 100, TextBox3.Text)

'テキストボックスへの表示
If bool_rtn = True Then
TextBox2.Text = "OK"
TextBox3.Text = "" 'テキストボックスを空白にする
Else
TextBox2.Text = "NG"
TextBox3.Text = str_errmsg 'エラーメッセージを表示
End If

End Sub

Private Sub Test(ByVal str)
Dim i_buf As String

i_buf = Str()

End Sub


'************************************************************
'関数名 :Checkvalue
'機能概要 :数値チェック
'引数   :in_str_buf…チェック対象文字列
'戻り値  :True/False
'作成日 :2004/01/15
'作成者 :kito
'備考 :
'履歴 :
'************************************************************
Public Function Checkvalue( _
ByVal in_str_buf As String _
) As Boolean
'*******
' 変数
'*******
Dim str_workbuf As String
Dim dbl_dt As Integer

'********
' 初期化
'********
Checkvalue = False

' 前後の空白をトリム
str_workbuf = Trim(in_str_buf)

'文字の長さが0かどうかチェック
If Len(str_workbuf) = 0 Then
str_errmsg = Err_2 'エラーメッセージ
Exit Function
End If

'数値かどうかチェック
If IsNumeric(str_workbuf) = False Then
str_errmsg = Err_3 'エラーメッセージ
Exit Function
End If

Checkvalue = True

End Function


'************************************************************
'関数名 :Checkminmax
'機能概要 :最小値〜最大値チェック
'引数   :in_str_chkstr…チェック対象文字列
'戻り値  :True/False
'作成日 :2004/01/1x
'作成者 :
'備考 :チェック対象文字列かどうか判断した上で、
'  最小〜最大値内かチェックする。
'  チェックでFalseになった物はエラーメッセージを返す
'履歴 :
'************************************************************
Public Function Checkminmax( _
ByVal in_str_chkstr As String, _
ByVal in_int_min As Integer, _
ByVal in_int_max As Integer, _
ByVal out_str_Errmsg As String _
) As Boolean

Dim bl_minmax As Boolean
Dim int_num As Integer

Checkminmax = False


'最小値が最大値より大きい時はNG
If in_int_min >= in_int_max Then
str_errmsg = Err_1 'エラーメッセージ
Exit Function
End If

bl_minmax = Checkvalue(in_str_chkstr)
If bl_minmax = False Then
Exit Function
End If

'最小値〜最大値内の数値ではないときの処理If in_int_min > in_str_chkstr Or _
If in_int_min > in_str_chkstr Or _
in_str_chkstr > in_int_max Then
Checkminmax = False
str_errmsg = Err_4 'エラーメッセージ
Exit Function
End If

Checkminmax = True

End Function


ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-01-28 17:46
ほむらです。
がんばっていますねー。
所々努力の成果がうかがえます^^
-------
ところで実験環境もっていないのですがこれって動きました?
エラーが出そうな気がするのですが。
あと、
bool_rtn = Checkminmax("5", 5, 100, TextBox3.Text)
としたときにTrueなりますか?

#VBならOKなのかな?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-29 09:26
ん〜?たぶん、「結果」だけなら、Okでしょう。「保守」を考えると・・・

> Const Err_4 As String = "最小値〜最大値内の数値ではありません。"
 日本語の問題ですが、「最小値」および「最大値」は、範囲に含まれるのでしょうか。「最小値以上」なのか、「最小値より大きい」なのか、このメッセージからは読みとれません。


> bool_rtn = Checkminmax(TextBox1.Text, 0, 100, TextBox3.Text)
 なおしましたね!
 でも、「TextBox3.Text」は、なぜ引数として渡しているのでしょう?

> Public Function Checkminmax( ... _
> ByVal out_str_Errmsg As String _
> ) As Boolean
 受け側をこう宣言しています。ここで第4引数は名称が「out_...」と、「出力」であることを示す名称が付けられています。ということは、「TextBox3」に、エラーメッセージを、Checkminmaxで表示させたかった。でも、表示できなかった。そのためにstr_errmsgを外部で宣言した。というところでしょうか。
 現在主流のプログラム言語のほとんどは、関数の引数には「値渡し」と「参照渡し」の2種類があります。「値渡し」とは、呼び出し側の「値」をコピーして渡します。「参照渡し」は、呼び出し側の変数が保管されている場所を渡します。「値渡し」は、値のコピーが渡されるため、関数側で値をどのように変更しようと、呼び出し側の変数の内容が変わることはありません。「参照渡し」では、「変数の内容が保管される場所」が渡されるので、関数側での変更が呼び出し側に影響します。
 VB.NETでは、それぞれ「ByVal」、「ByRef」修飾子を使います。デフォルトは「ByVal」です。・・・これでTextBox3に、直接表示させられますね?


> Public Function Checkvalue( _
> ByVal in_str_buf As String _
> ) As Boolean
 ツッコミどころはいくつかあるのですが、とりあえずパス。


> '最小値が最大値より大きい時はNG
> If in_int_min >= in_int_max Then
> str_errmsg = Err_1 'エラーメッセージ
> Exit Function
> End If
 「最小値」と「最大値」の大小関係を調べることは、この関数の「目的」、「入力が数値で、かつ最小値〜最大値の範囲内にあるか」と関係ないですよね。こういう場合は「エラー」ではなく「例外」なのですが、、、説明はパス。
 このツッコミはあくまで「プログラムの保守」に関することです。関数の看板に書いてあることと、実際にやっていることが違うため、保守する人がとまどう、ということです。


> If in_int_min > in_str_chkstr Or in_str_chkstr > in_int_max Then
 「暗黙の型変換」を使いましたね。「in_int_min」、「in_int_max」はそれぞれ整数型、「in_str_chkstr」は文字列型なので、本来ならチェックできません。ほむらさんの『エラーが出そう』は、そういうことです、たぶん(ついでに、"5", 5, 100はFalseですよ。「より大きく、より小さい」ですから)。
 暗黙の型変換や、次のバージョンでできる「演算子のオーバーロード」による「違う型(クラス)との比較」は、注意して行わなければなりません。この場合、おそらく整数型に変換されて比較されていると思います。が、文字列型に変換されて比較された場合・・・("45", 5, 100)が、Falseになります。
 説明。文字列"45"と、文字列"5"を比較します。
1文字目…"4"と"5"なので"45"が小さいらしい
2文字目…"5"と(ない)ので、1つ前の結果を確定
結果…"45"が小さい
 こういう結果になることを避けるため、明示的に整数型に変換して使いましょう。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-01-29 10:13
ちょろっとだけ。
引用:

Jittaさんの書き込み (2004-01-29 09:26) より:
 VB.NETでは、それぞれ「ByVal」、「ByRef」修飾子を使います。デフォルトは「ByVal」です。・・・これでTextBox3に、直接表示させられますね?


TextBox3.Textはプロパティなので、参照渡しで反映は出来ないんではないかなという気がします。
# 自動的にプロパティのSetを呼んでくれるんなら出来るかもしれませんが、
# 多分無理なんではないかなと…

スキルアップ/キャリアアップ(JOB@IT)