- 締切済み
クイックソートとチェックプログラム
こんにちは。以下の問題がわかりません。 特にint Check(){}にはいる部分が。 わかる方、ご回答願います。 /* QuickSortを完成させよう 【自動的に出てきた数を小さい順に並べ、それをチェックする】*/ #include <stdio.h> #include <stdlib.h> int a[1000000]; void MakeData(int *a,int n){ int i; srand(time(&i)); for(i=0;i<n;i++){a[i]=rand();} } int Divide(int *a, int Top, int Botom){ int x,y; while(Top<Botom){ if(a[Top]>a[Top+1]){ x=a[Top]; a[Top]=a[Top+1]; a[Top+1]=x; Top=Top+1; } else{ y=a[Top]; a[Top]=a[Botom]; a[Botom]=y; Botom=Botom-1; } } } int Check(/*ここの関数を作れ*/){/*ここの関数を作れ*/} void QuickSort(int *a, int Top, int Botom){ int K; if(Top>=Botom){return;} K=Divide(a,Top,Botom); QuickSort(a,Top,K-1); QuickSort (a,K+1,Botom); } main(){ int N; printf("データ数?");scanf("%d",&N); MakeData(a,N); if(Check(a,N)==1){printf("並べ変わっている\n");} else{printf("並べ変わっていない\n");} QuickSort(a,0,N-1); if(Check(a,N)==1){printf("並べ変わっている\n");} else{printf("並べ変わっていない\n");} }
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- arain
- ベストアンサー率27% (292/1049)
> 丸投げしたわけではありません((汗)) と書かれても、かなり疑問に思うところがあるんだよね。 No.2より >えーと、int Check(){}以外のプログラムは、事前に書いた流れ図に沿って作成できたけど、肝心なint Check(){}の中身をどのように書いていいかわからないんです。 No.3より >【質問】に書いたプログラムは私が手元で書いた流れ図を元に自分で作成したものです。 ということは、ある機能について理解できているから流れ図が書けて、プログラムが途中であれできてるわけだ。 その中でCheck()に対しての引数と戻り値も決めているのに、なぜCheck()の流れ図が書けてないのかな? 流れ図っていうのは基本的に開発言語に依存しないものだよ。プログラムは流れ図に合う関数を利用したり、処理を作成するステートだから。 No.2での補足に答えてもらってないけど、Check()の機能の説明はなぜないのでしょうかね? Check()をどのようにな処理で作るか確定していなけはれば、流れ図は書けないし、引数や戻り値といったI/Fも検討できない。 「○○を行うためにはどの様な処理を作成するばよいでしょうか」といった質問が出るのであれば理解できるんだけど…… なので >if(Check(a,N)==1){printf("並べ変わっている\n");} といったプログラムも組めないはず。 これは明確にI/Fを決定しているからこそのプログラム。 という意味では、穿った見方をすると、 No.3氏が回答されているソースが質問者の意図している処理であるかという保障なくなるわけなんだけど。
- D-Matsu
- ベストアンサー率45% (1080/2394)
> 丸投げしたわけではありません((汗)) といいますが、この聞き方では「関数Check()の作成」の丸投げですよ。 ・Check()が何をする関数で ・それを作るために何(全部、はダメ)がわからないのか くらいは最低書いておかないと丸投げと取られます。以後ご注意を。 ##3氏、言葉は厳しいけど親切だよなぁ。結局答えてるし。
- chie65536
- ベストアンサー率41% (2512/6032)
問題の丸投げは禁止。 >特にint Check(){}にはいる部分が。 の答えは >if(Check(a,N)==1){printf("並べ変わっている\n");} >else{printf("並べ変わっていない\n");} に書いてある。 Check(a,N) って呼んでるなら、最初の引き数は、配列の先頭要素のポインタ。次の引き数は個数。 呼んでる場所を見れば「呼んでる通りに引き数を用意してあげる」のは簡単。 なので、引き数はこうなる。 int Check(int *a,int N){ } これが判らないとしたら、小学生以下の『教えて君』のみ。 >if(Check(a,N)==1){printf("並べ変わっている\n");} って判断してるなら「並べ終わってるなら1を返し、そうじゃないなら0を返す」って事だ。 これも判らないとしたら、小学生以下の『教えて君』のみ。 あとは、関数の中身を書くだけ。 int Check(int *a,int N){ int i; for(i=0;i<N-1;i++){if (a[i]>a[i+1]) {return 0;}} return 1; } 中身はちょっと難しいかもね。
お礼
ご回答ありがとうございます。参考になりましたo(^▽^)o えーっと、問題は・・・丸投げしたわけではありません((汗)) 【質問】に書いたプログラムは私が手元で書いた流れ図を元に自分で作成したものです。 まだC言語をはじめて半年もたたないので、部分部分でわからなくなってしまうのです。
- arain
- ベストアンサー率27% (292/1049)
No.1氏の回答は理解されていますか? 「Check()関数は何を行う関数なのかわかっているか」という質問に対して >int Check(){}の中身をどうしていいのかまったくわかりません(>_<.) なら、「外」(関数の機能)はわかっているけど、「中身」(処理)の作り方がわからない という解釈でよいですよね? まずは、その理解されている関数の機能を説明してください。
補足
えーと、int Check(){}以外のプログラムは、事前に書いた流れ図に沿って作成できたけど、肝心なint Check(){}の中身をどのように書いていいかわからないんです。 C言語を始めて半年もたたないので、このような細かい部分の理解が追いつきません(>_<) 関数の機能・・・・・・並べ替えとかがちゃんとできているか確認するための関数?ですか??
- asuncion
- ベストアンサー率33% (2127/6290)
>特にint Check(){}にはいる部分が。 Check関数の仕様(機能)はわかりますか?
補足
int Check(){}以外のところは大丈夫なのですが、int Check(){}の中身をどうしていいのかまったくわかりません(>_<.)
お礼
D-Matsuさんの言うとおりですね。言葉がかなり足りませんでした(汗)