ページ 1 / 1
複数の文字列を含む文字列におけるソート
Posted: 2012年10月09日(火) 22:26
by Temp
char szNames[] = "Hokkaido\0Saga\0Aichi\0Wakayama\0Shizuoka\0\0";
を
"Aichi\0Hokkaido\0Saga\0Shizuoka\0Wakayama\0\0"
というようにアルファベット順に並び替える C 関数を書くにはどうすればよいでしょうか?
Re: 複数の文字列を含む文字列におけるソート
Posted: 2012年10月09日(火) 22:58
by softya(ソフト屋)
フォーラムルールをご覧頂きたいのですが、質問の書き方が良くわからない場合はテンプレートをお使いください。
http://dixq.net/board/board.html
Re: 複数の文字列を含む文字列におけるソート
Posted: 2012年10月10日(水) 08:51
by non
int ten[]={6,3,5,4,2,0};
のような数字のソートは作れますか?
Re: 複数の文字列を含む文字列におけるソート
Posted: 2012年10月10日(水) 17:47
by Temp
non さんが書きました:int ten[]={6,3,5,4,2,0};
のような数字のソートは作れますか?
int のソートは以下のコードでできました。
void sort(int numbers[], int count)
{
int i, j, temp;
for(i = 1; i < count; ++i)
{
for (j = count - 1; j >= i; --j)
{
if(numbers[j - 1] > numbers[j])
{
temp = numbers[j - 1];
numbers[j - 1] = numbers[j];
numbers[j] = temp;
}
}
}
}
Re: 複数の文字列を含む文字列におけるソート
Posted: 2012年10月10日(水) 20:06
by non
では次に、
char *str[] = {"Hokkaido","Saga","Aichi","Wakayama","Shizuoka",""};
だとしたら、ソートできますか?
プログラムを載せるときはコードタグで囲ってね。
Re: 複数の文字列を含む文字列におけるソート
Posted: 2012年10月10日(水) 20:42
by Temp
non さんが書きました:では次に、
char *str[] = {"Hokkaido","Saga","Aichi","Wakayama","Shizuoka",""};
だとしたら、ソートできますか?
プログラムを載せるときはコードタグで囲ってね。
コード:
void sortNames(char *names[], int count)
{
int i, j;
char *pTemp;
for(i = 0; i < count; i++)
{
for (j = i + 1; j < count; j++)
{
if (stricmp(names[i], names[j]) > 0)
{
pTemp = names[i];
names[i] = names[j];
names[j] = pTemp;
}
}
}
}
でできました。
Re: 複数の文字列を含む文字列におけるソート
Posted: 2012年10月11日(木) 11:39
by non
それでは、次に
char szNames[] = "Hokkaido\0Saga\0Aichi\0Wakayama\0Shizuoka\0\0";
から、おのおのの文字列の先頭アドレスをみつけ、char *str[6] に格納する
プログラムを作りましょう。
なお、ここでは文字列の個数が5個までとしています。str[6]にしているのは
終わりの合図用です。
Re: 複数の文字列を含む文字列におけるソート
Posted: 2012年10月18日(木) 23:57
by かずま
一週間以上経ちましたが、進展がないようですね。
さて、入力のサイズに応じて、必要なメモリーが増えるのが普通のアルゴリズム
ですが、どんなに時間がかかってもよいから、ごく少量のメモリだけで、目的を
達成するそんなプログラムを考えてみました。
コード:
#include <string.h> // strlen, strcmp
void rev(char *s, int n)
{
int c, i;
for (i = 0; i < --n; i++) c = s[i], s[i] = s[n], s[n] = c;
}
void sort(char *s)
{
int m, n;
for (; *s; s += strlen(s) + 1)
for (m = strlen(s) + 1; (n = strlen(s + m) + 1) > 1; m += n)
if (strcmp(s, s + m) > 0)
rev(s, m), rev(s + m, n), rev(s, m + n);
}
テストプログラムは、次の通りです。
コード:
#include <stdio.h>
void print(const char *s)
{
for (; *s; s++) {
for (; *s; s++) putchar(*s);
putchar(' ');
}
putchar('\n');
}
int main(void)
{
char szNames[] ="Hokkaido\0Saga\0Aichi\0Wakayama\0Shizuoka\0\0";
print(szNames);
sort(szNames);
print(szNames);
return 0;
}