VC++6.0で、誕生日を入力して歳を算出するには?

解決


  2007-06-20 19:28:20  No: 65425

初めまして、蒼と申します。初心者です;

VC++6.0 MFC ダイアログベースで画面設計の学習をしています。
エディットボックス1に文字列で『2000/06/20』と入力すると、
エディットボックス2には、現在の歳を表示するものを作りたいのですが、
どのようにすれば良いのかがわかりません・・。
どなたか方法やヒントなどを教えてもらえないでしょうか?
お願い致します。


Blue  2007-06-20 19:52:27  No: 65426

MFCならCOleDateTimeを使うとよいかも。

現在の日付は

COleDateTime::GetCurrentTime

で、テキストの内容を日付に変換するのは

COleDateTime::ParseDateTime

で、引き算はCOleDateTimeのoperator - にやらせて
COleDateTimeSpanを取得して、COleDataTime::Formatで%yを指定して
取得した文字列を使えばいいでしょう。


とおりすがり  2007-06-20 20:39:14  No: 65427

しかしいくら初心者とは言え、そこまで関数に頼ったり掲示板に質問しないと駄目なのかなー?そもそも入門書とか、それに類するHPとか読んでる?

それにそこまで初心者ならVB辺りから始めたほうが適切だし、MFCである必要性が見えない。仕事で環境を指定されてるとか?


tetrapod  2007-06-20 20:57:28  No: 65428

年齢って実は結構めんどくさいよ
2/29 生まれの人の年齢どう計算するのとか
法律上の年齢って一般常識の年齢とは異なるよ(民法第143条)とか


とおりすがり  2007-06-20 21:49:19  No: 65429

いやそれはわかってるんだけど、例えばコンソールアプリでscanf()で日付を読み込み、printf()で年齢が出せるなら、そもそもこんな質問にはならないと思ってね。

コンソールアプリすら出来ないやつが、いきなりMFCでウィンドウアプリ開発なのか?って思ったわけよ。順番が逆じゃないのかと。


  2007-06-20 23:16:24  No: 65430

返信ありがとうございます。

Blueさん
COleDateTimeの使い方を調べてやってみます。

とおりすがりさん
仕事でこの環境で作成するようにと言われていまして・・
入門書は、山本信雄 著『プログラマ養成入門講座 Visual C++』
の②と③を読んでいます。

tetrapodさん
2/29 生まれのことは考えていませんでした・・


どら  2007-06-21 19:02:23  No: 65431

現在時刻・入力した値をそれぞれ年・月・日と別々に整数変数として格納してから計算すると楽じゃないですか?
って、それぞれを整数変数にすること自体が面倒と思われる方もいるかもしれませんが・・・


tetrapod  2007-06-21 19:39:42  No: 65432

COleDateTimeSpan は経過時間でしかないので、年齢を計算するには使えんよ。
    COleDateTime birthday(1987,6,21,0,0,0);
    COleDateTime today(2007,6,21,0,0,0);
    COleDateTimeSpan sp(today-birthday);
    _tprintf(_T("Age=%s\n"), sp.Format(_T("%y")));
結果は19になってしまう。まだ酒飲めねぇや。

この課題って「年齢の算出ロジックを考えろ」ということなんだろう。
俺たちがコード書いちゃうのは簡単だけどそれぢゃ意味が無いんで
もっとじっくり考えてみるべし。
一度自分でコード書くといい。それの添削ならしてあげられるよ。


Blue  2007-06-21 19:52:02  No: 65433

>COleDateTimeSpan は経過時間でしかないので、年齢を計算するには使えんよ。
そうでしたか、、、確認せずに解答してすみませんでした。

>この課題って「年齢の算出ロジックを考えろ」ということなんだろう。
でしょうね。
まずは、コードに移す前に、自分ならどのような計算をするか考えて
その手順を箇条書きにするという作業をすべきでしょうね。


  2007-06-29 00:53:28  No: 65434

返事が遅くなってしまってすみません・・。

時間がかかってしまいましたが、どうにか動くものを作ることができました。

/*----------------------------------------------------------------------------
 * 処理概要:文字列で入力された生年月日を、年、月、日に分解し、数値に変換する。
 * 関数名  :OnChangeUmare()
 *--------------------------------------------------------------------------*/
void CTouroku2Dlg::OnKillfocusUmare() 
{
  CString Birthday;
    CString wkBirthday;
  int year, month, day;

  // エディットボックスから生年月日を取得
  //Birthday = OnChangeUmare();
  UpdateData(TRUE);
    wkBirthday = m_Umare;

  // 生年月日が10文字入力されていない場合、エラーを表示させる。
  if (GetDlgItem(IDC_UMARE)->GetWindowTextLength() != 10){
    AfxMessageBox("正しく入力してください");
  }

  // 年を取得
  wkBirthday = m_Umare.Mid(0, 4);
  year = atoi(wkBirthday);

  AfxMessageBox("1");
  // 月を取得
  wkBirthday = m_Umare.Mid(5, 2);
  month = atoi(wkBirthday);

  AfxMessageBox("2");
  // 日を取得
  wkBirthday = m_Umare.Mid(8, 2);
  day = atoi(wkBirthday);

  AfxMessageBox("3");
  // 年齢にKeisanで求めた結果を代入する。
  m_Nenrei = Keisan(year, month, day);
  UpdateData(FALSE);
}

/*-------------------------------------------------------------------
 * 処理概要:現在の年月日と入力された年月日を比べて、歳を求める。
 * 関数名  :Keisan()
 *-----------------------------------------------------------------*/
int CTouroku2Dlg::Keisan(int year, int month, int day){
  int age;

  // 現在の年月日を取得
  CTime DataTime = CTime::GetCurrentTime();
  CString g_year, g_month, g_day;
  int now_year = DataTime.GetYear();
  int now_month = DataTime.GetMonth();
  int now_day = DataTime.GetDay();

  // 現在年から入力された年を引き年齢を求める
  age = now_year - year;

  // 現在月と入力された月を比較する年
  if (now_month < month){
    age = age - 1;
  }
  if (now_month == month){

    // 現在日と入力された日を比較する
    if (now_day < day){
      age = age - 1;
    }
  }

  // 結果を返す
  return age;
}

ヒントをくれた方、皆様には感謝しております。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加