円と座標に関するプログラム 

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
むすめふさほせ

円と座標に関するプログラム 

#1

投稿記事 by むすめふさほせ » 14年前

c言語初心者で次の問題がまったくわかりません。

「原点を中心とし、第一象限における円を考える。自然数である半径nを入力して円内部の自然数である座標(x,y)を表示し、またその個数と各座標における x^2+y^2 の値を求めて昇順に並び替えて表示せよ。」

という問題です。
わかりやすい解答と解説をよろしくお願いいたします。

box
記事: 2002
登録日時: 15年前

Re: 円と座標に関するプログラム 

#2

投稿記事 by box » 14年前

むすめふさほせ さんが書きました:c言語初心者で次の問題がまったくわかりません。
数学的には解けるってことですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

むすめふさほせ

Re: 円と座標に関するプログラム 

#3

投稿記事 by むすめふさほせ » 14年前

返信ありがとうございます。

c言語のプログラミングがわからないのです。

数学的にはわかります。

box
記事: 2002
登録日時: 15年前

Re: 円と座標に関するプログラム 

#4

投稿記事 by box » 14年前

数学的には解ける、ということは、解くための手順はおわかりであるということですね。
その手順を、まずは日本語で説明してみてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

むすめふさほせ

Re: 円と座標に関するプログラム 

#5

投稿記事 by むすめふさほせ » 14年前

zは自作関数内で昇順にし、1次元配列を用いるということしか説明できません・・・

box
記事: 2002
登録日時: 15年前

Re: 円と座標に関するプログラム 

#6

投稿記事 by box » 14年前

関数とか配列とか、プログラムの実装に関することをおたずねしているわけではなかったんですが…。

例えば、当該の四分の一円の半径が3という具体的な数値であるとします。
このとき、当該の四分の一円の内部(円周上を含むのかどうか、私にはわかりませんが)にある
自然数の座標(x, y)をすべて求めるには、どういう手順を踏むのでしょうか。

先ほどの投稿で「数学的にはわかる」と書かれていましたので、このあたりについては
説明がおできになると思っています。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

むすめふさほせ

Re: 円と座標に関するプログラム 

#7

投稿記事 by むすめふさほせ » 14年前

すいません。

こちらが受け取っていた意味と違うようでした。

数学的も説明できません。

また境界上は含みません。

box
記事: 2002
登録日時: 15年前

Re: 円と座標に関するプログラム 

#8

投稿記事 by box » 14年前

むすめふさほせ さんが書きました: わかりやすい解答と解説をよろしくお願いいたします。
C言語のソースコードや説明を示すことはできますが、そもそもこの問題を数学的に解けない状態であるのに
それらをごらんになってもあまり意味がないような気がしますね。

まずは数学的に解けるようにしたいですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
ookami
記事: 214
登録日時: 15年前
住所: 東京都

Re: 円と座標に関するプログラム 

#9

投稿記事 by ookami » 14年前

こんにちは。

第一象限とか懐かしいなー。

いくつかポイントがあると思いますが、
① 原点を中心とした半径nの円の中に、座標(x,y)が含まれるかどうか、どうやって判定すればよいか?
② 座標(x,y)はたくさんあるわけですが、それをC言語でどのように扱えばいいか?
それぞれ、どんな感じで理解されていますか?

むすめふさほせ

Re: 円と座標に関するプログラム 

#10

投稿記事 by むすめふさほせ » 14年前

ご丁寧にありがとうございます。 

私としてはc言語のソースコードでかまいません。


ookamiさん書き込みありがとうございます。
①に関しては x^2+y^2<n^2 で判定するのでしょうか?
②に関しては int x,y; とすれば「いいのでしょうか?

拙い文章ですいません。本当にこれくらいしかわからないのです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 円と座標に関するプログラム 

#11

投稿記事 by h2so5 » 14年前

ookamiさんの②のポイントに関して補足させていただきます。

座標(x,y)が円の中に含まれるかどうかは、確かに①の方法で判定できます。
しかし、②のポイントは判定する座標(x,y)をどのようにしてリストアップするかということです。

半径5の円の座標に含まれる点を調べるのに、(x, y) = (9999, 43534) , ( -3333, 5434) のような点は調べないですよね?
無限の点を調べることはできないので、判定する座標を絞る必要があるわけです。

むすめふさほせ

Re: 円と座標に関するプログラム 

#12

投稿記事 by むすめふさほせ » 14年前

ということは x>0, y>0; でよいのでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 円と座標に関するプログラム 

#13

投稿記事 by h2so5 » 14年前

まず、プログラムを組む前に、手作業で数学的にどのように解くのかを考えて下さい。
x>0, y>0 が示すのは第一象限という条件だけです。

その条件だけなら、
(x, y) = (99999999999, 4359999934999), (1000000, 1000000)
などの座標も調べなければいけませんが、手作業でそんなことしません。
さらに座標を絞る条件が必要です。

box
記事: 2002
登録日時: 15年前

Re: 円と座標に関するプログラム 

#14

投稿記事 by box » 14年前

むすめふさほせ さんが書きました:ということは x>0, y>0; でよいのでしょうか?
それは、最初の投稿で第一象限を対象とするとか自然数の座標(x, y)とか書かれているのですから自明ですね。
問題は、四分の一円の半径を考慮して、最大どこまでの(x, y)について調べればいいか、ってことです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

むすめふさほせ

Re: 円と座標に関するプログラム 

#15

投稿記事 by むすめふさほせ » 14年前

半径nを入力して座標を表示して境界は含まないのだから・・・・

座標はx軸上は(n-1,0)、y軸上も(0,n-1)ですね。

むすめふさほせ

Re: 円と座標に関するプログラム 

#16

投稿記事 by むすめふさほせ » 14年前

まずは解答を示していただき、それを解説してくださらないでしょうか。

皆様が丁寧に解答へと導いてくださろうとしているところ申し訳ありません。

アバター
Tatu
記事: 445
登録日時: 15年前
住所: 北海道

Re: 円と座標に関するプログラム 

#17

投稿記事 by Tatu » 14年前

自分で考える癖をつけてほしいという理由で
丸投げは禁止となっております。よって、ソースコードをそのまま書くことはいたしません。
提出期限か何かがあるのですか?

とりあえず、今回の問題を私なりに考え、問題文の形で並べてみたので参考にしてみてください。
なお、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)を全て表示する処理はどう書けるでしょうか。
次の?????をうめてください。

コード:

for(?????){
	for(?????){
		printf(?????);
	}
}
(5)点(x,y)が半径nの円の内部にあるとき、(x,y)を表示するという処理はどう書けるでしょうか。
次の?????を埋めてください。

コード:

if(?????){
	printf(?????);
}
(6) (4),(5)を踏まえたうえで半径nの円の内部にある(x,y)を全て表示するという処理はどう書けるでしょうか。

(7) 個数のカウントを行う変数をcountとするとき、
countの宣言
countの初期化
countの加算
countの中身の表示
を行う文を示した後、
(6)で書いた処理に追加してください。

(8)

コード:

#include <stdio.h>

int main(void){
	変数宣言
	nを入力させる処理
	(7)まででできた処理
	return 0;
}
で動くプログラムを完成させてください。

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を表示するという処理をかいてください。

box
記事: 2002
登録日時: 15年前

Re: 円と座標に関するプログラム 

#18

投稿記事 by box » 14年前

机上で解くことができないと思われる状態で、
ソースコードを示して何か意味があるとはあまり思えないです。

定規とコンパスと方眼紙を用意して、問題を図化するところから始めてみてはどうでしょうか。
次に、机上で解くための考え方(アルゴリズム)を見つける。
C言語のソースコードに落とし込むのはそれから。

ソースコードで
 ・半径の入力方法がわからない
 ・x座標やy座標に関するループをどのように書いたらいいかわからない
などという状況でしたら、文法の基礎から勉強してください。本を読んだりサイトで調べたり、方法はいくらでもあります。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

むすめふさほせ

Re: 円と座標に関するプログラム 

#19

投稿記事 by むすめふさほせ » 14年前

返信が遅れて申し訳ありません
できるだけ自分で考えてみました

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)はどうしてもわかりません

non
記事: 1097
登録日時: 15年前

Re: 円と座標に関するプログラム 

#20

投稿記事 by non » 14年前

8行目に、nをscanfで入力するようにしましょう。

9行目のifですが、まだこの段階では、x,yの値が決まっていないので、判断することができません。
このif文は13行のprintfの前に(2つのforの中へ)場所を移して考えましょう。
countはそのifの中で、count++してみましょう。
その辺までできたら、また、プログラムを添付してみたら。
non

アバター
Tatu
記事: 445
登録日時: 15年前
住所: 北海道

Re: 円と座標に関するプログラム 

#21

投稿記事 by Tatu » 14年前

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)の答えが書かれていませんが確かめておいてくださいね。

むすめふさほせ

Re: 円と座標に関するプログラム 

#22

投稿記事 by むすめふさほせ » 14年前

できる限りのことはやってみましたがエラーが出ます

コード:

#include<stdio.h>
 
int main(void)
{
      int x;
      int y;
      int 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です");     
   
   return(0);
       } 

アバター
Tatu
記事: 445
登録日時: 15年前
住所: 北海道

Re: 円と座標に関するプログラム 

#23

投稿記事 by Tatu » 14年前

エラーが出たのならばそのエラーメッセージをコピペして回答者にわかるようにしましょう。

さて、コードについてですが

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文で複数の処理を行わせたい場合は

コード:

if(条件){
	処理1;
	処理2:
}
のようにします。慣れないうちは処理が1つしかなくても{}を付けてください。
そうしておくと今回のように処理を追加するときに{}をつけなくても済みます。


4.最後のprintfの%dが何の値か書かれていません。
先ほどの指摘は「は」ではなく、「の」がよいのではないですかというつもりで書いただけで
countをつけるなという意味ではありません。

5.{}
先ほども書きましたが数があっていません。
forループの中にさらにfor文を入れる場合は

コード:

for(){
	for(){
		処理;
	}
}
のようにしてください。

むすめふさほせ

Re: 円と座標に関するプログラム 

#24

投稿記事 by むすめふさほせ » 14年前

エラーメッセージはこれです

コード:

  In function `main':
21: parse error before character 0201
countが全然わかりません

コード:

#include<stdio.h>
 
int main(void)
{
      int x;
      int y;
      int n;
      int count;
     
      
      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);
       } 


アバター
Tatu
記事: 445
登録日時: 15年前
住所: 北海道

Re: 円と座標に関するプログラム 

#25

投稿記事 by Tatu » 14年前

1.そのエラーメッセージをGoogleで検索をかけて調べたところ、
やはり全角スペースの存在が原因でした。全角スペースを削除してください。
半角スペースかtabキーを押すと出るtabスペースならば大丈夫です。
検索や置換についてはメモ帳と同様の仕様ならばメニューバーの編集から選べますし、
ショートカットキーはCtrl+Fで検索、Ctrl+Hで置換が行えるようになるはずです。
わからなければすべてのスペースを削除し、半角スペースでインデントをやり直してください。

2.countについては
countの初期化が抜けてます。
countの加算を行うところはcount++;と;(セミコロン)をちゃんとつけてください。

3.if文で複数の処理をさせたい場合はどうするのでしたか?
今のままでは(x,y)が円の内部にあるかどうかにかかわらずカウントしてしまいます。

4.scanfの第二引数を確認してください。
scanfを使っているプログラムを見るとよいでしょう。

指摘されたことは全部確認し、
わからないならわからないということとどこがわからないかを書いてください。

むすめふさほせ

Re: 円と座標に関するプログラム 

#26

投稿記事 by むすめふさほせ » 14年前

何かが違います

コード:

#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です

アバター
Tatu
記事: 445
登録日時: 15年前
住所: 北海道

Re: 円と座標に関するプログラム 

#27

投稿記事 by Tatu » 14年前

(x,y)の表示はできてますね。
個数の表示がおかしいのはcountの初期化を忘れているからですね。
数え始める前なので最初は0です。
今回のように初期化を忘れるとデタラメな値が勝手に入りますので
初期化忘れには気を付けてください。

あと、printfで改行が行われるようにすればもっと見やすくなるのではないでしょうか?

むすめふさほせ

Re: 円と座標に関するプログラム 

#28

投稿記事 by むすめふさほせ » 14年前

気がかりなことに、座標の個数が違う数で表示されます

コード:

#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です

となります

Cr

Re: 円と座標に関するプログラム 

#29

投稿記事 by Cr » 14年前

最後の判定のこの部分ありますよね。

コード:

                  if(x*x+y*y<n*n)
                   printf("(%d,%d)",x,y);
                   count++;
if文の{}を省略した場合、条件の中に含まれるのは次の一行のみです。
つまり、

コード:

if(条件)
  処理A
  処理B
と書けば処理Aはif文の条件が合わないと実行されませんが処理Bは条件関係なく実行されます。
両方を条件判定したいなら、

コード:

if(条件){
   処理A
   処理B
}
と{}でくくる必要があります

むすめふさほせ

Re: 円と座標に関するプログラム 

#30

投稿記事 by むすめふさほせ » 14年前

確かにうまくいきました!

アドバイスありがとうございます


つぎにTatu様のアドバイスのなかで、Cの手順がわかりません
何かヒントはないでしょうか?

Cr

Re: 円と座標に関するプログラム 

#31

投稿記事 by Cr » 14年前

どこがどう分からないのか書いてもらわないとヒントの出しようもないのですが…
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: 円と座標に関するプログラム 

#32

投稿記事 by むすめふさほせ » 14年前

申し訳ございません

ただ、どこがどうわからないと言われても、(10)~(12)のすべてc言語でどう表現すればいいのかがわからないのです

Cr

Re: 円と座標に関するプログラム 

#33

投稿記事 by Cr » 14年前

「分からない」よりは「c言語でどう表現すればいいのか分からない」の方が詳しいですね。
数学としては解けるのですか?
C言語でどう表現したらいいのか分からないなら
まず、日本語で書いてみましょうよ。
特殊な問題でない限りC言語が関係してくるのはそれからです。

とりあえず、先ほどむすめふさほせ様が作ったプログラムを日本語に直すとどういうプログラムですか?

アバター
Tatu
記事: 445
登録日時: 15年前
住所: 北海道

Re: 円と座標に関するプログラム 

#34

投稿記事 by Tatu » 14年前

>>Cr さん
問題文を書いた時に何でそれで昇順になるかを説明してはいないので
たぶんCの質問文の理由、意味もまだわかっていないと思います。

>>むすめふさほせ さん
ここまでのプログラムを理解して書いたかの確認のため、
Crさんが書いたようにプログラムの動きを日本語で説明してください。
説明はint x;から printf("座標の個数は%dです\n",count);までで結構です。
説明するときはコメントを使うとよいでしょう。
例:

コード:

scanf("%d",&n); //nの値を代入させる

ここまででだいたい半分くらいできたことになります。残りも今まで使った文法がわかっていればできますよ。
では、残りの「各座標における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);
の後ろに残りの処理を追加するというやり方でやってください。

non
記事: 1097
登録日時: 15年前

Re: 円と座標に関するプログラム 

#35

投稿記事 by non » 14年前

学校の課題だと思うのですが、
1 配列を習っている?
2 関数は習っている?
3 関数に配列を引数で渡すことを習っている?
4 ソート(並び替え)を習っている?
5 習ったソートの方法は?

1~5にお答えください。
non

non
記事: 1097
登録日時: 15年前

Re: 円と座標に関するプログラム 

#36

投稿記事 by non » 14年前

Tatuさん
Tatu さんが書きました: そこで、別の変数(今回はmとした)を用意し、
その変数をx^2+y^2の取りうる値の範囲で徐々に大きくし、
それぞれの値とx^2+y^2が一致する時、
(x,y)とm(=x^2+y^2)を表示するということを考えました。
これで昇順に並び替えたのと同じことになります。
2変数(x、y)でmが小さい方から計算させるのは難しくないですか?
素直に、配列を使った方が、わかりやすいと思いますが。
私が、思いつかないすばらしい方法があるのならいいのですが・・・
non

むすめふさほせ

Re: 円と座標に関するプログラム 

#37

投稿記事 by むすめふさほせ » 14年前

non様

1について…配列は習いました
2について…関数は習いました
3~5は習っていません

Tatu様

すいませんが「プログラムの動き」はもう少し時間がかかります

むすめふさほせ

Re: 円と座標に関するプログラム 

#38

投稿記事 by むすめふさほせ » 14年前

プログラムの動きができました

コード:

#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);
} 


アバター
Tatu
記事: 445
登録日時: 15年前
住所: 北海道

Re: 円と座標に関するプログラム 

#39

投稿記事 by Tatu » 14年前

>>むすめふさほせ さん
文法については理解されているようですね。


>>non さん
私のやり方は
m=2のときの(x,y)は?
m=3のときの(x,y)は?
...
と順に調べていくというやり方なのですがわかりにくいでしょうか?
それとも、先生がいたとしたらその人を納得させられるか怪しいという意味ですか?
配列などが必要だというのならば、むすめふさほせ さんはそのことを書いているはずです。
例えば「配列の使い方の練習のための問題です」とか。

なんにせよ私のやり方は配列とソートを使っていませんと断っています。
配列を使っていないのはnの範囲がわからないからです。
また、自分のやり方で作ったプログラムがnに1000のような大きな値を入力しても動くことは確認しています。
「円の半径は#define N 10のように指定するものとする。」などと書かれていたらよいのですが。

配列を使った方がよいと考えているであれば
「配列を使わないと評価されないかもしれません」などの
自分の考えや、知識をもっと明らかにした方がよいでしょうね。

non
記事: 1097
登録日時: 15年前

Re: 円と座標に関するプログラム 

#40

投稿記事 by non » 14年前

Tatu さんが書きました:>>non さん
私のやり方は
m=2のときの(x,y)は?
m=3のときの(x,y)は?
...
と順に調べていくというやり方なのですがわかりにくいでしょうか?
それとも、先生がいたとしたらその人を納得させられるか怪しいという意味ですか?
私がその方法で作ると、3重ループになり、アルゴリズムもわかりにくいだろうなと思った次第です。
配列は習っていてもソートを習っていないのなら、Tatuさんのやり方の方が良いかもしれませんね。
non

むすめふさほせ

Re: 円と座標に関するプログラム 

#41

投稿記事 by むすめふさほせ » 14年前

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);
} 


non
記事: 1097
登録日時: 15年前

Re: 円と座標に関するプログラム 

#42

投稿記事 by non » 14年前

むすめふさほせさんは空気が読めない人だねえ。

ソートを習っていないのに、選択法の一種をちゃんと見つけてきましたね。
さて7行目、zが配列なら、まず、配列の宣言をしましょう。

33行目の配列への格納は、25行の前後で行います。もちろん、配列ですよ。
35行や37行、48行、データの個数はnではないです。
50行も配列ですよ。
non

アバター
Tatu
記事: 445
登録日時: 15年前
住所: 北海道

Re: 円と座標に関するプログラム 

#43

投稿記事 by Tatu » 14年前

エラーメッセージは配列でもポインタでもない変数に添え字を使っていますよという意味です。

コードとエラーメッセージを見ると配列についてあまりよくわかっていないようです。
そこで配列の使い方の確認です。以下のことを考えてください。

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: 円と座標に関するプログラム 

#44

投稿記事 by むすめふさほせ » 14年前

non様
訂正してみましたが失敗しました

コード:

#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でお願いします

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 円と座標に関するプログラム 

#45

投稿記事 by h2so5 » 14年前

むすめふさほせ さんが書きました:

コード:

#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);
}
せめてコンパイルしてみてから投稿しませんか?
実行すればまともに動かないことが分かるはずですが。

non
記事: 1097
登録日時: 15年前

Re: 円と座標に関するプログラム 

#46

投稿記事 by non » 14年前

もう少し、基本から勉強した方がいいと思いますが、とりあえず・・・・・

11行  int z[]={0};
これでは、配列が1個しか確保されません。
データの個数は不明ですから、自分が入力する半径の2乗ぐらい確保しておきましょう。

29行 z[count]=x*x+y*y;
この行は その前の
count++;//座標の数を数える
より前でないと、z[1]から入れることになりますよ。

53行
このcountは違うでしょう。


かっこの位置がだんだん出鱈目になってきています。
インデントをしっかり取りましょう。
non

むすめふさほせ

Re: 円と座標に関するプログラム 

#47

投稿記事 by むすめふさほせ » 14年前

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);
} 
エラーメッセージは次の通りです

コード:

: In function `main':
:11: invalid initializer

アバター
Tatu
記事: 445
登録日時: 15年前
住所: 北海道

Re: 円と座標に関するプログラム 

#48

投稿記事 by Tatu » 14年前

h2so5さんの指摘は無視ですか?

エラーメッセージはただ出ましたーだけじゃなくて
自分で英和辞典で大体の意味を探ったり、
ネットで検索をかけてみたりしてくださいね。
ただの意地悪なメッセージというわけではないんですから。

エラーメッセージが指す11行目のint z[16]=0;
配列の初期化の仕方はこれでよいのでしょうか?

53行目のz[count]
これだと同じ数字を繰り返し表示するだけです。
51行目のiは何のためにあるのですか?

むすめふさほせ

Re: 円と座標に関するプログラム 

#49

投稿記事 by むすめふさほせ » 14年前

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です」

質問に回答していただいた皆様
こんな初心者に丁寧に解答まで導いてくださり感謝しきれません
本当にありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る