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

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

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

#1

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

前回
「原点を中心とする円の第1象限を考える。半径nを入力して自然数である座標とその個数、各座標におけるx^2+y^2の値を求め、その値を大きい順に並び替えて、x^2+y^2の値とそれに対応する座標と個数を表示するプログラムを作成せよ」
という問題を質問したむすめふさほせです。

しかし1次元配列を用いていないため不正解となってしまいました。

そこで、次のプログラムをどう改良して1次元配列を用いればよいか教えていただきたいのです。

ご回答よろしくお願いいたします。

コード:

#include<stdio.h>
 int main(void)
{
      int x;
      int y;
      int count=0;
      int n;
      int i;
      int j;
      int z[9999]={0};
      int dumy;

      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);
            	   	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 < count; i++)
	{	
		printf("\nx^2+y^2=%dです",z[i]);
	}
	printf("\n座標の個数は%dです",count);
	return(0);
}

アバター
bitter_fox
記事: 607
登録日時: 9年前
住所: 大阪府

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

#2

投稿記事 by bitter_fox » 8年前

むすめふさほせ さんが書きました: 「原点を中心とする円の第1象限を考える。半径nを入力して自然数である座標とその個数、各座標におけるx^2+y^2の値を求め、その値を大きい順に並び替えて、x^2+y^2の値とそれに対応する座標と個数を表示するプログラムを作成せよ」

しかし1次元配列を用いていないため不正解となってしまいました。

そこで、次のプログラムをどう改良して1次元配列を用いればよいか教えていただきたいのです。

コード:

      int z[9999]={0};
zは一次元配列なので不正解となった原因は一次元配列を用いていないためではありません。
原因は、「x^2+y^2の値とそれに対応する座標を表示する」の「それに対応する座標」を表示できていないためです。
(今のプログラムではx^2+y^2の値とそれに対応する座標が別個で表示されています)

問の答えとなるようなプログラムを作るためにはx^2+y^2の値を一次元配列を用いた管理の対象とするのではなくxとyの値をそれの対象としてみてください。

コード:

int xList[9999], yList[9999];
// ...
そして各点の距離を二つの配列の値から求めそれで並び替えたのち、各点の座標と距離を表示するようにしてください。

また構造体を習っているのであれば構造体を用いても良いでしょう。

box
記事: 1745
登録日時: 9年前

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

#3

投稿記事 by box » 8年前

むすめふさほせ さんが書きました: しかし1次元配列を用いていないため不正解となってしまいました。
「1次元配列を用いていない」というのは、どなたが判断されたのですか?
ちゃんと、z[9999]という1次元配列を使っていますよ。

ところで、インデント(字下げ)に関するポリシーを感じないコードであるため、なんとなく読みづらいです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

むすめふさほせ

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

#4

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

すいません
xとyの値を1次元配列の対象とする方法がわかりません

自分で少しいじってみたのですが、座標が優先されてしまいました

コード:

#include<stdio.h>
 
int main(void)
{
      int x;
      int y;
      int count=0;
      int n;
      int i;
      int j;
      int z[9999]={0};
      int dumy;

      printf("円の半径nを入力してください:");
      scanf("%d",&n);

       for( x = 1;  x < n;  x++)
      {
                          
             for(  y = 1;  y < n; y++)
             {
                  
                  if(x*x+y*y<n*n)
                  {	
         	   	      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( x = 1;  x < n;  x++)
      		{
                        for(  y = 1;  y < n; y++)
             		{
                           		if(x*x+y*y<n*n)
                  		
					        printf("\n座標が(%d,%d)のときx^2+y^2=%d",x,y,x*x+y*y);
					
			}
		}
			

	printf("\n座標の個数は%dです",count);
	return(0);
} 
結果は
円の半径nを入力してください:4

座標が(1,1)のときx^2+y^2=2
座標が(1,2)のときx^2+y^2=5
座標が(1,3)のときx^2+y^2=10
座標が(2,1)のときx^2+y^2=5
座標が(2,2)のときx^2+y^2=8
座標が(2,3)のときx^2+y^2=13
座標が(3,1)のときx^2+y^2=10
座標が(3,2)のときx^2+y^2=13
座標の個数は8です

となってしまいました

アバター
bitter_fox
記事: 607
登録日時: 9年前
住所: 大阪府

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

#5

投稿記事 by bitter_fox » 8年前

むすめふさほせ さんが書きました:すいません
xとyの値を1次元配列の対象とする方法がわかりません
xとyの値を管理する一次元配列を作って、
z[count]=x*x+y*y;
としているところでそれに入れていってください。

並び替えるときはその配列からx^2 + y^2の値を求めるかzから取得するなりしてn^2と比較してください。

むすめふさほせ

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

#6

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

xとyの値を管理する一次元配列を作って、
z[count]=x*x+y*y;
としているところでそれに入れていってください。

並び替えるときはその配列からx^2 + y^2の値を求めるかzから取得するなりしてn^2と比較してください。
やっぱり自分の知識ではわかりません
もう少しわかりやすく説明していただけないでしょうか

コード:

#include<stdio.h>
 
int main(void)
{
      int x[9999];
      int y[9999];
      int count=0;
      int n;
      int i;
      int j;
      int z[9999]={0};
      int dumy;

      printf("円の半径nを入力してください:");
      scanf("%d",&n);

       for( x = 1;  x < n;  x++)
      {
                          
             for(  y = 1;  y < n; y++)
             {
                  
                  if(x*x+y*y<n*n)
                  {	
         	   	z[count]=x*x+y*y;
			x[9999]=z[count];
			z[9999]=z[count];
			
			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( x = 1;  x < n;  x++)
      		{
                        for(  y = 1;  y < n; y++)
             		{
                           		if(x*x+y*y<n*n)
                  		
					printf("\n座標が(%d,%d)のときx^2+y^2=%d",x,y,x[9999]*x[9999]+y[9999]*y[9999]);
					
			}
		}
			

	printf("\n座標の個数は%dです",count);
	return(0);
} 

初級者
記事: 200
登録日時: 9年前

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

#7

投稿記事 by 初級者 » 8年前

コード:

#include <stdio.h>

int main(void)
{
    int x[9999], y[9999], z[9999], n;
    int count, tx, ty, t, i, j;

    printf("円の半径:"), scanf("%d", &n);
    for (count = 0, tx = 1; tx < n; tx++) {
        for (ty = 1; ty < n; ty++) {
            if ((t = tx * tx + ty * ty) < n * n) {
                x[count] = tx, y[count] = ty, z[count++] = t;
            }
        }
    }

    for (i = 0; i < count - 1; i++) {
        for (j = i + 1; j < count; j++) {
            if (z[i] < z[j]) {
                x[i] ^= x[j] ^= x[i] ^= x[j];
                y[i] ^= y[j] ^= y[i] ^= y[j];
                z[i] ^= z[j] ^= z[i] ^= z[j];
            }
        }
    }

    for (i = 0; i < count; i++) {
        printf("座標が(%d,%d)のとき、x^2+y^2=%d\n", x[i], y[i], z[i]);
    }
    printf("座標の個数は%d\n", count);
    return 0;
}

hss12
記事: 40
登録日時: 8年前

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

#8

投稿記事 by hss12 » 8年前

気になる点では
全角スペースが入っている。インデントがそろってない。
スペースキーではなくTabキーなど使って縦をそろえてください。

プログラムの中では
i < count-1 と1引かなければ無駄な処理になります。
これは参考にしたもとが間違っていたんだと思いますが。
また、 z > z[j] では小さい順に並び替えてしまいます。

xを配列にしてしまうと、x=1などとすでに使っているので
x座標を xList[] y座標をyList[]にさせてもらいますが
z[count] = x*x+y*y;
とx*x+y*yの値を記憶しているところで
xList[count] = x;
yList[count] = y;
と x座標とy座標の値も記憶しておきます。
これで対応する座標が表示できます。
並び変えるときはこのxList[] yList[]も同時に並び替えます。

初級者さんの回答では、他人が書いたとばればれなので
書き直しましたが、このままコピーして提出はしないでください。
理解できない部分はすべて聞いてください。
対策として最後のほう消しました。理解できていれば書けるはずです。

コード:

#include <stdio.h>
 
int main(void)
{
	int xList[9999];
	int yList[9999];
	int z[9999];
	int x, y, i, j, n, count, dumy;
	printf("円の半径nを入力してください:");
	scanf("%d", &n);

	count=0;
	for(x = 1; x < n; x++)
	{
		for(y = 1; y < n; y++)
		{
			if(x*x+y*y < n*n)
			{
				xList[count] = x;
				yList[count] = y;
				z[count] = x*x+y*y;
				count++;
			}
		}
	}

	for(i = 0; i < count - 1; i++)
	{
		for (j = i + 1; j < count; j++)
		{
			if(z[i] < z[j])
			{
				dumy = xList[i];
				xList[i] = xList[j];
				xList[j] = dumy;

				dumy = yList[i];
				yList[i] = yList[j];
				yList[j] = dumy;

				dumy = z[i];
				z[i] = z[j];
				z[j] = dumy;
			}
		}
	}

	/*
	x座標が xList[]
	y座標が yList[]
	x^2+y^2=が z[]
	*/

	printf("座標の個数は%d\n", count);
	return 0;
}

むすめふさほせ

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

#9

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

初級者さん、hss12さんご回答ありがとうございます。

とてもわかりやすい解説で勉強になります。

また自分でプログラムを書いてみて、わからないところが出てきたときはまた質問しますのでよろしくお願いいたします。

むすめふさほせ

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

#10

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

できました
実行結果
円の半径nを入力してください:4

x^2+y^2=13のとき座標は(2,1)です
x^2+y^2=13のとき座標は(3,2)です
x^2+y^2=10のとき座標は(3,3)です
x^2+y^2=10のとき座標は(1,1)です
x^2+y^2=8のとき座標は(2,2)です
x^2+y^2=5のとき座標は(1,3)です
x^2+y^2=5のとき座標は(2,1)です
x^2+y^2=2のとき座標は(1,2)です
座標の個数は8です

ご回答していただいた皆様、詳しい解説をしていただき本当にありがとうございました
また皆様のお世話になるかと思いますが、そのときはまたよろしくお願いいたします

むすめふさほせ

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

#11

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

失礼しました
よく見ると間違っていました

訂正しましたので問題ありません

実行結果
円の半径nを入力してください:4

x^2+y^2=13のとき座標は(2,3)です
x^2+y^2=13のとき座標は(3,2)です
x^2+y^2=10のとき座標は(3,1)です
x^2+y^2=10のとき座標は(1,3)です
x^2+y^2=8のとき座標は(2,2)です
x^2+y^2=5のとき座標は(1,2)です
x^2+y^2=5のとき座標は(2,1)です
x^2+y^2=2のとき座標は(1,1)です
座標の個数は8です

閉鎖

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