No.14418![]() |
数値の比較及び削除 投稿者---AI(2004/06/03 15:44:15) |
||
前回文字削除について投稿しましたAIです。 前回まで2次元配列に文字を格納しstrcmpで比較して 削除する方法をおしえていただきましたが、 今回は、もし配列に格納されるデータが数値の場合、 int name[10][2] = {{1,1},{2,2},{3,3},{4,4},{5,5},{1,1},{6,6},{3,3}{4,4}{7,7}}; のようなときには、 どのように比較して重複削除したらよいのでしょうか? 以前のソースを変更して作成しましたが、 エラーが出ます。 以下にソースを示します。 宜しくお願いします。 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; int compar(const int* a,const int* b) { if(*a>*b) return 1; else if(*a<*b) return -1; else return 0; } #define gyo 10 int main() { int name[gyo][3]={{1,2},{3,4},{5,6},{7,8},{1,2},{2,2},{5,6},{7,8},{1,1},{2,2}}; int n,i,j; cout<<"ソート前表示"<<endl;; for(i=0;i<gyo;i++){ printf("%d\n",name[i]); } cout<<"\n"; qsort(name,gyo,sizeof name[0],(int(*)(const void *,const void *))compar); cout<<"ソート後表示"<<endl; for(i=0;i<gyo;i++){ printf("%d\n",name[i]); } cout<<"\n"; for(i=n=1;i<gyo;i++){ for(j=0;j<2;j++) if(name[i-1]!=name[i]){ name[n][j]=name[i][j]; n++; } } for(i=n;i<gyo;i++){ memset(histMatrix[i],0,2); } gyo=n; cout<<"重複削除後"<<endl; for(i=0;i<gyo;i++){ for(int k=0;k<2;k++){ printf("name[%d][%d]==%d\n",i,k,name[i][k]); } } return 0; } |
No.14419![]() |
Re:数値の比較及び削除 投稿者---シャノン(2004/06/03 15:47:15) |
||
>エラーが出ます。 どんなエラーが出るんです? |
No.14426![]() |
Re:数値の比較及び削除 投稿者---かずま(2004/06/03 16:14:12) |
||
#include <stdio.h> #include <stdlib.h> #include <string.h> #define ROW 10 #define COL 2 int compar(const void *a, const void *b) { int *p = (int *)a, *q = (int *)b; if (p[0] < q[0]) return -1; if (p[0] > q[0]) return 1; if (p[1] < q[1]) return -1; if (p[1] > q[1]) return 1; return 0; } void print(int name[][COL], int n) { int i; for (i = 0; i < n; i++) printf("name[%d][0]=%d, name[%d][1]=%d\n", i, name[i][0], i, name[i][1]); printf("\n"); } int main(void) { int name[ROW][COL] = { {1,2},{3,4},{5,6},{7,8},{1,2},{2,2},{5,6},{7,8},{1,1},{2,2} }; int n, i; puts("ソート前表示"); print(name, ROW); qsort(name, ROW, sizeof name[0], compar); puts("ソート後表示"); print(name, ROW); for (n = i = 1; i < ROW; i++) if (compar(name[i-1], name[i])) memcpy(name[n++], name[i], sizeof name[0]); memset(name[n], 0, (ROW - n) * sizeof name[0]); puts("重複削除後"); print(name, ROW); return 0; } |
No.14434![]() |
Re:数値の比較及び削除 投稿者---AI(2004/06/03 19:44:16) |
||
ありがとうございます。 質問です。 以下の部分の if()でcomparはname[i-1]とname[i]を 比較して返り値として-1,1,0だと思うのですが、 compar()が何であった場合以下のmemcpyを 行うのでしょうか? 宜しくお願いします。 for (n = i = 1; i < ROW; i++) if (compar(name[i-1], name[i])) memcpy(name[n++], name[i], sizeof name[0]); memset(name[n], 0, (ROW - n) * sizeof name[0]); |
No.14440![]() |
Re:数値の比較及び削除 投稿者---RAPT(2004/06/03 22:29:21) |
||
if ( 式 ) { ... } の場合、式 を評価した結果が0以外のとき真となります。 |