C言語でテーブル配列の中身をソートする方法

このQ&Aのポイント
  • C言語でテーブル配列の中身をソートする方法について教えてください。
  • ランダムに切断されたひもの長さを測るために、C言語でテーブル配列をソートする必要があります。どのようにすればいいのか教えてください。
  • ソートされたテーブル配列を比較させる方法が分からず困っています。ソート結果を保存する方法について教えてください。
回答を見る
  • ベストアンサー

テーブル配列の中身、出力値

お世話になっております。 C言語勉強中のものです。 一定のひもをランダムに切断し、その長さを測ろうと思っています。 前回アドバイスを頂き、ソートを使って書いてみたのですが、詰まる部分があったのでご指導いただきたいと思いました。 #include <stdlib.h> #include <string.h> #include <stdio.h> #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))   int GetRandom(int min, int max);   int compare_int(const void* a, const void* b);   int compare_str(const void* a, const void* b); int main(void) {   int int_table[] = {GetRandom(0,10000)};   int i;   qsort( int_table, ARRAY_SIZE(int_table), sizeof(int), compare_int );   for( i = 0; i < ARRAY_SIZE(int_table); ++i ) {     printf("%d\n",int_table[i] ); }   return 0; } int compare_int(const void* a, const void* b) {   return ( *(int*)a - *(int*)b ); } int GetRandom(int min, int max) {     return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } 【困っている箇所】 ・int int_table[]={} の中身に次のようなものを入れることで、ランダムに切ったひもを、ソートできると考えているのですが、その方法を色々ためしましたが上手くいきませんでした。このようなやり方で良いのか、その場合どのようにしたら良いか、また違うのかを教えていただきたいです。 for(i=0;i<10;i++) { printf("%d\n",GetRandom(0,10000)); } ・また最終的にソートしたものを比較させようと思っています。 「出力値を保存する方法」が分からないので教えて頂きたいです。 ----前回ご覧になってくださった方へ---- アドバイスありがとうございました。 まだ初心者ですが、色々ご教授下さるとうれしい限りです。

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

> このようなやり方で良いのか コンパイル時にエラーが出ませんか? 配列の要素数はいくつほしいですか? 100個だとします。 乱数を取得する前に一度だけ、srand()か何かを使って初期化します。 初期化していないと、何度実行しても同じ結果を得るだけで、あまりおもしろくないと思います。 そういう結果でよければ、srand()は不要です。 次に、100回(配列の要素数)まわるループを構成します。 ループの中でGetRandom()を実行し、配列の所定の場所に格納します。 後はqsort()なり他の関数を使うなりで、ソートします。

beibe_hosi
質問者

補足

ご解答ありがとうございます。 コンパイル時にエラーは出ませんでした。 配列の要素数はまだ考えていませんでした。 初期化はしていませんでした。time関数などを考えていましたが、後々考慮しようと思っています。初期化することで違う結果が出るのであれば、その方法も試してみたいと思います。 配列の所定の場所に格納する方法が分からず詰まってしまいました。 もう一度考えて見ます。

その他の回答 (2)

  • yuu_yuu
  • ベストアンサー率41% (34/81)
回答No.3

こんばんは、#2です。 前回の質問確認させていただきました。 前の質問の#2の方の回答は、ランダムに発生させたひもの切る位置をテーブルに保存後ソートし 切る位置の差からひもの長さを求めると言った回答がでしたが、この考えでよろしいですか? >>「出力値を保存する方法」が分からないので教えて頂きたいです。 との事ですが、あまり難しく考えず、変数へ代入すれば良いだけです。 切る回数は10回、ひもの長さ100000固定とします。 ※同じ箇所をたまたま2回以上で切った場合の制御は考えていません。長さ0のひもが表示される。  その他、細かい仕様は質問者様が考えてください^^ #define CUT_COUNT = 10 #define HIMO_LENGTH = 100000 int main(void) {   int int_table[CUT_COUNT];   // ひもを切る位置を保存する領域   int himo_table[CUT_COUNT+1];  // ひもの長さを保存する領域   int i;  // ループカウンタ   int iWork;  // ワーク領域   // 初期クリア   memset(int_table,0,sizeof(int_table));   memset(himo_table,0,sizeof(himo_table));   for( i = 0; i < CUT_COUNT; i++ )   {     // ひもの切る位置をランダムに10個作成     int_tabel[i] = GetRandom(0,HIMO_LENGTH);   }   // int_tabelを昇順でソートする。   ソートのロジックは面倒なので割愛^^;   iWork=0;   for( i = 0; i < CUT_COUNT; i++ )   {     // ひもの長さを計算しテーブルに保存     himo_table[i] = int_tabel[i] - iWork;     iWork = int_tabel[i];   }   // 最後のひもの長さ計算しテーブルに保存   himo_table[CUT_COUNT] = HIMO_LENGTH - int_tabel[CUT_COUNT-1];   for( i = 0; i < CUT_COUNT+1; i++ )   {     // ひもの長さを画面出力     printf("ひも番号[%d] ひもの長さ[%d]", i+1, himo_table[i]);   } } こんな感じでいかがでしょうか?

  • yuu_yuu
  • ベストアンサー率41% (34/81)
回答No.2

まず、前回の質問を見ている人が解答をつけるとは限りません。 全部書くのが面倒でしたら前回のURLを張るなどして誘導するか、前回の内容も含め 全部書いてください。 で、解らないのが、一定の長さのひもの長さは10000固定で、切る回数は10回固定で、 切る長さがランダムというこでOKでしょうか? また、その切るのアルゴリズムはどようなものをお考えですか? 例えば、元が10000のひもを10回切る(最終的にひもは11本)のだから、 最初は1~9999の間で乱数を発生させ、10000から発生した乱数を引いた数と、 発生した乱数と比較し大きかった方を次に切るひもとする。。。とか 考え方は、他にもありますが。。。 以下はソース上の突っ込みです。 ココの部分コンパイル通ってますか? int int_table[] = {GetRandom(0,10000)}; 私が知らないだけで、テーブルの初期クリアで関数が(C++だから?)使えるのかも知れません。 使えるとしても、ランダムな数字が1つ入るだけだと思います。

beibe_hosi
質問者

補足

指摘ありがとうございます。 前回のURLは次に貼り付けます。 http://oshiete1.goo.ne.jp/qa3949526.html 一定のひもの長さ、切る回数はこれから色々変えていこうと思っています。 ひもの長さを、int 型で定義しようとしているので、出来るだけ長くして、少数が入らないようにと考えています。 >最初は1~9999の間で乱数を発生させ、10000から発生した乱数を引いた数と、 発生した乱数と比較し大きかった方を次に切るひもとする。。。とか この方法も考えてみたのですが、やり方がよく分からなかったので、今回では、まずひもの位置を乱数で発生させ、その後その差を取ろうと考えていました。この方法も、また考えて生きたいと思います。 >ココの部分コンパイル通ってますか? int int_table[] = {GetRandom(0,10000)}; この部分のコンパイルは一応問題ないようでした。 しかしながら、指摘の通りランダムの数字が1つ入るだけでした。 この部分にランダムに切った値がいくつか入るようにしたかったのですが、そのやり方がわかりませんでした。

関連するQ&A

  • クイックソート

    #include<stdio.h> #include<stdlib.h> #define MAX 10 int comp(const void *i,const void *j); int main(void) { int sort[MAX], i ; for(i=0 ; i<MAX ; i++){ sort[i] = rand(); } qsort(sort, MAX, sizeof(int), comp); for( i=0; i<MAX ; i++) printf("%d\n", sort[i]); return 0; } int comp (const void *i, const void *j) { return *(int*)i - *(int*)j; } これはクイックソートのプログラムなのですが、 int comp (const void *i, const void *j) { return *(int*)i - *(int*)j; } この部分がわかりません。ここでソートしているのですか?

  • qsortについて

    qsort()で構造体をソートする時に、qsortの第3,4引数時の、「size t_t size, int (*cmp)(const void *a, const void *b)」の使い方が分かりません。 何故これを使ってソートが出来るのでしょうか?そもそも、構造体を送った時に、自作関数内での書き方にも疑問があります。 int main(void){ MAX dt[5]={・・・・}; //構造体変数宣言 ・・・・・ qsort(dt,5,sizeof(MAX),sum); //(*1) .... return 0; } int sum(const void *a, const void *b){ MAX *p1 = (MAX *)a; //(*2) MAX *p2 = (MAX *)b; //(*2) ・・・・ return ~; } ---------------------------------------------------- *1: 第3引数のsizeof(MAX)って何ですか? *2: 例えばint型が渡されてreturnする場合は、「return *(int *)a - *(int *)b 」でいいのに、   何故構造体の場合はこう書かないといけないのですか?

  • C言語の参照はずしについて

    ソートのプログラムなんですが #include <stdio.h> #include <stdlib.h> int comp(const void *, const void *); int main() { int i; int test[6] = {10, 8, 2, 6, 4, 0}; qsort(test, (size_t)6, sizeof(int), comp); printf("\n"); for (i = 0; i < 6; i++) printf("%d\n", test[i]); return 0; } int comp(const void *a, const void *b) { static int i = 1; printf("%02d--%d,%d\n", i, *(int *)a, *(int *)b); i++; return (*(int *)a - *(int *)b); } 最後のreturnの()の中身がよくわかりません。「参照はずし」という事をしてるらしいんですが「参照はずし」とは何ですか意味も教えてください。

  • 配列の中身を入れ替える方法を教えてください

    配列の中身を入れ替える方法をどなたかおしえてください。下のプログラムはちゃんと実行されるんですが、いまいち納得できません。 特に・・・↓↓ void sort(int a[]) { int x,y,z,min; for(x=0;x<10;x++) { min=x; for(y=x;y<10;y++) { if(a[min]>a[y]) { min=y; } } z=a[min]; a[min]=a[x]; a[x]=z; } } 上の部分でなぜfor文を2回使うのか?2回目のfor文のところはなぜ y=xなのか?0ではいけないのか?よくわかりません。一番最後の入れ替え作業のところは納得できたんですが、for文のところがよくわからないのでどなたか分かる方教えてください! #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <time.h> void sort(int a[]) { int x,y,z,min; for(x=0;x<10;x++) { min=x; for(y=x;y<10;y++) { if(a[min]>a[y]) { min=y; } } z=a[min]; a[min]=a[x]; a[x]=z; } } int main(int argc, char* argv[]) { int a[10],b,c; srand((unsigned)time(NULL)); for(b=0;b<10;b++) { a[b]=rand(); c=a[b]; printf("a[%d]=%d\n",b,a[b]); } sort(a); for(b=0;b<10;b++) { printf("小さい順a[%d]=%d\n",b,a[b]); } return 0; }

  • 小さい順に並べ替えるプログラム

    コンピュータに10個のてきとうな数字を入力させ それを、小さい順に並べ替えるプログラムです。 以下のようにしたのですが、エラー0 警告0 なのに動きません。 どこが違うのでしょうか? #include<iostream> #include<cstdlib> #include<ctime> using namespace std; const int NUM_ELEMENTS=10; void sort(int*); void generation(int*); void exchange(int&,int&); void sort(int* a){ int min, locate, i, j; for(i=0; i<NUM_ELEMENTS-1; i++){ min = a[i]; locate = i; for(j=i; j<NUM_ELEMENTS; j++){ if(min > a[j]){ min = a[j]; locate = j; } } exchange(a[i],a[locate]); } } void generation(int* a){ int i; srand(time(NULL)); for(i=0; i<NUM_ELEMENTS; i++){ a[i] = rand(); } } void exchange(int& a,int& b){ int t; t=a; a=b; b=t; } int main(){ int data[NUM_ELEMENTS]; generation(data); sort(data); return 0; }

  • ソートの名称について

    以下のようなソートに、選択ソートやバブルソート等といった名称は存在しますか? #include <stdio.h> int main(void) { int array[10]; int i, j, tmp; /* Input */ for(i=0; i<sizeof(array)/sizeof(int); i++){ printf("array[%d]> ", i); scanf("%d", &array[i]); } /* Sort */ for(i=0; i<sizeof(array)/sizeof(int)-1; i++){ for(j=i+1; j<sizeof(array)/sizeof(int); j++){ if(array[i]>array[j]){ tmp = array[i]; array[i] = array[j]; array[j] = tmp; } } } /* Output */ for(i=0; i<sizeof(array)/sizeof(int); i++){ printf("array[%d]: %d\n", i, array[i]); } return 0; }

  • java

    このプログラムをjavaでかくとどうなりますか? #include<stdio.h> #include<stdlib.h> #include<time.h> int comp(const void *a, const void *b){  return *(int*)a - *(int*)b; } int main(void){  int i;  int sep[9];  srand((unsigned int)time(NULL));  sep[0] = 0;  sep[8] = 100;  for(i=1;i<8;i++){   sep[i] = rand() % 101;  }  qsort(sep+1, 7, sizeof(int), comp);  for(i=0;i<8;i++){   printf("a[%d] = %d;\n", i, sep[i+1] - sep[i]);  }  return 0; }

    • ベストアンサー
    • Java
  • 配列へのポインタについて

    #include <stdio.h> void array(//ここのパターン){ //ある処理 } int main(void){     int a[2][3];     array(a);     return 0; } 上記のようなプログラムがあったとしてarray関数の引数のパターンが3つほどあった気がします・・・・(*b)[3]とあと2つ・・・・ すみませんが、教えていただけませんか?

  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • ポインターを使った並べ替え

    ポインタを用いてソートを行うプログラムを作成しています しかし、関数部分が悪いのか、上手く作動されません よろしければ、アドバイスをいただけると嬉しいです #include <stdio.h> #define MAX 10 #define RandMax 1000 void select_sort(int *a, int n){ int *i, *min, *last, t; last=a+n; for(i=a; i<last; i++){ min=a; for(i=a+1; i<last; i++) if(*i<*min) min=i; t=*min; *min=*i; *i=t; } } main(){ int *a, i; a=(int*)calloc(MAX,sizeof(int)); for(i=0; i<MAX; i++) a[i]=rand()%RandMax; select_sort(a, MAX); printf("data size=%d \n", MAX); for(i=0; i<MAX; i++){ printf("%5d", a[i]); if(i%10==9) printf("\n"); } } 以上が私の作成したプログラムです よろしくお願いします