西暦を入力すると干支が表示されるというプログラムを作りたいのですが、どうしても上手くいきません。どこが間違っているのでしょうか?
#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;
}
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;
}
No.9
- 回答日時:
>> 5
>システム上では、int型とchar*型はまったく同じ表現をするからです。
その保証はどこにもありません。環境に依存します。
sizeof(int) == sizeof(const char *)の時は動くでしょうけど、intが4バイトでポインタが 8バイトのシステムなどサイズが等しくない環境では破綻します。
No.8
- 回答日時:
BlueStonesさん、ご指摘ありがとうございました。
"文字列"がchar型の『ポインター』を示すことをすっかり忘れておりました。
いつもはstd::string型を使っているものですから。
どうも済みませんでした。m(__)m
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;
}
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*型はまったく同じ表現をするからです。
だからコンピュータは壊れません。
でも、こんな記述は絶対にやめてくださいね。
すべての型の意味がなくなってしまいますから・・・
No.4
- 回答日時:
#include <stdio.h>
int main(void){
int year;
char *eto[]={ "子","丑","寅","卯","辰","巳","午","未","申","酉","戌"};
printf( "西暦を入力して下さい --> " );
scanf( "%d", &year );
printf( "%s どしです", eto[(year-1900)%12]);
return 0;
}
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型を入れるのは止めてくださいよ。
コンピュータをぶっ壊すかも?
コンパイラはエラーを吐かなかったのですか?
No.2
- 回答日時:
まずは文字列を代入する変数がint型であること
次に以下の部分ですが・・・・
first = ( year - 1900)
if( first % 12 == 0 ) {
i = "ねずみ";
if( first % 12 == 1 ) {
i = "うし";
}
first= の行の最後にセミコロンがありません。
2番目のifの後に"}"がありません。
あと、間違いではないのですが、このような場合はifを使わずにswitchを使う方がスマートですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 英文の添削お願いします。【長文です。】 マッチングアプリで相手を言い負かしている時のやつです。 色々 1 2023/07/01 02:12
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 英語 至急英作文添削お願いします! 2 2023/01/21 11:12
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- 英語 英訳を確認したいです。 4 2023/03/01 07:22
- 英語 「this is the/my first time~」の文法上の制約について 1 2023/04/06 09:48
- C言語・C++・C# C#の検索プログラムの問題で下の写真についてなのですが実行した時にfirst、last、center 2 2022/10/13 09:36
- 邦画 『THE FIRST SLAM DUNK THE FIRST SLAM DUNK_』と [THE F 1 2022/12/30 09:48
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
テキストデータをそのままバイ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
str系関数を使わずに二つの文字...
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
間接操作のレベルとは
-
ftoa の作り方
-
絶対パスからのファイル名の切...
-
エンディアン:2バイトのデー...
-
C++のCreateFile関数で、ASCII...
-
型変換
-
c言語の問題の説明、各所ごとに
-
バイトスワップをやりたい
-
atoi( ) の反対をやりたい
-
c言語プログラミング実行時エラ...
-
構造体のアライメント調整
-
間接参照のレベルが異なっています
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
'const char *' 型は 'char *' ...
-
型変換
-
テキストデータをそのままバイ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
絶対パスからのファイル名の切...
-
fgetsなどのときのstdinのバッ...
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
3桁区切(コンマ)記号をつけ...
-
atoi( ) の反対をやりたい
-
double型の値をchar配列に変換...
-
C言語のfor文です。 繰り返しの...
-
switch文で文字を比較すること...
-
ファイル名である文字列からbas...
-
c++ 文字列を入力して、一文字...
-
strncpyと_tcsncpy_sのヌルの扱...
おすすめ情報