🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1564閲覧

C#で途中で改行したい

kanata_02

総合スコア25

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2019/12/20 04:14

C#コンソールでカレンダーの制作をしています。
コード一番下の
if (n % 7 == 6 && d != dm)
Console.WriteLine(" ");
の部分で土曜日の日付になったら改行するようにしたいのですが、\nを挿入しても、WriteLineを記述しても改行されません。

ブレイクポイントを設置すると通ってはいるので、何が原因なのかわからない状態です。
どうしたら改行されるか、アドバイスいただけますと幸いです。

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7namespace ConsoleApp1 8{ 9 class Program 10 { 11 static void Main() 12 { 13 int year = 0; 14 int month = 0; 15 int days = 0; 16 int youbi; 17 18 GetYearMonth(ref year, ref month); 19 days = GetMonthDays(year, month); 20 youbi = GetWeekDay(year, month, days); 21 PrintCalendar(days,youbi); 22 23 Console.ReadKey(); 24 } 25 26 //入力を受け付ける 27 static void GetYearMonth(ref int py, ref int pm) 28 { 29 Console.Write("カレンダー表示"); 30 Console.Write("西暦入力"); 31 py = int.Parse(Console.ReadLine()); 32 Console.Write("月入力"); 33 pm = int.Parse(Console.ReadLine()); 34 } 35 36 //日数を返す 37 static int GetMonthDays(int y,int m) 38 { 39 int dm; //日数を格納 40 41 switch (m) 42 { 43 case 1: case 3: case 5: case 7: case 8: case 10: case 12: 44 dm = 31; 45 break; 46 case 4: case 6: case 9: case 11: 47 dm = 30; 48 break; 49 case 2: 50 if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0) 51 { 52 dm = 29; 53 break; 54 } else { 55 dm = 28; 56 break; 57 } 58 default: 59 dm = 0; 60 break; 61 } 62 return dm; 63 } 64 65 static int GetWeekDay(int y , int m, int d) 66 { 67 int w; //曜日 68 69 //1,2月は13月,14月とする 70 if(m == 1 || m == 2) 71 { 72 y--; 73 m += 12; 74 } 75 76 //ツェラーの公式 77 w = (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + d) % 7; 78 79 return w; 80 } 81 82 //カレンダー表示,dmは日数,dwは最初の日の曜日 83 static void PrintCalendar(int dm, int dw) 84 { 85 int n, d; 86 87 for (n = 0; n < dw; n++) 88 Console.Write(" "); 89 for (d = 1; d <= dm; d++) 90 Console.Write("{0, 4}", d); 91 if (n % 7 == 6 && d != dm) 92 Console.WriteLine(" "); 93 n++; 94 } 95 } 96}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

仰っているコードで改行部分(Console.WriteLine(" ");)にブレイクポイントを置いても停止しません。
if文の部分に置いているのではないですか?

また実際にループで実行される部分を勘違いされているように思います。

C#

1for (d = 1; d <= dm; d++) 2 Console.Write("{0, 4}", d); 3if (n % 7 == 6 && d != dm) 4 Console.WriteLine(" "); 5

この部分ですが、分かりやすく書くと

C#

1for (d = 1; d <= dm; d++) 2{ 3 Console.Write("{0, 4}", d); 4} 5if (n % 7 == 6 && d != dm) 6 Console.WriteLine(" "); 7

このようにfor文の外で改行判定していることになります。
実際に、PrintCalendarに入ってすぐにブレイクポイントを置いて、ステップ実行で自分のプログラムがどのように動いているのか確認してください。

また、PrintCalendar内部の処理が正しいかまでは見ていません。

追記
残りの部分を見てみましたが、
1.入力された月の初日の曜日を算出する部分
2.指摘したループ範囲
この2点に誤りがあります。

投稿2019/12/20 04:26

編集2019/12/20 04:51
YAmaGNZ

総合スコア10469

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kanata_02

2019/12/20 04:58

改行することができました! やはり波かっこはしっかりと入れるようにします。回答いただきましてありがとうございました。
kanata_02

2019/12/20 05:00 編集

追記拝見いたしました。 曜日の算出につきましても、ずれがありましたので見直します。
YAmaGNZ

2019/12/20 05:02 編集

returnを使わないというのは関係なく、求める日が違うのですが・・・ あ、編集がかぶってしまいました。
kanata_02

2019/12/20 05:10

こちらこそ早とちりしてしまいました。申し訳ありません。 求める日にちを最初の日に変更して、何パターンか試しましたがちゃんと動いたと思います。 大変お騒がせしました…。
guest

0

こんにちは。

直接の回答はしませんが、

PrintCalendar の先頭にブレークポイントを張り、そこから一つずつ「ステップ実行」してみて下さい。
コンソール画面を確認しつつ、どんな順番でステップしているのか、条件式に入るときの変数の数値がどうなっているのかをよく見て下さい。
そうすれば、どうして意図しない結果になっているのか自分で気付くことができるはずです。

投稿2019/12/20 04:26

tamoto

総合スコア4243

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問