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

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

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

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

プログラミング言語

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

C++

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

Q&A

4回答

3947閲覧

C言語で生年月日から干支・星座・誕生石の判定

myo_3030

総合スコア6

C

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

プログラミング言語

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

C++

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

0グッド

0クリップ

投稿2018/09/07 05:30

前提・実現したいこと

緊急です。
C言語で
生年月日(西暦年、月、日)を⼊⼒して
◦誕生年から 干支(申、酉、戌、亥、子、丑、寅、卯、辰、巳、午、未)
◦誕生月から 誕生石(例:10月オパール)
◦誕生月日から 星座を表示するプログラムを作成したいのですが、
どなたか答えを教えていただきたいです・・・

一応自分でやってもみたのですが、正直めちゃくちゃでここからどうしてよいかわかりません。

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

エラーメッセージ

該当のソースコード

C

1#include<stdio.h> 2int main(void) 3{ 4 char buf[BUFSIZ]; 5int month,year; 6 7char *eto[] = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"}; 8char *jewel[]={"ガーネット","アメジスト","アクアマリン","ダイヤモンド","エメラルド","パール","ルビー","ペリドット","サファイア","オパール","トパーズ","ターコイズ"}; 9char *szs[] = {"山羊座", "水瓶座", "魚座", "牡羊座", "牡牛座", "双子座", "蟹座", "獅子座", "乙女座", "天秤座","蠍座", "射手座"}; 10 11printf("誕生月を入力してください>>"); 12scanf("%d",&month); 13 14while(1){ 15 if(month>=1&&month<=12)printf("あなたの誕生石は>> %s.\n",jewel[month-1]); 16 17 {printf("西暦を入力して下さい --> ");} 18 19else if (fgets(buf, BUFSIZ, stdin) == NULL) { 20break; 21} 22if (sscanf(buf, "%d", &year) == 1 && year > 0) { 23printf("%s どしです\n", eto[(year + 8) % 12]); 24} 25} 26//else printf("Input error.\n"); 27 28return 0; 29}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答4

0

記載されてるのではコンパイルエラー出ると思います
とりあえずあまり効率やら正確な入力チェックなど気にせずにさくっと

C

1#include<stdio.h> 2int main(void) 3{ 4 char buf[BUFSIZ]; 5 int day, month, year; 6 7 char *eto[] = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"}; 8 char *jewel[] = {"ガーネット","アメジスト","アクアマリン","ダイヤモンド","エメラルド","パール","ルビー","ペリドット","サファイア","オパール","トパーズ","ターコイズ"}; 9 char *szs[] = {"山羊座", "水瓶座", "魚座", "牡羊座", "牡牛座", "双子座", "蟹座", "獅子座", "乙女座", "天秤座","蠍座", "射手座"}; 10 11 printf("誕生年を入力してください>>"); 12 scanf("%d", &year); 13 14 printf("誕生月を入力してください>>"); 15 scanf("%d", &month); 16 17 printf("誕生日を入力してください>>"); 18 scanf("%d", &day); 19 20 printf("あなたの干支は>> %s.\n", eto[(year + 8) % 12]); 21 22 if(month >= 1 && month <= 12) { 23 printf("あなたの誕生石は>> %s.\n", jewel[month - 1]); 24 25 if(day >= 1 && day <= 31) { 26 int idx = 0, wk = month * 100 + day; 27 // 配列作って回したほうがいいけど 28 if(wk >= 121 && wk <= 219) { 29 idx = 1; 30 } 31 else if(wk >= 220 && wk <= 320) { 32 idx = 2; 33 } 34 else if(wk >= 321 && wk <= 420) { 35 idx = 3; 36 } 37 else if(wk >= 421 && wk <= 521) { 38 idx = 4; 39 } 40 else if(wk >= 522 && wk <= 621) { 41 idx = 5; 42 } 43 else if(wk >= 622 && wk <= 723) { 44 idx = 6; 45 } 46 else if(wk >= 724 && wk <= 823) { 47 idx = 7; 48 } 49 else if(wk >= 824 && wk <= 923) { 50 idx = 8; 51 } 52 else if(wk >= 924 && wk <= 1023) { 53 idx = 9; 54 } 55 else if(wk >= 1024 && wk <= 1122) { 56 idx = 10; 57 } 58 else if(wk >= 1123 && wk <= 1222) { 59 idx = 11; 60 } 61 printf("あなたの星座は>> %s.\n", szs[idx]); 62 } 63 } 64 return 0; 65}

投稿2018/09/07 06:02

rururu3

総合スコア5545

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

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

myo_3030

2018/09/07 06:23

素早い回答ありがとうございます・・!! int idx = 0, wk = month * 100 + day; // 配列作って回したほうがいいけど if(wk >= 121 && wk <= 219) { idx = 1; } 以下のところは、何をどう計算しているのか、今後のためにもよろしかったらぜひ教えていただきたいです。
yukihisa

2018/09/07 06:32

いて座は12/21までなので、最後の分岐は wk <= 1221 です。 他の星座は正直わからんです・・・たぶんあってる! monthに100かけて見た目上「月日」の形に直しているのです。 1/21ならmonth=1、day=21なので、1*100+21=121という感じで。 あとは各星座の開始日、終了日と比較ですね。
rururu3

2018/09/07 06:39

文字列比較はややこしいので数字比較するため wk = month * 100 + day で4桁の数字にしてます(MMDD) 121は1月21日 219は2月19日 を表します
yukihisa

2018/09/07 06:48

rururu3 様 なんてこった・・・ 実は僕の誕生日がいて座の最終日(12/21)でして。 さすがに子供のころからそれで通しているので間違ってはいないはず・・・っ!と検索してみましたがやっぱり12/21で間違いなさそうです。 たまたま見たサイトが間違っていたようですね。。。
yukihisa

2018/09/07 07:17

なん・・・だと・・・ なるほど、厳密には結構前後するんですね。 現在の射手座最終日は12/20~12/21の間のようですね。 ・・・とはいえ色々表記が違うサイトがあるので正確なのがわからない。。。 他の星座も同じようにずれるとしたらめんどくさいなぁ・・・ 質問者様、むちゃくちゃ脱線して申し訳ない。
pepperleaf

2018/09/07 12:07

脱線ついで、 星座は、所定の計算式に基づいて決定され、年毎に異なり、正確には、時間で切られます。ただ、そこまで気にする人は少ないかも。 ちなみに冥王星が惑星から脱落した時も一騒ぎあった筈。
guest

0

入力を勝手に変えてみました。

#include <stdio.h> int main(){ int birth; char *eto[] = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"}; char *jewel[] = {"ガーネット","アメジスト","アクアマリン","ダイヤモンド","エメラルド","パール","ルビー","ペリドット","サファイア","オパール","トパーズ","ターコイズ"}; char *szs[] = {"山羊座", "水瓶座", "魚座", "牡羊座", "牡牛座", "双子座", "蟹座", "獅子座", "乙女座", "天秤座","蠍座", "射手座"}; int data[12] = {121,220,321,421,522,622,724,824,924,1024,1123,1223}; printf("生年月日を入力してください(例: 19800202)\r\n"); scanf("%d",&birth); printf("あなたの干支は>> %s.\r\n", eto[(birth/10000 + 8)%12]); printf("あなたの誕生石は>> %s.\r\n", jewel[(birth % 10000)/100]); int indx = 0; for(int i=0;i<11;i++){ if(birth%10000 >= data[i] && birth%10000 < data[i+1]){ indx = i + 1; } } printf("あなたの星座は>> %s.\r\n",szs[indx]); }

投稿2018/11/02 04:32

YOshim

総合スコア1085

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

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

0

星座は表示しないほうがいいのでは?
毎年少し変わるので。
まあ、大体でいいのであれば入れてもいいかもしれませんが。

投稿2018/09/12 22:33

PingHermit

総合スコア478

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

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

0

こんにちは、星座を判定するところですが、
その星座の月日の範囲のデータを配列に格納させ,for文で回しながら判定しました。

また、入力のところは危険なscanf関数よりもfgetsをお勧めします。
ちなみに文字列をint型の変数に変換する関数はatoiがありますが、そちらも不安定は関数なので
より厳格な関数strtolを用いて実装しました。

C

1#include <stdio.h> 2#include <stdlib.h> 3 4#define BUFSIZE 256 5 6int main(void) 7{ 8 char buf[BUFSIZE]; 9 int day, month, year; 10 11 char *eto[] = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"}; 12 char *jewel[] = {"ガーネット","アメジスト","アクアマリン","ダイヤモンド","エメラルド","パール","ルビー","ペリドット","サファイア","オパール","トパーズ","ターコイズ"}; 13 char *szs[] = {"山羊座", "水瓶座", "魚座", "牡羊座", "牡牛座", "双子座", "蟹座", "獅子座", "乙女座", "天秤座","蠍座", "射手座"}; 14 int data[12] = {121,220,321,421,522,622,724,824,924,1024,1123,1223}; 15 int idx = 0; 16 int wk; 17 int i; 18 printf("誕生年を入力してください>>"); 19 fgets(buf,sizeof(buf),stdin); 20 year = strtol(buf,NULL,10); 21 22 printf("誕生月を入力してください>>"); 23 fgets(buf,sizeof(buf),stdin); 24 month = strtol(buf,NULL,10); 25 26 printf("誕生日を入力してください>>"); 27 fgets(buf,sizeof(buf),stdin); 28 day = strtol(buf,NULL,10); 29 30 printf("あなたの干支は>> %s.\n", eto[(year + 8) % 12]); 31 32 printf("あなたの誕生石は>> %s.\n", jewel[month - 1]); 33 34 wk = month * 100 + day; 35 36 for(i = 0; i < 11; i++){ 37 if(data[i] <= wk && wk <= data[i + 1] - 1){ 38 idx = i + 1; 39 } 40 } 41 printf("あなたの星座は>> %s.\n", szs[idx]); 42 43 44 return 0; 45}

投稿2018/09/07 09:25

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問