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

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

ただいまの
回答率

89.96%

警告やコンパイルエラーを直すことができません。

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 4,624

sort_merge

score 14

クイックソートのソースを書いているのですがうまくコンパイルすることができません。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXN 10000000
int inputdata();
int quicksort();
int printdata();
int A[MAXN],n,m;
int swap();
int find_median3();
int partition();
int insertionsort();
int main(){
  inputdata();
  A[0] = -999999999;
  quicksort(1,n);
  printdata();
}

int find_median3(left,right)
int left, right;
{
  int center,p;

  center = (left + right)/2;
  if(A[left] > A[center]) swap(left,center);
  if(A[left] > A[right]) swap(left,right);
  if(A[center] > A[right]) swap(center,right);

  p = A[center];
  swap(center,right);
  return(p);
}

int partition(left,right,q)
int left,right,q;
{
  int i,j;

  i=left-1; j=right;
  do{
    do i=i+1; while(A[i]<q);
    do j=j-1; while(A[j]>q);
    if(i<j)swap(i,j);
  }while(i<j);
  swap(i,right);
  return(i);
}

int quicksort(left,right)
     int left,right;
{
  int cutoff,pivot,i,j;
  cutoff = 10;
  clock_t start, end;
  start = clock();
  if((right - left) < cutoff) insertionsort(left,right);
  else{
    pivot = find_median3(left,right);
    i = partition(left,right,pivot);
    quicksort(left,i-1);
    quicksort(i+1,right);
  }
  end = clock();
  m = end - start;
  return(0);
}

int insertionsort(p,q)
int p,q;
{
  int i,j,c;
  for(j=p+1; j <= q; j++){
    c=A[j]; i=j;
    while(i>p && A[i-1]>c){
      A[i] = A[i-1]; i = i-1;
    }
    A[i] = c;
  }
  return(0);
}

int inputdata(){
  int i;

  srand((unsigned)time(NULL));
  printf("出力する乱数の個数を入力=======>");
  scanf("%d",&n);
  printf("\n");
  printf("------------入力データ-------------\n");
  for(i=1; i<=n; i++){
    A[i] = rand()%10000;
    printf("A[%d]=%5d    ",i,A[i]);
    if(i%4 == 0){
      printf("\n");
    }
  }
  printf("\n");
  return(0);
}

int printdata(){
  int i;

  printf("--------------ソート済みデータ-----------------\n");
  for(i=1; i<=n; i++)
    printf("A[%d]=%5d   ",i,A[i]);
  if(i%4 == 0){
    printf("\n");
  }
}
printf("\n");
printf("ソートの処理時間は%f秒です。\n",(double)m / CLOCKS_PER_SEC);
return(0);
}

int swap(i,j)
int i,j;
{
  int temp;

  temp = A[i];
  A[i] = A[j];
  A[j] = temp;
  return(0);
}
コード

そして以下が警告とコンパイルエラーです。

quicksort2.c:111:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
quicksort2.c:112:8: error: expected parameter declarator
printf("\n");
       ^
quicksort2.c:112:8: error: expected ')'
quicksort2.c:112:7: note: to match this '('
printf("\n");
      ^
quicksort2.c:112:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
printf("\n");
^~~~~~
quicksort2.c:112:1: error: conflicting types for 'printf'
/usr/include/stdio.h:259:6: note: previous declaration is here
int      printf(const char * restrict, ...) printflike(1, 2);
         ^
quicksort2.c:113:8: error: expected parameter declarator
printf("ソートの処理時間は%f秒です。\n",(double)m / CLOCKS_PER_SEC);
       ^
quicksort2.c:113:8: error: expected ')'
quicksort2.c:113:7: note: to match this '('
printf("ソートの処理時間は%f秒です。\n",(double)m / CLOCKS_PER_SEC);
      ^
quicksort2.c:113:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
printf("ソートの処理時間は%f秒です。\n",(double)m / CLOCKS_PER_SEC);
^~~~~~
quicksort2.c:113:1: error: conflicting types for 'printf'
/usr/include/stdio.h:259:6: note: previous declaration is here
int      printf(const char * restrict, ...) printflike(1, 2);
         ^
quicksort2.c:114:1: error: expected identifier or '('
return(0);
^
quicksort2.c:115:1: error: extraneous closing brace ('}')
}
^
3 warnings and 8 errors generated.

申し訳ありませんがアドバイスお願いします。
どうかよろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+1

quicksort2.c:111:1: warning: control reaches end of non-void function [-Wreturn-type] 

この位置に}があることは正常でしょうか?

コンパイル・エラーや警告は、的確なメッセージが出るとは限りません。時として適切でないメッセージが表示されます。しかし、そのエラーや警告が出た位置、もしくは、そのちょっと前に可笑しな記述をしていることが多いです。
また、あるエラーや警告が原因で後続の行がエラーや警告になることも非常に多いです。ということは、できるだけ始めの方のエラーや警告の原因を潰していくと速いです。

頑張ってください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/01/03 12:35

    回答ありがとうございました!
    参考にさせていただきます!

    キャンセル

checkベストアンサー

0

111行目を削除すれば、エラーがなくなります。

...
// }     <--- この行を削除
printf("\n");
printf("ソートの処理時間は%f秒です。\n",(double)m / CLOCKS_PER_SEC);
return(0);
...

質問文のコードを私なりに変更してみました。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXN 10000

int find_median3(int left, int right);
int partition(int left, int right, int q);
double quicksort(int left, int right);
void insertionsort(int p, int q);
int inputdata(void);
void swap(int i, int j);
void printA(int n, char* message);

int A[MAXN];
int CUTOFF = 10;

int main(int argc, char** argv) {
  int n = inputdata();
  printA(n, "------------入力データ-------------------------");
  double time = quicksort(1, n);
  printA(n, "--------------ソート済みデータ-----------------");

  printf("ソートの処理時間は %f 秒です。\n", time / CLOCKS_PER_SEC);
}

int find_median3(int left, int right) {
  int center = (left + right) / 2;

  if (A[left] > A[center])  swap(left, center);
  if (A[left] > A[right])   swap(left, right);
  if (A[center] > A[right]) swap(center, right);

  int p = A[center];
  swap(center, right);
  return p;
}

int partition(int left, int right, int q) {
  int i = left - 1;
  int j = right;
  do {
    do i = i + 1; while(A[i]<q);
    do j = j - 1; while(A[j]>q);
    if (i < j) swap(i,j);
  } while(i < j);
  swap(i, right);
  return i;
}

double quicksort(int left, int right) {
  clock_t start = clock();
  if ((right - left) < CUTOFF) {
    insertionsort(left, right);
  } else {
    int pivot = find_median3(left, right);
    int i = partition(left, right, pivot);
    quicksort(left, i - 1);
    quicksort(i + 1, right);
  }
  return clock() - start;
}

void insertionsort(int p, int q) {
  for (int j = p + 1; j <= q; j++) {
    int c = A[j];
    int i = j;
    while (i > p && A[i-1] > c) {
      A[i] = A[i-1];
      i = i - 1;
    }
    A[i] = c;
  }
}

int inputdata(void) {
  int n;
  srand((unsigned)time(NULL));
  printf("出力する乱数の個数を入力=======>");
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    A[i] = rand() % 10000;
  }
  return n;
}

void swap(int i, int j) {
  int temp = A[i];
  A[i] = A[j];
  A[j] = temp;
}

void printA(int n, char* message) {
  printf("%s\n", message);
  for (int i = 1; i <= n; i++) {
    printf("A[%d]=%5d    ", i, A[i]);
    if (i % 5 == 0) {
      printf("\n");
    }
  }
  printf("\n");
}


実行例

$ ./a.out
出力する乱数の個数を入力=======>15
------------入力データ-------------------------
A[1]= 7343    A[2]= 5599    A[3]= 4992    A[4]= 3116    A[5]= 9894    
A[6]= 4224    A[7]= 3094    A[8]= 4321    A[9]= 9364    A[10]= 5360    
A[11]= 5615    A[12]=  791    A[13]= 7340    A[14]= 3956    A[15]= 1704    

--------------ソート済みデータ-----------------
A[1]=  791    A[2]= 1704    A[3]= 3094    A[4]= 3116    A[5]= 3956    
A[6]= 4224    A[7]= 4321    A[8]= 4992    A[9]= 5360    A[10]= 5599    
A[11]= 5615    A[12]= 7340    A[13]= 7343    A[14]= 9364    A[15]= 9894    

ソートの処理時間は 0.000005 秒です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/01/03 12:34

    ありがとうございました!
    コンパイルすることができました!

    キャンセル

-1

printf();の仕様を確かめましょうd^^
printf("\n");→putchar('\n');

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/01/03 01:42 編集

    そのprintfは問題ないやろ。
    関数の外だから、戻り値省略(たぶんint)のプロトタイプ宣言になって、リテラルあるからおかしいって言われてんだよ

    キャンセル

  • 2016/01/03 12:36

    お二人方回答ありがとうございました!

    キャンセル

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

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