C言語関係掲示板

過去ログ

No.1096 数値の比較及び削除

[戻る] [ホームページ]
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以外のとき真となります。