アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

#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;
}

A 回答 (11件中1~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;
}
    • good
    • 0

>亥(い)が落ちてしまっているものが多いですね。


本当だ!
気がつきませんでした。
ご指摘ありがとうございます。
赤面(>_<)
    • good
    • 0

>> 5


>システム上では、int型とchar*型はまったく同じ表現をするからです。

 その保証はどこにもありません。環境に依存します。
 sizeof(int) == sizeof(const char *)の時は動くでしょうけど、intが4バイトでポインタが 8バイトのシステムなどサイズが等しくない環境では破綻します。
    • good
    • 0

BlueStonesさん、ご指摘ありがとうございました。


"文字列"がchar型の『ポインター』を示すことをすっかり忘れておりました。
いつもはstd::string型を使っているものですから。

どうも済みませんでした。m(__)m
    • good
    • 0

//#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;
}
    • good
    • 0

#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;
}
    • good
    • 0

まったくの余談ですが^_^;



実はint型に文字列を代入するのは
システム上では問題はないのですよ。
 int i = (int)"文字列";
 printf("%s\n", i);
と記述しても正常に動作します。

なぜ正常に動作するかというと、
システム上では、int型とchar*型はまったく同じ表現をするからです。

だからコンピュータは壊れません。

でも、こんな記述は絶対にやめてくださいね。
すべての型の意味がなくなってしまいますから・・・
    • good
    • 0

#include <stdio.h>



int main(void){
int year;
char *eto[]={ "子","丑","寅","卯","辰","巳","午","未","申","酉","戌"};

printf( "西暦を入力して下さい --> " );
scanf( "%d", &year );
printf( "%s どしです", eto[(year-1900)%12]);

return 0;
}
    • good
    • 0

#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型を入れるのは止めてくださいよ。
コンピュータをぶっ壊すかも?
コンパイラはエラーを吐かなかったのですか?
    • good
    • 0

まずは文字列を代入する変数がint型であること


次に以下の部分ですが・・・・

first = ( year - 1900)

if( first % 12 == 0 ) {
i = "ねずみ";
if( first % 12 == 1 ) {
i = "うし";
}

first= の行の最後にセミコロンがありません。
2番目のifの後に"}"がありません。

あと、間違いではないのですが、このような場合はifを使わずにswitchを使う方がスマートですね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!