痔になりやすい生活習慣とは?

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

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

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

A 回答 (5件)

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 {
  // 閏年ではないときの処理
 }
}

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

細かく教えていただきありがとうございます。
参考にさせてもらいます。

お礼日時:2006/10/26 23:56

/* 閏年判定関数 


  引数に西暦を渡し、閏年なら1を閏年でなければ0を返す*/
int leapyear( int year ){
return (((year%4==0) && (year%100!=0) || (year%400==0)) ? 1 : 0);
}

int main(){
int i;
for(i=1900;i<=2100;i+=4){
if( leapyear(i) ){
print("%d\n",i);
}
}

leapyear関数自体は汎用。
main内のループは、1900から2100までの閏年ってのに合わせてある。
    • good
    • 1

かなり、手を抜くなら…



1900から2100の間で
・4で割り切れる
・100で割り切れる
・400で割り切れない
ものは、1900と2100だけなんですよね。
なので、1904から4づつ足していったものを表示するだけで良いような…
で、2096以下になったら、ループを抜ける、と。
    • good
    • 0
この回答へのお礼

そういえばそうですね、気付きませんでした。
回答ありがとうございます。

お礼日時:2006/10/26 23:57

誤魔化して書くなら、こう。


int nen;
for (nen = 1901;nen < 2100;nen++) {
  if ((nen & 3) == 0) ptintf("%d年は閏年\n",nen);
}
ループの最初と最後の、1900年と2100年は通常年なので、ループしないで除外し、4で割れるかしか見ていない。

実際、1901~2099年の期間で使用する、年を下2桁しか持たないカレンダーICチップは、閏年の判定は「4で割り切れるなら閏年」としか判定しない。

更に言うなら年の割り算さえしない。年を保持するメモリの下位2ビットを取り出し、この2ビットが共に0の時は閏年、と処理している。

どうしてこういう手抜きをするかと言えば、計算が簡単になれば回路も簡単になり、それだけコストダウンになるのが理由。

ループから1900と2100を除外しないなら、こう。
int nen;
for (nen = 1900;nen <= 2100;nen++) {
  if ((nen==1900)||(nen==2100)) continue;
  if ((nen & 3) == 0) ptintf("%d年は閏年\n",nen);
}

年の制限をせずに、きっちり全部判断したいなら、質問者さんで工夫して下さい。
    • good
    • 0

 4で割り切れるかどうかを調べるには、割余演算子を使います。


 C言語の場合、% 演算子です。

 if ( nen % 4 = 0 ) {
  // 4で割り切れる
 }

 こんな感じ。他の条件も一緒です。
    • good
    • 1

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Qうるう年かどうかを計算するプログラミング

西暦何年かを入力し、その年がうるう年かそうでないかを
計算するプログラムを作っています。

#include <iostream>
using namespace std;

int main()
{
int toshi;
cout <<"西暦を入力してください";
cin>>toshi;
if (toshi%4==0)
{if (toshi%100==0)
{if (toshi%400==0)
{cout<<toshi<<"年はうるう年です。";}

else {cout<<toshi<<"年は非うるう年です。";}
else {cout<<toshi<<"年は非うるう年です。";}
else {cout<<toshi<<"年は非うるう年です。";}}}

return EXIT_SUCCESS;
}

これを入力したのですが エラーが2つでてしまいます。
どこがちがうのでしょうか?

Aベストアンサー

else文の対応の問題ですね。
上記のプログラムだと、全部のelseが三番目のif文に対応するelseになっちゃってます。
正解のソースはこちら
int toshi;
cout <<"西暦を入力してください";
cin>>toshi;
if (toshi%4==0){
if (toshi%100==0){
if (toshi%400==0){
cout<<toshi<<"年はうるう年です。";
}else{
cout<<toshi<<"年は非うるう年です。";
}
}else{
cout<<toshi<<"年は非うるう年です。";
}
}else{
cout<<toshi<<"年は非うるう年です。";
}

cin >> toshi;

return EXIT_SUCCESS;

上記のソースをよく見てくださいね。「{」の数が違うと思います。

ただ、三個もif文が重なるのは間違いの元なので、下のようにしたほうがすっきりすると思いますよ。

int toshi;
cout <<"西暦を入力してください";
cin>>toshi;
if (((toshi%4==0) && (toshi%100!=0)) ||
((toshi%4==0) && (toshi%400==0))){
cout<<toshi<<"年はうるう年です。";
}else{
cout<<toshi<<"年は非うるう年です。";
}

cin >> toshi;

return EXIT_SUCCESS;

プログラムは慣れと経験ですんで頑張ってください。

else文の対応の問題ですね。
上記のプログラムだと、全部のelseが三番目のif文に対応するelseになっちゃってます。
正解のソースはこちら
int toshi;
cout <<"西暦を入力してください";
cin>>toshi;
if (toshi%4==0){
if (toshi%100==0){
if (toshi%400==0){
cout<<toshi<<"年はうるう年です。";
}else{
cout<<toshi<<"年は非うるう年です。";
}
}else{
cout<<toshi<<"年は非うるう年です。";
}
}else{
cout<<toshi<<"年は非うるう年です。";
}

cin >> toshi;

return EXIT_SUCCESS;
...続きを読む

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閏年が何個含まれるか求めるプログラム

3桁、あるいは4桁の整数を10個程度入力して、これらの中
に閏年が何個含まれるか求めるプログラムの書き方を教え
てください。
 お願いします。

Aベストアンサー

まず「入力する整数は何なのか」と「閏年ってどんな日なのか」ってのを、きちんと提示しましょう。

例えば、エチオピアでは、閏年は「4で割り切れる年の前の年の、13月6日」が閏年です。因みに、エチオピアは、今は「2001年5月」です。

入力する数値が、西暦年なのか、エチオピア年なのか、皇紀年なのか、そこんところをハッキリさせましょう。

そして閏年も、それがどういうモノなのかハッキリさせましょう。

それらがハッキリしないと、プログラムは作れません。

1.整数を1つ入力するだけのプログラムを作る。
#include <stdio.h>
int main(void)
{
int year;
scanf("%d",&year);
return 0;
}

2.上記1のプログラムを改造して、整数を入力し、入力した整数が0だったら終了、0じゃなかったら入力を繰り返すようにする。
3.上記2のプログラムを改造して、0が入力されたら今までに入力した整数の「個数」を表示して終了、0じゃないなら入力した「個数」をカウントアップして入力を繰り返すようにする。
4.上記3のプログラムを改造して、入力した整数が0でなく、かつ、3桁か4桁の整数じゃなかった時は、カウントアップせずに入力をやり直すようにする。
5.上記4のプログラムを改造して、入力した個数をカウントする部分を、入力した整数が閏年の時だけカウントするようにする。

何も無い所から一気に「最終目的のプログラム」を書くのは無理なので、上記のように「少しづつ積み上げていく」と良いでしょう。

まず「入力する整数は何なのか」と「閏年ってどんな日なのか」ってのを、きちんと提示しましょう。

例えば、エチオピアでは、閏年は「4で割り切れる年の前の年の、13月6日」が閏年です。因みに、エチオピアは、今は「2001年5月」です。

入力する数値が、西暦年なのか、エチオピア年なのか、皇紀年なのか、そこんところをハッキリさせましょう。

そして閏年も、それがどういうモノなのかハッキリさせましょう。

それらがハッキリしないと、プログラムは作れません。

1.整数を1つ入力す...続きを読む

QC言語で文字列をかえす正しい書き方が知りたいです?

C言語で次の警告が表示されます。
文字列を返したいのですが、正しい書き方はどのようにすれば良いのでしょうか?


jci.h(20) : warning C4172; ローカル変数またはテンポラリのアドレスを返します。


char *test(char *a, int b)
{
char str[BUFSIZ];
return str; <------

}

Aベストアンサー

再入可能にするかどうかで、回答は変わります。

A.2度呼び出した場合に前のデータを破壊してもよいケース(再入不可能)

char *test(...)
{
static char str[BUFSIZ]; // static指定でメモリは静的に確保されます。

...

return str;
}

B.2度呼び出した場合に前のデータを破壊しないケース(再入可能)
B-1.mallocを使ってもいいケース
char *test(...)
{
char *str;
str = malloc(BUFSIZ);
if(str == NULL) return NULL; // エラー

...

return str;
}
この場合は、呼び出し元でちゃんとfreeしましょう。

B-2.呼び出し元でメモリを確保するケース
(注意:同じアドレスを指定して複数回呼び出すと、メモリ内容は当然破壊されます)
char *test(char *str, ...)
{

...

return str;
}
これは#1の方の回答と同じです。

B-3.B-1/B-2の複合
(注意:NULL以外の同じアドレスを指定して複数回呼び出すと、メモリ内容は当然破壊されます)
char *test(char *str, ...)
{
if(str == NULL)
{
str = malloc(BUFSIZ);
if(str == NULL) return NULL; //エラー
}

...

return str;
}

こんなところですかね。

再入可能にするかどうかで、回答は変わります。

A.2度呼び出した場合に前のデータを破壊してもよいケース(再入不可能)

char *test(...)
{
static char str[BUFSIZ]; // static指定でメモリは静的に確保されます。

...

return str;
}

B.2度呼び出した場合に前のデータを破壊しないケース(再入可能)
B-1.mallocを使ってもいいケース
char *test(...)
{
char *str;
str = malloc(BUFSIZ);
if(str == NULL) return NULL; // エラー

...

return str;
}
この場合は、呼び...続きを読む

Q日数を計算する方法

以下のようにして変数の配列を使って、
月の日数を格納しています。
int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};

これを使って、
元旦から入力された月日の日数を計算したいのですが
どの様にすればいいですか?

例えば、

4月5日の場合は、
1月 31日
2月 28日
3月 31日
4月 5日

なので「95日」

----------------
途中までのプログラム
#include<stdio.h>

main(void)
{int yy, mm, dd;
int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};

printf( "西暦を入力しなさい" );
scanf( "%d", &yy );
printf( "月を入力しなさい" );
scanf( "%d", &mm );
printf( "日を入力しなさい" );
scanf( "%d", &dd );

/* うるう年判定 */
if (((yy%4==0)&&(yy%100!=0))||(yy%400==0)) mon[1]=29; else mon[1]=28;

以下のようにして変数の配列を使って、
月の日数を格納しています。
int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};

これを使って、
元旦から入力された月日の日数を計算したいのですが
どの様にすればいいですか?

例えば、

4月5日の場合は、
1月 31日
2月 28日
3月 31日
4月 5日

なので「95日」

----------------
途中までのプログラム
#include<stdio.h>

main(void)
{int yy, mm, dd;
int mon[12]={31,28,31,30,31,30,31,31,30,31,30,...続きを読む

Aベストアンサー

要するに「配列にあるデータの合計を求める」のと同じなんだから, ふつうに考えれば for 文で足し込んでいくんでしょ~ね.

Q数字以外が入力されたらエラー文を出したい。

scanfで数字を取り込みたいのですが、ここでaなどのアルファベットや記号を入力すると、無限ループが発生してしまいます。
エラーが出ないように、数字以外が入力されたら、エラーメッセージを出すようなプログラムを作りたいのですが、どうすれば出来るでしょうか。

Aベストアンサー

★アドバイス
>scanfで数字を取り込みたいのですが、ここでaなどのアルファベットや記号を入力すると、
>無限ループが発生してしまいます。
 ↑
 ソースとかを見せて欲しいです。
 見ないとなぜ無限ループするのか判断できません。
>エラーが出ないように、数字以外が入力されたら、エラーメッセージを出すようなプログラムを
>作りたいのですが、どうすれば出来るでしょうか。
 ↑
 多分、scanf で整数の入力を行っていると思うので文字列で入力するようにします。
 そしてそのその文字列を strtod() 関数で整数に変換します。
・このときグローバル変数の errno を調べて ERANGE なら整数値のオーバーフローが起きたとか、
 第2引数で私のポインタに変換できなくなった位置をセットしますので、このポインタが \0 文字
 以外なら数字以外(アルファベットや記号)が混ざっていることになります。
・下にそのサンプルを載せます。

サンプル:
char buff[ 256 ];
char *argp;
int value;

// 文字列で入力
scanf( "%s", buff );
value = strtol( buff, &argp, 10 ); ←10進数で変換

// ここでチェック
if ( (errno != ERANGE) && (*argp != '\0') ){
 printf( "変換不可能な文字が入力されています。\n" );
 exit( 1 );
}

その他:
・上記のサンプルを使うには errno.h をインクルードして下さい。
 このヘッダに ERANGE 定数が定義されています。
 あと stdlib.h もインクルードしないと strtol() 関数が利用できません。
・以上。下の『参考URL』もどうぞ。

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strtol.html

★アドバイス
>scanfで数字を取り込みたいのですが、ここでaなどのアルファベットや記号を入力すると、
>無限ループが発生してしまいます。
 ↑
 ソースとかを見せて欲しいです。
 見ないとなぜ無限ループするのか判断できません。
>エラーが出ないように、数字以外が入力されたら、エラーメッセージを出すようなプログラムを
>作りたいのですが、どうすれば出来るでしょうか。
 ↑
 多分、scanf で整数の入力を行っていると思うので文字列で入力するようにします。
 そしてそのその文字列を str...続きを読む

Qカレンダープログラム、曜日の出力について。

西暦、月、日(1900年1月1日以降対象)を入力して、曜日を求めるプログラムを考えています。
過去の質問なども参考にしたんですが、プログラムがうまく動かず困っています。
プログラム中コメントの日数を変える辺りに不備があるかと思い色々試しましたが、曜日がずれてしまいますし開始1900年1月1日も月曜なのに水曜と出力されます。
forやifの条件の記述がおかしいのでしょうか?
なにか根本的な所が欠如しているのでしょうか、回答をよろしくお願いします。
始めのgetsの所はあえてです。
#include<stdio.h>
#include<stdlib.h>

int main(void)

{
char ss[9],cop1[5],cop2[3],cop3[3];

int year,manth,day,aa,cc,i,f;

gets(ss);

ss[8] = 0;
cop1[4] = 0;
cop2[2] = 0;
cop3[2] = 0;

for(i = 0;i <= 3;i++){
cop1[i] = ss[i];
}
for(i = 0;i <= 1;i++){
cop2[i] = ss[i+4];
}
for(i = 0;i <= 1;i++){
cop3[i] = ss[i+6];
}
year = atoi(cop1);
manth = atoi(cop2);
day = atoi(cop3);

printf("%d年%d月%d日",year,manth,day);

for(f = 1900; f <= year; f++){  //閏年か平年で日数を変える
if((year%4) == 0 && year != 1900){
aa += 366;
}
else{
aa += 365;
}
}
if((year%4) == 0 && manth >= 3 ){//閏年かつ3月以降日数+1
aa += 1;
}

switch(manth){
case 1:
cc = (aa + day)%7;
break;
case 2:
cc = (aa + 31 +day)%7;
break;
case 3:
cc = (aa + 59 +day)%7;
break;
case 4:
cc = (aa + 90 +day)%7;
break;
case 5:
cc = (aa + 120 +day)%7;
break;
case 6:
cc = (aa + 151 +day)%7;
break;
case 7:
cc = (aa + 181 +day)%7;
break;
case 8:
cc = (aa + 212 +day)%7;
break;
case 9:
cc = (aa + 243 +day)%7;
break;
case 10:
cc = (aa + 273 +day)%7;
break;
case 11:
cc = (aa + 304 +day)%7;
break;
case 12:
cc = (aa + 334 +day)%7;
break;
}
switch(cc){
case 1:
printf(" (月)");
break;
case 2:
printf(" (火)");
break;
case 3:
printf(" (水)");
break;
case 4:
printf(" (木)");
break;
case 5:
printf(" (金)");
break;
case 6:
printf(" (土)");
break;
case 0:
printf(" (日)");
break;
}

return 0;

}

西暦、月、日(1900年1月1日以降対象)を入力して、曜日を求めるプログラムを考えています。
過去の質問なども参考にしたんですが、プログラムがうまく動かず困っています。
プログラム中コメントの日数を変える辺りに不備があるかと思い色々試しましたが、曜日がずれてしまいますし開始1900年1月1日も月曜なのに水曜と出力されます。
forやifの条件の記述がおかしいのでしょうか?
なにか根本的な所が欠如しているのでしょうか、回答をよろしくお願いします。
始めのgetsの所はあえてです。
#include<stdio...続きを読む

Aベストアンサー

★追記。
・質問者さんのソースを元に書き直してみました。
 参考にして下さい。

#include <stdio.h>

// break 付きのキーワード
#define CASE  break;case
#define DEFAULT  break;default

// 西暦から閏年の判定
int FuncIsLeapYear( int year )
{
 if ( !(year % 3200) ) return 0;  // 平年(3200で割れる年)
 if ( !(year % 400) ) return 1;  // 閏年(400で割れる年)
 if ( !(year % 100) ) return 0;  // 平年(100で割れる年)
 if ( !(year % 4) ) return 1;  // 閏年(4で割れる年)
 return 0;       // 平年(それ以外の年)
}

// メイン関数
int main( void )
{
 static const char *table[] = { "日", "月", "火", "水", "木", "金", "土" };
 // 宣言
 int year = 0;
 int month = 0;
 int day = 0;
 int week = 0;
 // カウンタ
 int days;
 int i;
 
 // 年月日の入力
 scanf( "%04d/%02d/%02d", &year, &month, &day );
 // 1900年以降の日数を数える
 for ( days = 0, i = 1900 ; i < year ; i++ ){
  days += (FuncIsLeapYear(i) ? 366 : 365);
 }
 // 1月1日から日数を加える
 switch ( month ){
  CASE 1: days += 0;
  CASE 2: days += 31;
  CASE 3: days += 31 + 28;
  CASE 4: days += 31 + 28 + 31;
  CASE 5: days += 31 + 28 + 31 + 30;
  CASE 6: days += 31 + 28 + 31 + 30 + 31;
  CASE 7: days += 31 + 28 + 31 + 30 + 31 + 30;
  CASE 8: days += 31 + 28 + 31 + 30 + 31 + 30 + 31;
  CASE 9: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
  CASE 10: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
  CASE 11: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
  CASE 12: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;
 }
 // 3月以降で閏年なら+1日
 if ( (month >= 3) && FuncIsLeapYear(year) ){
  days++;
 }
 // 入力した日付を加える
 days += day;
 // 曜日の計算
 week = (days % 7);
 // 表示
 printf( "year = %d\n", year );
 printf( "month = %d\n", month );
 printf( "day = %d\n", day );
 printf( "week = %s\n", table[week] );
 return 0;
}
以上。

★追記。
・質問者さんのソースを元に書き直してみました。
 参考にして下さい。

#include <stdio.h>

// break 付きのキーワード
#define CASE  break;case
#define DEFAULT  break;default

// 西暦から閏年の判定
int FuncIsLeapYear( int year )
{
 if ( !(year % 3200) ) return 0;  // 平年(3200で割れる年)
 if ( !(year % 400) ) return 1;  // 閏年(400で割れる年)
 if ( !(year % 100) ) return 0;  // 平年(100で割れる年)
 if ( !(year % 4) ) return 1;  // ...続きを読む

Q西暦を入力して、うるう年かどうか判定せよ!という問題です。

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

Aベストアンサー

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

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

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

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

ね、そのまんまでしょ。

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

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

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


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

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

  うるう年 判定 C

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

参考URL:http://www.google.com/intl/ja/

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

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

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

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

ね、そのまんまでしょ。

質問にある...続きを読む

Q引数 戻り値 return文について

今、C言語を初めて勉強してます。

勉強していて、引数と戻り値、return文

についてよくわかりません。

どなたか詳しく素人にもわかるように教えて

頂けないでしょうか?よろしくお願いします。

Aベストアンサー

まず、関数とは何らかの処理をして結果を返してくれるものです。わざとらしい例ですが二つの数を足してその結果を返す関数を見てみましょう。

#include <stdio.h>

int add( int hoge, int piyo ){
return hoge + piyo;
}

int main(void){
int data;

data = add( 253, 434 );
printf( "%d", data );

return 0;
}

見てわかると思いますが、引数とは関数内の処理に使うデータです。
このデータは関数を呼び出すときに与えます。

add( 253, 434 )

すると与えられたデータは関数に渡され仮引数と言うものに格納されます。
この例では hoge に 253、piyo に 434 が格納されます。

int add( int hoge, int piyo ){

この仮引数は普通の変数のように使うことが可能なのです。

hoge + piyo

そしてこの結果を戻り値として return 文で返してやります。

return hoge + piyo;

返すとは具体的にどこへ返すのかと言うと呼び出したところへです。
ここでは main 関数内の呼び出し元です。

data = add( 253, 434 );

data と言う変数へは関数によって返された戻り値(関数値とか返却値とかとも言ったりします)が格納されます。つまり 253 と 434 を足した数です。

引数も戻り値も結局はデータです。処理させたいデータが引数で、処理した結果であるデータが戻り値です。

return は呼び出し元へ結果を返すためのものです。


C言語の関数にはいろいろな種類があります。

引数も戻り値もあるもの。

int add( int hoge, int piyo ){
return hoge + piyo;
}

引数はあるが戻り値のないもの。

void add( int hoge, int piyo ){
printf( "%d", hoge + piyo );
}

戻り値はあるが引数のないもの。

#include <stdlib.h>
#include <time.h>

int getRandNum(void){
srand( time( NULL ) );
return rand() % 500;
}

戻り値も引数もないもの。

void print(void){
printf( "%d + %d = %d", 253, 434, 253 + 434 );
}

これらの使い分けはデータの内容や型、処理の内容により適宜必要なものを使ってください。

まず、関数とは何らかの処理をして結果を返してくれるものです。わざとらしい例ですが二つの数を足してその結果を返す関数を見てみましょう。

#include <stdio.h>

int add( int hoge, int piyo ){
return hoge + piyo;
}

int main(void){
int data;

data = add( 253, 434 );
printf( "%d", data );

return 0;
}

見てわかると思いますが、引数とは関数内の処理に使うデータです。
このデータは関数を呼び出すときに与えます。

add( 253, 434 )

すると与...続きを読む

Q経過日数を調べたい

自分の誕生日から現在までの経過日数を算出するには、どういう関数を使ったらよいのでしょうか。
閏年の計算とかもあって、結構難しいプログラムですか?

Aベストアンサー

それほど難しくありません。

こんな方法はどうでしょうか。

まず、cftime(),mktime() 等で誕生日の日付情報をtime_t型に変換します。
その後、time()で、time_t型の現在時刻を取得します。
time_t型は、日本時間で1970年1月1日午前9時から何秒経ったかを表すもので、実体は通常long型です。

取得したそれぞれの値に32400(9時間の秒数)を足してから86400(1日の秒数)で割れば、日本時間で1970年1月1日から何日経過したかという値になりますから、あとは引き算するだけです。
(日本以外の場合は32400のところを変えてくださいね)

上記の関数は、#include <time.h> してから使ってくださいね。


人気Q&Aランキング