C言語で名前をアルファベット順にソートするプログラムの書き方
この記事では、ユーザーが入力した名前の個数と名前を受け取り、strcpy()関数を活用してそれらの名前をアルファベット順に並べ替えるC言語のプログラムを紹介します。
まず基本として、文字の配列(文字の集合)のことを「文字列」と呼びます。
文字列の宣言
文字列(文字配列)の宣言は以下のように行います。
char stringname [size];
例えば、char string[50]; と宣言すると、50文字分の長さを持つ文字列が定義されます。
文字列の初期化
文字列の初期化には、主に2つの方法があります。
- 1文字ずつの文字定数を使う方法
char string[10] = { 'H', 'e', 'l', 'l', 'o', '\0' };- 文字列リテラル(文字列定数)を使う方法
char string[10] = "Hello";
文字列へのアクセス
文字列の入出力には制御文字列 "%s" を使用します。%s は、終端文字 '\0' に到達するまでの文字列を読み書きします。
strcpy()関数とは
strcpy()関数は、コピー元(ソース)の文字列をコピー先(デスティネーション)の文字列へ複製するために使用されます。
このとき、コピー先の文字列の長さは、コピー元の文字列の長さ以上である必要があります。
strcpy()関数の構文は以下のとおりです。
strcpy(コピー先の文字列, コピー元の文字列);
使用例を見てみましょう。
char a[50];
strcpy("Hello", a); /* コピー先とコピー元が逆 → エラー */
char a[50];
strcpy(a, "Hello"); /* 正しい → a = "Hello" */第1引数にコピー先、第2引数にコピー元を指定する点に注意してください。順序を間違えるとコンパイルエラーや予期しない動作の原因になります。
アルファベット順ソートのロジック
名前をアルファベット順に並べ替えるには、strcmp()関数で文字列同士を比較し、順序が逆であればstrcpy()関数で入れ替えます。具体的なロジックは以下のとおりです。
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(strcmp(str[i],str[j])>0){
strcpy(s,str[i]);
strcpy(str[i],str[j]);
strcpy(str[j],s);
}
}
}このコードでは選択ソートに似た手法を使っています。strcmp()の戻り値が0より大きい場合、str[i]がstr[j]より辞書順で後ろにあることを意味するため、2つの文字列を一時変数 s を介して交換します。
完全なプログラム
以下は、入力された名前をアルファベット順にソートして表示するCプログラムの完全なコードです。
#include<stdio.h>
#include<string.h>
main(){
int i,j,n;
char str[100][100],s[100];
printf("Enter number of names :\n");
scanf("%d",&n);
printf("Enter names in any order:\n");
for(i=0;i<n;i++){
scanf("%s",str[i]);
}
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(strcmp(str[i],str[j])>0){
strcpy(s,str[i]);
strcpy(str[i],str[j]);
strcpy(str[j],s);
}
}
}
printf("\nThe sorted order of names are:\n");
for(i=0;i<n;i++){
printf("%s\n",str[i]);
}
}なお、現行のC標準では main() は int main(void) と宣言し、最後に return 0; を返すことが推奨されています。
実行結果
上記のプログラムを実行すると、以下のような結果が出力されます。
Enter number of names: 5 Enter names in any order: Pinky Lucky Ram Appu Bob The sorted order of names is: Appu Bob Lucky Pinky Ram
このように、strcmp()とstrcpy()を組み合わせることで、文字列配列に格納された名前を簡単にアルファベット順に並べ替えることができます。
-
C言語で学ぶ基数ソート(Radix Sort)の仕組みと実装方法
ソート(整列)アルゴリズムとは、リスト内の要素を特定の順序に並べ替えるためのアルゴリズムのことです。最もよく使われる順序としては、数値の昇順・降順や、辞書式(五十音・アルファベット)順などが挙げられます。 基数ソート(Radix Sort)は、要素同士を比較しない「非比較型」のソートアルゴリズムの一つで、ソートされていないリストに対して特に高い効果を発揮する手法として知られています。 基数ソートでは、同じ位の数字ごとに要素をグループ化することで並べ替えを行います。その基本的な考え方は、最下位桁(LSD:Least Significant Digit)から最上位桁(MSD:Most Signif
-
【Python】英数字混在の文字列を「小文字→大文字→奇数→偶数」の順に並べ替える方法
英字と数字が混在した文字列 s が与えられたとき、次の条件に従って並べ替えることを考えます。 すべての小文字は、大文字よりも前に配置する。 すべての大文字は、数字よりも前に配置する。 数字同士については、奇数を偶数よりも前に配置する。 たとえば、入力が s = HeLlo1234 の場合、出力は eloHL1324 となります。 解き方のアプローチ この問題は、各文字に対して「並び順を決めるための優先度コード」を計算し、その値をソートのキーとして使うことで解けます。具体的な手順は以下のとおりです。 関数 f() を定義します。引数として1文字 c を受け取ります。 code を 0 で初