ページ 11

整列関数で分からないところがあります

Posted: 2010年5月31日(月) 16:32
by JJ
『文字列の長さが同じとき,先頭から文字の大小を比較し,その文字が小さいほうが,
文字列として小さいとする.文字列の長さが同じで全ての文字が等しいとき,二つの文
字列は等しい.
文字の大小順序:
0 < 1 < ... < 9 < a < b < … < z < A< B < ... < Z
文字列大小例: "abc" < "abd", "ab" < "abc", "a" < "aaa"』という課題で下のような関数を作ったのですがうまくいきません。
どこがおかしいのか教えてください。


void bubble(char p[/url][NUM],int n){
int i,j,k,m;
int len[num];
char temp[NUM];
for(i=0;i<n;i++){
len=strlen(p);
}
for(i=0;i<n-1;i++){
for(j=0;j<n-i-1;j++){
if(len[j]>len[j+1]){
strcpy(temp,p[j]);
strcpy(p[j],p[j+1]);
strcpy(p[j+1],temp);
m=len[j];
len[j]=len[j+1];
len[j+1]=m;
}
}
}
for(i=0;i<n;i++){
for(j=n-1;j>i;j--){
if(len[j]==len[j-1]){
k=strcmp(p[j],p[j-1]);
if(k<0){
strcpy(temp,p[j]);
strcpy(p[j],p[j-1]);
strcpy(p[j-1],temp);
}
}
}
}
for(i=0;i<n;i++){
printf(" %s\n",p);
}
printf("\n");
}

Re:整列関数で分からないところがあります

Posted: 2010年5月31日(月) 17:20
by 先生さん
問題がよくわかんないけど。
"c" < "aaa" なのかな。 そう想定して。

少なくともstrcmpの比較は文字コードを使って行われるので 'a' > 'A' がなりたってしまうので今回の問題には合わないかと。

ちなみに僕だったら、ハッシュのように文字列を数値化する関数を先に作ってしまうと思う。

long getNum(char* str){
long retNum = 0;
while(str != '\0'){
retNum = retNum * 74 + *str-'0'; //TODO まだ'a' > 'A'は直ってないので直す必要がある。
str++;
}
return retNum;
}

まわりくどいかな。

Re:整列関数で分からないところがあります

Posted: 2010年5月31日(月) 19:29
by JJ
もっと簡単に「小文字<大文字」にすることはできませんか?

Re:整列関数で分からないところがあります

Posted: 2010年5月31日(月) 21:50
by ドラ
>もっと簡単に「小文字<大文字」にすることはできませんか?
文字がアルファベットだった場合、大文字と小文字を相互変換してから
大小比較するstrcmp相当の関数を自作したらどうでしょうか?

ASCIIコードなら大文字と小文字の相互変換はこのような感じでできます。

if (isalpha(ch)) ch ^= 0x20;