質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

88.78%

for文 カレンダーの表示

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,329

yoshiteru21

score 40

![イメージ説明](57448c2d02c0ed5624593b5bdc31bb2f.png)

c言語でfor文を使って画像のように出力させるプログラムを教えてください。
途中までできているコードを載せていますが全く違います

#include <stdio.h>

int main(void){
    int week, days, i;
    printf("カレンダーを表示させます\n");
    printf("表示させたい月は何曜日から始まりますか?次の数字で答えてください\n");
    printf("0:日,1:月,2:火,3:水,4:木,5:金,6:土\n");
    scanf_s("%d", &week);
    printf("表示させたい月は何日ありますか?数字を入力してください\n");
    scanf_s("%d", &days);
    printf("日 月 火 水 木 金 土\n");
    for (week = 0; week <= 6; week++)printf(" ");
    for (i = 1; i <= days; i++){
            for (int j = 1; j <= 7; j++){
                printf("%3d", i);
                i++;
                int d;
                d = j + week % 7;
                if (d == 0){
                    printf("\n");
                }

            }

        printf("\n");

    }


    return 0;
}
コード
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • cateye

    2019/04/12 12:38 編集

    京大 http://www.gi.ce.t.kyoto-u.ac.jp/user/susaki/c/for.htmlの課題(課題8)のようですが?・・・違いますか?
    もし課題なら自分で解きましょう。

    キャンセル

  • yoshiteru21

    2019/04/12 12:43

    そうです。課題として出されているのではなく、ネットで調べ、出てきたものを自分で解いているわけですが・・。
    こちらの問題がさっぱりわからず、質問している状況です。

    キャンセル

  • 退会済みユーザー

    2019/04/12 16:15

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 4

checkベストアンサー

+1

ものすごく久しぶりにC書いたのでガバガバコードです。
Spaceでなくタブ使ってるのでご自身でうまくやってください。

#include <stdio.h>
int main(void){
    // Your code here!
    int dayweek,days;
    int i,j;
    printf("カレンダーを表示させます。\n表示させたい月は何曜日から始まりますか?数字を入れてください\n");
    printf("0:日,1:月,2:火,3:水,4:木,5:金,6:土\n");
    scanf("%d",&dayweek);
    printf("何日間ある月ですか?\n");
    scanf("%d",&days);
    printf("日\t月\t火\t水\t木\t金\t土\n");

    int count;

    int first_week_days = 7 - dayweek;
    for(i=0; i<dayweek; i++){
      printf("\t");
    }
    for(i=0; i<first_week_days; i++){
      printf("%d\t",i+1);
      count = i+1;
    }
    printf("\n");

    while(1){
      for(i=0; i<7; i++){
        count++;
        printf("%d\t",count);
        if(days == count){
          goto END;
        }
      }
      printf("\n");
    }

    END:
      printf("\n");
      return 0;
}

追記

コード分かりやすくして、スペースにしました。
コメントで解説入れたので参考にしてください。

#include <stdio.h>
int main(void){
    // Your code here!
    int dayweek,days;
    printf("カレンダーを表示させます。\n表示させたい月は何曜日から始まりますか?数字を入れてください\n");
    printf("0:日,1:月,2:火,3:水,4:木,5:金,6:土\n");
    scanf("%d",&dayweek);
    printf("何日間ある月ですか?\n");
    scanf("%d",&days);
    printf("日 月 火 水 木 金 土 \n");

    //最初に一週間目の日付が当てはまらない曜日に空白を作る
    int i;
    for(i=0; i<dayweek; i++){
      printf("   ");
    }

    //次回出力予定の日にち
    int current_day = 1; //次に1日から出力したい
    //次回出力予定の曜日(0~6)が入る
    int current_dayweek = dayweek; //次に入力された曜日から出力したい

    //その月の日付と同じ回数回す
    do {
      printf("%2d ",current_day);

      current_day++; //次回出力予定の日数をインクリメント
      current_dayweek++; //次回出力予定の曜日をインクリメント

      //次回出力予定の曜日が 土+1 (カレンダーよりも右にはみ出た)場合の処理
      if(current_dayweek > 6){
        printf("\n");//改行を流して
        current_dayweek = 0; //日曜日に戻す
      }

    }while(current_day <= days); //次回の出力予定値が、入力された日数を超えたら終わり

    printf("\n"); //最後に改行入れといてあげる
    return 0;

}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/12 13:57

    ありがとうございました!
    ご参考にさせていただきます。

    キャンセル

+1

ヒントだけ。

  1. 月の始まりの曜日が決まると、「1日までに必要な空白の数」が分かります。
  2. カレンダーの一段は7日と決まっています
  3. カレンダーの出力の最後の日は入力で決まります

なので、「for文を使わずに書く」と、割と簡単に書けますよ。
※使うとしたら「日」のための1ループだけですね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

ちょっとひねり過ぎか?

usr ~/Project/test % ./a.out
カレンダーを表示させます
表示させたい月は何曜日から始まりますか?次の数字で答えてください
0:日,1:月,2:火,3:水,4:木,5:金,6:土
2
表示させたい月は何日ありますか?数字を入力してください
28
 日 月 火 水 木 金 土
        1  2  3  4  5
  6  7  8  9 10 11 12
 13 14 15 16 17 18 19
 20 21 22 23 24 25 26
 27 28
usr ~/Project/test % 


関数にしちゃってます^^;

#include <stdio.h>
#include <stdlib.h>
// 標準入力から文字列を読み込み数値に変換する
static int getNum()
{
    char buf[32];
    buf[31] = '\0';
    //
    fgets(buf, sizeof buf - 1, stdin);
    //
    return (int)strtol(buf, NULL, 10);
}
// カレンダー表示
static void putCal(int start, int num)
{
    //
    puts(" 日 月 火 水 木 金 土");
    //
    for (int i = 1; i <= start; i++) {
        printf("%2s", "   ");
    }
    //
    int d = start;
    for (int i = 1; i <= num; i++) {
        printf("%3d", i);
        d = (d + 1) % 7;
        if (d == 0) {
            putchar('\n');
        }
    }
    putchar('\n');
}
//
int main(void)
{
    //
    puts("カレンダーを表示させます");
    puts("表示させたい月は何曜日から始まりますか?次の数字で答えてください");
    puts("0:日,1:月,2:火,3:水,4:木,5:金,6:土");
    //
    int start = getNum();
    while (start < 0 || 6 < start) {
        fputs("0〜6の数字で指定して下さい", stderr);
        start = getNum();
    }
    //
    puts("表示させたい月は何日ありますか?数字を入力してください");
    int num = getNum();
    while (num < 28 || 31 < num) {
        fputs("28〜31の数字で指定して下さい\n", stderr);
        num = getNum();
    }
    //
    putCal(start, num);
    //
    return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

日付を0以下からカウントする方法もあります.

#include <stdio.h>

int main(void){
  int week, days;
  printf("カレンダーを表示させます\n");
  printf("表示させたい月は何曜日から始まりますか?次の数字で答えてください\n");
  printf("0:日,1:月,2:火,3:水,4:木,5:金,6:土\n");
  scanf("%d", &week);
  printf("表示させたい月は何日ありますか?数字を入力してください\n");
  scanf("%d", &days);

  printf("日 月 火 水 木 金 土\n");
  for(int i=1-week, j=1; i<=days; i++,j++) {
    if(i <= 0) printf("   ");
    else printf("%3d", i);
    if(j%7 == 0 || i == days) printf("\n");
  }
  return 0;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る