掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29681

文字列のソートについて
投稿者---HAL(2007/02/01 17:15:03)


OS:LINUX
コンパイラ:gcc

ソートの問題で、N個の英単語からなる配列を文字列の頭文字を読み取って辞書式に並べ替えるという問題について以下のようなソースを作りました。


#include <stdio.h>
#include <string.h>
#define WORDSIZE 3
#define swap(type, x, y) do {type t = x; x = y; y = t; } while (0)
void StrSort(char *str[ ], int n)
{
int i, j, k;
char *temp; /* 作業用ポインタ */

for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if ((strcmp(str[j], str[i])) < 0) {
temp = str[i]; /* 作業用ポインタを使い */
str[i] = str[j]; /* i + 1 番目に小さい要素と */
str[j] = temp; /* str[i] の要素と交換 */
}
}
for (k = 0; k < n; k++) /* ソートの途中経過を表示 */
printf("%s ", str[k]);
printf("\n");
}
}



int main(void)
{
int i,res;
char *word[WORDSIZE][128];
for(i=0;i<WORDSIZE;i++){
printf("英単語を入力してください:");scanf("%s",word[i]);

}
for(i=0;i<WORDSIZE;i++){
printf("%s\n",word[i]);
}
StrSort(word,WORDSIZE);

for(i=0;i<WORDSIZE;i++){
printf("%s\n",word[i]);
}
return 0;
}

バブルソートを使っているのですが、このようなエラーが出ます。

互換性のないポインタ型からの引数 1 個の `StrSort' を渡しますです。

どこが間違っているのか、どこを変更したらよいのか教えていただけないでしょうか。




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列のソートについて 29684 Hermit 2007/02/01 20:54:02
<子記事> Re:文字列のソートについて 29685 akg 2007/02/01 20:57:15
<子記事> Re:文字列のソートについて 29689 ルナレルナ 2007/02/01 22:40:30
<子記事> Re:文字列のソートについて 29691 ルナレルナ 2007/02/01 23:05:06
<子記事> Re:文字列のソートについて 29692 ルナレルナ 2007/02/01 23:47:12
<子記事> Re:文字列のソートについて 29693 ルナレルナ 2007/02/01 23:52:21


No.29684

Re:文字列のソートについて
投稿者---Hermit(2007/02/01 20:54:02)


型が違うからです(ってコンパイラが指摘してくれてるからわかってはいるだろうけど)
どう書き換えるか悩むところだけど、
こんなもんでどうでしょうか。

int
main (void)
{
  int i, res;
  char temp[WORDSIZE][128];
  char *word[WORDSIZE];
  for (i = 0; i < WORDSIZE; i++)
    {
      printf ("英単語を入力してください:");
      scanf ("%s", temp[i]);
      word[i] = temp[i];
    }
  for (i = 0; i < WORDSIZE; i++)
    {
      printf ("%s\n", word[i]);
    }
  StrSort (word, WORDSIZE);
  for (i = 0; i < WORDSIZE; i++)
    {
      printf ("%s\n", word[i]);
    }
  return 0;
}


main だけ書いてます。


この投稿にコメントする

削除パスワード

No.29687

Re:文字列のソートについて
投稿者---HAL(2007/02/01 21:56:10)


>型が違うからです(ってコンパイラが指摘してくれてるからわかってはいるだろうけど)
>どう書き換えるか悩むところだけど、
>こんなもんでどうでしょうか。
>
><pre>int
main (void)
{
int i, res;
char temp[WORDSIZE][128];
char *word[WORDSIZE];
for (i = 0; i < WORDSIZE; i++)
{
printf ("英単語を入力してください:");
scanf ("%s", temp[i]);
word[i] = temp[i];
}
for (i = 0; i < WORDSIZE; i++)
{
printf ("%s\n", word[i]);
}
StrSort (word, WORDSIZE);
for (i = 0; i < WORDSIZE; i++)
{
printf ("%s\n", word[i]);
}
return 0;
}
</pre>
>
>main だけ書いてます。


なるほど!一時ファイルに格納するんですね。ちゃんと起動できたんでありがとうございました!


この投稿にコメントする

削除パスワード

No.29695

Re:文字列のソートについて
投稿者---ルナレルナ(2007/02/02 00:00:45)
http://park6.wakwak.com/~nougaki/mini_program/


>なるほど!一時ファイルに格納するんですね。ちゃんと起動できたんでありがとうございました!

一時ファイルに格納なんてしていません。



この投稿にコメントする

削除パスワード

No.29685

Re:文字列のソートについて
投稿者---akg(2007/02/01 20:57:15)


例です。

#include <stdio.h>
#include <string.h>

#define WORDSIZE (3)
#define WORDLEN  (128)

void StrSort(char (*str)[WORDLEN], int n)
{
    int i, j, k;
    char temp[WORDLEN];      /* 作業用エリア */
    
    for (i = 0; i < n - 1; i++) {
        for (j = i + 1; j < n; j++) {
            if ((strcmp(str[j], str[i])) < 0) {
                strcpy(temp, str[i]);      /* 作業用エリアを使い */
                strcpy(str[i], str[j]);  /* i + 1 番目に小さい要素と */
                strcpy(str[j], temp);      /* str[i] の要素と交換 */
            }
        }
        for (k = 0; k < n; k++)    /* ソートの途中経過を表示 */
            printf("%s ", str[k]);
        printf("\n");
    }
}

int main(void)
{
    int i;
    char word[WORDSIZE][WORDLEN];
    
    for (i = 0; i < WORDSIZE; i++) {
        printf("英単語を入力してください:");
        scanf("%s", word[i]);
    }
    for (i = 0; i < WORDSIZE; i++)
        printf("%s\n", word[i]);
    StrSort(word, WORDSIZE);
    for (i = 0; i < WORDSIZE; i++)
        printf("%s\n", word[i]);
    return 0;
}




この投稿にコメントする

削除パスワード

No.29688

Re:文字列のソートについて
投稿者---HAL(2007/02/01 21:58:50)


ありがとうございました!教えてくれたプログラムを自分で読み返して理解できました。なるほど、少し勘違いしていたみたいです。


この投稿にコメントする

削除パスワード

No.29694

Re:文字列のソートについて
投稿者---ルナレルナ(2007/02/01 23:59:50)
http://park6.wakwak.com/~nougaki/mini_program/


>ありがとうございました!教えてくれたプログラムを自分で読み返して理解できました。なるほど、少し勘違いしていたみたいです。

型が違うというのは、致命的な問題です。
少し勘違いしてたみたいで終わるような問題ではありません。

HALさんは恐らく理解できていません。
もしもコピーペーストで済ませているのなら、
読むだけでなく、いちいち、わざわざ、面倒くさく、打ち込んでみてください。


この投稿にコメントする

削除パスワード

No.29689

Re:文字列のソートについて
投稿者---ルナレルナ(2007/02/01 22:40:30)
http://park6.wakwak.com/~nougaki/mini_program/


>ソートの問題で、N個の英単語からなる配列を文字列の頭文字を読み取って辞書式に並べ替えるという問題について以下のようなソースを作りました。

文字列の頭文字を読みとって、
辞書式に並べかえるのなら、
strcmp()を使うのは違う気がする。


この投稿にコメントする

削除パスワード

No.29691

Re:文字列のソートについて
投稿者---ルナレルナ(2007/02/01 23:05:06)
http://park6.wakwak.com/~nougaki/mini_program/


>バブルソートを使っているのですが、このようなエラーが出ます。

バブルソートになってない。


この投稿にコメントする

削除パスワード

No.29692

Re:文字列のソートについて
投稿者---ルナレルナ(2007/02/01 23:47:12)
http://park6.wakwak.com/~nougaki/mini_program/


//
//	ソート以外も関数化
//

#include <stdio.h>

#define N	5

int main(void)
{
    char w_array[N][128];	//	二次元配列
    char *p_array[N];	//	ポインタの配列
    int i, j;
    char *tmp;
    
    for (i = 0; i < N; i++)
        scanf("%127s", w_array[i]);
        
    for (i = 0; i < N; i++)
        p_array[i] = w_array[i];
        
    for (i = 0; i < N - 1; i++)
        for (j = N - 1; j > i; j--)
            if (*p_array[j] < *p_array[j - 1]) {
                tmp = p_array[j];
                p_array[j] = p_array[j - 1];
                p_array[j - 1] = tmp;
            }
    
    //	ソート後でも、二次元配列で元の状態のまま出力
    for (i = 0; i < N; i++)
        printf("%s\n", w_array[i]);
        
    putchar('\n');
    
    //	ポインタの配列で、ソート後出力
    for (i = 0; i < N; i++)
        printf("%s\n", p_array[i]);
        
    return 0;
}



この投稿にコメントする

削除パスワード

No.29693

Re:文字列のソートについて
投稿者---ルナレルナ(2007/02/01 23:52:21)
http://park6.wakwak.com/~nougaki/mini_program/


resという変数は、何処で使うのか?



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧