西暦を入力して、うるう年かどうか判定せよ。ただしうるう年の条件は4で割り切れる、100で割り切れない、400で割り切れる。という問題です!!誰か教えて下さい!お願いします~。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

多分、実例を見ないとさっぱり分からないんですよね。

言葉で書けるのだった
ら、それをそのままコードに落とせば良いのだけど、それが良く分からない
んですよね。

> うるう年の条件は4で割り切れる、100で割り切れない、400で割り切れる

そのまま if を使って書くと

if (年が4で割り切れる) {
  if (年が100で割り切れない) {
    年はうるう年
  } else {
    if (年が400で割り切れる) {
      年はうるう年
    }
  }
}

ね、そのまんまでしょ。

質問にある日本語だと「100で割り切れなくても」という条件が隠れている
のを落とせるかどうか、ですね。

これをひとつの式で書こうとかすると、更に知恵を絞るわけだけど、基本は
「頭の中身を下手に変換しないで、そのままコードに出す」ことです。

# さすがに「西暦を入力して」をそのままコードにするには 知識 が要ります


後、もうひとつのアプローチ。

Web であれば、検索ページを使うのも手のひとつ。例えば google (→参考URL)で、

  うるう年 判定 C

をキーワードにして探してみましょう。見たいソースはすぐ近くにあります :-)

参考URL:http://www.google.com/intl/ja/
    • good
    • 0
この回答へのお礼

教えていただいたURLと回答を参考に判定してみました。
うるう年判定できました!!かなりスッキリしました!!
回答本当にありがとうございましたm(_ _)m

お礼日時:2001/07/03 14:47

閏年の条件


1.4年に1度は閏年
2.ただし、100年に1度は閏年ではない
3.ただし、400年に1度は閏年
だから、西暦2000年は閏年ですが、2100年は閏年じゃないんです
    • good
    • 0
この回答へのお礼

回答ありがとうございました!!
参考になりました。

お礼日時:2001/07/03 14:42

ヒントだけ、という点に同感ですので、恐らく迷っている点を指摘させて頂きます。


演算子の論理和、論理積をうまく使いましょう。
(解らなかったらテキストの目次を引いて調べてみましょう)
複雑な条件も「・・・または・・・」や「・・・かつ・・・」で纏めてしまえば案外すっきりするものです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました!!
とても参考になりました。
なんとかうるう年判定することができました。

お礼日時:2001/07/03 14:55

4の倍数で、「400の倍数をのぞいて、100の倍数でない数」というふうに考えては?


「100で割り切れない、400で割り切れる」数なんてないですから。
    • good
    • 0
この回答へのお礼

回答ありがとうございました!!
なんとかうるう年判定することができました。

お礼日時:2001/07/03 15:00

こんにちは。

itohhといいます。

学校か何かの課題でしょうか、あまり、ソースコードそのものをここで
教えてしまうのもどうかと思うので、ヒントだけ。

うるう年の条件をそのまま判定してください。
(if文などで判定)
    • good
    • 0
この回答へのお礼

if文でうるう年判定することができました!!
学校の課題だったのですが、この課題が出た日
休んでいたのでさっぱりわかりませんでした。
回答ありがとうございましたm(_ _)m

お礼日時:2001/07/03 15:08

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qうるう年を求めるプログラム

1900から2100年のうるう年を求めるプログラムが作りたいのですが
どうしたらよいでしょうか?

forを使って1900から2100までかぞえる。
4で割り切れるものは閏年
しかし100で割り切れるものは閏年でない。
400で割り切れるものは閏年である。
最後の条件の分岐から閏年のみを表示させたいのですがわかりません

Aベストアンサー

int uruu;
int year;
for(year = 1900; year <= 2100; year++) {
 if(year % 4 == 0) {
  // 4で割り切れる
  if(year % 100 == 0) {
   // 100で割り切れる
   if(year % 400 == 0) {
    // 400で割り切れる = 閏年
    uruu = 1;
   } else {
    // 400で割り切れない = 閏年では無い
    uruu= 0;
   }
  } else {
   // 100で割り切れない = 閏年
   uruu = 1;
  }
 } else {
  // 4で割り切れない = 閏年ではない
  uruu = 0;
 }

 if(uruu == 1) {
  // 閏年のときの処理
 } else {
  // 閏年ではないときの処理
 }
}

規則どおりに書くのならこうなるね。
改良の余地はあるかもしれないけど。

int uruu;
int year;
for(year = 1900; year <= 2100; year++) {
 if(year % 4 == 0) {
  // 4で割り切れる
  if(year % 100 == 0) {
   // 100で割り切れる
   if(year % 400 == 0) {
    // 400で割り切れる = 閏年
    uruu = 1;
   } else {
    // 400で割り切れない = 閏年では無い
    uruu= 0;
   }
  } else {
   // 100で割り切れない = 閏年
   uruu = 1;
  }
 } else {
  // 4で割り切れない = 閏年ではない
  uruu = 0;
...続きを読む

Qうるう年判定のアルゴリズム

javaでうるう年判定のプログラムを作成しています。
プログラム自体はサーバにアップするときに実行結果が正しいかどうかテストされます。
仕様としては、
1.時間に関するAPIなどは一切使わずに完全に自作
2.入力される値はLong型の"秒"数(APIで提供されているのはミリ秒ですが)
3.60537895631062456(Long値) などの入力値に対して、年/月/日 (曜日) 時:分:秒 yday=元旦からの経過日数 を出力

最初は以下の関数を使用してループをかけていたのですが、仕様3の入力値に対して50秒近くかかってしまい、上手くいきませんでした。

public static int isLeap(int year){
if(year%4==0 && (year%100!=0 || year%400==0)) return 1;
return 0;
}

問題点はループ回数が多いことで、作る時点で分かってはいたのですが、ここまで遅くなるとは思っても見ませんでした。
これを使わない方法としては、一回だけうるう年(=n)を見つけ、その後は「(n+4)との比較+100で割り切れず400で割り切れる場合は別」という処理を行うことによって、処理時間を30秒付近にまで短縮することができたのですが、どうも10~15秒以内で終わらせなければテストにパスすることができないようです。

なんとか色々考えてはみたものの、上手いアルゴリズムは思いつきませんでした。
うるう年を処理するための"高速な"アルゴリズムはないのでしょうか。
お知恵を貸してください。よろしくお願いします。

javaでうるう年判定のプログラムを作成しています。
プログラム自体はサーバにアップするときに実行結果が正しいかどうかテストされます。
仕様としては、
1.時間に関するAPIなどは一切使わずに完全に自作
2.入力される値はLong型の"秒"数(APIで提供されているのはミリ秒ですが)
3.60537895631062456(Long値) などの入力値に対して、年/月/日 (曜日) 時:分:秒 yday=元旦からの経過日数 を出力

最初は以下の関数を使用してループをかけていたのですが、仕様3の入力値に対して50秒近くかかってしまい、上手...続きを読む

Aベストアンサー

>3.60537895631062456(Long値) などの入力値に対して
↑は何の値でしょうか?
(特定の年の元旦からの経過秒数?または任意の年月日?)
起点の年月日が既知であれば、それがうるう年か否かはすぐ
わかるはずですが?

>最初は以下の関数を使用してループをかけていたの
>ですが、仕様3の入力値に対して50秒近くかかって
>しまい、上手くいきませんでした。

>public static int isLeap(int year){
>if(year%4==0 && (year%100!=0 || year%400==0))
>return 1;
>return 0;
>}
上記にはループなどありませんが、どういったループを
かけたのがわからないと、どこが悪かったのか確認のしよう
が無いと思いますが?

QC言語のうるう年に関するプログラムの作成

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回あります。

C言語(閏年)の質問です。

任意の範囲の年から閏年の表示とその数をカウントして次の実行結果のように表示するプログラムの作成方法を教えてください。(ここでは2つの年をmain関数内で入力し、その範囲の西暦を引数とする関数checkYearを使用するものとする。int型の関数checkYearは、引数に西暦をとり、その西暦が閏年であれば、1を返し、閏年でない場合は0を返す。)
なお、閏年の判定方法は以下のとおりである。
条件1 西暦年が4で割り切れる年は閏年である
条件2 条件1を満たしていても、西暦年が10...続きを読む

Aベストアンサー

こんな感じでしょうか。
(体裁上、各行先頭のスペースは全角スペースにしてあるので、コピペするとコンパイルできないと思います)

#include <stdio.h>

static int
checkYear (int year)
{
 if ((year % 4) == 0)
 {
  if ((year % 100) == 0)
  {
   if ((year % 400) == 0)
    return (1);
  }
  else
   return (1);
 }

 return (0);
}

int
main (int argc, char * argv[])
{
 int count = 0;
 int year, start, end;

 printf ("西暦を入力:");
 scanf ("%d", &start);
 printf ("西暦を入力:");
 scanf ("%d", &end);

 if (start > end)
 {
  year = end;
  end = start;
  start = year;
 }

 for (year = start; year <= end; year++)
 {
  if (checkYear (year) == 1)
  {
   printf ("%d年\n", year);
   count++;
  }
 }
 if (count != 0)
  printf ("閏年は%d回あります。\n", count);
 else
  printf ("閏年はありません。\n");

 return;
}

こんな感じでしょうか。
(体裁上、各行先頭のスペースは全角スペースにしてあるので、コピペするとコンパイルできないと思います)

#include <stdio.h>

static int
checkYear (int year)
{
 if ((year % 4) == 0)
 {
  if ((year % 100) == 0)
  {
   if ((year % 400) == 0)
    return (1);
  }
  else
   return (1);
 }

 return (0);
}

int
main (int argc, char * argv[])
{
 int count = 0;
 int year, start, end;

 printf ("西暦を入力:");
 scanf ("%d", &start);
 print...続きを読む

Q今、C言語の勉強をしていて、「西暦と月をscanfで入力し、”西暦●●

今、C言語の勉強をしていて、「西暦と月をscanfで入力し、”西暦●●年の●月は●日です”というプログラムを完成させなさい」という問題がありました。
また、条件が「4の倍数で、かつ100の倍数でない場合か、400の倍数の場合は閏年である」また
「西暦が0以下のとき、月が1以下12以上の場合はエラーメッセージを表示させなさい。」というものです。

そこで、コーディングした結果、下記のようになりました。

#include <stdio.h>
main()
{ int y,m,d;
printf("西暦=");scanf("%d",&y);
printf("月=");scanf("%d",&m);
if(y<0 || d>1 && d<12)
printf("エラーです。");
else if(m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12)
d=31;
printf("西暦%d年の%d月は%d日です。",y,m,d);
else if(m==4 || m==6 || m==9 || m==11 )
d=30;
printf("西暦%d年の%d月は%d日です。",y,m,d);
else if(m==2 && y%4==0 && y%100>0 || y%400==0)
d=29;
printf("西暦%d年の%d月は%d日です。",y,m,d);
else d=29;
printf("西暦%d年の%d月は%d日です。",y,m,d);
}


これを、学校の先生が開発したコンパイラで文法チェックを施したところ、
「予約語elseは使用できません」と文法エラーがでました。
「else」は、if文のthen/elseの意味で利用したのにそういう風にとらえてくれませんでした。
また、字下げは適当にやっているだけですので気にしないでください。

これ、どこかおかしいところありますか・・・?

今、C言語の勉強をしていて、「西暦と月をscanfで入力し、”西暦●●年の●月は●日です”というプログラムを完成させなさい」という問題がありました。
また、条件が「4の倍数で、かつ100の倍数でない場合か、400の倍数の場合は閏年である」また
「西暦が0以下のとき、月が1以下12以上の場合はエラーメッセージを表示させなさい。」というものです。

そこで、コーディングした結果、下記のようになりました。

#include <stdio.h>
main()
{ int y,m,d;
printf("西暦=");scanf("%d",&y);
printf("月=");scanf("...続きを読む

Aベストアンサー

else if(m==2 && y%4==0 && y%100>0 || y%400==0)
d=29;
printf("西暦%d年の%d月は%d日です。",y,m,d);
else d=29;

ここですよね。
{}をつけない場合、if文は次の一行のみに効果を発揮します。
つまり、printfの一行はもうifの範囲を出ています。
ifの効果を発揮させたい範囲を{}で囲んでください。

また、こういった間違いを防ぐためにもif文を使う場合は極力{}を使うようにした方が良いと思います。

Q庚申様がうるう年になるのは何年後?

庚申さまは庚の申の日のことです(60日に一回)が、今年は閏年で、2月29日が庚申さまの日です。次に庚申様になるのは何年後ですか?方程式で教えて下さい。

Aベストアンサー

閏年は365日+365日+365日+366日=1461日に1回来ます。
1461と60の最小公倍数は29220日なので、80年後、次は2092年2月29日ですかね。

ただし、その次となると、2100年は閏年ではなくなるので、ズレます。
ズレると、また計算が大変になります。

エクセルで簡単に調べた結果、
2012年
2092年
2344年
2424年
2756年
2836年
は、2月29日が庚申の日ですね。

Q教えて!西暦の日付

西暦の日付を出力したいです。
年と月だけで良いです。
例えば、Oct 2004

教えてください!
お願いします。

Aベストアンサー

#1さんの方法に加えて、strftime()を使用するという手もあります。
手順としては、
 1.、2.(#1さんと同じ)
 3.結果格納用のchar配列を用意する
 4.strftime( 3.で用意した配列名, ←の領域長, "%b %Y", 2.で作成したtm構造体 )
 5.結果を出力する
となります。

個人的には、一目で「時間→文字列処理をやっている」とわかるこちらのほうをお勧めします。

参考URL:http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strftime.3.html

QSchemeのプログラミング うるう年関連

Schemeのプログラミング うるう年関連
Schemeで、
「(1)閏年かどうかを判定する関数leap?(number -> boolean)を定義した後、(2)○年○月の日数は何日かを求める関数num-of-days(number number -> number)を定義せよ」
という内容の課題を出されたのですが、(例えば 2009年の7月→31日 2012年の2月→29日)
どうもエラーが出て実行できません。
自分は以下のように組みました。
;;(1)の関数
(define (leap? year)
(cond
[(= (remainder year 400) 0) #t]
[(and (= (remainder year 4) 0)(> (remainder year 100) 0)) #t]
[else #f]
)
)
;;(2)の関数
(define (num-of-days year month)
(cond
[(and (= month 2)(= (leap? year) #t)) 29]
[(and (= month 2)(= (leap? year) #f)) 28]
[(or (= month 1)(= month 3)(= month 5)
(= month 7)(= month 8)(= month 10)
(= month 12)) 31]
[else 30]
)
)

これを例えば
(num-of-days 2008 4) や (num-of-days 1995 12)
などとして実行すると、それぞれ30,31という正しい値を返してくれるのですが、
(num-of-days 2008 2) や (num-of-days 1995 2)
など、閏年・非閏年に関係無く、2月が絡むと
=: expects type <number> as 1st argument, given: false; other arguments were: true
というエラーを吐いてしまいます。
何度も見直しましたが、どこが間違っているのか見付けきれません…。どなたか間違いを指摘して頂けると幸いです。

Schemeのプログラミング うるう年関連
Schemeで、
「(1)閏年かどうかを判定する関数leap?(number -> boolean)を定義した後、(2)○年○月の日数は何日かを求める関数num-of-days(number number -> number)を定義せよ」
という内容の課題を出されたのですが、(例えば 2009年の7月→31日 2012年の2月→29日)
どうもエラーが出て実行できません。
自分は以下のように組みました。
;;(1)の関数
(define (leap? year)
(cond
[(= (remainder year 400) 0) #t]
[(and (= (remainder year 4) 0)(> (remainde...続きを読む

Aベストアンサー

ああ、ちなみに。

manaka3161 さんの作ったコードのロジックは「無駄がある」とは思いますが、基本的に「間違ってはいない」、とは思いますよ。
どこが悪いのか?と言うと、単純に、ここです。

(define (num-of-days year month)
(cond
[(and (= month 2)(= (leap? year) #t)) 29] ;; ここが間違ってる
[(and (= month 2)(= (leap? year) #f)) 28] ;; ここが間違ってる
[(or (= month 1)(= month 3)(= month 5)
(= month 7)(= month 8)(= month 10)
(= month 12)) 31]
[else 30]
)
)

「ロジックが合ってる」のに「エラーを返す」場合があるんです。何故なら、データ型に整合性がない、からです。
比較演算子=は「数値専用」で等価判定を下す。引数が数値である、ってのが前提なんですけど、引数にシンボル#tか#fが来てる、ってのがエラーの原因です。

> (= 1 2)
#f
> (= 1 1)
#t
> (= 'a 'b)
=: expects type <number> as 1st argument, given: a; other arguments were: b

=== context ===
/usr/lib/plt/collects/scheme/private/misc.ss:74:7

>

同じエラーですよね。見て分かる通り、=は数値しか引数に取れないんです。

つまり、シンボル同士を比較したい場合はeq?使った方が良いでしょう。すなわち、

(define (num-of-days year month)
(cond
[(and (= month 2)(eq? (leap? year) #t)) 29] ;二番目の判定式を eq? で行う
[(and (= month 2)(eq? (leap? year) #f)) 28] ;二番目の判定式を eq? で行う
[(or (= month 1)(= month 3)(= month 5)
(= month 7)(= month 8)(= month 10)
(= month 12)) 31]
[else 30]
)
)

これで動く筈です。

> (num-of-days 2009 7)
31
> (num-of-days 2012 2)
29
>

慣れない内は、数値/シンボルの比較を両方「考えずに行いたい」のなら、eqv?を使った方が良いかもしれません。eqv?はリストじゃなければ数値/シンボルの両方とも行えます。eq?はシンボル専用、ですね。=は数値専用。
大まかに言うと、繰り返しになりますが、次のようになってます。

eq? => シンボル比較の時に使う。高速。
eqv? => 数値、シンボル両方O.K。ある意味デフォルト。
equal? => リスト同士まで比較出来る。ただし、eq?に比べると遅い。
= => 数値専用。

ああ、ちなみに。

manaka3161 さんの作ったコードのロジックは「無駄がある」とは思いますが、基本的に「間違ってはいない」、とは思いますよ。
どこが悪いのか?と言うと、単純に、ここです。

(define (num-of-days year month)
(cond
[(and (= month 2)(= (leap? year) #t)) 29] ;; ここが間違ってる
[(and (= month 2)(= (leap? year) #f)) 28] ;; ここが間違ってる
[(or (= month 1)(= month 3)(= month 5)
(= month 7)(= month 8)(= month 10)
(= month 12)) 31]
[else 30]
)
)

「ロジックが合ってる」の...続きを読む

QC++で日付判定を行いたい!!

C++で日付判定を行いたい!!
C++でデータを1バイトづつ呼んで(For文で回す)日付かどうかを判断したいのですが、VBのようなIsDateみたいな関数がないので、同じように扱える関数がC++であったら教えてください。
対応する関数が無い場合は参考になるようなサイトでもやり方でも結構ですので、教えてください。

例>
tp=&buf[4*16+(16*3)]; //ポインタ
for( ixs = 0;ixs<50;ixs++){
 //日付判定チェックがしたい
 sprintf(aaa,"%08d",*((unsigned int*)(tp+ixs)));
}

宜しくお願いします。

Aベストアンサー

汎用的に考えれば、以下の関数が使えるんじゃないかなーと
- sscanf()
- localtime()
- mktime()

処理概要は、
sscanf() で 値を読み取って、struct tm に設定。
mktime()で time_t を取得してlocaltime() で struct tmを再度取得
sscanf()で読み取った値と逆引きした日付が一致するかチェック

こんなかんじでしょうかね。
各関数のエラーチェックも忘れずに

Qうるう年判定

こんにちは。今回も宜しくお願いします<(_ _)>
画面から入力された日付(生年月日)の妥当性をチェックしたいのですが、それにはまずクラス(API)をわかっていなくてはいけないと思い、お試しで作ったものが、私の想像していた通りに動きません。
import java.util.*;
public class Test {
 public static void main(String[] args) {
  int year;
  int month;
  int day;

  GregorianCalendar g = new GregorianCalendar();
  year = g.get( Calendar.YEAR );
  month = g.get( Calendar.JUNE );
  day = g.get( Calendar.DATE );

  System.out.println("year = " + year);
  System.out.println("month = " + month);
  System.out.println("day = " + day);

  }
}

上記のソースを実行すると、
C:\WINDOWS\デスクトップ\カレンダ>java Test
year = 2003
month = 3
day = 3
となります。月の指定はCalendar.JUNEとしているのに、どうして3と表示されるのでしょうか?

あともう一つ質問なのですが、GregorianCalendarに自分の好きな年月を与えたいのですが、
g.get( 1980 );
とすると実行時にArrayIndexOutOfBoundsExceptionのエラーがでます。
GregorianCalendarを使って任意の年月を渡すことは無理なんでしょうか?
私が最初考えたのが、画面から入力された値をそのままGregorianCarendarに渡して、もしもその時にエラーがでたらそれは妥当ではなかった値(閏年じゃないのに2月29日と入力したり、とか)として、画面にて再入力を促すメッセージをだそうと思っていたのですが、この考え方はどこか変でしょうか?

お手数お掛けいたしますが、宜しくお願い致します<(_ _)>

こんにちは。今回も宜しくお願いします<(_ _)>
画面から入力された日付(生年月日)の妥当性をチェックしたいのですが、それにはまずクラス(API)をわかっていなくてはいけないと思い、お試しで作ったものが、私の想像していた通りに動きません。
import java.util.*;
public class Test {
 public static void main(String[] args) {
  int year;
  int month;
  int day;

  GregorianCalendar g = new GregorianCalendar();
  year = g.get( Calendar.YEAR );
  month = g.get( Cale...続きを読む

Aベストアンサー

>  year = g.get( Calendar.YEAR );
>  month = g.get( Calendar.JUNE );
>  day = g.get( Calendar.DATE );

 どういう動作を期待しているのかわかりませんが、月を取得したいのなら

month = g.get( Calendar.MONTH );

です。これを実行すると、次の疑問が出るでしょう。「11月なのに"10"が出てくる!」と。これはAPIの仕様で、1月は"0"、2月は"1"、……、12月は"11"になっているのです。

>GregorianCalendarに自分の好きな年月を与えたいのですが、
>g.get( 1980 );
>とすると

 与えるメソッドはget()ではなくてset()です。APIリファレンスをよく見てください。

参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/Calendar.html

Q誰か教えてください!!

main()
{
float weight,height,s_weight,fatness;
int sex,count,keisu,y_cnt,f_cnt,k_cnt,c_cnt,n_cnt;
y_cnt=f_cnt=k_cnt=c_cnt=n_cnt=0;
printf("*** 肥満度プログラム ***\n");
for(count=1;count<=10;count++)
{
printf("あなたの体重(Kg単位)=\n");
scanf("%f",&weight);
printf("あなたの身長(m単位)=\n");
scanf("%f",&height);
printf("あなたの性別(男=0/女=1)=\n");
scanf("%d",&sex);
if(sex==0)
keisu=22;
else
keisu=20;
if(height>0 && weight>0)
{
s_weight=height*height*keisu;
printf("標準体重=%fKg\n",s_weight);
fatness=(weight-s_weight)/s_weight*100;
printf("肥満度=%f%\n",fatness);
if(fatness<-10.0)
{
printf("やせすぎです。\n");
y_cnt++;
}
else
if(-10.0<=fatness && fatness<10.0)
{
printf("標準です。\n");
f_cnt++;
}
else
if(10.0<=fatness && fatness<20.0 )
{
printf("過体重です。\n");
k_cnt++;
}
else
if(20.0<=fatness)
{
printf("あなたは超過体重ですわ!\n");
c_cnt++;
}
else
printf("計算できません。\n");
n_cnt++;
}
}
printf("*** 肥満度統計結果 ***\n");

printf("やせすぎ=%d人\n",y_cnt);
printf("普通=%d人\n",f_cnt);
printf("過体重=%d人\n",k_cnt);
printf("超過体重=%d人\n",c_cnt);
printf("計算できない人=%d人\n",n_cnt);
}


これを実行すると、10回それぞれ身長や体重を入力していくのですが、”計算できない人”が毎回加算されてしまい、”計算できない人=10”と出てしまします。他のやせすぎとか過体重などはちゃんと計算してくれるんです。どのようにしたら、ちゃんと”計算できない人”を計算してくれるのでしょうか?

main()
{
float weight,height,s_weight,fatness;
int sex,count,keisu,y_cnt,f_cnt,k_cnt,c_cnt,n_cnt;
y_cnt=f_cnt=k_cnt=c_cnt=n_cnt=0;
printf("*** 肥満度プログラム ***\n");
for(count=1;count<=10;count++)
{
printf("あなたの体重(Kg単位)=\n");
scanf("%f",&weight);
printf("あなたの身長(m単位)=\n");
scanf("%f",&height);
printf("あなたの性別(男=0/女=1)=\n");
scanf("%d",&sex);
if(sex==0)
keisu=22;
else
keisu=20;
if(height>0 && weight>0)
{
s_weight=height*heigh...続きを読む

Aベストアンサー

ぱっと見ただけなので、違っていたらごめんなさい。
たぶん、後半にある

printf("あなたは超過体重ですわ!\n");
c_cnt++;
}
else
printf("計算できません。\n");
n_cnt++;
}
}
printf("*** 肥満度統計結果 ***\n");

の、最後のelseのところが問題ではないかと思います。

この書き方だと、elseに続くのは
>printf("計算できません。\n");
の1文だけであり、その下の
>n_cnt++;
は、elseと関係ない文になっています。
全体のif文の外側になってます。

これを直すには、{}を使い、

printf("あなたは超過体重ですわ!\n");
c_cnt++;
}
else
{
printf("計算できません。\n");
n_cnt++;
}
}
}
printf("*** 肥満度統計結果 ***\n");

として
printf("計算できません。\n");

n_cnt++;
をグループにまとめてやります。

ぱっと見ただけなので、違っていたらごめんなさい。
たぶん、後半にある

printf("あなたは超過体重ですわ!\n");
c_cnt++;
}
else
printf("計算できません。\n");
n_cnt++;
}
}
printf("*** 肥満度統計結果 ***\n");

の、最後のelseのところが問題ではないかと思います。

この書き方だと、elseに続くのは
>printf("計算できません。\n");
の1文だけであり、その下の
>n_cnt++;
は、elseと関係ない文になっています。
全体のif文の外側になってます。

これを直すには、{}を使い、

p...続きを読む


人気Q&Aランキング

おすすめ情報