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

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

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

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

Q&A

解決済

3回答

14277閲覧

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

sort_merge

総合スコア16

C

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

0グッド

1クリップ

投稿2016/01/02 14:42

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

#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.

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

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

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

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

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

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

guest

回答3

0

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

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

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

頑張ってください。

投稿2016/01/02 14:59

編集2016/01/02 15:04
Chironian

総合スコア23272

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

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

sort_merge

2016/01/03 03:35

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

0

ベストアンサー

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

c

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

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

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4#define MAXN 10000 5 6int find_median3(int left, int right); 7int partition(int left, int right, int q); 8double quicksort(int left, int right); 9void insertionsort(int p, int q); 10int inputdata(void); 11void swap(int i, int j); 12void printA(int n, char* message); 13 14int A[MAXN]; 15int CUTOFF = 10; 16 17int main(int argc, char** argv) { 18 int n = inputdata(); 19 printA(n, "------------入力データ-------------------------"); 20 double time = quicksort(1, n); 21 printA(n, "--------------ソート済みデータ-----------------"); 22 23 printf("ソートの処理時間は %f 秒です。\n", time / CLOCKS_PER_SEC); 24} 25 26int find_median3(int left, int right) { 27 int center = (left + right) / 2; 28 29 if (A[left] > A[center]) swap(left, center); 30 if (A[left] > A[right]) swap(left, right); 31 if (A[center] > A[right]) swap(center, right); 32 33 int p = A[center]; 34 swap(center, right); 35 return p; 36} 37 38int partition(int left, int right, int q) { 39 int i = left - 1; 40 int j = right; 41 do { 42 do i = i + 1; while(A[i]<q); 43 do j = j - 1; while(A[j]>q); 44 if (i < j) swap(i,j); 45 } while(i < j); 46 swap(i, right); 47 return i; 48} 49 50double quicksort(int left, int right) { 51 clock_t start = clock(); 52 if ((right - left) < CUTOFF) { 53 insertionsort(left, right); 54 } else { 55 int pivot = find_median3(left, right); 56 int i = partition(left, right, pivot); 57 quicksort(left, i - 1); 58 quicksort(i + 1, right); 59 } 60 return clock() - start; 61} 62 63void insertionsort(int p, int q) { 64 for (int j = p + 1; j <= q; j++) { 65 int c = A[j]; 66 int i = j; 67 while (i > p && A[i-1] > c) { 68 A[i] = A[i-1]; 69 i = i - 1; 70 } 71 A[i] = c; 72 } 73} 74 75int inputdata(void) { 76 int n; 77 srand((unsigned)time(NULL)); 78 printf("出力する乱数の個数を入力=======>"); 79 scanf("%d", &n); 80 for (int i = 1; i <= n; i++) { 81 A[i] = rand() % 10000; 82 } 83 return n; 84} 85 86void swap(int i, int j) { 87 int temp = A[i]; 88 A[i] = A[j]; 89 A[j] = temp; 90} 91 92void printA(int n, char* message) { 93 printf("%s\n", message); 94 for (int i = 1; i <= n; i++) { 95 printf("A[%d]=%5d ", i, A[i]); 96 if (i % 5 == 0) { 97 printf("\n"); 98 } 99 } 100 printf("\n"); 101}

実行例

$ ./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/02 23:46

katoy

総合スコア22324

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

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

sort_merge

2016/01/03 03:34

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

0

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

投稿2016/01/02 15:02

cateye

総合スコア6851

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

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

hotcake_box

2016/01/02 16:50 編集

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

2016/01/03 03:36

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問