円と座標に関するプログラム
-
むすめふさほせ
円と座標に関するプログラム
c言語初心者で次の問題がまったくわかりません。
「原点を中心とし、第一象限における円を考える。自然数である半径nを入力して円内部の自然数である座標(x,y)を表示し、またその個数と各座標における x^2+y^2 の値を求めて昇順に並び替えて表示せよ。」
という問題です。
わかりやすい解答と解説をよろしくお願いいたします。
「原点を中心とし、第一象限における円を考える。自然数である半径nを入力して円内部の自然数である座標(x,y)を表示し、またその個数と各座標における x^2+y^2 の値を求めて昇順に並び替えて表示せよ。」
という問題です。
わかりやすい解答と解説をよろしくお願いいたします。
Re: 円と座標に関するプログラム
数学的には解けるってことですか?むすめふさほせ さんが書きました:c言語初心者で次の問題がまったくわかりません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 円と座標に関するプログラム
数学的には解ける、ということは、解くための手順はおわかりであるということですね。
その手順を、まずは日本語で説明してみてください。
その手順を、まずは日本語で説明してみてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 円と座標に関するプログラム
関数とか配列とか、プログラムの実装に関することをおたずねしているわけではなかったんですが…。
例えば、当該の四分の一円の半径が3という具体的な数値であるとします。
このとき、当該の四分の一円の内部(円周上を含むのかどうか、私にはわかりませんが)にある
自然数の座標(x, y)をすべて求めるには、どういう手順を踏むのでしょうか。
先ほどの投稿で「数学的にはわかる」と書かれていましたので、このあたりについては
説明がおできになると思っています。
例えば、当該の四分の一円の半径が3という具体的な数値であるとします。
このとき、当該の四分の一円の内部(円周上を含むのかどうか、私にはわかりませんが)にある
自然数の座標(x, y)をすべて求めるには、どういう手順を踏むのでしょうか。
先ほどの投稿で「数学的にはわかる」と書かれていましたので、このあたりについては
説明がおできになると思っています。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 円と座標に関するプログラム
C言語のソースコードや説明を示すことはできますが、そもそもこの問題を数学的に解けない状態であるのにむすめふさほせ さんが書きました: わかりやすい解答と解説をよろしくお願いいたします。
それらをごらんになってもあまり意味がないような気がしますね。
まずは数学的に解けるようにしたいですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 円と座標に関するプログラム
こんにちは。
第一象限とか懐かしいなー。
いくつかポイントがあると思いますが、
① 原点を中心とした半径nの円の中に、座標(x,y)が含まれるかどうか、どうやって判定すればよいか?
② 座標(x,y)はたくさんあるわけですが、それをC言語でどのように扱えばいいか?
それぞれ、どんな感じで理解されていますか?
第一象限とか懐かしいなー。
いくつかポイントがあると思いますが、
① 原点を中心とした半径nの円の中に、座標(x,y)が含まれるかどうか、どうやって判定すればよいか?
② 座標(x,y)はたくさんあるわけですが、それをC言語でどのように扱えばいいか?
それぞれ、どんな感じで理解されていますか?
-
むすめふさほせ
Re: 円と座標に関するプログラム
ご丁寧にありがとうございます。
私としてはc言語のソースコードでかまいません。
ookamiさん書き込みありがとうございます。
①に関しては x^2+y^2<n^2 で判定するのでしょうか?
②に関しては int x,y; とすれば「いいのでしょうか?
拙い文章ですいません。本当にこれくらいしかわからないのです。
私としてはc言語のソースコードでかまいません。
ookamiさん書き込みありがとうございます。
①に関しては x^2+y^2<n^2 で判定するのでしょうか?
②に関しては int x,y; とすれば「いいのでしょうか?
拙い文章ですいません。本当にこれくらいしかわからないのです。
Re: 円と座標に関するプログラム
ookamiさんの②のポイントに関して補足させていただきます。
座標(x,y)が円の中に含まれるかどうかは、確かに①の方法で判定できます。
しかし、②のポイントは判定する座標(x,y)をどのようにしてリストアップするかということです。
半径5の円の座標に含まれる点を調べるのに、(x, y) = (9999, 43534) , ( -3333, 5434) のような点は調べないですよね?
無限の点を調べることはできないので、判定する座標を絞る必要があるわけです。
座標(x,y)が円の中に含まれるかどうかは、確かに①の方法で判定できます。
しかし、②のポイントは判定する座標(x,y)をどのようにしてリストアップするかということです。
半径5の円の座標に含まれる点を調べるのに、(x, y) = (9999, 43534) , ( -3333, 5434) のような点は調べないですよね?
無限の点を調べることはできないので、判定する座標を絞る必要があるわけです。
Re: 円と座標に関するプログラム
まず、プログラムを組む前に、手作業で数学的にどのように解くのかを考えて下さい。
x>0, y>0 が示すのは第一象限という条件だけです。
その条件だけなら、
(x, y) = (99999999999, 4359999934999), (1000000, 1000000)
などの座標も調べなければいけませんが、手作業でそんなことしません。
さらに座標を絞る条件が必要です。
x>0, y>0 が示すのは第一象限という条件だけです。
その条件だけなら、
(x, y) = (99999999999, 4359999934999), (1000000, 1000000)
などの座標も調べなければいけませんが、手作業でそんなことしません。
さらに座標を絞る条件が必要です。
Re: 円と座標に関するプログラム
それは、最初の投稿で第一象限を対象とするとか自然数の座標(x, y)とか書かれているのですから自明ですね。むすめふさほせ さんが書きました:ということは x>0, y>0; でよいのでしょうか?
問題は、四分の一円の半径を考慮して、最大どこまでの(x, y)について調べればいいか、ってことです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
-
むすめふさほせ
Re: 円と座標に関するプログラム
まずは解答を示していただき、それを解説してくださらないでしょうか。
皆様が丁寧に解答へと導いてくださろうとしているところ申し訳ありません。
皆様が丁寧に解答へと導いてくださろうとしているところ申し訳ありません。
Re: 円と座標に関するプログラム
自分で考える癖をつけてほしいという理由で
丸投げは禁止となっております。よって、ソースコードをそのまま書くことはいたしません。
提出期限か何かがあるのですか?
とりあえず、今回の問題を私なりに考え、問題文の形で並べてみたので参考にしてみてください。
なお、nの範囲がわからないので配列とソートは使っていません。
これらを使う必要があるのならば自分で調べるなり、協力を求めるなりしてください。
A.
まずは(x,y)を求める方法を考えます。
(1) 点(x,y)が半径nの円の内部にあるとき、どのような関係式が成り立ちますか。
これについてはx^2+y^2<n^2と書かれていますね。
(2) 半径がnの時、x,yはこれ以上にはならないと思う値を示してください。
これもx,yはn-1までと書いていますね。
(3) n=3のとき、(1)の答えを満たす自然数x,yの組(x,y)とそれぞれのx^2+y^2の値を全て書いてください。
B.
A.で考えたことを参考に半径nの円の内部にある(x,y)を表示する
プログラムを考えます。
(4) x,yの両方が(2)の答えよりも小さい(x,y)を全て表示する処理はどう書けるでしょうか。
次の?????をうめてください。 (5)点(x,y)が半径nの円の内部にあるとき、(x,y)を表示するという処理はどう書けるでしょうか。
次の?????を埋めてください。 (6) (4),(5)を踏まえたうえで半径nの円の内部にある(x,y)を全て表示するという処理はどう書けるでしょうか。
(7) 個数のカウントを行う変数をcountとするとき、
countの宣言
countの初期化
countの加算
countの中身の表示
を行う文を示した後、
(6)で書いた処理に追加してください。
(8) で動くプログラムを完成させてください。
C.昇順(昇順の意味は大丈夫かな)に表示する処理を考えます。
(10) x^2+y^2=mとなる(x,y)を表示する処理はどうなりますか。
(11) x^2+y^2の取りうる値の範囲を示してください。
(12) 変数mを(11)で答えた範囲で変化させながら x^2+y^2=m
を満たす(x,y)を各mごとに調べ、(x,y)とmを表示するという処理をかいてください。
丸投げは禁止となっております。よって、ソースコードをそのまま書くことはいたしません。
提出期限か何かがあるのですか?
とりあえず、今回の問題を私なりに考え、問題文の形で並べてみたので参考にしてみてください。
なお、nの範囲がわからないので配列とソートは使っていません。
これらを使う必要があるのならば自分で調べるなり、協力を求めるなりしてください。
A.
まずは(x,y)を求める方法を考えます。
(1) 点(x,y)が半径nの円の内部にあるとき、どのような関係式が成り立ちますか。
これについてはx^2+y^2<n^2と書かれていますね。
(2) 半径がnの時、x,yはこれ以上にはならないと思う値を示してください。
これもx,yはn-1までと書いていますね。
(3) n=3のとき、(1)の答えを満たす自然数x,yの組(x,y)とそれぞれのx^2+y^2の値を全て書いてください。
B.
A.で考えたことを参考に半径nの円の内部にある(x,y)を表示する
プログラムを考えます。
(4) x,yの両方が(2)の答えよりも小さい(x,y)を全て表示する処理はどう書けるでしょうか。
次の?????をうめてください。 (5)点(x,y)が半径nの円の内部にあるとき、(x,y)を表示するという処理はどう書けるでしょうか。
次の?????を埋めてください。 (6) (4),(5)を踏まえたうえで半径nの円の内部にある(x,y)を全て表示するという処理はどう書けるでしょうか。
(7) 個数のカウントを行う変数をcountとするとき、
countの宣言
countの初期化
countの加算
countの中身の表示
を行う文を示した後、
(6)で書いた処理に追加してください。
(8) で動くプログラムを完成させてください。
C.昇順(昇順の意味は大丈夫かな)に表示する処理を考えます。
(10) x^2+y^2=mとなる(x,y)を表示する処理はどうなりますか。
(11) x^2+y^2の取りうる値の範囲を示してください。
(12) 変数mを(11)で答えた範囲で変化させながら x^2+y^2=m
を満たす(x,y)を各mごとに調べ、(x,y)とmを表示するという処理をかいてください。
Re: 円と座標に関するプログラム
机上で解くことができないと思われる状態で、
ソースコードを示して何か意味があるとはあまり思えないです。
定規とコンパスと方眼紙を用意して、問題を図化するところから始めてみてはどうでしょうか。
次に、机上で解くための考え方(アルゴリズム)を見つける。
C言語のソースコードに落とし込むのはそれから。
ソースコードで
・半径の入力方法がわからない
・x座標やy座標に関するループをどのように書いたらいいかわからない
などという状況でしたら、文法の基礎から勉強してください。本を読んだりサイトで調べたり、方法はいくらでもあります。
ソースコードを示して何か意味があるとはあまり思えないです。
定規とコンパスと方眼紙を用意して、問題を図化するところから始めてみてはどうでしょうか。
次に、机上で解くための考え方(アルゴリズム)を見つける。
C言語のソースコードに落とし込むのはそれから。
ソースコードで
・半径の入力方法がわからない
・x座標やy座標に関するループをどのように書いたらいいかわからない
などという状況でしたら、文法の基礎から勉強してください。本を読んだりサイトで調べたり、方法はいくらでもあります。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
-
むすめふさほせ
Re: 円と座標に関するプログラム
返信が遅れて申し訳ありません
できるだけ自分で考えてみました
Tatu様の書き込みを参考にまとめると
となるのでしょうか?
c(10)~(12)はどうしてもわかりません
できるだけ自分で考えてみました
Tatu様の書き込みを参考にまとめると
#include<stdio.h>
int main(void)
{
int x,y,n;
int count=0;
if(x*x+y*y<n*n)
{
for( x = 0; x < n-1; x++){
for( y=0; y < n-1; y++){
pritnf("(%d,%d)",x,y);
}
}
countの加算←わかりません
printf("座標は個数は%dです",count);
return(0);
}
c(10)~(12)はどうしてもわかりません
Re: 円と座標に関するプログラム
8行目に、nをscanfで入力するようにしましょう。
9行目のifですが、まだこの段階では、x,yの値が決まっていないので、判断することができません。
このif文は13行のprintfの前に(2つのforの中へ)場所を移して考えましょう。
countはそのifの中で、count++してみましょう。
その辺までできたら、また、プログラムを添付してみたら。
9行目のifですが、まだこの段階では、x,yの値が決まっていないので、判断することができません。
このif文は13行のprintfの前に(2つのforの中へ)場所を移して考えましょう。
countはそのifの中で、count++してみましょう。
その辺までできたら、また、プログラムを添付してみたら。
non
Re: 円と座標に関するプログラム
Cの昇順に表示させる方法についてはまだ後にしておきましょう。
「となるのでしょうか?」と書かれていますが
できれば自分のパソコンで実行し、うまくいくかを
確かめられるようにした方がよいと思います。
もし、自分でプログラムを考えて作るということがあれば
実行して正しい、少なくとも思い通りに動くかどうかを
自分で判断できるほうがよいですから。
私は趣味でゲームを制作することがありますが
処理の追加、調整のたびにそれがうまくいっているのか
確かめるためにテストプレイしています。
さて、書かれたコードについてですが
1.nについて
変数nに値が入っていないままnが使われているようです。
とりあえずnを入力させる処理をscanfを使って書いてみてください。
2.円の内部にあるかどうかの判断
この処理はx,yに調べたい値が代入されている時に行うので
if(x*x+y*y<n*n)はforループの中にあるはずです。
3.for文の()の中身について
私の書いた問題文(2)で答えがn-1まで(n以上にはならない)なので
x,yがn-1の場合もあり得ます。例えばn=3の場合、(2,1)はx=3-1=2になっていますが
2^2+1^2 = 5 < 9 = 3^2で条件を満たします。
また、x,yが自然数という条件もうっかり忘れてしまっているようです。
この二つの点を考えてforの()の中身をなおしてみてください。
4.(x,y)を表示する処理
pritnfと書かれていますがあっていますか?
たった1字のタイプミスで動かないということがよくあるので気を付けてください。
あと、インデントに全角のスペースをうっかり使ってしまい、動かなくなったということもあります。
5.countの加算
これは処理の文自体はわかるけど
どこにおけばよいのかわからないということでしょうか?
まずは2,3をなおしましょう。
そして、(x,y)が円の内部にあるときにこの処理を行うようにしてください。
(x,y)が円の内部にあるときにはその(x,y)を表示する処理を行っているはずです。
あと、ソース内にコメントを書くときは
//コメントや/*コメント*/などのようにしてください。
6.
個数を表示する時の文章は
座標「の」個数は%dです
のほうがよいのではないでしょうか?
7.
中括弧{}の数は合わせてください。
1,2,5についてはnonさんも指摘していますね。
とりあえずできるとこまでやったらまたここに書き込んでください。
うまくいけば
n=1のとき、個数は0と表示され、
n=2のとき、個数は1と表示され、
n=3のとき、個数は4と表示され、
n=4のとき、個数は8と表示されるはずです。
(3)の答えが書かれていませんが確かめておいてくださいね。
「となるのでしょうか?」と書かれていますが
できれば自分のパソコンで実行し、うまくいくかを
確かめられるようにした方がよいと思います。
もし、自分でプログラムを考えて作るということがあれば
実行して正しい、少なくとも思い通りに動くかどうかを
自分で判断できるほうがよいですから。
私は趣味でゲームを制作することがありますが
処理の追加、調整のたびにそれがうまくいっているのか
確かめるためにテストプレイしています。
さて、書かれたコードについてですが
1.nについて
変数nに値が入っていないままnが使われているようです。
とりあえずnを入力させる処理をscanfを使って書いてみてください。
2.円の内部にあるかどうかの判断
この処理はx,yに調べたい値が代入されている時に行うので
if(x*x+y*y<n*n)はforループの中にあるはずです。
3.for文の()の中身について
私の書いた問題文(2)で答えがn-1まで(n以上にはならない)なので
x,yがn-1の場合もあり得ます。例えばn=3の場合、(2,1)はx=3-1=2になっていますが
2^2+1^2 = 5 < 9 = 3^2で条件を満たします。
また、x,yが自然数という条件もうっかり忘れてしまっているようです。
この二つの点を考えてforの()の中身をなおしてみてください。
4.(x,y)を表示する処理
pritnfと書かれていますがあっていますか?
たった1字のタイプミスで動かないということがよくあるので気を付けてください。
あと、インデントに全角のスペースをうっかり使ってしまい、動かなくなったということもあります。
5.countの加算
これは処理の文自体はわかるけど
どこにおけばよいのかわからないということでしょうか?
まずは2,3をなおしましょう。
そして、(x,y)が円の内部にあるときにこの処理を行うようにしてください。
(x,y)が円の内部にあるときにはその(x,y)を表示する処理を行っているはずです。
あと、ソース内にコメントを書くときは
//コメントや/*コメント*/などのようにしてください。
6.
個数を表示する時の文章は
座標「の」個数は%dです
のほうがよいのではないでしょうか?
7.
中括弧{}の数は合わせてください。
1,2,5についてはnonさんも指摘していますね。
とりあえずできるとこまでやったらまたここに書き込んでください。
うまくいけば
n=1のとき、個数は0と表示され、
n=2のとき、個数は1と表示され、
n=3のとき、個数は4と表示され、
n=4のとき、個数は8と表示されるはずです。
(3)の答えが書かれていませんが確かめておいてくださいね。
-
むすめふさほせ
Re: 円と座標に関するプログラム
エラーが出たのならばそのエラーメッセージをコピペして回答者にわかるようにしましょう。
さて、コードについてですが
1.scanf
scanfの使い方はそれでよいのでしょうか?二番目の引数を確認してください。
2.全角スペース
Microsoft Visual C++ 2010で試したところ
1>c:\users\tatu\downloads\dxlib_vc\サンプルプログラム実行用フォルダ\その他\円の中の点\
main.c(21): error C3872: '0x3000': この文字を識別子で使用することはできません
というエラーメッセージが出ました。
このメッセージの0x3000というのは先ほど書いた全角スペースのことです。
全角スペースを消してインデントをやり直してください。
全角スペースの消去には
置換で検索する文字列に全角スペースを入れ、
置換後の文字列を空白(スペースも何もいれない)とすると便利です。
3.countについて
countの宣言、初期化が無くなっています。
countを加算するところで;が抜けています。
if文で複数の処理を行わせたい場合は のようにします。慣れないうちは処理が1つしかなくても{}を付けてください。
そうしておくと今回のように処理を追加するときに{}をつけなくても済みます。
4.最後のprintfの%dが何の値か書かれていません。
先ほどの指摘は「は」ではなく、「の」がよいのではないですかというつもりで書いただけで
countをつけるなという意味ではありません。
5.{}
先ほども書きましたが数があっていません。
forループの中にさらにfor文を入れる場合は のようにしてください。
さて、コードについてですが
1.scanf
scanfの使い方はそれでよいのでしょうか?二番目の引数を確認してください。
2.全角スペース
Microsoft Visual C++ 2010で試したところ
1>c:\users\tatu\downloads\dxlib_vc\サンプルプログラム実行用フォルダ\その他\円の中の点\
main.c(21): error C3872: '0x3000': この文字を識別子で使用することはできません
というエラーメッセージが出ました。
このメッセージの0x3000というのは先ほど書いた全角スペースのことです。
全角スペースを消してインデントをやり直してください。
全角スペースの消去には
置換で検索する文字列に全角スペースを入れ、
置換後の文字列を空白(スペースも何もいれない)とすると便利です。
3.countについて
countの宣言、初期化が無くなっています。
countを加算するところで;が抜けています。
if文で複数の処理を行わせたい場合は のようにします。慣れないうちは処理が1つしかなくても{}を付けてください。
そうしておくと今回のように処理を追加するときに{}をつけなくても済みます。
4.最後のprintfの%dが何の値か書かれていません。
先ほどの指摘は「は」ではなく、「の」がよいのではないですかというつもりで書いただけで
countをつけるなという意味ではありません。
5.{}
先ほども書きましたが数があっていません。
forループの中にさらにfor文を入れる場合は のようにしてください。
-
むすめふさほせ
Re: 円と座標に関するプログラム
エラーメッセージはこれです
countが全然わかりません
Re: 円と座標に関するプログラム
1.そのエラーメッセージをGoogleで検索をかけて調べたところ、
やはり全角スペースの存在が原因でした。全角スペースを削除してください。
半角スペースかtabキーを押すと出るtabスペースならば大丈夫です。
検索や置換についてはメモ帳と同様の仕様ならばメニューバーの編集から選べますし、
ショートカットキーはCtrl+Fで検索、Ctrl+Hで置換が行えるようになるはずです。
わからなければすべてのスペースを削除し、半角スペースでインデントをやり直してください。
2.countについては
countの初期化が抜けてます。
countの加算を行うところはcount++;と;(セミコロン)をちゃんとつけてください。
3.if文で複数の処理をさせたい場合はどうするのでしたか?
今のままでは(x,y)が円の内部にあるかどうかにかかわらずカウントしてしまいます。
4.scanfの第二引数を確認してください。
scanfを使っているプログラムを見るとよいでしょう。
指摘されたことは全部確認し、
わからないならわからないということとどこがわからないかを書いてください。
やはり全角スペースの存在が原因でした。全角スペースを削除してください。
半角スペースかtabキーを押すと出るtabスペースならば大丈夫です。
検索や置換についてはメモ帳と同様の仕様ならばメニューバーの編集から選べますし、
ショートカットキーはCtrl+Fで検索、Ctrl+Hで置換が行えるようになるはずです。
わからなければすべてのスペースを削除し、半角スペースでインデントをやり直してください。
2.countについては
countの初期化が抜けてます。
countの加算を行うところはcount++;と;(セミコロン)をちゃんとつけてください。
3.if文で複数の処理をさせたい場合はどうするのでしたか?
今のままでは(x,y)が円の内部にあるかどうかにかかわらずカウントしてしまいます。
4.scanfの第二引数を確認してください。
scanfを使っているプログラムを見るとよいでしょう。
指摘されたことは全部確認し、
わからないならわからないということとどこがわからないかを書いてください。
-
むすめふさほせ
Re: 円と座標に関するプログラム
何かが違います
結果は次の通りです
半径nを入力してください4
(1,1)(1,2)(1,3)(2,1)(2,2)(2,3)(3,1)(3,2)座標の個数は37814093です
#include<stdio.h>
int main(void)
{
int x;
int y;
int n;
int count;
printf("半径nを入力してください");
scanf("%d",&n);
for( x = 1; x < n; x++)
{
for( y = 1; y < n; y++)
{
if(x*x+y*y<n*n)
printf("(%d,%d)",x,y);
count++;
}
}
printf("座標の個数は%dです",count);
return(0);
}
半径nを入力してください4
(1,1)(1,2)(1,3)(2,1)(2,2)(2,3)(3,1)(3,2)座標の個数は37814093です
Re: 円と座標に関するプログラム
(x,y)の表示はできてますね。
個数の表示がおかしいのはcountの初期化を忘れているからですね。
数え始める前なので最初は0です。
今回のように初期化を忘れるとデタラメな値が勝手に入りますので
初期化忘れには気を付けてください。
あと、printfで改行が行われるようにすればもっと見やすくなるのではないでしょうか?
個数の表示がおかしいのはcountの初期化を忘れているからですね。
数え始める前なので最初は0です。
今回のように初期化を忘れるとデタラメな値が勝手に入りますので
初期化忘れには気を付けてください。
あと、printfで改行が行われるようにすればもっと見やすくなるのではないでしょうか?
-
むすめふさほせ
Re: 円と座標に関するプログラム
気がかりなことに、座標の個数が違う数で表示されます
例として
半径nを入力してください5
(1,1)(1,2)(1,3)(1,4)(2,1)(2,2)(2,3)(2,4)(3,1)(3,2)(3,3)(4,1)(4,2)座標の個数は16です
となります
#include<stdio.h>
int main(void)
{
int x;
int y;
int n;
int count=0;
printf("半径nを入力してください");
scanf("%d",&n);
for( x = 1; x < n; x++)
{
for( y = 1; y < n; y++)
{
if(x*x+y*y<n*n)
printf("(%d,%d)",x,y);
count++;
}
}
printf("座標の個数は%dです\n",count);
return(0);
}
半径nを入力してください5
(1,1)(1,2)(1,3)(1,4)(2,1)(2,2)(2,3)(2,4)(3,1)(3,2)(3,3)(4,1)(4,2)座標の個数は16です
となります
-
むすめふさほせ
Re: 円と座標に関するプログラム
確かにうまくいきました!
アドバイスありがとうございます
つぎにTatu様のアドバイスのなかで、Cの手順がわかりません
何かヒントはないでしょうか?
アドバイスありがとうございます
つぎにTatu様のアドバイスのなかで、Cの手順がわかりません
何かヒントはないでしょうか?
-
Cr
Re: 円と座標に関するプログラム
どこがどう分からないのか書いてもらわないとヒントの出しようもないのですが…
Tatu様のアドバイスのCの手順と言われましても、いちいち探さなければならないような質問の仕方では、回答しようと思ってくださる方も減っちゃいますよ?
Tatu様のアドバイスのCの手順と言われましても、いちいち探さなければならないような質問の仕方では、回答しようと思ってくださる方も減っちゃいますよ?
のどれが分からないのですか?C.昇順(昇順の意味は大丈夫かな)に表示する処理を考えます。
(10) x^2+y^2=mとなる(x,y)を表示する処理はどうなりますか。
(11) x^2+y^2の取りうる値の範囲を示してください。
(12) 変数mを(11)で答えた範囲で変化させながら x^2+y^2=m
を満たす(x,y)を各mごとに調べ、(x,y)とmを表示するという処理をかいてください。
-
むすめふさほせ
Re: 円と座標に関するプログラム
申し訳ございません
ただ、どこがどうわからないと言われても、(10)~(12)のすべてc言語でどう表現すればいいのかがわからないのです
ただ、どこがどうわからないと言われても、(10)~(12)のすべてc言語でどう表現すればいいのかがわからないのです
-
Cr
Re: 円と座標に関するプログラム
「分からない」よりは「c言語でどう表現すればいいのか分からない」の方が詳しいですね。
数学としては解けるのですか?
C言語でどう表現したらいいのか分からないなら
まず、日本語で書いてみましょうよ。
特殊な問題でない限りC言語が関係してくるのはそれからです。
とりあえず、先ほどむすめふさほせ様が作ったプログラムを日本語に直すとどういうプログラムですか?
数学としては解けるのですか?
C言語でどう表現したらいいのか分からないなら
まず、日本語で書いてみましょうよ。
特殊な問題でない限りC言語が関係してくるのはそれからです。
とりあえず、先ほどむすめふさほせ様が作ったプログラムを日本語に直すとどういうプログラムですか?
Re: 円と座標に関するプログラム
>>Cr さん
問題文を書いた時に何でそれで昇順になるかを説明してはいないので
たぶんCの質問文の理由、意味もまだわかっていないと思います。
>>むすめふさほせ さん
ここまでのプログラムを理解して書いたかの確認のため、
Crさんが書いたようにプログラムの動きを日本語で説明してください。
説明はint x;から printf("座標の個数は%dです\n",count);までで結構です。
説明するときはコメントを使うとよいでしょう。
例:
ここまででだいたい半分くらいできたことになります。残りも今まで使った文法がわかっていればできますよ。
では、残りの「各座標におけるx^2+y^2の値を求めて昇順に並び替えて表示せよ」について
考えることにしましょう。
もし、配列を使っているのならばこれまでの(x,y)の表示を行うときに
配列でx^2+y^2の値を記憶し、昇順に表示するようにすればよいのですが
私の考え方では配列を使っていません。
どうすればx^2+y^2の値が昇順になるか。
ソートが使えないのだから初めからx^2+y^2が昇順に表示されるようにすればよい。
しかし、x^2+y^2が昇順となるような(x,y)の法則は見つからない。
そこで、別の変数(今回はmとした)を用意し、
その変数をx^2+y^2の取りうる値の範囲で徐々に大きくし、
それぞれの値とx^2+y^2が一致する時、
(x,y)とm(=x^2+y^2)を表示するということを考えました。
これで昇順に並び替えたのと同じことになります。
(10)
まず、「x^2+y^2=mならば(x,y)を表示する」という処理を考えてください。
ある条件を満たしているなら処理を行うという文はどういうものだったでしょうか?
条件で二つの値が等しいかの判断に使うものは何だったでしょうか?
なお、C言語においては「=」は代入の意味なのでこれではありません。
そして、この処理をforの中で行うようにしてください。
forについてはこれまでの内容でわかっていますね?
(11)
x^2+y^2の最小値とこれ以上にはならないという値を示してください。
(x,y)のxとyは両方とも自然数であり、
また、半径nの円の内部にあるという条件を持ちます。
(12)
今まではx,yを変更するだけだったのが
さらにmの変更まで加わります。
まずは説明を書き、それができたら書き込んでください。
(10)から(12)については(10)、(11)を考えて書いてください。
コードについては書いてあったものを消されたりすると面倒になる気がするので
今までのものを変更するのではなく、
printf("座標の個数は%dです\n",count);
の後ろに残りの処理を追加するというやり方でやってください。
問題文を書いた時に何でそれで昇順になるかを説明してはいないので
たぶんCの質問文の理由、意味もまだわかっていないと思います。
>>むすめふさほせ さん
ここまでのプログラムを理解して書いたかの確認のため、
Crさんが書いたようにプログラムの動きを日本語で説明してください。
説明はint x;から printf("座標の個数は%dです\n",count);までで結構です。
説明するときはコメントを使うとよいでしょう。
例:
ここまででだいたい半分くらいできたことになります。残りも今まで使った文法がわかっていればできますよ。
では、残りの「各座標におけるx^2+y^2の値を求めて昇順に並び替えて表示せよ」について
考えることにしましょう。
もし、配列を使っているのならばこれまでの(x,y)の表示を行うときに
配列でx^2+y^2の値を記憶し、昇順に表示するようにすればよいのですが
私の考え方では配列を使っていません。
どうすればx^2+y^2の値が昇順になるか。
ソートが使えないのだから初めからx^2+y^2が昇順に表示されるようにすればよい。
しかし、x^2+y^2が昇順となるような(x,y)の法則は見つからない。
そこで、別の変数(今回はmとした)を用意し、
その変数をx^2+y^2の取りうる値の範囲で徐々に大きくし、
それぞれの値とx^2+y^2が一致する時、
(x,y)とm(=x^2+y^2)を表示するということを考えました。
これで昇順に並び替えたのと同じことになります。
(10)
まず、「x^2+y^2=mならば(x,y)を表示する」という処理を考えてください。
ある条件を満たしているなら処理を行うという文はどういうものだったでしょうか?
条件で二つの値が等しいかの判断に使うものは何だったでしょうか?
なお、C言語においては「=」は代入の意味なのでこれではありません。
そして、この処理をforの中で行うようにしてください。
forについてはこれまでの内容でわかっていますね?
(11)
x^2+y^2の最小値とこれ以上にはならないという値を示してください。
(x,y)のxとyは両方とも自然数であり、
また、半径nの円の内部にあるという条件を持ちます。
(12)
今まではx,yを変更するだけだったのが
さらにmの変更まで加わります。
まずは説明を書き、それができたら書き込んでください。
(10)から(12)については(10)、(11)を考えて書いてください。
コードについては書いてあったものを消されたりすると面倒になる気がするので
今までのものを変更するのではなく、
printf("座標の個数は%dです\n",count);
の後ろに残りの処理を追加するというやり方でやってください。
Re: 円と座標に関するプログラム
学校の課題だと思うのですが、
1 配列を習っている?
2 関数は習っている?
3 関数に配列を引数で渡すことを習っている?
4 ソート(並び替え)を習っている?
5 習ったソートの方法は?
1~5にお答えください。
1 配列を習っている?
2 関数は習っている?
3 関数に配列を引数で渡すことを習っている?
4 ソート(並び替え)を習っている?
5 習ったソートの方法は?
1~5にお答えください。
non
Re: 円と座標に関するプログラム
Tatuさん
素直に、配列を使った方が、わかりやすいと思いますが。
私が、思いつかないすばらしい方法があるのならいいのですが・・・
2変数(x、y)でmが小さい方から計算させるのは難しくないですか?Tatu さんが書きました: そこで、別の変数(今回はmとした)を用意し、
その変数をx^2+y^2の取りうる値の範囲で徐々に大きくし、
それぞれの値とx^2+y^2が一致する時、
(x,y)とm(=x^2+y^2)を表示するということを考えました。
これで昇順に並び替えたのと同じことになります。
素直に、配列を使った方が、わかりやすいと思いますが。
私が、思いつかないすばらしい方法があるのならいいのですが・・・
non
-
むすめふさほせ
Re: 円と座標に関するプログラム
non様
1について…配列は習いました
2について…関数は習いました
3~5は習っていません
Tatu様
すいませんが「プログラムの動き」はもう少し時間がかかります
1について…配列は習いました
2について…関数は習いました
3~5は習っていません
Tatu様
すいませんが「プログラムの動き」はもう少し時間がかかります
-
むすめふさほせ
Re: 円と座標に関するプログラム
プログラムの動きができました
#include<stdio.h>
int main(void)
{
int x;
int y;
int n;
int count=0;
printf("半径nを入力してください");//半径nを入力させる
scanf("%d",&n);//nの値を読み取る
for( x = 1; x < n; x++)//x座標が1からn-1まで繰り返す
{
for( y = 1; y < n; y++)//y座標が1からn-1まで繰り返す
{
if(x*x+y*y<n*n)//x^2+y^2の値ががn^2の値より小さい場合
{
printf("(%d,%d)",x,y);//座標(x.y)を表示する
count++;//座標の数を数える
}
}
}
printf("座標の個数は%dです\n",count);//座標と座標の数を表示する
return(0);
}
Re: 円と座標に関するプログラム
>>むすめふさほせ さん
文法については理解されているようですね。
>>non さん
私のやり方は
m=2のときの(x,y)は?
m=3のときの(x,y)は?
...
と順に調べていくというやり方なのですがわかりにくいでしょうか?
それとも、先生がいたとしたらその人を納得させられるか怪しいという意味ですか?
配列などが必要だというのならば、むすめふさほせ さんはそのことを書いているはずです。
例えば「配列の使い方の練習のための問題です」とか。
なんにせよ私のやり方は配列とソートを使っていませんと断っています。
配列を使っていないのはnの範囲がわからないからです。
また、自分のやり方で作ったプログラムがnに1000のような大きな値を入力しても動くことは確認しています。
「円の半径は#define N 10のように指定するものとする。」などと書かれていたらよいのですが。
配列を使った方がよいと考えているであれば
「配列を使わないと評価されないかもしれません」などの
自分の考えや、知識をもっと明らかにした方がよいでしょうね。
文法については理解されているようですね。
>>non さん
私のやり方は
m=2のときの(x,y)は?
m=3のときの(x,y)は?
...
と順に調べていくというやり方なのですがわかりにくいでしょうか?
それとも、先生がいたとしたらその人を納得させられるか怪しいという意味ですか?
配列などが必要だというのならば、むすめふさほせ さんはそのことを書いているはずです。
例えば「配列の使い方の練習のための問題です」とか。
なんにせよ私のやり方は配列とソートを使っていませんと断っています。
配列を使っていないのはnの範囲がわからないからです。
また、自分のやり方で作ったプログラムがnに1000のような大きな値を入力しても動くことは確認しています。
「円の半径は#define N 10のように指定するものとする。」などと書かれていたらよいのですが。
配列を使った方がよいと考えているであれば
「配列を使わないと評価されないかもしれません」などの
自分の考えや、知識をもっと明らかにした方がよいでしょうね。
Re: 円と座標に関するプログラム
私がその方法で作ると、3重ループになり、アルゴリズムもわかりにくいだろうなと思った次第です。Tatu さんが書きました:>>non さん
私のやり方は
m=2のときの(x,y)は?
m=3のときの(x,y)は?
...
と順に調べていくというやり方なのですがわかりにくいでしょうか?
それとも、先生がいたとしたらその人を納得させられるか怪しいという意味ですか?
配列は習っていてもソートを習っていないのなら、Tatuさんのやり方の方が良いかもしれませんね。
non
-
むすめふさほせ
Re: 円と座標に関するプログラム
zの値を出して昇順に並び替えようと思いましたが案の定失敗しました。
エラーメッセージは次の通りです
プログラムは次の通りです
エラーメッセージは次の通りです
In function `main':
39: subscripted value is neither array nor pointer
39: subscripted value is neither array nor pointer
41: subscripted value is neither array nor pointer
42: subscripted value is neither array nor pointer
42: subscripted value is neither array nor pointer
43: subscripted value is neither array nor pointer
#include<stdio.h>
int main(void)
{
int x;
int y;
int z=0;
int n;
int i;
int j;
int count=0;
int dumy;
printf("円の半径nを入力してください:");//半径nを入力させる
scanf("%d",&n);//nの値を読み取る
for( x = 1; x < n; x++)//x座標が1からn-1まで繰り返す
{
for( y = 1; y < n; y++)//y座標が1からn-1まで繰り返す
{
if(x*x+y*y<n*n)//x^2+y^2の値ががn^2の値より小さい場合
{
printf("(%d,%d)",x,y);//座標(x.y)を表示する
count++;//座標の数を数える
}
}
}
z = x*x+y*y;
for( i = 0; i < n; i++)
{
for( j = i + 1; j < n; j++)
{
if( z[i] > z[j])
{
dumy = z[i];
z[i] = z[j];
z[j] = dumy;
}
}
}
for(i = 0; i < n; i++)
{
printf("\nzの値は%dです",z);
}
printf("\n座標の個数は%dです",count);//座標と座標の数を表示する
return(0);
}
Re: 円と座標に関するプログラム
むすめふさほせさんは空気が読めない人だねえ。
ソートを習っていないのに、選択法の一種をちゃんと見つけてきましたね。
さて7行目、zが配列なら、まず、配列の宣言をしましょう。
33行目の配列への格納は、25行の前後で行います。もちろん、配列ですよ。
35行や37行、48行、データの個数はnではないです。
50行も配列ですよ。
ソートを習っていないのに、選択法の一種をちゃんと見つけてきましたね。
さて7行目、zが配列なら、まず、配列の宣言をしましょう。
33行目の配列への格納は、25行の前後で行います。もちろん、配列ですよ。
35行や37行、48行、データの個数はnではないです。
50行も配列ですよ。
non
Re: 円と座標に関するプログラム
エラーメッセージは配列でもポインタでもない変数に添え字を使っていますよという意味です。
コードとエラーメッセージを見ると配列についてあまりよくわかっていないようです。
そこで配列の使い方の確認です。以下のことを考えてください。
int型の要素を5個持つ配列はどう宣言すればよいでしょうか?
数字を入力させて、その数字を各要素に代入するという処理を5回行い、
その結果を
1
5
6
3
10
のように入力した順に出力させるにはどうすればよいでしょうか?
問題の解き方なのですが
A.
z=x^2+y^2の値を(x,y)が円の内部かどうかを問わずに配列に記憶しておいて、
小さい数字から探し出して表示する方法。座標は配列の要素の番号から求める。
円の内部かを気にしないのは配列の要素の番号を座標に対応させるため。
配列のソートは行わない。これはプログラムを書いて動作確認しました。
B.
位置を記憶する配列と対応するx^2+y^2を記憶する配列を用意し、
それらをソートし、表示する。面倒。
C.
zの値を記憶する配列を用意し、この配列のソートを行って
zの値のみ表示する。座標は表示しなくてもよいのだろうか?
D.
配列を使わない今までに私が示したやり方。
が考えられます。どうしますか?
コードとエラーメッセージを見ると配列についてあまりよくわかっていないようです。
そこで配列の使い方の確認です。以下のことを考えてください。
int型の要素を5個持つ配列はどう宣言すればよいでしょうか?
数字を入力させて、その数字を各要素に代入するという処理を5回行い、
その結果を
1
5
6
3
10
のように入力した順に出力させるにはどうすればよいでしょうか?
問題の解き方なのですが
A.
z=x^2+y^2の値を(x,y)が円の内部かどうかを問わずに配列に記憶しておいて、
小さい数字から探し出して表示する方法。座標は配列の要素の番号から求める。
円の内部かを気にしないのは配列の要素の番号を座標に対応させるため。
配列のソートは行わない。これはプログラムを書いて動作確認しました。
B.
位置を記憶する配列と対応するx^2+y^2を記憶する配列を用意し、
それらをソートし、表示する。面倒。
C.
zの値を記憶する配列を用意し、この配列のソートを行って
zの値のみ表示する。座標は表示しなくてもよいのだろうか?
D.
配列を使わない今までに私が示したやり方。
が考えられます。どうしますか?
-
むすめふさほせ
Re: 円と座標に関するプログラム
non様
訂正してみましたが失敗しました
実行結果は次の通りです
円の半径nを入力してください:3
(1,1)(1,2)(2,1)(2,2)(2,3)(2,4)(3,1)(3,2)(3,3)(4,1)(4,2)
Tatu様
でよろしいでしょうか?
また問題の解き方はCでお願いします
訂正してみましたが失敗しました
#include<stdio.h>
int main(void)
{
int x;
int y;
int count=0;
int n;
int i;
int j;
int z[]={0};
int dumy;
printf("円の半径nを入力してください:");//半径nを入力させる
scanf("%d",&n);//nの値を読み取る
for( x = 1; x < n; x++)//x座標が1からn-1まで繰り返す
{
for( y = 1; y < n; y++)//y座標が1からn-1まで繰り返す
{
if(x*x+y*y<n*n)//x^2+y^2の値ががn^2の値より小さい場合
{
printf("(%d,%d)",x,y);//座標(x.y)を表示する
count++;//座標の数を数える
z[count]=x*x+y*y;
}
}
}
for( i = 0; i < count; i++)
{
for( j = i + 1; j < count; j++)
{
if( z[i] > z[j])
{
dumy = z[i];
z[i] = z[j];
z[j] = dumy;
}
}
}
for(i = 0; i < count; i++)
{
printf("\nzの値は[%d]です",z[count]);
}
printf("\n座標の個数は%dです",count);//座標と座標の数を表示する
return(0);
}
円の半径nを入力してください:3
(1,1)(1,2)(2,1)(2,2)(2,3)(2,4)(3,1)(3,2)(3,3)(4,1)(4,2)
Tatu様
#include <stdio.h>
int main(void)
{
int a[5] = {0};
int i = 0;
for(i = 0; i <5; i = i+1)
{
scanf("a[%d] = %d\n",i,&a[i]);
}
for(i = 0; i <5; i = i +1)
{
printf("a[%d] = %d\n,i,a[i]);
}
return(0);
}
また問題の解き方はCでお願いします
Re: 円と座標に関するプログラム
もう少し、基本から勉強した方がいいと思いますが、とりあえず・・・・・
11行 int z[]={0};
これでは、配列が1個しか確保されません。
データの個数は不明ですから、自分が入力する半径の2乗ぐらい確保しておきましょう。
29行 z[count]=x*x+y*y;
この行は その前の
count++;//座標の数を数える
より前でないと、z[1]から入れることになりますよ。
53行
このcountは違うでしょう。
かっこの位置がだんだん出鱈目になってきています。
インデントをしっかり取りましょう。
11行 int z[]={0};
これでは、配列が1個しか確保されません。
データの個数は不明ですから、自分が入力する半径の2乗ぐらい確保しておきましょう。
29行 z[count]=x*x+y*y;
この行は その前の
count++;//座標の数を数える
より前でないと、z[1]から入れることになりますよ。
53行
このcountは違うでしょう。
かっこの位置がだんだん出鱈目になってきています。
インデントをしっかり取りましょう。
non
-
むすめふさほせ
Re: 円と座標に関するプログラム
non様
直してみましたがまだエラーが出ます
エラーメッセージは次の通りです
直してみましたがまだエラーが出ます
#include<stdio.h>
int main(void)
{
int x;
int y;
int count=0;
int n;
int i;
int j;
int z[16]=0;
int dumy;
printf("円の半径nを入力してください:");//半径nを入力させる
scanf("%d",&n);//nの値を読み取る
for( x = 1; x < n; x++)//x座標が1からn-1まで繰り返す
{
for( y = 1; y < n; y++)//y座標が1からn-1まで繰り返す
{
if(x*x+y*y<n*n)//x^2+y^2の値ががn^2の値より小さい場合
{
printf("(%d,%d)",x,y);//座標(x.y)を表示する
z[count]=x*x+y*y;
count++;//座標の数を数える
}
}
}
for( i = 0; i < count; i++)
{
for( j = i + 1; j < count; j++)
{
if( z[i] > z[j])
{
dumy = z[i];
z[i] = z[j];
z[j] = dumy;
}
}
}
for(i = 0; i < n; i++)
{
printf("\nzの値は%dです",z[count]);
}
printf("\n座標の個数は%dです",count);//座標と座標の数を表示する
return(0);
}
Re: 円と座標に関するプログラム
h2so5さんの指摘は無視ですか?
エラーメッセージはただ出ましたーだけじゃなくて
自分で英和辞典で大体の意味を探ったり、
ネットで検索をかけてみたりしてくださいね。
ただの意地悪なメッセージというわけではないんですから。
エラーメッセージが指す11行目のint z[16]=0;
配列の初期化の仕方はこれでよいのでしょうか?
53行目のz[count]
これだと同じ数字を繰り返し表示するだけです。
51行目のiは何のためにあるのですか?
エラーメッセージはただ出ましたーだけじゃなくて
自分で英和辞典で大体の意味を探ったり、
ネットで検索をかけてみたりしてくださいね。
ただの意地悪なメッセージというわけではないんですから。
エラーメッセージが指す11行目のint z[16]=0;
配列の初期化の仕方はこれでよいのでしょうか?
53行目のz[count]
これだと同じ数字を繰り返し表示するだけです。
51行目のiは何のためにあるのですか?
-
むすめふさほせ
Re: 円と座標に関するプログラム
Tatu様
アドバイスありがとうございます
おかげでようやく成功いたしました
実行結果
「円の半径nを入力してください:4
(1,1)(1,2)(1,3)(2,1)(2,2)(2,3)(3,1)(3,2)
x^2+y^2=2です
x^2+y^2=5です
x^2+y^2=5です
x^2+y^2=8です
x^2+y^2=10です
x^2+y^2=10です
x^2+y^2=13です
x^2+y^2=13です
座標の個数は8です」
質問に回答していただいた皆様
こんな初心者に丁寧に解答まで導いてくださり感謝しきれません
本当にありがとうございました
アドバイスありがとうございます
おかげでようやく成功いたしました
実行結果
「円の半径nを入力してください:4
(1,1)(1,2)(1,3)(2,1)(2,2)(2,3)(3,1)(3,2)
x^2+y^2=2です
x^2+y^2=5です
x^2+y^2=5です
x^2+y^2=8です
x^2+y^2=10です
x^2+y^2=10です
x^2+y^2=13です
x^2+y^2=13です
座標の個数は8です」
質問に回答していただいた皆様
こんな初心者に丁寧に解答まで導いてくださり感謝しきれません
本当にありがとうございました