• ベストアンサー

干支のプログラム

西暦を入力すると干支が表示されるというプログラムを作りたいのですが、どうしても上手くいきません。どこが間違っているのでしょうか? #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

  • 閏年のプログラム

    C言語(閏年)の質問です。 任意の範囲の年から閏年の表示とその数をカウントして次の実行結果のように表示するプログラムの作成で途中まではわかって修正・追加する箇所があったら一緒に教えてください。(ここでは2つの年をmain関数内で入力し、その範囲の西暦を引数とする関数checkYearを使用するものとする。int型の関数checkYearは、引数に西暦をとり、その西暦が閏年であれば、1を返し、閏年でない場合は0を返す。) なお、閏年の判定方法は以下のとおりである。 条件1 西暦年が4で割り切れる年は閏年である 条件2 条件1を満たしていても、西暦年が100で割り切れるときは閏年でない 条件3 条件2を満たしていても、西暦年が400で割り切れるならば閏年である 実行例1 西暦を入力:2000 西暦を入力:2009 2000年 2004年 2008年 閏年は3回あります。 実行例2 西暦を入力:2100 西暦を入力:2000 2000年 2004年 2008年 2012年 2016年 2020年 (省略) 2096年 閏年は25回あります。 実行例3 西暦を入力:2090 西暦を入力:2110 2092年 2096年 2104年 2108年 閏年は4回あります。 #include <iostream> bool checkYear(int year); int main() { int year; int year2; printf("西暦を入力:"); scanf("%d",year); printf("西暦を入力:"); scanf("%d",year2); int count = 0; for (int i = year; i < year2; i++) { if (checkYear(i)) { printf("%d年\n"); count++; } } printf("閏年は%d回です。\n"); return 0; } bool checkYear(int year) { return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0); }

  • 干支についてです。

    干支の話をしていた時にふと疑問に思っただけなので暇な時に回答いただければと思います。 ねずみ・うし・とら・うさぎ・たつ・へび・うま・ひつじ・さる・とり・いぬ・いのしし なぜ空想の動物(?)が一種類混ざっているのかなと不思議に思いました。「たつ」の事です。 昔からのことだから何かあるんでしょうね。 分かる方いましたら、豆知識として教えてください。 どうぞよろしくお願いします。

  • 干支の覚え方

    年配の人と話をしていると、干支の話になることがあります。 どうも私はこれが苦手で、順番が覚えられません。 子ね・丑うし・寅とら・卯う・辰たつ・巳み・ 午うま・未ひつじ・申さる・酉とり・戌いぬ・亥い これの暗記法とかありませんかね?

  • 夏季五輪冬季五輪開催と開催しない年の計算

    #include<stdio.h> int main(void) { int year; printf("西暦年を入力して下さい:"); scanf_s("%d", &year); if (year % 4 == 0) printf("夏季五輪\n"); if (year % 2 == 0 && year % 4 != 0)printf("冬季五輪\n"); if (year % 2 != 0) printf("五輪なし\n"); return 0; } まずこれを見ると解る通り、yearに何が入るか解りませんが 適当な西暦の年の数値を入力して2か4で割って余りで計算して0になればいいっていう 例題なんですが、全く意味が解りません。 例えば2018年と入力して冬季五輪と出るのですが、 いったいどういう意味なのかさっぱり解りません。 2018年に冬季五輪がやるという事でしょうか? 適当な数値を入力しているだけだからそんな訳ではないですよね。 if文を使ってやっていたのですが、この例題は何か意味があるのでしょうか?

  • カレンダー作成

    C言語初心者です。 西暦と月を入力してその月のカレンダーを作成するプログラムの問題なのですが #include <stdio.h> #define MMAX 12 #define COMP (year - 1) int main(void) {  int i, j, year, month, day, youbi, ycnt, mcnt = 0;  int mday[MMAX] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  printf("西暦と月を入力して下さい-->");  scanf("%4d%2d, &year, &month");  if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)   mday[1] = 29;  for (i = 0; i < [A]; i++) {   mcnt += mday[i];  }  mcnt++;  [B] = ((COMP + COMP / 4 - COMP / 100 + COMP / 400) + mcnt) % 7;  printf("\n%4d 年%2d 月\n", year, month);  printf("----------------------------\n");  printf(" 日 月 火 水 木 金 土\n");  for (j = 0, ycnt = 0; j < youbi; j++, ycnt++) {   printf(" ");  }  for (day =1; day <= mday[month - 1]; day++) {   if ([C])    printf("[%2d]", day);   else    printf(" %2d ", day);   ycnt++;   if ([D]) {    printf("\n");    ycnt = 0;   }  }  return (0); } [A]、[B]、[C]、[D]に答えを入れなきゃいけないのですが私が考えた答えだと カレンダーの表示すらされません。どこがいけないのでしょうか? #include <stdio.h> #define MMAX 12 #define COMP (year - 1) int main(void) {  int i, j, year, month, day, youbi, ycnt, mcnt = 0;  int mday[MMAX] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  printf("西暦と月を入力して下さい-->");  scanf("%4d%2d, &year, &month");  if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)   mday[1] = 29;  for (i = 0; i < month; i++) {   mcnt += mday[i];  }  mcnt++;  youbi = ((COMP + COMP / 4 - COMP / 100 + COMP / 400) + mcnt) % 7;  printf("\n%4d 年%2d 月\n", year, month);  printf("----------------------------\n");  printf(" 日 月 火 水 木 金 土\n");  for (j = 0, ycnt = 0; j < youbi; j++, ycnt++) {   printf(" ");  }  for (day =1; day <= mday[month - 1]; day++) {   if (youbi = 0)    printf("[%2d]", day);   else    printf(" %2d ", day);   ycnt++;   if (youbi > 7) {    printf("\n");    ycnt = 0;   }  }  return (0); } よろしくお願いします。

  • C言語入門者です。プログラムの添削をお願いします。

     任意の西暦年を入力し、その年がオリンピックの開催年(夏季・冬季問わず)かどうかを判定するプログラムを作ろうと思っています。  #include<stdio.h> int main(void) {     int year, rest;     rest = year % 4;     printf("オリンピック(夏季・冬季問わず)が開催される年(西暦)を一つ答えなさい。");     scanf("%d", year);     if(rest == 0) printf("正解!夏季五輪!");     if(rest == 2) printf("正解!冬季五輪!");     if(!(rest == 0 || rest == 2)) printf("不正解!");     return 0; } 夏季五輪開催年を入力した場合、「正解!夏季五輪!」 冬季五輪開催年を入力した場合、「正解!冬季五輪!」 それ以外の場合、「不正解!」 と画面に表示されるようにしたいのです。    しかし、year にどんな数値を入力しても、「正解!夏季五輪!」としか表示されません。どこが間違っているのでしょうか?添削よろしくお願いします。

  • カレンダーのプログラム

    指定した開始月と終了月を入力して、それを横に最大3つまで並べて 納まりきらないときは改行するというプログラムを作りたいです。 イメージとしては、2009年の9月から2009年の12月まで指定した場合は… 2009 / 9              2009 / 10             2009 / 11 1 2 3 4 5 6 7          1 2 3 4 5 6 7           1 2 3 4 5 6 7 8 9 10 11 12 13 14      8 9 10 11 12 13 14       8 9 10 11 12 13 14 15 16 17 18 19 20 21    15 16 17 18 19 20 21    15 16 17 18 19 20 21 21 22 23 24 25 26 27    21 22 23 24 25 26 27    21 22 23 24 25 26 27 28 29 30           28 29 30 31           28 29 30   2009 / 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 21 22 23 24 25 26 27 28 29 30 31 (最初の日数などは適当ですし、ちょっとずれてしまっていますがご了承ください。あくまでもイメージなので…) ところが下のプログラムを動作させようとしたところ全く 動きません。何がおかしいために動作しないのでしょうか? よろしくお願いします。 #include<stdio.h> #include<string.h> int getyoubi(int year,int month,int day) { if(month==1 || month==2 ) { year--; month +=12; } return ((year+year/4-year/100+year/400+(13*month+8)/5 + day)%7); } int main(void) { int nen1,tuki1,nen2,tuki2,tukiho,nenho,tukih,w,i,j; char sbuf[3][7][22]; int tuki[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int k; char tmp[4]; printf("カレンダーを表示します。\n"); printf("開始年月を入力せよ。\n"); printf("年:"); scanf("%d",&nen1); printf("月:"); scanf("%d",&tuki1); printf("終了年月を入力せよ。\n"); printf("年:"); scanf("%d",&nen2); printf("月:"); scanf("%d",&tuki2); do{ /*3つのカレンダー分の格納する*/ for(i=0;i<3;i++) { w=getyoubi(nen1,tuki1,1); sprintf(sbuf[i][0],"%10d /%3d ",nen1,tuki1); for(k=1;j<7;k++) { sbuf[i][k][0]='\0'; } sprintf(sbuf[i][1],"%*s",3*w,""); k=1; for(j=1;j<tuki[tuki1];j++) { sprintf(tmp,"%3d",j); strcat(sbuf[i][k],tmp); if(j%7==6) { k++; } } do{ if(j%7==6) { sprintf(sbuf[i][k],"%21s",""); } else { do{ strcat(sbuf[i][k]," "); j++; }while(j%7!=6); k++; } }while(k!=7); tuki1++; if(tuki1==13) { tuki1=1; nen1++; } if(nen1>nen2 || nen1==nen2 && tuki1>tuki2) { break; } } /*3つためたカレンダーを出力する。*/ for(i=0;i<3;i++) { printf("%s",sbuf[i][0]); } printf("\n"); for(i=0;i<3;i++) { printf(" 日 月 火 水 木 金 土 "); } printf("\n"); for(i=0;i<3;i++) { printf("----------------------"); } printf("\n"); for(i=1;i<7;i++) { for(j=0;j<3;j++) { printf("%s",sbuf[j][i]); } } /*指定した年の月になるまでループ*/ }while(nen1<nen2 || nen1==nen2 && tuki1<=tuki2); return 0; }

  • プログラムの内容

    以下のプログラムは答えとして渡されたものなんですが、 コマンド引数を使ったプログラムの流れがよくわかりません。 簡単に解説してくれる方、いませんか? #include <stdio.h> int leapyear(int year){ if(year%400 == 0) return 1; else if(year%4 == 0 && year%100 != 0) return 1; else return 0; } void addmonth(int *day, int *month, int *year){ *day = 1; (*month)++; if(*month > 12) { *month = 1; (*year)++; } } int main(int argc, char *argv[]){ int year, month, day, a=0, max_days; int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; if(argc < 2) max_days = 10000; else max_days = atoi(argv[1]); printf("今日は西暦何年 何月 何日? "); scanf("%d%d%d",&year,&month,&day); while(a<max_days) { a++; day++; if(month == 2 && leapyear(year)) { if(day > 29) addmonth(&day, &month, &year); } else { if(day > month_days[month-1]) addmonth(&day, &month, &year); } } printf("今日から%d日後は、%d年%d月%d日です。",max_days, year, month, day); }

  • 五輪が開催される年の判定

    #include<stdio.h> int main(void){ int year; printf("西暦年を入力してください:"); scanf("%d", &year);      if (year % 4 == 0) printf("夏季五輪\n"); if (year % 2 == 0 && year % 4 != 0) printf("冬季五輪\n"); if (year % 2 != 0) printf("五輪なし\n"); return 0; } この部分は、     if (year % 4 == 0) printf("夏季五輪\n"); if (year % 2 == 0 && year % 4 != 0) printf("冬季五輪\n"); if (year % 2 != 0) printf("五輪なし\n"); なぜこうなるのか説明してください。 五輪が開催されるのは、4年ごとらしいのですが、 レベルの低いかもしれない、質問ですが、どうか解りやすく なぜこうなるのか教えて下さい、よろしくお願いします。

  • 日数チェックプログラム

    c++言語で西暦と月を入力してその年月の日数を表示するプログラムを教えてください #define CRT_SECURE_NO_DEPRECATE #include <stdio.h> int nisuu_chk(int,int); int uru_chk(int,int); void main(void) { int yy,mm; char dsp[4]={28,29,30,31}; printf("年(西暦:4桁)を入力して下さい"); scanf("%d",&yy); printf("月を入力して下さい"); scanf("%d",&mm); printf("%d年%d月は%d日まであります",yy,mm,nisuu_chk(yy,mm)); } ここから先がわかりません。 だれか、教えてください

専門家に質問してみよう