VC++でif文が処理されません

このQ&Aのポイント
  • 万年カレンダーを作っていて、if文が処理されません。
  • label2に日付を表示させるコードが読み込まれず、改行されません。
  • コンパイルは成功しているため、構文の間違いではないと思われますが、どこかおかしい部分があるようです。
回答を見る
  • ベストアンサー

VC++でif文が処理されません

万年カレンダーを作っていて、先日こちらで日付の取得方法を質問して解決法を教えていただき、その後制作を進めていました。 が、今度はコンパイルは成功しても一部コードが処理されずに行き詰ってしまいました。 以下のようにlabel2に日付を表示させるコードを書いてみたのですが、/*日付の表示*/の if(wd%7 == 0){ label2->Text = Cal + "\r\n"; } が読み込まれていないようで、改行されません。 試しに"\r\n"ではなく別の文字列を入れてみたり、if(wd == 6)に換えてみたりしました。 が、どちらも成果はありませんでした。 どこかおかしい部分があるのでしょうか? コンパイルは成功するので、構文としては間違っていないと思います。 無駄に長いコードになってしまっているかも知れませんが、よろしくお願いします。 <↓ここからソースです> private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { DateTime d1 = DateTime::Now; textBox1->Text = d1.ToString("yyyy"); textBox2->Text = d1.ToString("MM"); int year,month,day ; /* 年 月 日 */ int wd; /* 曜日 */ int dm ; /* 月の日数 */ int L0 ; /* カウンタ */ String^ Cal = ""; /*年・月・日を代入*/ year = System::Int32::Parse( d1.ToString("yyyy") ); month = System::Int32::Parse( d1.ToString("MM") ); day = System::Int32::Parse( d1.ToString("dd") ); /*現在の年・月が何日あるか*/ switch(month) { case 2: if ( year%4 == 0 && (year%100 != 0 || year%400 ==0)){ dm = 29 ; /* うるう年 */ } else { dm = 28 ; break ; } case 4: case 6: case 9: case 11: dm = 30 ; break ; default: dm = 31 ; break ; } /* 今年・今月1日の曜日を求める */ if (month == 1 || month == 2) { year-- ; month += 12 ; } wd = (year + year/4 - year/100 + year/400 + (13*month+8)/5 +1) % 7 ; /* スペースの表示 */ for (L0=0;L0<wd;L0++) { label2->Text = Cal + " "; Cal = label2->Text; } /* 日付の表示 */ for(L0=1;L0<=dm;L0++){ if(wd == 6){ label2->Text = Cal + "\r\n"; } label2->Text = Cal + L0; Cal = label2->Text; wd = wd + 1; } label1->Text = "日  月  火  水  木  金  土" + "\r\n"; }

  • 35a94
  • お礼率100% (8/8)

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

> if(wd == 6){ > label2->Text = Cal + "\r\n"; > } ここで label2->Text に代入していますが、その直後の > label2->Text = Cal + L0; で、また別の文字列を代入してますね。 そのため、最初のTextへの代入はまったく反映されないことになります。 他の記述に合わせるなら、 if文のブロック内に Cal = Label2->Text が必要かな。 でも、そもそも「毎回 Label2->Text に代入しては Cal に代入し戻す」のはかなりの無駄です。 カレンダー文字列の設定は全て Cal = Cal + "\r\n" って感じで、変数Calにどんどん追加していって、最後に一回だけ Label2->Text = Cal と代入するので十分でしょう。

35a94
質問者

お礼

>そもそも「毎回 Label2->Text に代入しては Cal に代入し戻す」のはかなりの無駄です。 落ち着いて考えると確かに無駄ですね。 どうやら途中で代入処理の記述を書き落としていたため、改行がCalに反映されていなかったようです。 ご指摘されたように最後に一回だけ出力するようにしたら、解決しました。 ご回答くださった方々、ありがとうございます。

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

>wd = (year + year/4 - year/100 + year/400 + (13*month+8)/5 +1) % 7 ; ツェラーの公式で求まる曜日は、 0:日曜日、1:月曜日、...、6:土曜日のはずです。 したがって、 >if(wd == 6){ 1週間分のラベル文字列を出力した後で改行を入れたいのであれば、 wdが6のとき「だけ」ではなく、wdを7で割ったあまりが6のとき、 である必要があると思います。 また、 >label2->Text = Cal + L0; 文字列と整数の連結は成立するのでしょうか? Calと「L0を文字列に変換した内容」とを連結しなければならないのではないでしょうか。 さらに、1週間分のラベル文字列を出力し終わったら、 Calを空に初期化する必要があるのではないでしょうか。 以上、VC++ を全く知らない者からのたわごとでした。

35a94
質問者

お礼

>if(wd == 6){ これに関しては、「%」がマズいのかと確認するためのテスト用です。 言葉足らずですみません; >label2->Text = Cal + L0; 今回は問題ないようです。 が、よくその内容でエラーを出してしまうので、改めて気をつけてみます。

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

とりあえずwd自体をdumpしてみたらどうかな? 目的の値を保持している?

35a94
質問者

お礼

/*日付の表示*/内のfor文でlabelに表示させてみたところ、wdの値は保持しているようです。 今後それについても気をつけてみたいと思います。

関連するQ&A

  • VC++2008 フォーム間の変数の受け渡しについて

    フォーム1で DateTime d1; int year; d1 = DateTime::Now; year = System::Int32::Parse( d1.ToString("yyyy") ); で読み込んだ現在の年数を、フォーム2で使いたい場合どうすればいいのでしょうか? private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { Form2^ f = gcnew Form2(); f->Show(); } でForm2を読み込んでいるので、ここに「変数yearを使う」旨を書けばいいのかとも思いましたが、うまく行きませんでした。 使用しているのはVisualC++2008 ExpressEdition。 ボタンをクリックすると別フォームを表示して、そこで元のフォームで使った変数を使おうと考えています。

  • C#のlabelの表示について

    C#のlabelの表示について カテ違いですが、C#のカテゴリがないのでここで質問させていただきます。 以下の時刻を表示するプログラムを作成したのですが、        //現在の時刻を取得  DateTime dt = DateTime.Now; int Second_1 = dt.Second % 10; int Second_2 = dt.Second / 10; int Minute_1 = dt.Minute % 10; int Minute_2 = dt.Minute / 10; int Hour_1 = dt.Hour % 10; int Hour_2 = dt.Hour / 10; label1.Text = Second_1.ToString(); label2.Text = Second_2.ToString(); label3.Text = Minute_1.ToString(); label4.Text = Minute_2.ToString(); label5.Text = Hour_1.ToString(); label6.Text = Hour_2.ToString(); if (int.Parse(label1.Text) == 0 && int.Parse(label2.Text) == 0) { int a; for (a = 0; a < 10; a++) { pictureBox4.Top += 1; System.Threading.Thread.Sleep(30); } for (a = 0; a < 50; a++) { pictureBox4.Top += 5; System.Threading.Thread.Sleep(10); } pictureBox4.Top = 12; } label1は「秒」の1の位、 label2は「秒」の10の位、 pictureBox4は「分」の1の位の画像を表示しています。 pictureBoxとlabelを重ねて、画像の上に時刻を表示しています。 秒が0になったとき(分の位が一つ上がるとき)、 分の位の画像を移動させて(forループ2つ)再び元の位置に戻しているのですが(pictureBox4.Top = 12;) そのとき秒が「00」とはならず「59」のままで、このループが終わると「00」を飛ばして「01」となります。 ちなみにこの部分はタイマーで0.2秒ごとに回しています。 原因がわかりませんので、ご教授願います。 また、ループには概算で0.8秒かかりますが、この間、タイマーの呼び出しは実行されているのでしょうか? 加えて、pictureBox4.Topの値を動かしていますが、重ねて配置しているlabelも一緒に動いてくれます。 いろいろなサイト様を参考に、 this.label3.Parent = this.pictureBox4; と親コントロールをFormから変更したのですが、このためでしょうか? 変な表現がありましたらご容赦ください。 よろしくお願いします。

  • プログラムの内容

    以下のプログラムは答えとして渡されたものなんですが、 コマンド引数を使ったプログラムの流れがよくわかりません。 簡単に解説してくれる方、いませんか? #include <stdio.h> int leapyear(int year){ if(year%400 == 0) return 1; else if(year%4 == 0 && year%100 != 0) return 1; else return 0; } void addmonth(int *day, int *month, int *year){ *day = 1; (*month)++; if(*month > 12) { *month = 1; (*year)++; } } int main(int argc, char *argv[]){ int year, month, day, a=0, max_days; int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; if(argc < 2) max_days = 10000; else max_days = atoi(argv[1]); printf("今日は西暦何年 何月 何日? "); scanf("%d%d%d",&year,&month,&day); while(a<max_days) { a++; day++; if(month == 2 && leapyear(year)) { if(day > 29) addmonth(&day, &month, &year); } else { if(day > month_days[month-1]) addmonth(&day, &month, &year); } } printf("今日から%d日後は、%d年%d月%d日です。",max_days, year, month, day); }

  • C# プログラム

    下記のプログラムを組んだのですが,for Dが1回しかまわりません. int[] Mo = new int[12]; #region Month ///<summary> ///月の定義 ///<summary/> Mo[0] = 4; Mo[1] = 5; Mo[2] = 6; Mo[3] = 7; Mo[4] = 8; Mo[5] = 9; Mo[6] = 10; Mo[7] = 11; Mo[8] = 12; Mo[9] = 1; Mo[10] = 2; Mo[11] = 3; #endregion int hh = f1.Ye; int ic = 0; for (int D = 0; D <= 11; D++) { int hye = hh; MessageBox.Show(D.ToString()); if (Mo[D] < 4) { hye = hh + 1; } int hmo = Mo[D]; // 2004年02月の日数を取得する int iDaysInMonth = DateTime.DaysInMonth(hye,hmo); //日数を積算 ic=ic + 31; int Sic = 31*D + 1; int Dic = 0; for (int N = Sic; N <= ic; N++) { Dic = Dic + 1; //必要な変数を宣言する DateTime dateValue = new DateTime(hye, hmo, Dic); // 曜日を取得する DayOfWeek uWeekday = dateValue.DayOfWeek; string W = ("日月火水木金土").Substring(int.Parse(dateValue.DayOfWeek.ToString("d")), 1); //MessageBox.Show(W.ToString()); string NI = Convert.ToString(Dic); if (Dic > iDaysInMonth) { NI = ""; W = ""; } //Labelに文字を入力。 string h = "label" + N; string hY = "label" + (N + 372); //MessageBox.Show(hY.ToString()); //日数を記入 Control[] cs = this.Controls.Find(h, true); ((Label)cs[0]).Text = NI; //曜日の記入 Control[] css = this.Controls.Find(hY, true); ((Label)css[0]).Text = W; } } いろいろ調べて //必要な変数を宣言する DateTime dateValue = new DateTime(hye, hmo, Dic); こいつが何らかの影響を及ぼしていることまではつかんだのですが,何が悪いのか,また, どうすれば改善できるのか解らず困っています. ご教授よろしくお願いいたします.

  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語を学習していてつまづいたので、皆さんの意見を聞きたいと思います。 現在、カレンダーを表示するプログラムをつくっています。 Yearとmonthをユーザが入力すると、その年その月のカレンダーが出るという算段です。(画像貼っておきます。ソースコードは下) これはできました。 これをいじって、Yearをユーザから受け取ると、その年の1月から12月までのカレンダーがば~っと表示されるようにしろ、と言われました。 Yearとmonthを受け取って書くやつは友人の助けを得ながらなんとかかけましたが、もう無理です。多分、for文を使うんだと思うんですが……助けてください! #include <stdio.h> int dayofweek(int year, int month); int daysinmonth(int year, int month); int daysinyear(int year); void showcal(int dow, int days); int main(void) { int year, month; int dow; int dim; printf ("Year?: "); scanf ("%d", &year); printf ("Month?: "); scanf ("%d", &month); dow = dayofweek(year, month); dim = daysinmonth(year, month); showcal(dow, dim); return 0; } void showcal (int dow, int days) { int i, j, d; printf ("Su Mo Tu We Th Fr Sa\n"); d = 1; for (i = 0; i < dow; i++) { printf (" "); } for (; i < 7; i++) { printf (" %d ", d); d++; } printf("\n"); for (j = 0; d <= days; j++) { for (i = 0; i < 7 && d <= days; i++) { if (d < 10) printf (" %d ", d); else printf ("%d ", d); d++; } printf("\n"); } } int daysinmonth( int year, int month) { int dim; dim = 31; if (month == 4 || month == 6 || month == 9 || month == 11) dim = 30; if (month == 2) { if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) dim = 29; else dim = 28; } return dim; } int daysinyear( int year) { int diy; if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) diy = 366; else diy = 365; return diy; } int dayofweek (int year, int month) { int dow; int days; int y, m; if (year >= 2000) { days = 0; for ( y = 2000; y < year; y++ ) { days = days + daysinyear(y); } for ( m = 1; m < month; m++ ) { days = days + daysinmonth(year, m); } dow = (6 + days) % 7; } else { days = 0; for ( m = month; m <= 12; m++ ) { days = days + daysinmo

  • 【VC++2005(CLR)】テキストボックスに0を除く整数値の入力を許可したい

    VC++2005(Express Edition)初心者です。 CLRでプロジェクトを作成しています。 表題の件でよい知恵を頂ければと思い質問させていただきました。 お手数ですが、よろしくお願いします。 現在、以下のようなコードを書きました。 しかし、このコードですと"-"の符号だけがテキストボックスに 放置される可能性があります。 これを防止するにはどうしたらよろしいでしょうか。 private: System::Void textBoxMain_Work_TextChanged(System::Object^ sender, System::EventArgs^ e) {  String^ strValue = textBoxMain_Workt->Text;  int intValue;  if(strValue=="-")  textBoxMain_Workt->Text = "-";   else{    intValue = CheckNumber(strValue);   if(intValue != 0) //0の場合、数値外の値が入力されたこととする    textBoxMain_Work->Text = intValue.ToString();   else    textBoxMain_Work->Text = "";   } } System::Int32 CheckNumber(System::String^ textValue){  int value;  if(int::TryParse(textValue,value)){   value = int::Parse(textValue);  }  else{   value = 0;  }  return value; }

  • C言語 実行エラー 10000日先が表示されない 

    今10000日先後の年、月、日を求めていて下のプログラムを 考えたんですけど、コンパイルは通るんですが結果がうまくいきません↓ どこがおかしいですか? #include<stdio.h> int leapYear(int); int Date(int,int,int,int); int main(void){ int year,i=0,month,date,date2=10000,emp=0; printf("年>>"); scanf("%d",&year); printf("月>>"); scanf("%d",&month); printf("日>>"); scanf("%d",&date); Date(year,month,date,date2);//date2から各月の日数を引いていく printf("year=%d month=%d date=%d date2=%d \n",year,month,date,date2); return 0; } int leapYear(int year){ //うるう年を求める if(year%400==0){ return 1; } else if(year%4==0 && year%100!=0){ return 1; } else return 0; } int Date(int y,int m,int d,int d2){ for(;;y++){ if(d2<0) return y,m,d,d2; for(;m<=12 || d2>=0;m++){ if(leapYear(y)==1){ if(m==4||m==6||m==9||m==11){ d2-(30-d); } else if(m==2) d2-(29-d); else d2-(31-d); } else if(m==4||m==6||m==9||m==11){ d2-(30-d); } else if(m==2) d2-(28-d); else d2-(31-d); } } }

  • java Calendarクラス

    javaで月、日を入力してカレンダーを作成したのですが 年と月のsetでmonth-1はマジックナンバーなので直したいのですが どなたかわかる方教えてください。 package sample; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Test { private final static int firstday = 1; public static void main(String[] args) { //カレンダーのインスタンスを取得します Calendar cal = Calendar.getInstance(); //文字入力 BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); //年を取得 int year =0; //月を取得 int month =0; //最後の日付 int lastDay =0; //月初めの曜日を取得 int week =0; //年妥当性チェック boolean CheckYear = true; //月妥当性チェック boolean CheckMonth = true; try { //年妥当性チェック while(CheckYear){ System.out.println("年を入力してください"); //年を入力します year = Integer.parseInt(input.readLine()); //年が4桁の場合 if(String.valueOf(year).length()==4){ CheckYear = false; }else{ System.out.println("年は4桁で入力してください"); } } //月妥当性チェック while(CheckMonth){ System.out.println("月を入力してください"); //月を入力します month = Integer.parseInt(input.readLine()); //月が1~12の場合 if(month>=1&&month<=12){ CheckMonth = false; }else{ System.out.println("月1~12を入力してください"); } } }catch(IOException e){ System.out.println("数字以外は入力しないでください"); System.out.println("処理を中断します"); return; }catch (Exception a) { System.out.println("数字以外は入力しないでください"); System.out.println("処理を中断します"); return; } //年、月をセットします cal.set(year,month-1,cal.getActualMinimum(Calendar.DATE)); //月初めの曜日を取得 week = cal.get(Calendar.DAY_OF_WEEK); //年月を出力する System.out.println(String.valueOf(year)+"年"+String.valueOf(month)+"月"); //曜日を出力する System.out.println("日 月  火  水  木  金  土"); //最後の日付を取得する lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); /* * 最後の日付を取得する */ if(month==1||month==3||month==7||month==8||month==10||month==12) { lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(month==4||month==6||month==9||month==11){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(year%4==0&&month==2){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(year%4!=0&&month==2){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); } /* * カレンダーを出力する */ //最後の日付まで繰り返す // 最後の日付まで繰り返す for (int i = 1; i <= lastDay; i++) { // 1日とそれ以外で分岐する if (i == 1) { // 1日の曜日位置まで移動する for (int j = 1; j < cal.get(Calendar.DAY_OF_WEEK); j++) { System.out.print(" "); } } else { // 日付を増やす cal.add(Calendar.DAY_OF_MONTH, firstday); } // 1~9と10~で表示を変える if (i < 10) { System.out.print(" " + i); } else { System.out.print(" " + i); } // 土曜日になったら改行する if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { System.out.println(""); } } } }

  • if文の条件について

    2008年の09月30日までは「テスト」と表示し、それ以降はなにも表示しないようにしようと思い、以下のように作成してみました。 ---------------------------------------------------------- <?php $year = date('Y'); $month = date('m'); $day = date('d'); if($year == 2008 and $month == 09 and $day <= 30){ echo 'テスト';} ?> -------------------------------------------------------------- けれど、なにも表示されませんでした。 ためしに else{ echo 'hoge';} をつけ加えてみると、「hoge」と表示されました。 どうして「テスト」と表示されず、elseの「hoge」と表示されてしまうのでしょうか? ご教授のほど、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • javaのカレンダー作成について

    コマンドライン引数で渡された6桁の数字をカレンダーに起こすプログラムを作成しています。 以下のように書きました。 ↓ public class Calendar { public static void main(String[] args) { java.util.Calendar cal = java.util.Calendar.getInstance(); int year = Integer.parseInt(args[0].substring(0, 4)); int month = Integer.parseInt(args[0].substring(4)); cal.set(java.util.Calendar.YEAR, year); cal.set(java.util.Calendar.MONTH, month - 1); cal.set(java.util.Calendar.DAY_OF_MONTH, 1); int week = cal.get(java.util.Calendar.DAY_OF_WEEK); //日曜始まり一週間のセット作成 int weekset = 0; if (week == cal.SUNDAY) { weekset = 0; } else if (week == cal.MONDAY) { weekset = 1; } else if (week == cal.TUESDAY) { weekset = 2; } else if (week == cal.WEDNESDAY) { weekset = 3; } else if (week == cal.THURSDAY) { weekset = 4; } else if (week == cal.FRIDAY) { weekset = 5; } else if (week == cal.SATURDAY) { weekset = 6; } //月末日 int lastDay = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH); //7日ごとに改行するカウンタ用意 int counter = 0; System.out.println( year + "年" + month + "月"); System.out.println(" 日 月 火 水 木 金 土"); //weekset分回す for (int i = 0; i < weekset; i++) { System.out.print(" "); counter ++; } //1日から月末日まで、カレンダーを表示する for (int day = 1 ; day <= lastDay; day ++) { if (day < 10) { System.out.print(" " + day + " "); } else { System.out.print( day + " "); } counter ++; if (counter == 7) { // 7日おきに改行する counter = 0; System.out.println(); } } } } きちんと動作してくれるのですが、2つ目のループ内の、 ************** for (int day = 1 ; day <= lastDay; day ++) { if (day < 10) { ●System.out.print(" " + day + " "); } else { ●System.out.print( day + " "); } ************** ●の部分の出力はループの外で一つに纏められるはずだと指摘されました。 dayの後ろの部分にだけなら、for文の前にString str = "";と宣言しておいて、 for (int day = 1 ; day <= lastDay; day ++) { str += " "; とすることで空白を付けられる気がしているのですが、前部分に空白を設定した上でまとめて出力する方法が分かりません。 お分かりになる方、どのようにすればよいのかご教授お願いいたします。 (また、上記の方法自体全く的外れということでしたらそれを含めてご教授お願いいたします・・・;;)

    • ベストアンサー
    • Java