文字列関数を使って名前をアルファベット順にソートするCプログラムの書き方
はじめに
C言語では、strcmpやstrcpyなどの標準文字列関数を組み合わせることで、実行時に入力された複数の名前(文字列)を簡単にアルファベット順に並べ替えることができます。本記事では、古典的なソートアルゴリズムである「バブルソート」の手法を使い、ユーザーが入力した名前を五十音ではなくアルファベット順(辞書順)に整列するプログラムを紹介します。
問題
実行時にユーザーから入力された複数の名前を受け取り、バブルソートの手法を用いてアルファベット順に並べ替えて表示すること。
解決方法
名前をアルファベット順に出力するためのロジックは以下の通りです。
- 隣り合う2つの文字列をstrcmp関数で比較します。戻り値が0より大きい場合、前の文字列が後の文字列よりも辞書順で後に来ていることを意味します。
- 順序が逆になっている場合は、strcpy関数を使って一時的な配列(dummy)を介して2つの文字列の内容を入れ替えます。
- この操作を配列全体に対して繰り返すことで、全体が昇順に整列されます。
for (i=1; i < ITEMS; i++){
for (j=1; j <= ITEMS-i ; j++){
if (strcmp (string[j-1], string[j]) > 0){ /* 内容の交換 */
strcpy (dummy, string[j-1]);
strcpy (string[j-1], string[j]);
strcpy (string[j], dummy );
}
}
}サンプルプログラム
以下は、文字列関数を使用して名前をアルファベット順にソートするCプログラムの完全なコードです。
#define ITEMS 5
#define MAXCHAR 20
main( ){
char string[ITEMS][MAXCHAR], dummy[MAXCHAR];
int i = 0, j = 0;
/* 名前リストの読み込み */
printf ("Enter names of %d items \n ",ITEMS);
while (i < ITEMS)
scanf ("%s", string[i++]);
/* ソート開始 */
for (i=1; i < ITEMS; i++){
for (j=1; j <= ITEMS-i ; j++){
if (strcmp (string[j-1], string[j]) > 0){ /* 内容の交換 */
strcpy (dummy, string[j-1]);
strcpy (string[j-1], string[j]);
strcpy (string[j], dummy );
}
}
}
printf ("\nAlphabetical list \n\n");
for (i=0; i < ITEMS ; i++)
printf ("%s\n", string[i]);
}プログラムのポイント
- #define ITEMS 5:扱う名前の個数を定義しています。この値を変更すれば、任意の個数の名前に対応できます。
- #define MAXCHAR 20:1つの名前に格納できる最大文字数を定義しています。
- strcmp:2つの文字列を辞書順に比較し、大小関係を判定します。
- strcpy:文字列を別の配列にコピーします。ここでは入れ替え用の一時領域として利用しています。
実行結果
上記のプログラムを実行すると、次のような出力が得られます。
Enter names of 5 items computers architecture organization microprocessor networking Alphabetical list architecture computers microprocessor networking organization
まとめ
このように、strcmpとstrcpyという基本的な文字列関数をバブルソートと組み合わせるだけで、文字列の配列を簡単にアルファベット順に整列できます。なお、より大規模なデータを扱う場合は、qsort関数やより効率的なソートアルゴリズム(クイックソートなど)の活用も検討するとよいでしょう。
-
C言語の文字列ライブラリ関数を具体例つきでわかりやすく解説
C言語の文字列ライブラリ関数とは C言語には、文字列を扱うための定義済み関数が標準ライブラリ「string.h」に多数用意されています。これらの関数を活用することで、文字列の長さ取得・コピー・連結・比較・検索といった処理を簡単かつ効率的に実装できます。 本記事で紹介する主な文字列関数は以下の通りです。 strlen() strcmp() strcpy() strncmp() strncpy() strrev() strcat() strstr() strncat() strlen()関数 ― 文字列の長さを取得する strlen() は、文字列に含まれる文字数(長さ)を返す関数です。
-
【Python】部分文字列のソート操作で文字列sをtに変換できるか判定する方法
問題の概要2つの数字のみで構成された文字列 s と t が与えられます。次の操作を何度でも繰り返し適用して、文字列 s を文字列 t に変換できるかどうかを判定するプログラムを作成します。操作の定義: s の中から空でない部分文字列を1つ選び、その範囲内の文字を昇順(小さい順)に並べ替えます。例として、s = 95643、t = 45963 の場合、出力は True になります。実際に次のような手順で変換できるためです。95643 → 95463 → 45963解法のアプローチこの問題は、以下の手順で解くことができます。各数字(0〜9)ごとに、その数字が s 内に出現する位置インデックスを記録