0

ベクトルの次元と数を長さに基づいてソートするプログラムを作成したいと思います。ほとんどのコードは機能しますが、プログラムのソート部分は機能しません。基本的に私がやりたいことは、配列 w の 2 つの場所からの bereken_lengte 関数からの出力を比較することです。しかし、何も起こらないようです。また関数 bereken_lengte では、ループ終了後に合計の根をとることはできません。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double bereken_lengte(double *array, int dim)
{
  int i, j;
  double sum = 0.0;
  for(i=0; i<dim; ++i)
    sum += pow(array[i],2);
  return sum;
}

void swap(double **p, double **q)
{
  double *tmp;
  tmp = *p;
  *p = *q;
  *q = tmp;
}

void sort_vector(double *w[] , int num , int dik )
{
  int i,dim,j;
  dim = dik;
  for(i=0;i<num;++i)
    for(j = 1+i;j<num;++j)
    {
      if(bereken_lengte(w[i],dim) > bereken_lengte(w[j],dim)  )
        swap(&w[i], &w[j]);
    }
}

int main (void)
{
  int dim, num;
  int i, j,k,l;
  double **w;
  scanf ("%d %d", &dim, &num);          /* read N and M */
  w = calloc (num, sizeof (double *));  /* allocate array of M pointers */
  for (i = 0; i < num; i++)
  {
    /* allocate space for N dimensional vector */
    w[i] = calloc (dim, sizeof (double));
    /* read the vector */
    for (j = 0; j < dim; j++)
    {
      scanf ("%lf", &w[i][j]);
    }
  }
  sort_vector(w,num,dim);
  for(k=0; k<num; ++k)
  {
    printf("\n");
    for(l=0; l<dim; ++l)
      printf("%f ", w[k][l]);
  }
  return 0;
}
4

1 に答える 1

2
double bereken_lengte(double *array, int dim)
{
  unsigned int i;
  double sum =0.0;
  for(i=0; i<dim; ++i)
    sum += pow(array[i],2);
  return sum;
}

合計する前に合計をゼロに初期化するだけです。

ところで、i を unsigned に変更しました。インデックス && サイズ変数に符号なしの型を使用するのは IMnsvHO の良い習慣です (アンダーフローしません。そうであれば、それに気付くでしょう)。

更新: これは int インデックスとサイズを回避しようとし、qsort を使用します。(比較関数は 2 つの要素しか必要としないため、かなり見苦しいです。マルチスレッド プログラムでこれを試さないでください ...) 注、行と列を交換することもできますが、それが生き方です ... gewoon, omdat het kan !:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double bereken_lengte(double *array, size_t dim)
{
  size_t i;
  double sum=0.0;
  for(i=0; i<dim; ++i)
    sum += pow(array[i],2);
  return sum;
}

        /* this is ugly: qsort only allows only two arguments */
static size_t ze_third_argument=0;
int srt_pdbl(void *l, void *r)
{
double **dl = l, **dr = r;
double diff;
diff = bereken_lengte( *dl, ze_third_argument) - bereken_lengte( *dr, ze_third_argument) ;
return (int) diff;
}

void sort_vector(double *w[] , size_t num , size_t dik )
{
ze_third_argument = dik;
qsort(w, num, sizeof *w, srt_pdbl );
}

int main (void)
{
  size_t dim, num;
  size_t i, j,k,l;
  double **w;
  scanf ("%zu %zu", &dim, &num);          /* read N and M */
  w = calloc (num, sizeof *w);  /* allocate array of M pointers */
  for (i = 0; i < num; i++)
  {
    /* allocate space for N dimensional vector */
    w[i] = calloc (dim, sizeof *w[i] );
    /* read the vector */
    for (j = 0; j < dim; j++)
    {
      scanf ("%lf", &w[i][j]);
    }
  }
  sort_vector(w,num,dim);
  for(k=0; k<num; ++k)
  {
    printf("\n");
    for(l=0; l<dim; ++l)
      printf("%f ", w[k][l]);
  }
  return 0;
}
于 2012-12-28T00:51:12.470 に答える