ページ 11

C言語のプログラム

Posted: 2011年4月27日(水) 17:43
by amu
入力された数値がオリンピック(夏、冬)開催されるか否かを判定するプログラムです。作る際の条件はオリンピック開催を計算する部分は別関数で作りなさい、この予定は永遠に狂わないが作る条件です。
自分で考えたんですが、入力された数値をオリンピック開催年、2000,2002,2004…と照らし合わせ合えば開催すると表示されればいいと思い以下をなんとか書いてみました。添削お願いします。

コード:


#include <stdio.h>

int kaisai (void);  //プロトタイプ宣言

int main (void)
 {
	int seireki;
	scanf("%d",&seireki);  //西暦入力
	
	do
  {
		printf("%d年は開催しないよ",seireki);  //条件(開催年)に合わなかったらこの表示
  }
	while(seireki==b)  //条件(開催年を求めた答えをここにもってきたい)
  {
		printf("%d年は開催します",seireki);     //入力が条件に合えばここへ
		return 0;
 }
	int kaisai (void)
   {
		for(;;)  //開催年を求める式、開催は2年毎に続いてるので無限に繰り返して求める式
			int b = 2000 += 2;
			return b;
   }
 }

初めてつかうサイトなので書き方がおかしかったり見にくいプログラムですいませんがお願いします。

Re: C言語のプログラム

Posted: 2011年4月27日(水) 18:48
by non
添削してくれっていわれても、添削できるレベルになっていません。
課題となっている関数の仕様を決めてください。
もし、私がこの関数をつくるなら
プロトタイプ
int kaisai(int seireki);
引数
int seireki  西暦年
戻り値
オリンピックが開催されるなら1を返し、開催されない場合は0を返す

のように決めます。仕様の決め方は人それぞれでしょうし、課題であれば先生から指示があっているかもしれません。

>この予定は永遠に狂わないが作る条件です。
この意味がわからないのですが、どういう意味なのでしょうか?永遠とは?
オリンピックの開催される年のルールってどうなっているのでしたっけ?
4年おきってのはわかるけど、冬のオリンピックが年の明けた2月とかでなく12月にあるってことはないのですか?
または、南半球の開催の時は?

Re: C言語のプログラム

Posted: 2011年4月27日(水) 19:04
by amu
2000,2002,2004…という年で夏冬オリンピックが開かれてる仕様は変わらないという意味です。もしこの設計でプログラムを組むとしたらどうすればいいのでしょうか?問題サイトの回答はswitchを使ってたんですが、このやり方でプログラムしてみたいと思ったんですが積みました。。。

Re: C言語のプログラム

Posted: 2011年4月27日(水) 19:33
by たかぎ
確かに仕様がよくわかりませんね。
念のため確認しますが、近代オリンピックの話ですよね?
だとしても、2000年以降でよいのでしょうか?
そうではない場合、最初のころは例外が多いですし、戦争で中断された時期もあります。
そのあたりはどうするのでしょうか?

Re: C言語のプログラム

Posted: 2011年4月27日(水) 19:46
by amu

コード:


#include <stdio.h>

int olympic(int year);

int main(void)
{
	int year,hold;
	
	do{printf("2000開催された西暦から表示します。開催以降の西暦を入力してください\n");
		scanf("%d",&year);
	}
	
	while(year<1999);
	
	hold = olympic(year);
	
	do{printf("開催されない");}
	
	while (!(hold==0));
	
	printf("開催される");
		
	return 0;
}

int olympic(int year)
{
	if (;;){ 2000 += 2}
		
		return 0;
		
		}

最後のifの部分がうまくいきません。。ここで2000,2002,2004,2006…と無限に開催年を出して、それが入力された西暦と一致したら開催するとしたいんですが。。。

Re: C言語のプログラム

Posted: 2011年4月27日(水) 20:11
by h2so5
その仕様であれば、
もっと単純に入力した年が偶数なら開催するという判断で良いのではないでしょうか?

Re: C言語のプログラム

Posted: 2011年4月27日(水) 20:30
by amu
単純に書かれたのが解答にあったので、別のやり方(無限ループされた数値と一致したら)でやって見たいと思って積んでしまってる訳です。。。

Re: C言語のプログラム

Posted: 2011年4月27日(水) 21:16
by h2so5
amu さんが書きました:別のやり方(無限ループされた数値と一致したら)でやって見たいと思って積んでしまってる訳です。。。
わざわざそんな非効率的な方法を使っても何の意味もないと思いますよ。
複雑な方法を使ってより良い結果が出せるならともかく、この場合は無限ループを使う利点は全くありません。

Re: C言語のプログラム

Posted: 2011年4月27日(水) 21:20
by box
amu さんが書きました:自分で考えたんですが、入力された数値をオリンピック開催年、2000,2002,2004…と照らし合わせ
さてさて、ここまでのやりとりでもって、そういう照らしあわせは必要ないことがわかりましたか?
単純に、入力した1個の数値が、オリンピック開催年にあたるかどうかを
if文で判定するだけ、ってことです。

あ、ついでに書いておくと、どなたかが書かれていた南半球云々の話は
わきへどけておいてかまいませんからね。

Re: C言語のプログラム

Posted: 2011年4月27日(水) 21:27
by amu
効率云々ではなく、こういう条件でもプログラムで出来るのか否か。出来るのであれば試したいただそれなんですけどね、、、。んでその書き方をわかる方が居れば聞きたいという事です。

Re: C言語のプログラム

Posted: 2011年4月27日(水) 22:08
by a5ua
入力例として、
2011と入力した場合、2012と入力した場合とで、
それぞれ、どのような表示をしたいのか示してくれませんか?

Re: C言語のプログラム

Posted: 2011年4月27日(水) 22:11
by h2so5
amu さんが書きました:効率云々ではなく、こういう条件でもプログラムで出来るのか否か。出来るのであれば試したいただそれなんですけどね、、、。んでその書き方をわかる方が居れば聞きたいという事です。
もちろん、amuさんがその方法を試したいのであればそれは自由です。
ただしそれは、自力でやっている場合の話です。

amuさんのコードはただでさえ変な設計になっているため、
非効率で複雑な方法でやろうとするとさらに添削が面倒になってしまいます。

より良い方法を教えてくれる方はこの掲示板にはたくさんいると思いますが、
わざわざ悪い方法を指導したいという人はあまりいないと思います。

Re: C言語のプログラム

Posted: 2011年4月27日(水) 22:45
by amu
2011,2012と入力…。テキスト、コードに何度もかいてある通りです。入力された数がオリンピックの開催年に当たれば開催されると文字表示、否なら開催されないと表示したいです。
要は2000から2002,2004…と2づつ増え続ける数を無限ループで表して、その結果を条件にして、入力値と条件を照らし合わせて、一致するか否かの文字表示するコードが分かればと思うしだいです。

Re: C言語のプログラム

Posted: 2011年4月27日(水) 23:22
by a5ua
無限ループではないですけど、例えばこんな感じですかね。

コード:

// オリンピック開催年かどうか(year >= 2000を仮定)
int olympic(int year)
{
	int y = 2000;
	while (y <= year) {
		y += 2;
	}
	return y == year;
}

Re: C言語のプログラム

Posted: 2011年4月27日(水) 23:25
by box
どうしてそこまで無限ループ(終了しないプログラム!)にこだわるのか、全然わかりません。
入力する数値は1個なんですよね?であれば、その数値が
4の倍数なのか4で割って2余るのか(おっと、すごいヒントだ!)によって
夏季オリンピックの開催年か冬季オリンピックの開催年か、あるいはオリンピックを開催しない年なのかを
出力するだけってことに気づかないですかねぇ。

Re: C言語のプログラム

Posted: 2011年4月27日(水) 23:49
by しひ
もしかして、「無限ループされた数値」というのは、Haskellでの無限リストのことを指していたりして。

Re: C言語のプログラム

Posted: 2011年4月28日(木) 01:13
by amu
(不適切な発言があったため、管理人が削除しました)

Re: C言語のプログラム

Posted: 2011年4月28日(木) 01:24
by amu
a5uaさんありがとうございます!それをヒントにできそうです。

Re: C言語のプログラム

Posted: 2011年4月28日(木) 02:26
by ISLe
amu さんが書きました:効率云々ではなく、こういう条件でもプログラムで出来るのか否か。出来るのであれば試したいただそれなんですけどね、、、。んでその書き方をわかる方が居れば聞きたいという事です。
amu さんが書きました:2011,2012と入力…。テキスト、コードに何度もかいてある通りです。入力された数がオリンピックの開催年に当たれば開催されると文字表示、否なら開催されないと表示したいです。
要は2000から2002,2004…と2づつ増え続ける数を無限ループで表して、その結果を条件にして、入力値と条件を照らし合わせて、一致するか否かの文字表示するコードが分かればと思うしだいです。
無限に開催年を出して一致したら開催すると(出力)する→一致しないときは無限に続く
できるかできないかという問いにはできないという回答になるかと。

おや、他人に暴言を吐いておきながらあっさり前提条件を覆すのですか。

Re: C言語のプログラム

Posted: 2011年4月29日(金) 00:17
by Dixq (管理人)
> amuさん

規約を守った投稿をお願いします。
特定の人を不快にさせる暴言は吐いた自分にとって良い結果を生みません。
暴言を吐かれて次の機会にまた親身になって答えてあげようと思ってくれる人は少ないことでしょう。
大人の対応をして頂けると有難いです。