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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Q&A

解決済

1回答

243閲覧

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

ike-0315

総合スコア30

C

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

0グッド

0クリップ

投稿2018/05/30 03:14

編集2018/05/30 03:19

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

stp.c

1#include<stdio.h> 2#include<stdlib.h> 3#include<math.h> 4#include "MT.c" 5#include "quicksort.c" 6 7int main(int argc,char *argv[]){ 8 int i,j,k,DIM; 9 FILE *fp; 10 char temp[100],n[100],c[100],t[100],e[100]; 11 12 if(argc !=2){ 13 printf("Usage: sample <input_filename>\n"); //引数が足りない時のエラー表示 14 exit(1); 15 } 16 17 if((fp=fopen(argv[1],"r"))==NULL){//引数で指定されたファイル読み込み 18 printf("file open error!\n"); 19 exit(1); 20 } 21 22 do{ 23 fscanf(fp,"%s",temp); 24 if(strcmp("NAME",temp)==0){//NAMEの項目を読み込むまで空読み 25 fscanf(fp,"%s",temp); 26 break; 27 } 28 if(strcmp("NAME:",temp)==0)break;//NAMEの後に:が入っている場合の対処 29 }while(1); 30 31 fscanf(fp,"%s",&n);//NAMEの読み込み 32 printf("%s\n",n); 33 34 do{ 35 fscanf(fp,"%s",temp); 36 if(strcmp("COMMENT",temp)==0){//COMMENTの項目を読み込むまで空読み 37 fscanf(fp,"%s",temp); 38 break; 39 } 40 if(strcmp("COMMENT:",temp)==0)break; 41 //COMMENTの後に:が入っている場合の対処 42 }while(1); 43 44 fscanf(fp,"%s %s %s",&c);//COMMENTの読み込み 45 printf("%s\n",c); 46 47 do{ 48 fscanf(fp,"%s",temp); 49 if(strcmp("TYPE",temp)==0){//TYPEの項目を読み込むまで空読み 50 fscanf(fp,"%s",temp); 51 break; 52 } 53 if(strcmp("TYPE:",temp)==0)break; 54 //TYPEの後に:が入っている場合の対処 55 }while(1); 56 57 fscanf(fp,"%s",&t);//TYPEの読み込み 58 printf("%s\n",t); 59 60 do{ 61 fscanf(fp,"%s",temp); 62 if(strcmp("DIMENSION",temp)==0){//DIMENSIONの項目を読み込むまで空読み 63 fscanf(fp,"%s",temp); 64 break; 65 } 66 if(strcmp("DIMENSION:",temp)==0)break; 67 //DIMENSIONの後に:が入っている場合の対処 68 }while(1); 69 70 fscanf(fp,"%d",&DIM);//次元(都市数)の読み込み 71 printf("%d\n",DIM); 72 73 do{ 74 fscanf(fp,"%s",temp); 75 if(strcmp("EDGE_WEIGHT_TYPE",temp)==0){//EDGE_WEIGHT_TYPEの項目を読み込むまで空読み 76 fscanf(fp,"%s",temp); 77 break; 78 } 79 if(strcmp("EDGE_WEIGHT_TYPE:",temp)==0)break; 80 //EDGE_WEIGHT_TYPEの後に:が入っている場合の対処 81 }while(1); 82 83 fscanf(fp,"%s",&e);//EDGE_WEIGHT_TYPEの読み込み 84 printf("%s\n",e); 85 86 do{ 87 fscanf(fp,"%s",temp); 88 if(strcmp("NODE_COORD_SECTION",temp)==0)//NODE_COORD_SECTIONの項目を読込むまで空読み 89 break; 90 }while(1); 91 92 int node[100][3]; 93 94 for(i=0;i<DIM;i++){ 95 fscanf(fp,"%d %d %d",&node[i][0],&node[i][1],&node[i][2]); 96 //NODE_COORD_SECTIONの読み込み 97 } 98 for(i=0;i<DIM;i++){ 99 printf("%2d %2d %2d\n",node[i][0],node[i][1],node[i][2]); 100 } 101 102 //各都市間コスト計算 103 int cost[DIM][DIM]; 104 double x; 105 for(i=0;i<DIM;i++){ 106 for(j=0;j<DIM;j++){ 107 x=sqrt(((node[i][1]-node[j][1])*(node[i][1]-node[j][1]) 108 +(node[i][2]-node[j][2])*(node[i][2]-node[j][2]))); 109 cost[i][j]=round(x); 110 } 111 } 112 for(i=0;i<DIM;i++){ 113 for(j=0;j<DIM;j++){ 114 printf("%3d ",cost[i][j]); 115 } 116 printf("\n"); 117 } 118 119 //RandomAns生成 120 121 double ans[100][2]; 122 123 for(i=0;i<DIM;i++){ 124 ans[i][0]=i; 125 } 126 127 for(i=0;i<DIM;i++){ 128 ans[i][1]=genrand(); 129 } 130 131 for(i=0;i<DIM;i++){ 132 printf("%d: %lf\n",i,ans[i][1]); 133 } 134 135 //sort 136 quicksort(ans[DIM][2],0,DIM-1); 137 138 //コスト評価ver0.2 139 /* int TSPCost=0; 140 for(i=0;i<DIM;i++){ 141 TSPCost = TSPCost + cost[ans[i][0]][ans[(i+1)%DIM][0]]; 142 } 143 144 printf("TSPCost : %d\n",TSPCost); 145 */fclose(fp); 146}

quicksort.c

1void quicksort(double list[][2], int left, int right) 2{ 3 int i, last; 4 int temp; 5 6 if (left >= right) 7 return; 8 9 last = left; 10 for (i=left+1; i <= right; i++){ 11 if (list[i][1] < list[left][1] ){ 12 last++; 13 temp=list[last][0]; 14 list[last][0]=list[i][0]; 15 list[i][0]=temp; 16 temp=list[last][1]; 17 list[last][1]=list[i][1]; 18 list[i][1]=temp; 19 } 20 } 21 22 temp=list[left][0]; 23 list[left][0]=list[last][0]; 24 list[last][0]=temp; 25 temp=list[left][1]; 26 list[left][1]=list[last][1]; 27 list[last][1]=temp; 28 29 quicksort(list, left, last-1); 30 quicksort(list, last+1, right); 31

MT.c

1/* Period parameters */ 2#define N 624 3#define M 397 4#define MATRIX_A 0x9908b0df /* constant vector a */ 5#define UPPER_MASK 0x80000000 /* most significant w-r bits */ 6#define LOWER_MASK 0x7fffffff /* least significant r bits */ 7 8/* Tempering parameters */ 9#define TEMPERING_MASK_B 0x9d2c5680 10#define TEMPERING_MASK_C 0xefc60000 11#define TEMPERING_SHIFT_U(y) (y >> 11) 12#define TEMPERING_SHIFT_S(y) (y << 7) 13#define TEMPERING_SHIFT_T(y) (y << 15) 14#define TEMPERING_SHIFT_L(y) (y >> 18) 15 16static unsigned long mt[N]; /* the array for the state vector */ 17static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */ 18 19/* initializing the array with a NONZERO seed */ 20void sgenrand(unsigned long seed) 21{ 22 /* setting initial seeds to mt[N] using */ 23 /* the generator Line 25 of Table 1 in */ 24 /* [KNUTH 1981, The Art of Computer Programming */ 25 /* Vol. 2 (2nd Ed.), pp102] */ 26 mt[0]= seed & 0xffffffff; 27 for (mti=1; mti<N; mti++) 28 mt[mti] = (69069 * mt[mti-1]) & 0xffffffff; 29} 30 31double genrand() 32{ 33 unsigned long y; 34 static unsigned long mag01[2]={0x0, MATRIX_A}; 35 /* mag01[x] = x * MATRIX_A for x=0,1 */ 36 37 if (mti >= N) { /* generate N words at one time */ 38 int kk; 39 40 if (mti == N+1) /* if sgenrand() has not been called, */ 41 sgenrand(4357); /* a default initial seed is used */ 42 43 for (kk=0;kk<N-M;kk++) { 44 y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK); 45 mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1]; 46 } 47 for (;kk<N-1;kk++) { 48 y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK); 49 mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1]; 50 } 51 y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK); 52 mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1]; 53 54 mti = 0; 55 } 56 57 y = mt[mti++]; 58 y ^= TEMPERING_SHIFT_U(y); 59 y ^= TEMPERING_SHIFT_S(y) & TEMPERING_MASK_B; 60 y ^= TEMPERING_SHIFT_T(y) & TEMPERING_MASK_C; 61 y ^= TEMPERING_SHIFT_L(y); 62 63 return ( (double)y / (unsigned long)0xffffffff ); /* reals */ 64 /* return y; */ /* for integer generation */ 65} 66

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

quicksortの定義は

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

対して呼び出しが

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

となっています。

配列を渡すのですから

c

1quicksort(ans, 0, DIM-1);

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

投稿2018/05/30 03:22

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ike-0315

2018/05/30 03:46

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問