• ベストアンサー

干支のプログラム

西暦を入力すると干支が表示されるというプログラムを作りたいのですが、どうしても上手くいきません。どこが間違っているのでしょうか? #include <stdio.h> int main(){ int i, first, year; printf( "西暦を入力して下さい --> " ); scanf( "%d", &year ); first = ( year - 1900) if( first % 12 == 0 ) { i = "ねずみ"; if( first % 12 == 1 ) { i = "うし"; } if( first % 12 == 2 ) { i = "とら";  } if( first % 12 == 3 ) { i = "うさぎ"; } if( first % 12 == 4 ) { i = "たつ"; }  if( first % 12 == 5 ) { i = "へび"; } if( first % 12 == 6 ) { i = "うま"; } if( first % 12 == 7 ) { i = "ひつじ"; }  if( first % 12 == 8 ) { i = "さる"; }  if( first % 12 == 9 ) { i = "とり"; } if( first % 12 == 10 ) { i = "いぬ"; } if( first % 12 == 11 ) { i = "いのしし"; } printf( "%d どしです", i )    } } return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.10

亥(い)が落ちてしまっているものが多いですね。 数値以外のものや、1900未満が入力されると落ちるものもあるようです。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- #include <stdio.h> int main(void) { char buf[BUFSIZ]; int year; char *eto[] = { "子(ね)", "丑(うし)", "寅(とら)", "卯(う)", "辰(たつ)", "巳(み)", "午(うま)", "未(ひつじ)", "申(さる)", "酉(とり)", "戌(いぬ)", "亥(い)" }; while (1) { printf("西暦を入力して下さい --> "); if (fgets(buf, BUFSIZ, stdin) == NULL) { break; } if (sscanf(buf, "%d", &year) == 1 && year > 0) { printf("%s どしです\n", eto[(year + 8) % 12]); } } return 0; }

その他の回答 (10)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.11

>亥(い)が落ちてしまっているものが多いですね。 本当だ! 気がつきませんでした。 ご指摘ありがとうございます。 赤面(>_<)

回答No.9

>> 5 >システム上では、int型とchar*型はまったく同じ表現をするからです。  その保証はどこにもありません。環境に依存します。  sizeof(int) == sizeof(const char *)の時は動くでしょうけど、intが4バイトでポインタが 8バイトのシステムなどサイズが等しくない環境では破綻します。

  • nk2
  • ベストアンサー率23% (6/26)
回答No.8

BlueStonesさん、ご指摘ありがとうございました。 "文字列"がchar型の『ポインター』を示すことをすっかり忘れておりました。 いつもはstd::string型を使っているものですから。 どうも済みませんでした。m(__)m

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.7

//#6訂正 #include <stdio.h> int main(void){ int year; char *eto="子丑寅卯辰巳午未申酉戌"; short i; printf( "西暦を入力して下さい --> " ); scanf( "%d", &year ); i=((short*)eto)[(year-1900)%12]; printf( "%c%c どしです", i, i>>8); return 0; }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

#include <stdio.h> int main(void){ int year; char *eto="子丑寅卯辰巳午未申酉戌"; short i; printf( "西暦を入力して下さい --> " ); scanf( "%d", &year ); i=((short*)eto)[(year-1900)%12]; printf( "%c%c どしです", (0xFF)&i,(0xFF)&(i>>8)); return 0; }

回答No.5

まったくの余談ですが^_^; 実はint型に文字列を代入するのは システム上では問題はないのですよ。  int i = (int)"文字列";  printf("%s\n", i); と記述しても正常に動作します。 なぜ正常に動作するかというと、 システム上では、int型とchar*型はまったく同じ表現をするからです。 だからコンピュータは壊れません。 でも、こんな記述は絶対にやめてくださいね。 すべての型の意味がなくなってしまいますから・・・

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#include <stdio.h> int main(void){ int year; char *eto[]={ "子","丑","寅","卯","辰","巳","午","未","申","酉","戌"}; printf( "西暦を入力して下さい --> " ); scanf( "%d", &year ); printf( "%s どしです", eto[(year-1900)%12]); return 0; }

  • nk2
  • ベストアンサー率23% (6/26)
回答No.3

#include <stdio.h> int main() { int year; char* eto[] = { "ねずみ", "うし" , "とら" , "うさぎ" , "たつ" , "へび" , "うま" , "ひつじ" , "さる" , "とり" , "いぬ" , "いのしし" }; printf("西暦を入力して下さい->"); scanf("%d",&year); year -= 1900; year %= 12; if(0 < year && year < 12) printf("\n%s年です!",eto[year]); else printf("\nエラー:正当な西暦を入力してください:%d",year); } //---------------------------------------------------------- int i, i = "ねずみ"; int型にchar型を入れるのは止めてくださいよ。 コンピュータをぶっ壊すかも? コンパイラはエラーを吐かなかったのですか?

  • yeslets
  • ベストアンサー率31% (47/151)
回答No.2

まずは文字列を代入する変数がint型であること 次に以下の部分ですが・・・・ first = ( year - 1900) if( first % 12 == 0 ) { i = "ねずみ"; if( first % 12 == 1 ) { i = "うし"; } first= の行の最後にセミコロンがありません。 2番目のifの後に"}"がありません。 あと、間違いではないのですが、このような場合はifを使わずにswitchを使う方がスマートですね。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

i をint にしていますから、文字列定数へのアドレスを設定しているのは、おかしいです。 char *i; にして printf( "%s どしです", i ) にするといいかもしれません

関連するQ&A