• ベストアンサー

コンパイルできない!助けてください!

以下のプログラムがコンパイル出来ません。 なぜでしょうか? それと、このプログラムにソート対象の比較回数や書き換え回数を付け加えたいのですが、どうもうまくいきません。 あと、乱数を発生させて実験もしてみたいのですが、うまくいきません。 どうしても、コームソート自体が納得いかず、色々、実験しています。 何か、いい情報があれば、教えていただければありがたいです。 質問が多くてすみません。 よろしくお願いします! #include <stdio.h> #include <time.h> /* * コームソート * */ void comb_sort11 (KEY x[], int n) { int i, gap; KEY hold; enum {BREAK, CONT} flag; gap = n; flag = CONT; while (flag == CONT !! gap > 1) { flag = BREAK; gap gap / 1.3; if (gap == 0) gap = 1 ; else if (gap == 9 !! gap == 10) gap = 11; for (i = 0; i + gap < n; i++) if( x[i] > x[i+gap]) { hold = x[i]; x[i] = x[i+gap]; x[i+gap] = hold; flag = CONT; } } } #include <stdio.h> main() { int s, e; int n=5,i; int x[] = {5,8,3,6,2}; s = clock(); comb_sort11(x,n); e = clock(); for (i = 0; i <= n-1; i++){ printf("%d",x[i]);} fprintf(stderr,"time = %d\n", e - s ); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • natural
  • ベストアンサー率37% (419/1115)
回答No.1

「コンパイル出来ない」の具体的な症状を書かれた方が適切な回答が付くと思いますよ。(エラーメッセージ等) とりあえず私が気付いたのは、 flag == CONT !! gap > 1 等の「!!」です。 これは「||」の間違いではありませんか? 「|」は「\(またはバックスラッシュ)」のキーをシフトを押しながら打てば入力出来ます。 細かいロジック等はあまり時間がないので見ていません。 悪しからず。

YOSI163
質問者

お礼

KEYと||部分が間違っていました。 ありがとうございました!

YOSI163
質問者

補足

基本的な間違いをご指摘いただきありがとうございました! エラーメッセージは以下のようなまのが出ました。 もしよろしければ、教えてくださればありがたいです。 -------------------構成: コームソート1 - Win32 Debug-------------------- コンパイル中... コームソート1.c C:\My Documents\コームソート\コームソート1.c(8) : error C2146: 構文エラー : ')' が、識別子 'x' の前に必要です。 C:\My Documents\コームソート\コームソート1.c(8) : error C2061: 構文エラー : 識別子 'x' がシンタックスエラーを起こしました。 C:\My Documents\コームソート\コームソート1.c(8) : error C2059: 構文エラー : ';' C:\My Documents\コームソート\コームソート1.c(8) : error C2059: 構文エラー : '[' C:\My Documents\コームソート\コームソート1.c(8) : error C2059: 構文エラー : ')' C:\My Documents\コームソート\コームソート1.c(40) : warning C4013: 関数 'comb_sort11' は定義されていません。int 型の値を返す外部関数と見なします。 cl.exe の実行エラー コームソート1.obj - エラー 5、警告 1

その他の回答 (2)

  • natural
  • ベストアンサー率37% (419/1115)
回答No.3

tediwecさんと同じくKEYの部分なのですが、intに置き換えればとりあえず動くのではないでしょうか。 もしかしたら汎用的な配列を想定されているのかもしれませんが、当面の確認にはなると思います。

YOSI163
質問者

お礼

KEYと||部分が間違っていました。 ありがとうございました!

  • tediwec
  • ベストアンサー率70% (21/30)
回答No.2

こんにちは。 KEYというのは何でしょうか? KEYが定義されていないのでコンパイルエラーになるのだと思います。

YOSI163
質問者

お礼

KEYと||部分が間違っていました。 ありがとうございました!

関連するQ&A

  • 大文字を小文字に、小文字を大文字にするプログラム

    問題は、 ファイルにあるアルファベットの大文字を小文字に変換し、小文字は大文字に変換して、ファイルに保存するプログラムを作りなさい というものです。 色々考えて、 #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> #include <ctype.h> int main(int argc,char **argv){ int fd,flag1,flag2; int i,n; char buffer[512],x; fd = open(argv[1],O_RDWR); if(fd == -1) perror("open"); while((n = read(fd,buffer,sizeof(buffer)))>0){ x = buffer[i]; flag1 = islower(x); flag2 = isupper(x); for(i=0;i<n;++i) if(flag1 == 1){ buffer[i] = toupper(buffer[i]); }else if(flag2 == 1){ buffer[i] = tolower(buffer[i]); } write(fd,buffer,n); } close(fd); exit(0); } のようなプログラムを考えましたが、うまくいきません。 toupperのような関数を使ったのは初めてなのでよく使い方が分からずこのようなプログラムになってしまいました。 どうか正しく動くようなプログラムを教えてください。お願いします。

  • 乱数について

    プログラミングの授業で、各種ソートのプログラムを勉強しました。 srand (99);でランダムに数字を作っていると教わったのですが、この中の数字もランダムにしたい場合、どのようなプログラムに変えればいいのでしょうか? また、括弧内の数字で、どのようにランダムに数字をはき出しているのか知りたいです。 ~time.c~ #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX 250000 void insert_sort(int x[], int n); main() { int i , x[MAX] , n ; time_t start , end ; //列配列の選択 srand (99); for (i = 0 ; i<MAX ; i++) x[i] =rand() % MAX; n = MAX; start =clock(); //測定対象プログラム insert_sort (x ,n); end = clock(); printf("sort\n"); for(i =0 ; i < n ; i++ ) if ( i == i/100*100) printf("%d\n" , x[i]); printf ("%f sec\n" , (double)(end-start) /CLOCKS_PER_SEC); return 0; } ~insert.c~ void insert_sort(int x[], int n) { int i, j, tmp; for(i=1;i<n;i++){ for(j=i;j>0;j--){ if(x[j]<x[j-1]){ tmp = x[j]; x[j]=x[j-1]; x[j-1]=tmp; } else{ break; } } } }

  • ソート

    読み込むファイル(sample.txt)は、 2,jirou 5,gorou 4,shirou 1,tarou 6,mutsuo 3,saburou 下記の処理をします。 #include<stdio.h> #include<string.h> #define N 6 int sort1[N]; char sort2[N][30]; int BubbleSort(int data[N]) { int i,j,flag; do{ flag=0; for(i=0;i<N-1;i++) { if(data[i]>data[i+1]) { flag=1; j=data[i]; data[i]=data[i+1]; data[i+1]=j; } } } while(flag==1); return 0; } int main(void) { FILE *fpin; int id,h,k; printf("\n"); fpin=fopen("sample.txt","r"); if(fpin==NULL){ printf("ファイルをオープンできず!\n"); return 1; } for(k=0;k<N;k++) { h=fscanf(fpin,"%d,%s",&sort1[k],sort2[k]); if(h==EOF) break; printf("%d %s\n",sort1[k],sort2[k]); } printf("\n"); BubbleSort(sort1); for(k=0;k<N;k++) printf("%d %s\n",sort1[k],sort2[k]); return 0; } 実行結果は、 2 jirou 5 gorou 4 shirou 1 tarou 6 mutsuo 3 saburou 1 jirou 2 gorou 3 shirou 4 tarou 5 mutsuo 6 saburou 名前(sort2)もソートさせるには、どうすればいいか手ほどきをお願いします…

  • クイックソートの交換回数

    クイックソートを行うプログラムを書いています。 これを、比較回数と交換回数を表示できるように改良したいのですが、うまくいきません。カウントする場所は間違えてないと思うのですが、出力の場所が悪いせいか、大量の出力結果が表示されます。 うまく表示させる方法を教えてください。 ~time.c~ #include <stdio.h> #include <stdlib.h> #include <time.h> #include "sfmt.h" #define MAX 5000 void quick_sort(int a[], int start, int end); main() { int i , x[MAX] , n; time_t start , end ; int sn; printf("適当な数字の入力 : "); scanf("%d", sn); init_gen_rand(sn); for(i=0; i<MAX; i++) x[i]= (gen_rand32()% MAX);; n=MAX; start = clock(); //測定対象プログラム quick_sort(x, 0, n-1); end = clock(); printf("sort\n"); for(i =0 ; i < n ; i++ ) if ( i == i/100*100) printf("%d\n" , x[i]); printf ("実行時間: %f sec\n" , (double)(end-start) /CLOCKS_PER_SEC); return 0; } ~quick.c~ #include <stdio.h> int hikaku = 0, koukan = 0; int divide_array(int x[], int start, int end) { int i, j, tmp; i = start; j = end -1; while(1){ while(x[i] < x[end])i++; hikaku++; //比較カウント while(x[j] > x[end] && j>i)j--; hikaku++; //比較カウント if(i >= j) break; tmp = x[i]; x[i] = x[j]; x[j] = tmp; koukan++; //交換カウント i++; j--; } tmp = x[i]; x[i] = x[end]; x[end] = tmp; printf("比較回数: %d\n", hikaku); printf("交換回数: %d\n", koukan); return i; } ~quick2.c~ int divide_array(int x[], int start, int end); void quick_sort(int a[], int start, int end); void quick_sort(int a[], int start, int end) { int s; if(start >= end) return; s = divide_array(a, start, end); quick_sort(a, start, s-1); quick_sort(a, s+1, end); }

  • マージソート

    マージソートの実行時間を測定するプログラムを書いています。 コンパイルの時にはエラーが出ないのですが、実行するとコマンドプロンプトが強制終了されます。 どこが悪いか、どう直せばいいのか指摘していただけないでしょうか? よろしくお願いします。 ~qtime.c~ //マージソート実行用プログラム //bcc32 mtime.c merge.c m1.c sfmt.c #include <stdio.h> #include <stdlib.h> #include <time.h> #include "sfmt.h" #define MAX 5000 void merge_sort(int a[], int start, int end); main() { int i , x[MAX] , n; time_t start , end ; int sn; printf("適当な数字の入力 : "); scanf("%d", sn); init_gen_rand(sn); for(i=0; i<MAX; i++) x[i]= (gen_rand32()% MAX);; n=MAX; start = clock(); //測定対象プログラム merge_sort(x, 0, n-1); end = clock(); printf("sort\n"); for(i =0 ; i < n ; i++ ) if ( i == i/100*100) printf("%d\n" , x[i]); printf ("実行時間: %f sec\n" , (double)(end-start) /CLOCKS_PER_SEC); return 0; } ~merge.c~ int b[100]; void merge_array(int x[], int start, int end) { int mid, i, j, k; mid = (start + end) /2; i = start; j = mid + 1; for(k = start; k <= end; k++){ if(x[i] > x[j] && j <= end || i > mid){ b[k] = x[j]; j++; } else{ b[k] = x[i]; i++; } } for(k = start; k <= end; k++){ x[k] = b[k]; } } ~m1.c~ void merge_array(int x[], int start, int end); void merge_sort(int a[], int start, int end); void merge_sort(int a[], int start, int end) { int mid; if(start >= end) return; mid = (start + end) / 2; merge_sort(a, start, mid); merge_sort(a, mid + 1, end); merge_array(a, start, end); }

  • 問題: 以下の2つのプログラムを実装し、時間計算量を実験的に評価せよ。

    問題: 以下の2つのプログラムを実装し、時間計算量を実験的に評価せよ。     (1)1から1万までの整数ちをランダムに1千個生成するプログラム     (2)シェルソートプログラム 質問内容   プログラム()をやったんですが、「時間計算量を実験てきに評価せよ」というのは分かりません。 教えてください。 /* ランダムプログラ*/ #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 1000 void main(){ FILE *fp; int i,rnd; fp=fopen("data.dat","w"); srand((int)time(NULL)); for(i=1;i<=N;i++){ rnd = (int)rand()% 10000 + 1; fprintf(fp,"%d\n ", rnd); } fclose(fp); } /* シェルソートプログラム*/ #include <stdio.h> #include <stdlib.h> #define DATA_NUM 1000 void ShellSort(int num[ ], int n) ; void InsSort(int num[ ], int gap, int n); void ShowData(int num[ ], int n); void main(void); /* n 個のデータのシェルソートを行う */ void ShellSort(int num[ ], int n) { int gap; for (gap = n / 2; gap > 0; gap /= 2) InsSort(num, gap, n); } /* n 個のデータの単純挿入ソートを行う */ void InsSort(int num[ ], int gap, int n){ int i, j, temp; for (i = gap; i < n; i ++) { for (j = i - gap; j >= 0; j -= gap) { /* このループで */ if (num[j] <= num[j + gap]) /* j 番目とj + gap 番目と比較 */ break; /* ここにbreak;を挿入。*/ else { temp = num[j]; /* 要素の入れ替え */ num[j] = num[j + gap]; num[j + gap] = temp; ShowData(num,DATA_NUM); /* 途中経過を表示 */ } } } printf("\n"); /* InsSort( ) を抜ける時改行 */ } /* n 個のデータの表示 */ void ShowData(int num[ ], int n) { while (n--) printf("%d ", *num++); printf("\n"); } void main(void) { FILE *fp; int data[DATA_NUM]; int i; fp = fopen("data.dat","r"); if(fp == NULL){ printf("data.dat cannot be opened"); exit(1); } for(i=0;i<DATA_NUM;i++){ if(fscanf(fp,"%d",&data[i])== NULL){ break; } } printf("ソート前\n"); ShowData(data, DATA_NUM); printf("\n"); /* シェルソート */ ShellSort(data, DATA_NUM); printf("\n"); printf("ソート後\n"); ShowData(data,DATA_NUM); printf("\n"); fclose(fp); }

  • 最速化するにはどうしたらいいでしょうか?

    #include <stdio.h> #include <math.h> #include <time.h> double abssucc(double x){ return x / (1 - pow(2,-53)); } double abspred(double x){ return x * (1 - pow(2,-53)); } double succ (double x){ if(abs(x) < pow(2,-1022)) return x + pow(2,-1074); if (x >= 0) return abssucc(x); else return abspred(x); } double pred(double x){ if(abs(x) < pow(2,-1022)) return x - pow(2,-1074); if (x >= 0) return abspred(x); else return abssucc(x); } int main(){ clock_t start, end; double r= 0; int i=0; start = clock(); for(i;i<1000000;i++){ r= succ(1); printf("%.50f\n",r); }end = clock(); printf("ループ100万回の時間: %f秒\n", (double)(end - start) / CLOCKS_PER_SEC); } このプログラムをpow関数使わないでもっと速く動かしたいのですが、やり方がわかりません。 教えて下さい!お願いします。

  • クイックソートでの整列

    10個~20個程度の数列をキーボードから入力し、降順に整理し途中経過と整列後の状態を表示するプログラムを作りなさい。 このような課題が出ているのですが、よくわかりません。授業中に この2つのプログラムを応用すればできるといわれたプログラムがあるのですが、コンパイルするとエラーがたくさん出てきます。 ヒントを教えてください。 1.c #include <stdio.h> #include <stdlib.h> quick_sort(int a[], int l, int r); main(int argc, char *argv) { int i, x[100], n; n = atoi(argv[1]); for(i = 0;i< n;i++); scanf("%d", %x[i]); quick_sort(x, n); printf("sort\n"); for(i = 0;i<n; i++){ printf("%d\n", x[i]); } return ; } 2.c quick_sort(int a[], int l, int r) { int v,i,j,t; if(r>1) { v=a[r]; i=l-1; j=r; while(1) { while(a[++i]<v); while(a[--j]>v) if(j==l)break; if(i>=j)break; t=a[i];a[i]=a[j];a[j]=t; } a[r]=a[i];a[i]=v; quick_sort(a,l,i-1); quick_sort(a,i+1,r); } }

  • 二分法のプログラム

    関数x^3-7x^2-6x+2を二分法で解くプログラムを作ったのですが、エラーが出てコンパイルできません。訂正箇所を教えて下さい。 宜しくお願い致します。 #include<stdio.h> #include<math.h> #define EPSILON 0.1E-5 #define TURE 1 #define FALSE 0 int kansu(int x); void Nibunho(left,right,sol,flag); double left,right; int flag; int main(void) { printf("区間の左端と右端は?\n"); scanf("%lf %lf",&left,&right); flag=FALSE; Nibunho(left,right,&root,&flag); if(flag) printf("解 = %e (繰り返し回数 = %d)\n",root,k); else { printf("入力した範囲で解は求まりませんでした。\n"); printf("f(%e) = %e \n",root,k); } return 0; } int kansu(int x) { int f(double x) f(x)=x*x*x-7.0*x*x-6.0*x+2.0; return(f(x)); } void Nibunho(left,right,sol,flag) { double left,right,*sol; int *flag; double a,b,c,fa,fb,fc; k=0; a=left; b=right; do { k++; c=(a+b)/2.0; fc=f(c); fa=f(a); fb=f(b); if(fabs(fc)<1.0e-10) { a=c; b=c; *flag=TRUE; } else { if( (fa * fc < 0.0) || (fb * fc < 0.0) ) { *flag = TRUE; if( (fa*fc) < 0.0 ) b=c; else a=c; } else { if( fabs(fa) > fabs(fb) ) a=c; else b=c; } } } while((b-a)>EPSILON) *sol=(a+b)/2.0; }

  • シェルソートのプログラムが分かりません

    教科書どおり下のようなプログラムを作ったのですが、ちゃんとソートされません。 打ち間違いなどを探しているのですが見つからないんです・・・ それと、プログラム11行目のj=j-hが何のためにあるのか分かりません。もしかしたら幼稚な質問かもしれませんがどうかよろしくお願いします。 #include<stdio.h> void shell(int n,int a[]) { int i,j,x,h; h=n/2; while(h<0) { for(i=h;i<=n;i++) { x=a[i]; for(j=i-h;j>=0;j=j-h) { if(a[j]>x) { a[j]=a[j+h]; a[j+h]=x; } } } h=h/2; } } main() { int a[]={30,20,60,29,10,90}; int n=6; int i; shell(n,a); for(i=0;i<n;i++) { printf("%4d",a[i]); } printf("\n"); }