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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1784閲覧

C++で書いた15日後の日付を出すプログラムをC言語に書き換えたいです。

Domyyyy

総合スコア4

C

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/09/17 04:03

C++で書いたこのコードをC言語に書き換える場合、classやオペレーターに代わる簡潔な書き方を教えていただきたいです。

C++

1#include <iostream> 2 3//y年がうるう年か判定する関数 4bool is_leap_year(int y) 5{ 6 return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0; 7} 8 9//y年m月に含まれる日数を計算する関数 10int num_days_in_month(int y, int m) 11{ 12 int days = 0; 13 if (is_leap_year(y) == true && m == 2) 14 { //うるう年で2月のとき 15 days = 29; 16 } 17 else if (is_leap_year(y) == false && m == 2) 18 { //うるう年ではない2月 19 days = 28; 20 } 21 else if (m == 4 || m == 6 || m == 9 || m == 11) 22 { //4月、6月、9月、11月のとき 23 days = 30; 24 } 25 else 26 { //上記以外 27 days = 31; 28 } 29 return days; 30} 31 32//日数を表現するクラス 33struct Date 34{ 35 int years; //年 36 int month; //月 37 int day; //日 38 39 //日付をn日進める関数 40 void advance(void) 41 { 42 day += 15; 43 while (day > num_days_in_month(years, month)) 44 { //その月の日数よりdayが小さくなるまで繰り返す(dayは減っていく) 45 day -= num_days_in_month(years, month); 46 if (++month > 12) 47 { //12月までいったら1月に戻る 48 years++; 49 month = 1; 50 } 51 } 52 } 53}; 54 55//Dateに対する入力用の演算子 56std::istream &operator>>(std::istream &in, Date &d) 57{ 58 in >> d.years >> d.month >> d.day; 59 return in; 60} 61 62//Dateに対する出力用の演算子 63std::ostream &operator<<(std::ostream &out, Date d) 64{ 65 out << d.years << "年" << d.month << "月" << d.day << "日"; 66 return out; 67} 68 69int main() 70{ 71 Date d; //日付クラス 72 int n; //n日後 73 Date day; 74 std::cout << "日付を入力してください\n"; 75 std::cin >> d; 76 //std::cout<<"何日後ですか n:\n"; 77 //std::cin>>n; 78 79 std::cout << d << "の15日後は"; 80 d.advance(); 81 std::cout << d << "です\n"; 82 83 return 0; 84} 85

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

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

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

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

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

m.ts10806

2020/09/17 04:10

Cは直接関係しますか? <質問タグ
Domyyyy

2020/09/17 04:14

Cに書き換えたほうが簡潔ならCに書き換えたいと思い質問させていただきました。 それよりもオペレーターやクラスに代わる書き方をしてC++でも簡潔に書き表せるのならその方法も教えていただきたいと思った次第です。
Domyyyy

2020/09/17 04:16

Cの質問タグは取り消したほうがよろしいのでしょうか?
m.ts10806

2020/09/17 04:20

現在のコードにおける問題を明示された方が良いかとは思いますが(なんか丸投げっぽいし)、関係するかしないかで決めたら良いかと。 書かれてないことは伝わらないので、提示コードと直接関係ないのであれば、タグをつけた意図もあったほうが良いかと思います。 ※私自身は「プログラミング言語」のみタグ登録しているユーザーなので直接のアドバイスは難しいですが
m.ts10806

2020/09/17 04:34

あ、すみません。読み違えました。 「C言語に書き換えたい」とタイトルにありましたね。 いずれにしても、まず自身がやってみることからと思います。質問内容から、特に何も試してなく、問題も起きてないので。
Domyyyy

2020/09/17 04:36

自分なりに書き換えて実行したのですが、エラー文が出ました。なぜお伝えしたのかというと丸投げだととらえているようだからです。なぜ載せていないのかというと、エラー文がかなりの量で、回答していただける方が拝見した際に、見づらくなってしまうのではという可能性を考えたからです。確かに、そうとらえる方もあなたのようにいらっしゃると思うので追記しておこうと思います。何分最近こちらのサイトを利用し始めたので質問の仕方に多少不備があることはご了承ください。ご指摘ありがとうございました。もしまた質問に不備がありましたら、助言をくださるとうれしいです。
m.ts10806

2020/09/17 04:44

何もないよりあったほうが良いですよ。 なければ見づらい云々すら判断できないわけですから。 エラーはひとまず一部抜粋としてコードだけでも全部提示した方が良いです。
Domyyyy

2020/09/17 04:50

細やかなところまでのご指示ありがとうございます。
m.ts10806

2020/09/17 04:50

質問は編集できますので。
Domyyyy

2020/09/17 04:55

ありがとうございます。
guest

回答3

0

そのまんまのコードでCでコンパイルして、エラー出たところを修正していけばどうでしょう

投稿2020/09/17 04:24

y_waiwai

総合スコア88042

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

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

0

ベストアンサー

Cに書き換えたほうが簡潔ならCに書き換えたいと思い質問させていただきました。

おそらく、簡潔にはなりません

C言語には「文字列」というデータ型がなく、文字列は文字の配列やポインタとして扱う必要があります。

cout << objのようなカスタム型を、標準のストリームへ簡単に出力するような仕組みは作れず、「専用の出力関数を用意して、それを呼ぶ」形となります。

投稿2020/09/17 04:35

maisumakun

総合スコア146018

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

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

Domyyyy

2020/09/17 04:47

なるほど、この方法のままが一番ベストなのかもしれませんね、ありがとうございます。
guest

0

C++ のコードを C で書き換えたいだけですよね。

C

1#include <stdio.h> 2 3int is_leap_year(int y) 4{ 5 return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0); 6} 7 8int num_days_in_month(int y, int m) 9{ 10 static int t[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; 11 return m==2 ? 28 + is_leap_year(y) : t[m-1]; 12} 13 14typedef struct Date 15{ 16 int year; 17 int month; 18 int day; 19} Date; 20 21void advance(Date *d, int n) 22{ 23 d->day += n; 24 while (d->day > num_days_in_month(d->year, d->month)) { 25 d->day -= num_days_in_month(d->year, d->month); 26 if (++d->month > 12) { 27 d->year++; 28 d->month = 1; 29 } 30 } 31} 32 33int getDate(FILE *fp, Date *d) 34{ 35 return fscanf(fp, "%d%d%d", &d->year, &d->month, &d->day) == 3; 36} 37 38void putDate(FILE *fp, const Date *d) 39{ 40 fprintf(fp, "%d年%d月%d日", d->year, d->month, d->day); 41} 42 43int main(void) 44{ 45 Date d; 46 puts("日付を入力してください"); 47 getDate(stdin, &d); 48 49 int n; 50 printf("何日後ですか: "); 51 scanf("%d", &n); 52 53 putDate(stdout, &d), printf("の15日後は"); 54 advance(&d, n); 55 putDate(stdout, &d), puts("です"); 56}

追記
advance(&d, 15); となっていたのを advance(&d, n); に変更しました。

投稿2020/09/19 01:52

編集2020/09/19 05:23
kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問