質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • C

    3670questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ソート部分が上手くいかずコンパイルエラーが出る

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 125

ike-0315

score 4

MT.cはメルセンヌツイスターで信頼性のあるサイトから引用しました。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include "MT.c"
#include "quicksort.c"

int main(int argc,char *argv[]){
  int i,j,k,DIM;
  FILE *fp;
  char temp[100],n[100],c[100],t[100],e[100];

  if(argc !=2){
    printf("Usage: sample <input_filename>\n"); //引数が足りない時のエラー表示
    exit(1);
  }

  if((fp=fopen(argv[1],"r"))==NULL){//引数で指定されたファイル読み込み
    printf("file open error!\n");
    exit(1);
  }

  do{
    fscanf(fp,"%s",temp);
    if(strcmp("NAME",temp)==0){//NAMEの項目を読み込むまで空読み
      fscanf(fp,"%s",temp);
      break;
    }
    if(strcmp("NAME:",temp)==0)break;//NAMEの後に:が入っている場合の対処      
  }while(1);

  fscanf(fp,"%s",&n);//NAMEの読み込み
  printf("%s\n",n);

  do{
    fscanf(fp,"%s",temp);
    if(strcmp("COMMENT",temp)==0){//COMMENTの項目を読み込むまで空読み
      fscanf(fp,"%s",temp);
      break;
    }
    if(strcmp("COMMENT:",temp)==0)break;
    //COMMENTの後に:が入っている場合の対処      
  }while(1);

  fscanf(fp,"%s %s %s",&c);//COMMENTの読み込み
  printf("%s\n",c);

  do{
    fscanf(fp,"%s",temp);
    if(strcmp("TYPE",temp)==0){//TYPEの項目を読み込むまで空読み
      fscanf(fp,"%s",temp);
      break;
    }
    if(strcmp("TYPE:",temp)==0)break;
    //TYPEの後に:が入っている場合の対処      
  }while(1);

  fscanf(fp,"%s",&t);//TYPEの読み込み
  printf("%s\n",t);

  do{
    fscanf(fp,"%s",temp);
    if(strcmp("DIMENSION",temp)==0){//DIMENSIONの項目を読み込むまで空読み
      fscanf(fp,"%s",temp);
      break;
    }
    if(strcmp("DIMENSION:",temp)==0)break;
    //DIMENSIONの後に:が入っている場合の対処      
  }while(1);

  fscanf(fp,"%d",&DIM);//次元(都市数)の読み込み
  printf("%d\n",DIM);

  do{
    fscanf(fp,"%s",temp);
    if(strcmp("EDGE_WEIGHT_TYPE",temp)==0){//EDGE_WEIGHT_TYPEの項目を読み込むまで空読み
      fscanf(fp,"%s",temp);
      break;
    }
    if(strcmp("EDGE_WEIGHT_TYPE:",temp)==0)break;
    //EDGE_WEIGHT_TYPEの後に:が入っている場合の対処      
  }while(1);

  fscanf(fp,"%s",&e);//EDGE_WEIGHT_TYPEの読み込み
  printf("%s\n",e);

  do{
    fscanf(fp,"%s",temp);
    if(strcmp("NODE_COORD_SECTION",temp)==0)//NODE_COORD_SECTIONの項目を読込むまで空読み
      break;
  }while(1);

  int node[100][3];

  for(i=0;i<DIM;i++){
    fscanf(fp,"%d %d %d",&node[i][0],&node[i][1],&node[i][2]);
    //NODE_COORD_SECTIONの読み込み
  }      
  for(i=0;i<DIM;i++){
    printf("%2d %2d %2d\n",node[i][0],node[i][1],node[i][2]);
  }

  //各都市間コスト計算
  int cost[DIM][DIM];
  double x;
  for(i=0;i<DIM;i++){
    for(j=0;j<DIM;j++){
      x=sqrt(((node[i][1]-node[j][1])*(node[i][1]-node[j][1])
          +(node[i][2]-node[j][2])*(node[i][2]-node[j][2])));
      cost[i][j]=round(x);     
    }
  }
  for(i=0;i<DIM;i++){
    for(j=0;j<DIM;j++){
      printf("%3d ",cost[i][j]);
    }
    printf("\n");
  }

  //RandomAns生成 

  double ans[100][2];

  for(i=0;i<DIM;i++){
    ans[i][0]=i;
  }

  for(i=0;i<DIM;i++){
    ans[i][1]=genrand();
  }

  for(i=0;i<DIM;i++){
    printf("%d: %lf\n",i,ans[i][1]);
  }

  //sort
  quicksort(ans[DIM][2],0,DIM-1);

 //コスト評価ver0.2
  /* int TSPCost=0;
     for(i=0;i<DIM;i++){
     TSPCost = TSPCost + cost[ans[i][0]][ans[(i+1)%DIM][0]];
     }

     printf("TSPCost : %d\n",TSPCost);
  */fclose(fp);
}
void quicksort(double list[][2], int left, int right)
{
  int i, last;
  int temp;

  if (left >= right)
    return;

  last = left;
  for (i=left+1; i <= right; i++){
    if (list[i][1] < list[left][1] ){
      last++;
      temp=list[last][0];
      list[last][0]=list[i][0];
      list[i][0]=temp;
      temp=list[last][1];
      list[last][1]=list[i][1];
      list[i][1]=temp;        
    }
  }

  temp=list[left][0];
  list[left][0]=list[last][0];
  list[last][0]=temp;
  temp=list[left][1];
  list[left][1]=list[last][1];
  list[last][1]=temp;

  quicksort(list, left, last-1);
  quicksort(list, last+1, right);
}
/* Period parameters */  
#define N 624
#define M 397
#define MATRIX_A 0x9908b0df   /* constant vector a */
#define UPPER_MASK 0x80000000 /* most significant w-r bits */
#define LOWER_MASK 0x7fffffff /* least significant r bits */

/* Tempering parameters */   
#define TEMPERING_MASK_B 0x9d2c5680
#define TEMPERING_MASK_C 0xefc60000
#define TEMPERING_SHIFT_U(y)  (y >> 11)
#define TEMPERING_SHIFT_S(y)  (y << 7)
#define TEMPERING_SHIFT_T(y)  (y << 15)
#define TEMPERING_SHIFT_L(y)  (y >> 18)

static unsigned long mt[N]; /* the array for the state vector  */
static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */

/* initializing the array with a NONZERO seed */
void sgenrand(unsigned long seed)
{
    /* setting initial seeds to mt[N] using         */
    /* the generator Line 25 of Table 1 in          */
    /* [KNUTH 1981, The Art of Computer Programming */
    /*    Vol. 2 (2nd Ed.), pp102]                  */
    mt[0]= seed & 0xffffffff;
    for (mti=1; mti<N; mti++)
        mt[mti] = (69069 * mt[mti-1]) & 0xffffffff;
}

double genrand()
{
    unsigned long y;
    static unsigned long mag01[2]={0x0, MATRIX_A};
    /* mag01[x] = x * MATRIX_A  for x=0,1 */

    if (mti >= N) { /* generate N words at one time */
        int kk;

        if (mti == N+1)   /* if sgenrand() has not been called, */
            sgenrand(4357); /* a default initial seed is used   */

        for (kk=0;kk<N-M;kk++) {
            y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
            mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1];
        }
        for (;kk<N-1;kk++) {
            y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
            mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1];
        }
        y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);
        mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1];

        mti = 0;
    }

    y = mt[mti++];
    y ^= TEMPERING_SHIFT_U(y);
    y ^= TEMPERING_SHIFT_S(y) & TEMPERING_MASK_B;
    y ^= TEMPERING_SHIFT_T(y) & TEMPERING_MASK_C;
    y ^= TEMPERING_SHIFT_L(y);

    return ( (double)y / (unsigned long)0xffffffff ); /* reals */
    /* return y; */ /* for integer generation */
}

巡回セールスマン問題でランダム経路を作成しようとしています。
方針としてはMT.c内のgenrand()で各都市にランダムな値を与え、それに従い昇順にソートすることでランダムな経路にしようと考えています。
しかし、quicksortを導入した時点でコンパイルエラーが出てしまい、行き詰まってしまいました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

quicksortの定義は

void quicksort(double list[][2], int left, int right)

対して呼び出しが

quicksort(ans[DIM][2],0,DIM-1);

となっています。

配列を渡すのですから

quicksort(ans, 0, DIM-1);

でいいのではないでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/30 12:46

    解決しました!
    ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3670questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。