[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/01/08(Sat) 11:57
投稿者名:SO
Eメール:
URL :
タイトル:
入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
2つのテキストボックスに西暦を入力し、ボタンを押すと西暦間のうるう年の
回数をカウントし表示させたいです。
入力された西暦間のうるう年の回数をカウントするには、入力された西暦(小さい値)
から入力された西暦(大きい値)間を1年ずつカウントアップしながら繰り返す。
その中でうるう年かどうかチェックする。
つまり、2000,2001,2002,2003,2004と順に繰り返し、毎回うるう年のチェックをする。
繰り返しのステートメントはDo〜Whileを使う。

どこから書いたらいいか分かりません。どなたか教えてください。

投稿時間:2005/01/08(Sat) 12:28
投稿者名:いな
Eメール:
URL :
タイトル:
Re: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
> どこから書いたらいいか分かりません。どなたか教えてください。

ボタンのクリックイベントに
 ※内部で西暦1を変数にセット、回数カウント初期化
 Do-Whle関数
  変数がうるう年ならば回数カウントを+1する
  変数を+1
  
 変数が西暦2になるまで繰り返す。

西暦を元にうるう年ならばTrueを返す関数を作成するとより簡単なのかもしれません。

投稿時間:2005/01/08(Sat) 13:22
投稿者名:SO
Eメール:
URL :
タイトル:
Re^2: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
> > どこから書いたらいいか分かりません。どなたか教えてください。
>
> ボタンのクリックイベントに
>  ※内部で西暦1を変数にセット、回数カウント初期化
>  Do-Whle関数
>   変数がうるう年ならば回数カウントを+1する
>   変数を+1
>   
>  変数が西暦2になるまで繰り返す。
>
> 西暦を元にうるう年ならばTrueを返す関数を作成するとより簡単なのかもしれません。


早速のご返事ありがとうございます。実は学校の内容なんです。プリントを見てもうまくつなげることができなくて困っていたんです。

西暦1を変数にセット⇒ dim seireki as int
回数カウント初期化とは、cnt=0 ですよね?

dim seirekiA as int
dim seirekiB as int
dim cnt as int

seirekiA=text1.text
seirekiB=text2.text

cnt=0            
Do While if....?

ここまでokですか?すみません。

投稿時間:2005/01/08(Sat) 13:23
投稿者名:いな
Eメール:
URL :
タイトル:
Re^3: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
> 早速のご返事ありがとうございます。実は学校の内容なんです。プリントを見てもうまくつなげることができなくて困っていたんです。
>
> 西暦1を変数にセット⇒ dim seireki as int
> 回数カウント初期化とは、cnt=0 ですよね?
>
> dim seirekiA as int
> dim seirekiB as int
> dim cnt as int
>
> seirekiA=text1.text
> seirekiB=text2.text
>
> cnt=0            
> Do While if....?
>
> ここまでokですか?すみません。

うん、OK

投稿時間:2005/01/08(Sat) 13:28
投稿者名:いな
Eメール:
URL :
タイトル:
Re^4: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
っと思ったら

> dim seirekiA as int
> dim seirekiB as int
> dim cnt as int

AS INTじゃなくって AS INTEGERね

> seirekiA=text1.text
> seirekiB=text2.text

  seirekiA=text1.textをやると型が一致しないような気がするので
 念のため
 seirekiA=Cint(text1.text)
  seirekiB=Cint(text2.text)

> cnt=0            
> Do While if....?


だね。

投稿時間:2005/01/08(Sat) 13:32
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
課題なら自分で
> 早速のご返事ありがとうございます。実は学校の内容なんです。
>プリントを見てもうまくつなげることができなくて困っていたんです。

だったら、こんな事は自分で調べて自分で試すべき事ですよ。

投稿時間:2005/01/08(Sat) 13:58
投稿者名:SO
Eメール:
URL :
タイトル:
Re: 課題なら自分で
> > 早速のご返事ありがとうございます。実は学校の内容なんです。
> >プリントを見てもうまくつなげることができなくて困っていたんです。
>
> だったら、こんな事は自分で調べて自分で試すべき事ですよ。

ご指摘ありがとうございます。知識がないのが原因ですけど、自分で調べた結果分からなかったんです。発想できるまでに至っていない状態でした。お騒がせしてすみませんでした。

投稿時間:2005/01/08(Sat) 12:48
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
発想の転換をすれば、平年は1年は365日なので期間の年間の日数を求め
365で割って余りを求めればそれがうるう年の回数になるのでは。
下記のようにたった1行で済みます。

Debug.Print (DateDiff("d", "1980/01/01", "2005/01/01")) Mod 365

投稿時間:2005/01/08(Sat) 13:06
投稿者名:いな
Eメール:
URL :
タイトル:
Re^2: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
どちらかというと、自分がやるならばDo-Whle関数など使うやり方はしないなぁ

hhttp://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_t05.htm
のように、西暦1年1月1日を起算日として計算してしまう。

投稿時間:2005/01/08(Sat) 13:29
投稿者名:SO
Eメール:
URL :
タイトル:
Re^2: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
> 発想の転換をすれば、平年は1年は365日なので期間の年間の日数を求め
> 365で割って余りを求めればそれがうるう年の回数になるのでは。
> 下記のようにたった1行で済みます。
>
> Debug.Print (DateDiff("d", "1980/01/01", "2005/01/01")) Mod 365

早速ありがとうございます。
参考にさせていただきます。でも、学校で習ってないやり方というか、 Debug.Print はどういうときに使うものですか?VB6始めたばかりなんです。すみません。

投稿時間:2005/01/08(Sat) 13:48
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
> Debug.Print はどういうときに使うものですか?

解らない事がでてきたら、まず、その箇所を選択して、F1 キーを押して見て下さい。
そうすれば、その語句のヘルプが表示されます。
因みに、Debug をヘルプで調べれば、Debug オブジェクトは、実行時に
イミディエイト ウィンドウに出力を送ります。 と記載されています。

プログラミングで一番大事なのは、発想だと私は思います。自分で色々思った事を
試さないと発想は沸きません。一々人に聞いたりしていたのでは、物まねに過ぎません。
まー頑張って下さい。

# >繰り返しのステートメントはDo〜Whileを使う 
上記も課題の条件なら課題をだした人に尋ねたいですね。
私なら For 〜 Next にしますが、まーそのような課題は出したくないですが。

投稿時間:2005/01/08(Sat) 13:54
投稿者名:SO
Eメール:
URL :
タイトル:
Re^4: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
> > Debug.Print はどういうときに使うものですか?
>
> 解らない事がでてきたら、まず、その箇所を選択して、F1 キーを押して見て下さい。
> そうすれば、その語句のヘルプが表示されます。
> 因みに、Debug をヘルプで調べれば、Debug オブジェクトは、実行時に
> イミディエイト ウィンドウに出力を送ります。 と記載されています。
>
> プログラミングで一番大事なのは、発想だと私は思います。自分で色々思った事を
> 試さないと発想は沸きません。一々人に聞いたりしていたのでは、物まねに過ぎません。
> まー頑張って下さい。

色々とすみません。うちのパソコンVB6使えなくて、試そうと思っても試せない状態なんです。
以後気をつけます。

投稿時間:2005/01/08(Sat) 14:21
投稿者名:いな
Eメール:
URL :
タイトル:
Re^5: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
せめて、
いきなり入力した西暦間のうるう年を求めるのではなく、
入力した西暦が、うるう年か否かを判断するところから始めては?

努力を見せれば・・・。応援するが

投稿時間:2005/01/08(Sat) 16:23
投稿者名:いな
Eメール:
URL :
タイトル:
ま、暇つぶしに、、、
学校の課題ということもあって、
長々とコードを掲示板に乗せるのもいかがなものかということで
削除します。

では。

投稿時間:2005/01/11(Tue) 18:27
投稿者名:SO
Eメール:
URL :
タイトル:
Re: ま、暇つぶしに、、、
> 学校の課題ということもあって、
> 長々とコードを掲示板に乗せるのもいかがなものかということで
> 削除します。
>
> では。

色々とありがとうございました。今日やっと出来ました。

投稿時間:2005/01/10(Mon) 17:17
投稿者名:jikoryuu
Eメール:
URL :
タイトル:
Re: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
> 2000,2001,2002,2003,2004と順に繰り返し、毎回うるう年のチェックをする。
> 繰り返しのステートメントはDo〜Whileを使う。

入力は西暦年だけで日付は入りませんね?

私なら入力年数を4で割って整理した後、For〜Nextで処理します。
Dim iFrom As Long
Dim iTo As Long
Dim iTemp As Long
Dim iRet As Long
iFrom = Text1.Text
iTemp = iFrom Mod 4
iFrom = Int(iFrom / 4)
iFrom = Iif(iTemp > 0, iFrom + 1, iFrom)
iTo = Int(Text2.Text / 4)
For iTemp = iFrom To iTo
 '4で割り切れる年は閏年
 'iRet = iRet + 1
 'If 100で割り切れる年は閏年ではない(25)
  'iRet = iRet - 1
  'If 400で割り切れる年は閏年(100)
   'iRet = iRet + 1
Next

他にも様々な方法(計算式のみなど)がありますが、学校の課題なら1年づつループしつつ
閏年をカウントしていく方法が良いでしょうね。

投稿時間:2005/01/11(Tue) 18:25
投稿者名:SO
Eメール:
URL :
タイトル:
Re^2: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
>
> 入力は西暦年だけで日付は入りませんね?

ありがとうございます。入力は西暦だけです。
>
> 私なら入力年数を4で割って整理した後、For〜Nextで処理します。
> Dim iFrom As Long
> Dim iTo As Long
> Dim iTemp As Long
> Dim iRet As Long
> iFrom = Text1.Text
> iTemp = iFrom Mod 4
> iFrom = Int(iFrom / 4)
> iFrom = Iif(iTemp > 0, iFrom + 1, iFrom)
> iTo = Int(Text2.Text / 4)
> For iTemp = iFrom To iTo
>  '4で割り切れる年は閏年
>  'iRet = iRet + 1
>  'If 100で割り切れる年は閏年ではない(25)
>   'iRet = iRet - 1
>   'If 400で割り切れる年は閏年(100)
>    'iRet = iRet + 1
> Next
>
> 他にも様々な方法(計算式のみなど)がありますが、学校の課題なら1年づつループしつつ
> 閏年をカウントしていく方法が良いでしょうね。

私は今日色々試して出来ました。多分OKです。
For seireki = Text1 To Text2 Step 1
    If N4 = seireki Mod 4 Then
    cnt = cnt + 1
    End If
Next

どうですか?
あと、必ずしも左のテキストボックスに小さい西暦が入るとは限らないプログラムはどのようにやるべ
きでしょうか?お願いします。

投稿時間:2005/01/11(Tue) 18:36
投稿者名:LESIA
Eメール:
URL :
タイトル:
Re^3: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
> 私は今日色々試して出来ました。多分OKです。
> For seireki = Text1 To Text2 Step 1
>     If N4 = seireki Mod 4 Then
>     cnt = cnt + 1
>     End If
> Next
>
> どうですか?

これだと、4年で割り切れる年はすべて閏年になってしまいますよ。
4年で割り切れる年でも100で割り切れる年は閏年でなありません。
しかし、100で割り切れてしかも400で割り切れる年は閏年です。

> あと、必ずしも左のテキストボックスに小さい西暦が入るとは限らないプログラムはどのようにやるべ
> きでしょうか?お願いします。

For seireki = Text1 To Text2 Step Sgn(Text2 - Text1)
とすれば良いかと

投稿時間:2005/01/11(Tue) 18:43
投稿者名:SO
Eメール:
URL :
タイトル:
Re^4: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
> > 私は今日色々試して出来ました。多分OKです。
> > For seireki = Text1 To Text2 Step 1
> >     If N4 = seireki Mod 4 Then
> >     cnt = cnt + 1
> >     End If
> > Next
> >
> > どうですか?
>
> これだと、4年で割り切れる年はすべて閏年になってしまいますよ。
> 4年で割り切れる年でも100で割り切れる年は閏年でなありません。
> しかし、100で割り切れてしかも400で割り切れる年は閏年です。

ありがとうございます。Ifの中にIfを入れればOKですよね?もう一度やってみます。
>
> > あと、必ずしも左のテキストボックスに小さい西暦が入るとは限らないプログラムはどのようにや
るべ
> > きでしょうか?お願いします。
>
> For seireki = Text1 To Text2 Step Sgn(Text2 - Text1)
> とすれば良いかと

早速ありがとうございます。step1とStep Sgn(Text2 - Text1)の違いは何でしょう?
調べてみます。

投稿時間:2005/01/11(Tue) 20:45
投稿者名:LESIA
Eメール:
URL :
タイトル:
Re^5: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
> 早速ありがとうございます。step1とStep Sgn(Text2 - Text1)の違いは何でしょう?
> 調べてみます。

Text1 < Text2 の時、Sgn(Text2 - Text1) = 1となるので
For seireki = Text1 To Text2 Step 1
で、小さい西暦から大きい西暦まで1ずつ増やしながらループします。

Text1 > Text2 の時、Sgn(Text2 - Text1) = -1となるので
For seireki = Text1 To Text2 Step -1
で、大きい西暦から小さい西暦まで1ずつ減らしながらループします。

ただし、Text1 = Text2の時は、Sgn(Text2 - Text1) = 0 となるので
要注意です。

投稿時間:2005/01/12(Wed) 04:34
投稿者名:jikoryuu
Eメール:
URL :
タイトル:
Re^3: 入力した西暦間のうるう年の回数をカウントするプログラムを作りたい
>小さい西暦が入るとは限らないプログラム〜

これに関してはプログラムの初歩のアルゴリズムなので
ご自分で考えてみてください。
ヒントとしてはText1とText2を比較して後の処理に都合
が良くなるように入れ替える事です。

その他に気になったのは閏年の処理と記事No.1505で提示
されたプログラムコード中の変数N4の事です。閏年の処理は
記事No.1508で解決されているようなので、ここでは変数に
ついて書きます。

Mod演算子は余りを求めるものですから、このプログラムでは
変数N4は必要なく、固定数で十分です。(あえて向学のため
この数値はここでは示さない事とします。ご理解ください。)
Mod演算子をヘルプで調べることでどのような固定値が入るか
考えて見てください。

もう少しでできそうですね。頑張ってください。