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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

4回答

4025閲覧

c言語 1月1日からの日数と月名の計算

baji_13

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/11/15 02:04

質問閲覧ありがとうございます。

高校の課題で「入力した文字が、1月1日から数えて何月の何日であるか」を出力する課題が出ました。

例えば、1月1日から85日目の場合は、85-days[0]→54-days[1]という風に3月26日になり、mnt[2]のMarを表示するという考え方は理解できるのですが、プログラムがあまりよく分かりません。

アドバイス等いただけたら幸いです。m(_ _)m

c

1#include <stdio.h> 2 3int main() 4{ 5 char *p_mnt[] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","sep","Oct","Nov","Dec"}; 6 int days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; 7 int date; 8 9 printf("1月1日からの日数を入力してください:"); 10 scanf("%d",&date); 11 12 if (date<1 || date>365){ 13 printf("\n正しい日付を入力してください"); 14 } else { 15 printf("\n%d日目は、%sの%s日です。\n",date,p_mnt[date - days[1]]); 16 } 17}

<出力結果>
1月1日からのに数を入力してください:
200日目は、(null)の(null)です。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/11/15 02:48 編集

[推奨していない質問] https://teratail.com/help/avoid-asking > 何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。 ていうか、高校の課題なら何故先生に聞かないの?
baji_13

2021/11/15 03:00

申し訳ありません。 自分のクラスの担任は聞いても、アドバイスをいただけません(課題に限り)。 また、この課題が完成できていないと大幅原点となるため質問してしまいました。 以後はなるべくこのような質問はしないで生きたいです。
Zuishin

2021/11/15 03:36

授業をろくに聞かずネットで解決しようというのは減点が正しい評価だと思う。
jimbe

2021/11/15 04:04

> 考え方は理解できるのですが、プログラムがあまりよく分かりません。 この、「あまりよく」の部分をご自分でどこまで掘り下げられるか、です。 そして、掘り下げられていないと「何が分からないのか」が他人には分からないので、結局全部書いて見せる=カンニング状態となってしまい、アドバイスになりません。 「飛行機が何故飛べるのかは分かるけれど紙飛行機は作れない」としたら何故なのか…紙の折り方(山折り谷折り)が分からない? 紙の折り順が分からない? 折り方を説明した文章・図(の一部)が読めない? ・・・さて、何故でしょうか。
dodox86

2021/11/16 00:59

いくつもの回答をいただいている状況で質問者さん本人のコメントがぱったりなので分かりませんが、「考え方は(なんとなく)分かる」けど、「具体的なC言語のコード」は自力ではまったく思い浮かばないということではないかな、と。提示のコードは、実は問題文としてもともと書かれていたものではありませんか。これを元に追加、修正せよ、という課題とか。
guest

回答4

0

85-days[0]→54-days[1]という風に3月26日になり、mnt[2]のMarを表示する

それをそのまま。

C

1#include <stdio.h> 2 3int main() { 4 //配列のインデックスを1から使えるように小細工 5 char *p_mnt[] = {"", "Jan", "Feb", "Mar", "Apr", "May", "Jun", 6 "Jul", "Aug", "sep", "Oct", "Nov", "Dec"}; 7 int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 8 int date; 9 int m = 0; //検査する月 10 11 printf("1月1日からの日数を入力してください:"); 12 scanf("%d", &date); 13 14 if (date < 1 || date > 365) { 15 printf("\n正しい日付を入力してください"); 16 } else { 17 int inDate = date; 18 date -= days 19 [m]; // days[0]を0にしてあるので無駄といえば無駄だけど、後と同じ書き方にできる... 20 m += 1; // mは1になる。さあ、1月を調べよう 21 if (date > days[m]) { // 1月の日数を超えてる? なら2月以降 22 date -= days[m]; // date-1月の日数 23 m += 1; // 2月を調べよう 24 if (date > days[m]) { // 2月と3月以降を選り分け 25 date -= days[m]; // date-2月の日数 26 m += 1; 27 if (date > days[m]) { 28 //規則性はわかりましたね? 書くのが面倒なので略 29 } 30 } 31 } 32 printf("\n%d日目は、%sの%d日です。\n", inDate, p_mnt[m], date); 33 } 34 return 0; 35}

なんていうのはどうだろう。まぁ、これを見るとループにしたくなる人も多いでしょうけれど。

多分、

85-days[0]→54-days[1]という風に3月26日になり

ここをなんとなくわかったつもりになって「いう風」としか言えないから、プログラムに書けないんじゃないだろうか。その作業を完全に日本語に落としきってみれば、そこからプログラムにするのは意外と近いんじゃないかと思うけど。

投稿2021/11/15 16:44

thkana

総合スコア7703

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

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

0

まずは、あなたが手計算で、日数から月日を出すにはどうするのか、を考えましょう
その手順をきっちり言語化して、それをコードに変えていけばいいのです

投稿2021/11/15 05:48

y_waiwai

総合スコア88042

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

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

0

動くコードに、落第点をつける教官はいませんので、

C

1#include <stdio.h> 2#include <time.h> 3 4int main() 5{ 6 const char *p_mnt[] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","sep","Oct","Nov","Dec"}; 7 int date; 8 9 printf("1月1日からの日数を入力してください:"); 10 scanf("%d",&date); 11 12 if (date<1 || date>365){ 13 printf("\n正しい日付を入力してください"); 14 } else { 15 struct tm t2 = {0, 0, 0, 2, 0, 70}, t3 = {0, 0, 0, 3, 0, 70}, t4 = {0, 0, 0, 1, 0, 71}; 16 time_t sec = (date-1) * (mktime(&t3) - mktime(&t2)) + mktime(&t4); 17 struct tm t = *gmtime(&sec); 18 printf("\n%d日目は、%sの%d日です。\n",date,p_mnt[t.tm_mon],t.tm_mday); 19 } 20}

こんなコードを。
分からないときは、「日付」「C言語」など、適切なキーワードでggり、調べましょう。大抵の問題は、先人がライブラリという形で解決してくれています。調査すら怠るようでは、丸投げと言われても仕方ないですよ。

追記:移植性がなかったため修正。

投稿2021/11/15 03:43

編集2021/11/16 14:42
majiponi

総合スコア1722

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

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

0

85-days[0]→54-days[1]という風に…

これをもうちょっと具体的な話に纏めること.


  • 入力が85 → 1月の日数 days[0] よりも多いので,引く.
  • 残りは54 → 2月の日数 days[1] よりも多いので,また引く.
  • 残りは…

としていって,ある時点での残りが X月の日数 以下のとき,答えが定まる.


みたく.

そしたら,その通りにコードを書けばいい.
前記の手続きを本当に愚直に書くなら
「残りがX月の日数よりも多いかどうか」的な条件判断処理を 11個か12個か,そのくらい書き連ねてやればよかろう.

同じようなのをたくさん書くのが 嫌だ とか なんかかっこ悪い とか何とか言い出すのは,まずは愚直な実装でできてからにすると良かろう.

投稿2021/11/15 02:25

fana

総合スコア11996

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

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

fana

2021/11/15 03:48

> アドバイス っぽく言うなら,こう↓だ. ・どういう手続きを実装すればよいのか ・その手続きをどのような形のコードとして実装するのか の2つを同時に相手にするのが困難なのであれば,各個撃破せよ. まずは(後者側に関してこだわり等は捨てて),とにかく前者側の手続きを動かしてみることができる物を用意する. →これで動作確認する.動作結果がまともであれば,前者側はクリアできている. →そしたらあとは後者側だけの話だ.同じ動作結果を生じるより良い実装形態をいくらでも好きなだけ模索すればよい.
fana

2021/11/15 04:03

実装形態として{スマート,短い,処理が早い,使用メモリが少ない,etc...}なコードをいきなり書いたとしても,妥当な動作結果が伴わなければそのコードには何の意味もない(課題提出できない). 多少不格好だろうが妥当に動くものをとにかく手元に確保したならば,提出期限の時点ではとにかく何かしらの動くものを提出できる. より良い実装形態の模索が期限内に最後まで行き着かなかったとしても,その時点での妥当に動くコードの最新版を提出すればよい.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問