• ベストアンサー

並べ替えについて教えて下さい

現在、C言語を勉強しています 現在、読み取り用のファイルからデータを読み取って情報を処理し、別のファイルにその結果を書き込むといったことをしています。 その中で、配列変数を用いた並べ替えに悪戦苦闘しています。 数字を並べ替えるのと、文字を並べ替えるのでは方法が違うとのこと。 そもそも、文字を並べ替えるとはどういうことですか? まだ経験が少ないので、できる限りわかりやすく説明して下さい。 (c言語に使用する言語を使われてもかまいません。)

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

  • ベストアンサー
  • cocky
  • ベストアンサー率57% (232/402)
回答No.4

直接の回答ではありませんが、KOH_daさんのプログラム例だとまずい点があるので、念のため指摘しときます。 数値の入れ替えの方はそのままでもいいんですが、文字列の方は必ずしも文字列の記憶領域が十分確保されているとは限りませんから、単にポインタを入れ替えるにとどめるか、もしくはきちんとmalloc/freeしないとだめですよね。 なので、前者(ポインタをただ入れ替えるだけ)なら、 if( strcmp( a[i], a[j] ) > 0 ) {  w = a[i];  a[i] = a[j];  a[j] = w; } でしょうし、また後者(完全にmalloc/freeしなおす)なら if( strcmp( a[i], a[j] ) > 0 ) {  w = malloc( strlen( a[i] ) + 1 );  strcpy( w, a[i] );  realloc( a[i], strlen( a[j] ) + 1 );  strcpy( a[i], a[j] );  realloc( a[j], strlen( w ) + 1 );  strcpy( a[j], w );  free( w ); } と書かないと、最悪の場合配列の他の部分の文字列が破壊されるなど大変なことになります。 しかも後者の場合だと、今回はあえて省略しましたが、malloc/reallocに失敗した場合のエラー処理まで考えると処理が非常に重くなります。 なので、前者のような書き方がベストでは、と思いますが。

kouzi
質問者

お礼

質問が抽象的だったようですね。すみませんでした。 とても詳しく説明していただいてありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • KOH_da
  • ベストアンサー率31% (161/506)
回答No.3

答えじゃなくて、問題の意味を聞かれても推測でしか答えられません。 たぶん文字を並べ替えるというのは、 文字列を並べ替えるという意味だと思います。 名前を五十音順にするとか...。 で、方法が違うというのはこういうことじゃないかな。 数字の並べ替えだと... if( a[i] < a[j] ) { w = a[i]; a[i] = a[j]; a[j] = w; } というように並べ替えることができます。 しかし文字列だとそのまま比較することができませんし、 代入にも専用の関数が必要になります。 if( strcmp(a[i], a[j]) > 0 ) { strcpy( w, a[i] ); strcpy( a[i], a[j] ); strcpy( a[j], w ) ; }

kouzi
質問者

お礼

質問が抽象的だったようですね。すみませんでした。 参考になりました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • cocky
  • ベストアンサー率57% (232/402)
回答No.2

正確には「文字を並べ替える」ではなく、「文字列を辞書順に並べる」と表現すると意味が通じると思います。 基本的には数値同士の比較であれば、単純にif文等で比較してやればいいんですが、文字列同士の比較の場合はstrcmp関数を使うのが普通です。 ただし、strcmp関数はあくまで8bitコード(半角英数字、半角カナ)の文字列で利用されることを前提としているため、漢字混じり文字列(つまりマルチバイトコード)の場合はwcscmp関数などを使う必要があります。 また漢字を扱う場合はそのコード体系(JIS、Shift-JIS、EUC)の違いにも注意する必要があり、特に比較や並べ替えを行う場合は事前に漢字コードを何らかの形で統一しておかないと、訳の分からない結果がでてくる原因につながります。 今制作中というプログラムが具体的にどこまでの処理を予定しているのかがわからないのでこれ以上の回答は難しいですが…。

kouzi
質問者

お礼

わかりやすい回答ありがとうございました。 質問が抽象的だったようですね。すみませんでした。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

ここで並べ替えとは、どういう処理をさしているのでしょうか? ソーティング(整列)ですか?そうだと仮定して… 「方法が違うとのこと」とされていますが、整列そのものの原理は、 対象が何であれ変わるわけではありません。数値と文字列(文字で はなくて文字列ですよね?)で違うのは、代入するのに = を使う か strcpy 等を使うかの違いと、比較するのに <, =, > を使うか、 strcmp 等を使うかの違いです。もっとも、文字列の比較の場合、 何を大きいとするかは目的によって違いますので、特殊な順序にし たいなら新たに関数を用意しなければいけません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 並べ替えの結果でわからないことがあります。

    下記状態の、行数約1000行の数字類の並べ替えがうまくいきません。 列内容 A列:名称 B列:フリガナ C列:ページ数(ここで並べ替えを行う) ページ数列の書式  「文字列」※フォント・サイズは統一されています  3桁表示(001、002、003・・・)  イレギュラー的に  「*001」や「001-1」などという表記分もあります。 いざ、上記状態のものをC列にて並べ替えを行うと、「231」「230」「001」「002」「003」(以下普通のソート状態)となります。 なぜか「231」「230」の行だけが一番上に来て、その後通常の並べ替えが行われています。 A列、B列には特別な仕様(ただの文字列のみ)は行っておらず、並べ替え方法も「データで並べ替え」・「C列で昇順」のみとなっています。 以上、よろしくお教えください。

  • アクセスの並べ替えについて

    現在アクセスで6万近くのデータを処理しています。 大字名と小字名及び地番(本番と枝番あり)を随時入力しています。 アクセス終了時に、並べ替えをしたいのですが、フィルタを使用して並べ替えの優先順位をつけました。コード(大字名で並べ替えるためにもともとある番号)→本番→枝番の順番で並べ替えするように設定しました。けれど、本番には500といった数字以外に500・520合併といった数字以外のものも含まれるため本番と枝番はプロパティをテキスト型にしています。そして並べ替えを実行すると、たしかにコード順にはなっているのですが、地番が100→1000→200→2000→というふうに必ずしも昇順になりません。どのように設定しなおしたらよろしいでしょうか?教えてください。

  • c言語 配列 や ソート datファイル読み込みについて

    初投稿でC言語初心者なのでよろしくお願いします。 課題でdatファイルから100万個の数字を読み込んで、ソートのタイムを競うのがでました。 ソートのアルゴリズム等は分かるのですが、100万個の数字を読み込むのがわかりません。 datファイルには、縦にずらっと数字が並べられていてどこを区切り文字としてとりだすのとか。 int配列も100万個も格納できないので3次元配列つかうのかなと思ってみたりしてます。 どうやって格納すればソートで使いやすいかご教授お願いいたします。

  • 配列を使わずに、変数名を動的にループで回したい

    配列を使わずに、変数名を動的にループで回したい 大学の課題をやっている途中に思ったことなのですが……。 プログラム中に同じ型の変数p1,p2,p3があり、それぞれの変数にループで同じ処理を施したいと思っています。 しかし、「p(i)」や「("p" + i)」などと、変数どうしを別のものとして認識させようとしても、コンパイラから警告が出て上手くいきません。 配列を使えば、このような処理が出来ることはわかるのですが、使う変数名を指定されてしまっているために、今回は配列を使えません。 出来るか出来ないか、出来る場合は方法を知りたいです。 後、今回はC言語のプログラムで利用出来るかが自分にとっての問題なのですが、C言語以外のこのプログラミング言語なら出来る、とかの情報もこの機会に知りたいです。 お答え出来る範囲でいいので、もしよければ回答お願いします。

  • 正八面体について

    正八面体のこの問題がわからなくて、悪戦苦闘しています。 (1)正八面体の各面に1~8の数字を1つずつ書き込んでできる八面体さいころは何種類できるか。ただし回転して同一になるものは同じとみなす。 (2)その中で、どの頂点についても、そこに会する4面につけられた数字の和が同一の値になるようなものがあるか。もしあれば、そのような配列の一例を示せ。 考えれば考えただけ、分からなくなりました。 どなたか教えてください。

  • エクセル複数条件の並べ替えについて

    こんばんは。 いつもお世話になり、ありがとうございます。 現在、エクセル2007を利用しております。 現在、並べ替えが上手くいかず、頭を抱えています。 -------------------------------------------------------    A    B    C    D    E 1 区名  町名  丁目  番地  枝番 2 ●区  △△町 05    200   005 3 ●区  △△町 01    300   004 4 ●区  ○○町 03    900   008 5 ●区  ○○町 00    315   200           ・           ・           ・ ------------------------------------------------------- 上記のような表を 町名ごとでまとめ、C列(丁目)・D列(番地)・E列(枝番)の番号を若い数字順に並べ替えたいと思っています。 並べ替えで、 ・町名 ・丁目 ・番地 ・枝番 の優先順位で並べ替えをしてみたのですが、枝番だけ若い数字順なりません。 4条件が揃うような並べ替えの方法というのはあるのでしょうか。 ちなみに、△△町・○○町共各数百行はあります。 ご存知の方がおられましたら、どうかご教授下さいますと助かります。 どうぞよろしくお願いします。

  • コマンドを実行してコマンドライン文字列を読み込む

    C言語(他の言語でも)で、コマンドを実行して結果の文字列を取得できるような関数はないでしょうか? コマンドを実行したプログラム内の変数に文字列として保持して、処理したいと考えています。 Windowsです。 よろしくお願い致します。

  • いろいろな言語に関する質問(スクリプト)

    ★現在、とあるソフトを開発していますが、このソフトで処理する  動作を外部の手続きファイル(スクリプト)を読み込むことで機能  拡張できるように考えています。 ・そこで、ちょっとした専用のスクリプト言語を開発しようと思って  います。質問内容はどの言語でも良いですが、それぞれの言語で  便利そうな仕組みを教えて下さい。たとえば、私は C/C++ 言語しか  使ったことがありませんが『if』、『switch』、『while』、『for』  のほかに BASIC やそれ以外の言語より、『until』、『repeat』や  C/C++の『do-while』をまねた、独自の『do-until』やバッチ処理の  『FOR』コマンドに似せた『fortable』の制御を可能にしようと思っ  ています。 ・基本的に文法構造の制御に関する仕組みを考えているので、関数の  機能ではありません。ただし、変数に関する扱い方や宣言の仕方は  いろいろとアイディアを出してくれてかまいません。何でもね。 ・今、ちょっとだけ『Perl』の文法を検索して言語使用などを見ましたが  もっと良い文字列(配列など)の操作仕組みがあれば、アイデアとして  取り入れたいと思います。整数に関する変数の扱い方も募集します。 ・以上。制御系を中心にスクリプト言語にあれば便利そうな仕組みや  サイト、または言語名を教えて下さい。お願い致します。

  • 並べ替えがうまくいかない

    数千行に及ぶデータがあります。 一定のものを抽出し、それを項目ごとに並べ替えて印刷使用しています。 たまたま、そこにあるべきはずのデータが入っていないことに気付き 調べたところ数行が並べ替えの対象となっていません。 データ入力時にミスがあったのかなと再度入力してみても変化がありません。 やむを得ず、該当行のところへ移動・挿入してから印刷をと試みましたがうまく行きません。 該当列には住所の条丁目を文字列として10-23のように入れています。 (当初、横に長いデータが想定されたため入力作業を優先し使用列をケチってしまったのが失敗でした) ここで質問ですが 1.考えられるマチガイはなんでしょうか? 2.全データの再入力以外に、抽出や並べ替えの対象外となってしまう  データが存在する行を見つけ出す方法はあるでしょうか?   ※データは2000と2007とで入力したものが混在し、互換モードで使用    していますが、調べた限りでは2007で入力した数字の取りこぼしもあるようです。

  • エクセルの文字列並べ替えについて

    エクセルの文字列並べ替えについて エクセル2000です。 半角文字列の数字とアルファベットを通常のエクセルの機能で昇順で並べ替えた場合 012 013 111 1AA 1B1 211 222 22C 23A 2AB 2BC のように並ぶと思います。(ここでの数字は数値でなく、すべて文字列です) 数字→アルファベットの順番のようです。 これを「アルファベット」→「数字」の順番で並べ替える方法はないでしょうか? 以下のような順にです。 ユーザー定義のリストに基づいた並べ替えがあることは存じていますが、3桁だけでも英数混在だと36×36×36=46,656個のリストを登録しなければならないことになり、現実的と思えません。 目的は、ホストコンピュータから出力される紙のデータがなぜかこのような順で出てきて、それにエクセルで作成したデータをあわせる必要が出てきたためです。 012 013 1AA 1B1 111 2AB 2BC 211 22C 222 23A エクセルの一般機能でもVBAでもかまいません。ご教示いただけると幸いです。

このQ&Aのポイント
  • ドライバーのインストールができずに「ドライバーは使用できません。」というエラーメッセージが表示されます。
  • さらに、インストールしようとすると「サードパーティーのINFにデジタル署名情報が含まれていません。」というエラーメッセージも表示されます。
  • どのように対処すれば良いかわからない状況です。EPSON社製品に関する問題です。
回答を見る

専門家に質問してみよう