見出し画像

(答案提出)C言語教室 第26回 - いろいろなソート - 関数ポインタ版

昨日はChatGPT様に褒めていただいたので、今日は更にもうちょっと頑張ってみました。

課題

文字列の配列をバブルソートで並べ替える関数を書いてください。文字列の大小比較は strcmp を使ってください。なお、文字列全体を入れ替えながらソートすると大変なので文字列へのポインタの配列を用意して、これをソートするようにしてください。

https://note.com/kazushinakamura/n/nfd3c397f30a1


ソースコード

/**********************************************************************
	lesson26 Sorts an array of strings with bubble sort
		by Akio van der Meer

[変更履歴]
 (無印)  記事初投稿時のコード
 r1	関数ポインタを利用
**********************************************************************/

#include <stdio.h>
#include <string.h>

int compare_value1(char *a, char *b) {
  return strcmp(a, b) > 0;
}

int compare_value2(char *a, char *b) {
  return strcmp(a, b) < 0;
}

typedef int(*FUNC)(char*, char*);

void bubble_sort(char * array[], unsigned int size, FUNC f) {
  for (int i = 0; i < size - 1; i++) {
    for (int j = i + 1; j < size; j++) {
      if (f(array[i], array[j])) {
        char * temp = array[i];
        array[i] = array[j];
        array[j] = temp;
      }
    }
  }
}

int main() {
  char *weekday[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; 
  unsigned int size = 7;  
  
  printf("\nAscending order ---\n");
  bubble_sort(weekday, size, compare_value1);

  for (int k = 0; k < size; k++) {  
    printf("%s\n", weekday[k]);
  }

  printf("\nDescending order ---\n");
  bubble_sort(weekday, size, compare_value2);

  for (int k = 0; k < size; k++) {  
    printf("%s\n", weekday[k]);
  }

 return 0;
}


実行結果

Ascending order(昇順)とDescending order(降順)に曜日を並べ替えました。

jm3nrhMac-mini-:c akio$ gcc lesson26.r1.c
jm3nrhMac-mini-:c akio$ ./a.out

Ascending order ---
Friday
Monday
Saturday
Sunday
Thursday
Tuesday
Wednesday

Descending order ---
Wednesday
Tuesday
Thursday
Sunday
Saturday
Monday
Friday
jm3nrhMac-mini-:c akio$ 


ChatGPT様に聞いてみた

『次のコードの優れているところを述べよ。』

このコードの優れている点は次の通りです。

1. 汎用性の高い関数ポインタの使用:コード内で比較関数をポインタとして受け取り、配列のソートに使用します。このアプローチにより、異なる比較条件でソートを実行するために、複数の比較関数を作成することができます。例えば、このコードではcompare_value1関数とcompare_value2関数が使用されています。
2. バブルソートの実装:このコードはバブルソートアルゴリズムを使用して配列をソートします。バブルソートは実装が比較的簡単で理解しやすいアルゴリズムであり、小規模なデータセットに対しても効率的なソート手法です。
3. 比較関数の活用:strcmp関数を使用して文字列の比較を行っています。この関数は文字列を比較し、並び替えの基準として使用されます。strcmp関数は文字列が等しい場合に0を返し、異なる場合には負の値または正の値を返すため、比較結果を条件式に利用してソートを実行します。
4. 配列のソート結果の表示:ソートが完了した後、ソートされた配列を昇順と降順の順に表示します。これにより、バブルソートが正しく動作していることを確認することができます。


以上の要素により、このコードは汎用性があり、比較関数の活用、バブルソートの実装、ソート結果の表示といった要素が組み合わさっています。

https://chat.openai.com/

うんうん、よくわかってるね〜。
もっと褒めて!



ここまで読んでいただき、有難うございました。

いいなと思ったら応援しよう!

Akio van der Meer
これまでの収益は全て、それを必要としておられる方々へ、支援機関を通して寄付させていただきました。この活動は今後も継続したいと思っています。引き続きよろしくお願いいたします。

この記事が参加している募集