座標比較
Posted: 2007年1月22日(月) 01:50
ご無沙汰してます。また詰まっちゃいましたんでおねがいします。
テキストファイル(中身は三次元の座標が書いてあります)を比較して何%合ってるかって言うプログラムを作りたいです。
どうすればいいかお願いします。
テキストファイル(中身は三次元の座標が書いてあります)を比較して何%合ってるかって言うプログラムを作りたいです。
どうすればいいかお願いします。
#include <stdio.h>
#define N 10
typedef struct{
int x,y,z;
}zahyou_t;
int main(){
int count=0,on;
int onoff[N]={};
zahyou_t num[N]={{1,2,3},
{2,2,3},
{3,2,3},
{4,2,3},
{5,2,3},
{6,2,3},
{6,2,3},
{1,2,3},
{1,2,3},
{2,2,3}};
for(int i=0;i<N;i++){
if(onoff==1)
continue;
on=0;
for(int j=0;j<N;j++){
if(i==j)
continue;
if(num.x==num[j].x && num.y==num[j].y && num.z==num[j].z){
onoff[j]=1;
on=1;
}
}
if(on==1 && onoff==0)
count++;
}
printf("一致する座標は%d個\n",count);
return 0;
}#include <stdio.h>
#define N 10
typedef struct{
int x,y,z;
}zahyou_t;
void change(int i,int j, zahyou_t num[ ]){//配列要素i番目とj番目の値を入れ替える
int t;
t=num.x; num.x=num[j].x; num[j].x=t;
t=num.y; num.y=num[j].y; num[j].y=t;
t=num.z; num.z=num[j].z; num[j].z=t;
}
void sort(int l, int r, zahyou_t num[ ]){//lを一番左端の配列要素、rを一番右端の要素としてソートする。
int i,j,p;
i=l;j=r;
p=num[(l+r)/2].x;
while(1) {
while(num.x<p){//左からピボット以上を探索
i++;
}
while(p<num[j].x){//右からピボット以下を探索
j--;
}
if(i>=j){//探索地点がぶつかったら終了
break;
}
change(i,j,num);//お互い発見した値をいれかえる
i++;
j--;
}
if(l<i-1){//左範囲が分割可能なら
sort(l,i-1,num);//左範囲を分割してソートを行う
}
if(j+1<r){//右範囲が分割可能なら
sort(j+1,r,num);//右範囲を分割してソートを行う
}
}
int main(void){
zahyou_t num1[N]=
{{1,2,3},
{3,8,4},
{7,7,9},
{4,1,5},
{5,1,3},
{1,2,3},
{6,4,6},
{3,1,4},
{6,2,2},
{3,1,4}};
zahyou_t num2[N]=
{{7,2,3},
{1,2,3},
{1,2,3},
{6,4,6},
{5,1,5},
{3,1,4},
{3,2,3},
{6,2,2},
{1,2,3},
{3,1,4}};
int count=0,on;
int onoff[N]={};
int x=-1,y=-1,z=-1;//存在しない座標をセット
printf("num1ソート作業前\n");
for(int i=0;i<N;i++)
printf("%d %d %d\n",num1.x,num1.y,num1.z);
sort(0, N-1, num1);
printf("num1ソート作業後\n");
for(int i=0;i<N;i++)
printf("%d %d %d\n",num1[i].x,num1[i].y,num1[i].z);
printf("num2\n");
for(int i=0;i<N;i++)
printf("%d %d %d\n",num2[i].x,num2[i].y,num2[i].z);
for(int i=0;i<N;i++){
if(num1[i].x==x && num1[i].y==y && num1[i].z==z)
continue;
on=0;
for(int j=0;j<N;j++){
if(num1[i].x==num2[j].x && num1[i].y==num2[j].y && num1[i].z==num2[j].z){
on=1;
printf("num1[%d]とnum2[%d]が一致\n",i,j);
break;
}
}
if(on==1)
count++;
x=num1[i].x; y=num1[i].y; z=num1[i].z;
}
printf("一致したのは%d個\n",count);
return 0;
}int main(void){
zahyou_t num1[N]=
{{1,2,3},
{3,8,4},
{7,7,9},
{4,1,5},
{5,1,3},
{1,2,3},
{6,4,6},
{3,1,4},
{6,2,2},
{3,1,4}};
zahyou_t num2[N]=
{{7,2,3},
{1,2,3},
{1,2,3},
{6,4,6},
{5,1,5},
{3,1,4},
{3,2,3},
{6,2,2},
{1,2,3},
{3,1,4}};
int count=0,on;
int onoff[N]={};
int x=-1,y=-1,z=-1;//存在しない座標をセット
printf("num1ソート作業前\n");
for(int i=0;i<N;i++)
printf("%d %d %d\n",num1.x,num1.y,num1.z);
sort(0, N-1, num1);
printf("num1ソート作業後\n");
for(int i=0;i<N;i++)
printf("%d %d %d\n",num1.x,num1.y,num1.z);
printf("num2\n");
for(int i=0;i<N;i++)
printf("%d %d %d\n",num2.x,num2.y,num2.z);
for(int i=0;i<N;i++){
//前の座標をx,y,zに格納しておき、前のと同じだったらカウントしない。
if(num1.x==x && num1[i].y==y && num1[i].z==z)
continue;
on=0;//forで回った後、今回の比較で一致したものがあったかどうかを示す。
for(int j=0;j<N;j++){
if(num1[i].x==num2[j].x && num1[i].y==num2[j].y && num1[i].z==num2[j].z){//比較
on=1;
printf("num1[%d]とnum2[%d]が一致\n",i,j);
break;
}
}
if(on==1)//一致したものがあったらカウント
count++;
x=num1[i].x; y=num1[i].y; z=num1[i].z;//今回の座標を次の比較で使うため、記憶
}
printf("一致したのは%d個\n",count);
return 0;
}#include <stdio.h>
#include <stdlib.h>
void DataError(int flag)
{
char *message[/url] = {"File Open Error", "Data Empty",};
puts(message[flag + 1]);
exit(1);
}
int ReadData(int data[/url][10][10][10], char *fname[/url])
{
FILE *fp;
int y, x, z, i, j;
for(j = 0; j < 2; j ++){
if((fp = fopen(fname[j + 1], "r")) == NULL) return -1;
for(i = 0; fscanf(fp, "%d,%d,%d", &x, &y, &z) != EOF; i ++){
data[j][y][x][z] |= 1;
}
fclose(fp);
}
return i;
}
int CompData(int result[/url][10][10], int data[/url][10][10][10])
{
int y, x, z, count;
for(count = y = 0; y < 10; y ++){
for(x = 0; x < 10; x ++){
for(z = 0; z < 10; z ++){
result[y][x][z] = data[0][y][x][z] ^ data[1][y][x][z];
count += result[y][x][z];
}
}
}
return count;
}
void PrintResult(int result[/url][10][10], int count)
{
int y, x, z;
for(y = 0; y < 10; y ++){
for(x = 0; x < 10; x ++){
for(z = 0; z < 10; z ++){
if(result[y][x][z]) printf("(%d,%d,%d)\n", x, y, z);
}
}
}
printf("Different %d\n", count);
return;
}
int main(int argc, char *argv[/url])
{
int result[10][10][10] = {0,};
int data[2][10][10][10] = {0,};
int count, flag;
if(argc != 3){
puts("Parameter Error");
return 1;
}
if((flag = ReadData(data, argv)) < 1) DataError(flag);
count = CompData(result, data);
PrintResult(result, count);
return 0;
}#include <stdio.h>
#include <stdlib.h>
void DataError(int flag)
{
char *message[/url] = {"File Open Error", "Data Empty",};
puts(message[flag + 1]);
exit(1);
}
int ReadData(int data[10][10][10], char *fname[/url])
{
FILE *fp;
int y, x, z, i, j;
for(j = 1; j <= 2; j ++){
if((fp = fopen(fname[j], "r")) == NULL) return -1;
for(i = 0; fscanf(fp, "%d,%d,%d", &x, &y, &z) != EOF; i ++){
data[y][x][z] ++;
}
fclose(fp);
}
return i;
}
int ProcessData(int data[10][10][10])
{
int y, x, z, count;
for(count = y = 0; y < 10; y ++){
for(x = 0; x < 10; x ++){
for(z = 0; z < 10; z ++){
data[y][x][z] &= 1;
count += data[y][x][z];
}
}
}
return count;
}
void PrintResult(int data[10][10][10], int count)
{
int y, x, z;
for(y = 0; y < 10; y ++){
for(x = 0; x < 10; x ++){
for(z = 0; z < 10; z ++){
if(data[y][x][z]) printf("(%d,%d,%d)\n", x, y, z);
}
}
}
printf("Different %d\n", count);
return;
}
int main(int argc, char *argv[/url])
{
int data[10][10][10] = {0,};
int count, flag;
if(argc != 3){
puts("Parameter Error");
return 1;
}
if((flag = ReadData(data, argv)) < 1) DataError(flag);
count = ProcessData(data);
PrintResult(data, count);
return 0;
}