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

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

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

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

Q&A

4回答

1949閲覧

C言語 if文の使い方が不安です。

audereestfacere

総合スコア6

C

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

0グッド

0クリップ

投稿2018/10/13 02:54

前提・実現したいこと

C言語 if文の正しい使い方が分かりません。
和暦 → 西暦 のプログラミングを作りたいのですが、
年号を入力してもらったあとに、年によって、存在し得るかを判定し、
存在したら「昭和30年は1955年です。」のように変換して表示し、
存在しない場合(例えば明治80年)などの場合は、「入力エラー」と表示されるようにしたい。

発生している問題・エラーメッセージ

if文の中にif文をいれたりして、作ってみましたが、
何を入れても入力エラーになってしまいます。

エラーメッセージ

プログラミング自体は動作しています。

該当のソースコード

C言語

1ソースコード

#include <stdio.h>
#include <string.h>

int main()
{
int wyear = -1, jyear = 0;
char m,t,s,h,kigo;
char nengo[16];

printf("和暦=>西暦の変換を行います。\n");
printf("年号を入力してください(明治=m 大正=t 昭和=s 平成=h):");
scanf("%c",&kigo);
printf("年を入力してください(例:11年→11):");
scanf("%d",&jyear);

if(kigo == m) {
strcpy(nengo,"明治");
if(jyear >=1 && jyear <=44) {
wyear = jyear + 1868 - 1;
}
} else if(kigo == t) {
strcpy(nengo,"大正");
if(jyear >=1 && jyear <=14) {
wyear = jyear + 1912 - 1;
}
} else if(kigo == s) {
strcpy(nengo,"昭和");
if(jyear >=1 && jyear <=63) {
wyear = jyear + 1926 - 1;
}
} else if(kigo == h) {
strcpy(nengo,"平成");
if(jyear >=1 && jyear <=62) {
wyear = jyear + 1989 - 1;
}
} else {
wyear = -1;
}

if(wyear == -1) {
printf("入力エラーです。\n");
} else {
printf("%s%d年は、西暦%d年です。\n",nengo,jyear,wyear);
}

}

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

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

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

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

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

guest

回答4

0

if ではなく変数と文字をごっちゃにしてますね。
それはともかく昭和 64 年は存在します。
明治 80 年も計算できた方が便利です。
次の元号もコンパイルし直さず計算できた方がいいですね。
和暦計算はややこしいので自分で実装するよりライブラリを探して使うのがいいと思います。

投稿2018/10/13 03:00

Zuishin

総合スコア28660

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

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

audereestfacere

2018/10/13 05:24

回答ありがとうございます。 勉強不足を実感しました。 たしかに明治80年を計算して西暦にあてはめたりできれば、より便利になりますね。 そんな発想はありませんでした。勉強になります。 今回和暦計算に挑戦したのは勉強のためです。 最後に質問なのですが、今回の場合kigoというのは、システム利用者がmやsを入力したりで、何をいれるかが変わるので、変数で文字だからcharにしたのですが、この考えは間違っているのでしょうか。 m,t,s,hをcharでおく必要がないことは理解できました。 よろしければ教えていただけませんか。
Zuishin

2018/10/13 09:09

間違っていません。 間違っているのは他の回答にもあるように、kigo == m というところです。 こうすると、m という変数に何が入っているかによって結果が変わってきます。 kigo に 'm' が入っていて m に 's' が入っていれば kigo == m は 'm' == 's' となり、偽となりますが、kigo に 'm' が入っていて m に 'm' が入っていれば kigo == m は真となります。 このソースの場合は m が初期化されていないので kigo == m が意味のない比較になっています。 kigo == 'm' のように変数と文字リテラルの比較として書くか、あらかじめ const char m = 'm' と初期化することで意味のある比較になります。
audereestfacere

2018/10/13 12:49

ありがとうございます。 とても分かりやすく、納得できました。 kigo == 'm'の形にしたらうまくいきました。 const char m = 'm' でしているように const っていうのはまだ使ったことがないので、 勉強して使えるようにしたいと思います。 ありがとうございました。
Zuishin

2018/10/13 13:11

const はつけてもつけなくても動作は同じです。 ただし const をつけると変数への再代入ができなくなります。 次のコードはエラーになります。 const int i = 0; i++; const はそれが定数であり、変化しないことを読む人に明示するキーワードです。 可読性を上げるために使います。
guest

0

年号の記号の判定文ですが、入力は文字(mtsh)なので、文字定数と比較する必要があります。なので、例えば明治のmとの比較の場合は

C

1if(kigo == m)

ではなく、

C

1if(kigo == 'm')

となります。
m,t,s,hを変数で用意しているようですが、これは無意味です(実際値の設定もされていませんよね)。
初期化もされていないので、ゴミと比較してるんですね。そのためどれとも一致していないので入力エラーとされるわけです。

投稿2018/10/13 03:03

archiver

総合スコア1557

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

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

audereestfacere

2018/10/13 05:17

回答ありがとうございます。 自分はまだ変数などをしっかり理解できていなかったみたいです。 m,r,s,hを変数で用意する必要がない というのは理解できました。 そこで、int wyear = -1, jyear = 0; char kigo; char nengo[16]; このようにし、archiverさんにご指摘があったように。"m"のようにif文を治してコンパイルしたところ、 comparison between pointer and integer というエラーがでました。 このエラーについて調べてみると、整数とポインタ型の変数の比較をしているために出るエラーということがわかりましたが、どういうことか理解できません。 もしよろしければ、自分のコードでは、どこがおかしいのか教えていただけませんでしょうか。 初歩的な質問で申し訳ありません。
archiver

2018/10/13 05:45

ちょっと今、外に出てるんで、帰ったら見てみますね。 #多分、夜になると思います。
audereestfacere

2018/10/13 12:52

LouiS0616さん 回答ありがとうございます。 ダブルクオテーションとシングルクオテーションが違うだけでうまくいかないことがあるとはしりませんでした。 今まですべてダブルクオテーションを使っていたんですが、文字一文字のときはシングルクオテーションにする。 などという決まりがあったのですね。 もっと勉強したいと思います。 archiverさん お忙しい中ありがとうございます。 おかげさまで、意味を理解したうえで解決することができました。 ありがとうございました。
archiver

2018/10/13 13:15

LouiS0616さん 代わりに回答していただきありがとうございます。 audereestfacereさん C言語の学習はまだ始めたばかりと言ったところでしょうか。C言語には様々なデータ型とそれに合わせた書き方等もあります。そこは徐々に学習していけばいいと思います。焦らずにきっちりと基礎を固めながら学習を進めていってください。 ちなみに、ダブルコーテーションで囲んだ場合「文字列データ」というものになります。どういったデータかは学習を進めていくうちに登場してくるでしょう。そこで押さえておけばいいです。
guest

0

C

if(kigo == m) {

変数mではなく『文字m』と比較せねばなりません。

C

1if(kigo == 'm') {

他の部分も同様です。

コードの書き方について

teratailには、コードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
C

投稿2018/10/13 02:57

編集2018/10/13 02:58
LouiS0616

総合スコア35660

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

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

0

C++で作成した西暦から和暦に変換するプログラムです。

cpp

1 2#include <iostream> 3#include <string> 4#include <sstream> 5#include <tuple> 6#include "DateTime.hpp" 7 8int date_format(int y, int m, int d) 9{ 10 return y * 10000 + m * 100 + d; 11} 12 13int is_first_year(int y) 14{ 15 if (y == 1) 16 return 1; 17 else 18 return 0; 19} 20 21std::string MonthDay(int m, int d) 22{ 23 std::stringstream ss; 24 ss << m << "月"; 25 ss << d << "日"; 26 return ss.str(); 27} 28 29std::string ToJapaneseEraYear(int y, int m, int d) { 30 std::stringstream ss; 31 enum GengoType { Meiji, Taisho, Showa, Heisei, Reiwa } type; 32 enum { Gannen, Nen }; 33 const char* name[] = { "明治", "大正", "昭和","平成", "令和" }; 34 const char* gannen[] = { "元年", "年" }; 35 36 int target = date_format(y, m, d); 37 static int result, ad; 38 39 ad = y; 40 41 if (target >= date_format(1868, 1, 25) && target <= date_format(1912, 7, 29)) { 42 type = Meiji; 43 result = calc_year(y, Meiji); 44 if (is_first_year(result) == 1) { 45 ss << ad << "年(" << name[type] << gannen[Gannen] << ")" << MonthDay(m, d); 46 } 47 else { 48 ss << ad << "年(" << name[type] << result << gannen[Nen] << ")" << MonthDay(m, d); 49 } 50 } 51 else if (target >= date_format(1912, 7, 30) && target <= date_format(1926, 7, 30)) { 52 type = Taisho; 53 result = calc_year(y, Taisho); 54 if (is_first_year(result) == 1) { 55 ss << ad << "年(" << name[type] << gannen[Gannen] << ")" << MonthDay(m, d); 56 } 57 else { 58 ss << ad << "年(" << name[type] << result << gannen[Nen] << ")" << MonthDay(m, d); 59 } 60 } 61 else if (target >= date_format(1926, 12, 25) && target <= date_format(1989, 1, 7)) { 62 type = Showa; 63 result = calc_year(y, Showa); 64 if (is_first_year(result) == 1) { 65 ss << ad << "年(" << name[type] << gannen[Gannen] << ")" << MonthDay(m, d); 66 } 67 else { 68 ss << ad << "年(" << name[type] << result << gannen[Nen] << ")" << MonthDay(m, d); 69 } 70 } 71 else if (target >= date_format(1989, 1, 8) && target <= date_format(2019, 4, 30)) { 72 type = Heisei; 73 result = calc_year(y,Heisei); 74 if (is_first_year(result) == 1) { 75 ss << ad << "年(" << name[type] << gannen[Gannen] << ")" << MonthDay(m, d); 76 } 77 else { 78 ss << ad << "年(" << name[type] << result << gannen[Nen] << ")" << MonthDay(m, d); 79 } 80 } 81 else if (target >= date_format(2019, 5, 1)) { 82 type = Reiwa; 83 result = calc_year(y, Reiwa); 84 if (is_first_year(result) == 1) { 85 ss << ad << "年(" << name[type] << gannen[Gannen] << ")" << MonthDay(m, d); 86 } 87 else { 88 ss << ad << "年(" << name[type] << result << gannen[Nen] << ")" << MonthDay(m, d); 89 } 90 } 91 return ss.str(); 92} 93 94std::ostream& operator<<(std::ostream& stream, const Date& date) 95{ 96 int y = std::get<0>(date); 97 int m = std::get<1>(date); 98 int d = std::get<2>(date); 99 auto ret = ToJapaneseEraYear(y, m, d); 100 return stream << ret; 101} 102 103std::ostream& operator<<(std::ostream& stream, const Time& time) 104{ 105 return stream 106 << std::get<0>(time) << "時" 107 << std::get<1>(time) << "分" 108 << std::get<2>(time) << "秒"; 109} 110 111int calc_year(int year, int type) 112{ 113 int ret; 114 switch (type) { 115 case 0: // 明治 116 ret = year + 33 - 1900; 117 break; 118 case 1: // 大正 119 ret = year - 11 - 1900; 120 break; 121 case 2: // 昭和 122 ret = year - 25 - 1900; 123 break; 124 case 3: // 平成 125 ret = year + 12 - 2000; 126 break; 127 case 4: // 令和 128 ret = year - 18 - 2000; 129 break; 130 } 131 return ret; 132} 133 134int calc_JapaneseEraToAD(int type, int y) 135{ 136 int ret; 137 switch (type) { 138 case 0: // 明治 139 ret = y - 33 + 1900; 140 break; 141 case 1: // 大正 142 ret = y + 11 + 1900; 143 break; 144 case 2: // 昭和 145 ret = y + 25 + 1900; 146 break; 147 case 3: // 平成 148 ret = y - 12 + 2000; 149 break; 150 case 4: // 令和 151 ret = y + 18 + 2000; 152 break; 153 } 154 return ret; 155}

投稿2019/12/20 14:17

naohiro19_

総合スコア178

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問