ページ 1 / 1
円と座標に関するプログラム
Posted: 2011年9月27日(火) 19:05
by むすめふさほせ
前回
「原点を中心とする円の第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);
}
Re: 円と座標に関するプログラム
Posted: 2011年9月27日(火) 19:56
by bitter_fox
むすめふさほせ さんが書きました:
「原点を中心とする円の第1象限を考える。半径nを入力して自然数である座標とその個数、各座標におけるx^2+y^2の値を求め、その値を大きい順に並び替えて、x^2+y^2の値とそれに対応する座標と個数を表示するプログラムを作成せよ」
しかし1次元配列を用いていないため不正解となってしまいました。
そこで、次のプログラムをどう改良して1次元配列を用いればよいか教えていただきたいのです。
zは一次元配列なので不正解となった原因は一次元配列を用いていないためではありません。
原因は、「x^2+y^2の値とそれに対応する座標を表示する」の「それに対応する座標」を表示できていないためです。
(今のプログラムではx^2+y^2の値とそれに対応する座標が別個で表示されています)
問の答えとなるようなプログラムを作るためにはx^2+y^2の値を一次元配列を用いた管理の対象とするのではなくxとyの値をそれの対象としてみてください。
コード:
int xList[9999], yList[9999];
// ...
そして各点の距離を二つの配列の値から求めそれで並び替えたのち、各点の座標と距離を表示するようにしてください。
また構造体を習っているのであれば構造体を用いても良いでしょう。
Re: 円と座標に関するプログラム
Posted: 2011年9月27日(火) 20:33
by box
むすめふさほせ さんが書きました:
しかし1次元配列を用いていないため不正解となってしまいました。
「1次元配列を用いていない」というのは、どなたが判断されたのですか?
ちゃんと、z[9999]という1次元配列を使っていますよ。
ところで、インデント(字下げ)に関するポリシーを感じないコードであるため、なんとなく読みづらいです。
Re: 円と座標に関するプログラム
Posted: 2011年9月27日(火) 21:04
by むすめふさほせ
すいません
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です
となってしまいました
Re: 円と座標に関するプログラム
Posted: 2011年9月28日(水) 19:28
by bitter_fox
むすめふさほせ さんが書きました:すいません
xとyの値を1次元配列の対象とする方法がわかりません
xとyの値を管理する一次元配列を作って、
z[count]=x*x+y*y;
としているところでそれに入れていってください。
並び替えるときはその配列からx^2 + y^2の値を求めるかzから取得するなりしてn^2と比較してください。
Re: 円と座標に関するプログラム
Posted: 2011年9月28日(水) 23:00
by むすめふさほせ
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);
}
Re: 円と座標に関するプログラム
Posted: 2011年9月28日(水) 23:13
by 初級者
コード:
#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;
}
Re: 円と座標に関するプログラム
Posted: 2011年9月29日(木) 08:28
by hss12
気になる点では
全角スペースが入っている。インデントがそろってない。
スペースキーではなく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: 円と座標に関するプログラム
Posted: 2011年9月29日(木) 11:44
by むすめふさほせ
初級者さん、hss12さんご回答ありがとうございます。
とてもわかりやすい解説で勉強になります。
また自分でプログラムを書いてみて、わからないところが出てきたときはまた質問しますのでよろしくお願いいたします。
Re: 円と座標に関するプログラム
Posted: 2011年9月29日(木) 12:23
by むすめふさほせ
できました
実行結果
円の半径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: 円と座標に関するプログラム
Posted: 2011年9月29日(木) 12:36
by むすめふさほせ
失礼しました
よく見ると間違っていました
訂正しましたので問題ありません
実行結果
円の半径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です