アフィリエイト広告を利用しています

広告

posted by fanblog

2017年11月24日

《その149》 汎用ユーティリティ関数 qsort & p.117演習3-7


 qsort関数

// qsort関数(あらゆる型の配列をソートすることができる。)
// #include <cstdlib>
// @ A B
// ↓ ↓ ↓
// void* qsort(void* base, size_t nmemb, sizt_t size,
// int (*compar)(const void*, const void*));
// ↑
// C 比較関数


@は配列の先頭要素へのポインタです。void型として受け取ります。
  (void型ポインタは、どのようなポインタ型でも受け取る汎用ポインタ)
Aは配列要素の個数です。
Bは配列要素の大きさです。
・ 比較関数C 例えば int_cmp を qsort関数に渡す際には、キャストが必要です。
    reinterpret_cast<int(*)(const void*, const void*)>(int_cmp);
   比較関数は、配列要素の大小の判定方法を qsort関数 に教えます。
   比較関数は二つの引数を比較して、第1引数の値が小さければ負の値
   を、大きければ正の値を、二つが等しければ 0 を返す仕様にします。


新版明解C++中級編 p.117 演習3-7
 qsort関数を用いて、以下の二つの配列を昇順にソートするプログラムを作成せよ。
    char a[][7] = {"LISP", "C", "Ada", "Pascal"};
    char* p  = {"LISP", "C", "Ada", "Pascal"};
 ソートを行う部分は、それぞれ独立した関数として実現すること。

// p117_演習3-7
#include <cstdlib>
#include <cstring>
#include <iostream>

using namespace std;

int acmp(char* x, char* y) { // 比較関数
return strcmp(x, y);
}

int pcmp(char** x, char** y) { // 比較関数
return strcmp(*x, *y);
}

void print_a(char a[][7], int na) {
for (int i = 0; i < na; i++)
cout << a[i] << " ";
cout << '\n';
}

void print_p(const char** p, int np) {
for (int i = 0; i < np; i++)
cout << p[i] << " ";
cout << '\n';
}

int main() {
char a[][7] = { "LISP", "C", "Ada", "Pascal" };
const char* p[] = { "LISP", "C", "Ada", "Pascal" };

int na = sizeof(a) / sizeof(a[0]);
int np = sizeof(p) / sizeof(p[0]);

qsort(a, na, sizeof(a[0]),
reinterpret_cast<int(*)(const void*, const void*)>(acmp));
print_a(a, na);

qsort(p, np, sizeof(p[0]),
reinterpret_cast<int(*)(const void*, const void*)>(pcmp));
print_p(p, np);
}

e03_07.png


新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:13時点)

新版 明解C 中級編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:14時点)





この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7002620
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。