文字列のアルファベット順並び替え

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
TKD

文字列のアルファベット順並び替え

#1

投稿記事 by TKD » 6年前

"asrutocdgeqkfg"という文字列をアルファベット順に並び替えたいのですが下記のプログラムだとうまくいきません。よろしければアドバイスをよろしくお願いします。

#include<stdio.h>
#define N 15

int main()
{
int i,j,k;
char ch[N] = "asrutocdgeqkfg";
char ex;

for (i = 0; i < N - 1; i++)
for (j = 0; j < N - 1; j++)
if (ch[j] > ch[j + 1])
{
ex = ch[j];
ch[j] = ch[j + 1];
ch[j + 1] = ex;
}


for (k = 0; k < N; k++)
{
printf("%s", ch[k]);
}

return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 文字列のアルファベット順並び替え

#2

投稿記事 by みけCAT » 6年前

まず、ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。

次に、「うまくいきません」だとわかりにくいです。
具体的に「どうなってほしいのに」「現状どうなってしまう」のかが書かれているとわかりやすそうです。

そして、printfでchar*型のデータを要求する書式%sにchar型のデータを渡しているので、未定義動作になります。
1文字出力するには書式%cを用いるといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 13年前

Re: 文字列のアルファベット順並び替え

#3

投稿記事 by box » 6年前

TKD さんが書きました:"asrutocdgeqkfg"という文字列をアルファベット順に並び替えたいのですが下記のプログラムだとうまくいきません。よろしければアドバイスをよろしくお願いします。

コード:

	for (i = 0; i < N - 1; i++)
		for (j = 0; j < N - 1; j++)
			if (ch[j] > ch[j + 1])
			{
				ex = ch[j];
				ch[j] = ch[j + 1];
				ch[j + 1] = ex;
			}
ループの中で、i がからむ処理がないのが気になります。
・i がからむ処理をしたければ、そういうコードを書く
・処理がなくていいのなら、i のループをやめる
どっちかにしましょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 文字列のアルファベット順並び替え

#4

投稿記事 by みけCAT » 6年前

box さんが書きました:ループの中で、i がからむ処理がないのが気になります。
・i がからむ処理をしたければ、そういうコードを書く
・処理がなくていいのなら、i のループをやめる
どっちかにしましょう。
iに依存して処理内容を変えることなく、単にN - 1回ループ処理を実行しているのですね。
あえて「i のループをやめる」なら、変数名をcountなどにするといいかもしれませんね。
もちろん、この程度の入力では考えることが増える割にあまり性能向上の意味は無いでしょうが、よくあるようにiに依存してどこまで見るかを決めてもいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 文字列のアルファベット順並び替え

#5

投稿記事 by かずま » 6年前

TKD さんが書きました:"asrutocdgeqkfg"という文字列をアルファベット順に並び替えたいのですが下記のプログラムだとうまくいきません
"asrutocdgeqkfg" という文字列は、最後に終端文字 '\0' が
あるので、ch のサイズは 15バイトですが、並び替えるのは
'a' から 'g' までの 14文字であることに注意してください。

shika

Re: 文字列のアルファベット順並び替え

#6

投稿記事 by shika » 6年前

コード:

for (i = N - 1; 0 < i; i--)
        for (j = 0; j < i; j++)
            if (ch[j] > ch[j + 1])
            {
                ex = ch[j];
                ch[j] = ch[j + 1];
                ch[j + 1] = ex;
            }
では、どうでしょう。
i の設定がおかしかったのではないでしょうか?

返信

“C言語何でも質問掲示板” へ戻る