1時間ごとに更新!Amazon.co.jpで今売れている本トップ100   掲示板ランキング



掲示板利用宣言

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

 私は

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

掲示板1

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

No.6138

英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---クロ(2006/07/13 16:38:53)


下記の問題を私なりに解いてみたのですが、もっと効率よく、簡潔に出来そうな感じがしました。
ソースコードの見易さ、修正箇所など、気づいた点なんでもいいのでご指摘お願い致します。

環境:WindowsXP Borland C++Builder 5.5

問題内容:英数字を読み込んで、モールス符号に変換するプログラム。また、モールス符号のフレーズを読み込んで、それを英数字に変換するプログラムを書け。ただし、モールス符号の各文字は1個の空白で区切り、各単語は3個の空白で区切ること。

モールス信号の詳細は以下のサイトで確認できます。
http://encyclopaedicnet.com/japan/a_/a_a_a_a_ae_a__40.html
欧文モールスコードのアルファベットと数字のみを使用します。


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

#define MAX 999

void morse_conversion(const char *[], char [], char [], const char []);
void abc_conversion(const char *[], char [], char [], const char []);


/*************************************************/
main()
{
        //morse_code[0]〜[25]がA〜Z、morese_code[26]〜[35]が1〜0
    char *morse_code[] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--",
                  "-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",
                  ".----","..---","...--","....-",".....","-....","--...","---..","----.","-----"};

    char abc_code[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M',
                  'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
                  '1','2','3','4','5','6','7','8','9','0'};


    char str[MAX];
    char morse[MAX];
    char abc[MAX];
    int i;


    morse[0] = NULL;
    abc[0] = NULL;

    printf("大文字で英文を入力して下さい。英数字(スペース)可能\n");

    gets(str);

    //printf("%s\n", str);


    //文字列からモールス符号に変換
    morse_conversion(morse_code, str, morse, abc_code);


    printf("\nモールス符号へ変換終了\n");

    for (i = 0; morse[i] != NULL; i++)
        printf("%c", morse[i]);


    //モールス符号からスペルに変換
    abc_conversion(morse_code, morse, abc, abc_code);


    printf("\nモールス符号から文字に変換終了\n");

    for (i = 0; abc[i] != NULL; i++)
        printf("%c", abc[i]);



    return 0;
}
/*************************************************/


/**************************文字列からモールス符号に変換********************/
void morse_conversion(const char *morse_code[], char str[], char morse[], const char abc_code[])
{
    int i, m;
    char *sp1 = " ", *sp2 = "  ";

    for (i = 0; str[i] != NULL; i++){

        for (m = 0; abc_code[m] != NULL; m++){


            //str[i]とabc_code[m]が同じ文字列なら
            if (str[i] == abc_code[m]){

                //morseにモールス符号を移動。
                strcat(morse, morse_code[m]);

                //スペルの区切りとしてスペースを挿入
                strcat(morse, sp1);

                break;

            }

        }

        //各単語の区切りなら
        if (str[i] == ' '){
            //各単語の区切りを挿入。スペルの区切りでスペースを1個分入れてるので、
            //ここではスペース2個分入れる
            strcat(morse, sp2);
        }

    }

}
/********************************************************************/

/**********************モールス符号からスペルに変換****************************/
void abc_conversion(const char *morse_code[], char morse[], char abc[], const char abc_code[])
{
    int i = 0, x, y;
    char *ptr;
    char hold[99];
    char *sp1 = " ";
    char s[2];

    ptr = hold;


    if(morse[0] == NULL)
        return;

    for(;;){

        //moreseが最後の文字ならfor文終了
        if (morse[i] == NULL)
            break;

        //モールス符号で、スペースがくるまでmorseの文字をhodにコピー
        for (x = 0; morse[i] != ' '; i++, x++){

            if (morse[i] == NULL)            
                break;

            hold[x] = morse[i];

        }

        hold[x] = NULL;


        for(y = 0; morse_code[y] != NULL; y++){

            //printf("%s = %s\n", ptr, morse_code[y]);

            //モールス符号が同じなら
            if (0 == strcmp(ptr, morse_code[y])){

                //y番目の文字をsに代入
                s[0] = abc_code[y];

                strcat(abc, s);
                break;
            }
        }


        if ( (morse[i] == ' ') && (morse[i + 1] == ' ') && (morse[i + 2] == ' ') ){
            //モールス符号の間にスペースが三個あるときは、スペース一個を代入
            strcat(abc, sp1);
            //スペースの次のモールス符号を読み込むため。
            i += 3;
        }
        else{
            //スペースの次のモールス符号を読み込むため
            i++;
        }
    

    }


}
/********************************************************************/




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:英数字を読み込んで、モーレス符号に変換するプログラム。 6139 asd 2006/07/13 16:50:17
<子記事> Re:英数字を読み込んで、モーレス符号に変換するプログラム。 6140 ruby 2006/07/13 17:15:15
<子記事> Re:英数字を読み込んで、モーレス符号に変換するプログラム。 6141 kafuka 2006/07/13 18:08:30
<子記事> Re:英数字を読み込んで、モーレス符号に変換するプログラム。 6145 かずま 2006/07/13 19:08:19
<子記事> Re:英数字を読み込んで、モーレス符号に変換するプログラム。 6147 ruby 2006/07/14 00:48:12
<子記事> Re:英数字を読み込んで、モーレス符号に変換するプログラム。 6155 shu 2006/07/14 15:13:40
<子記事> Re:英数字を読み込んで、モーレス符号に変換するプログラム。 6164 shu 2006/07/16 00:47:11


No.6139

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---asd(2006/07/13 16:50:17)


>もっと効率よく、簡潔に出来そうな感じがしました。

では逆にどこが非効率で煩雑に感じますか?
どんな風に簡潔にできそうだと思いましたか?
クロさんの考えをお聞かせください。

>ソースコードの見易さ、修正箇所など、気づいた点なんでもいいのでご指摘お願い致します。

問題なく動作しているのなら特に修正することもないと思いますが。
あなたの考えを述べてくれないと抽象的すぎて助言できそうにないです。

#何を以ってして簡潔なのか。効率的なのか。


この投稿にコメントする

削除パスワード

No.6140

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---ruby(2006/07/13 17:15:15)


>ソースコードの見易さ、修正箇所など、気づいた点なんでもいいのでご指摘お願い致します。

さしあたり、気づいた点を挙げてみます。
1)gets関数は使ってはいけない。
この関数は入力した文字列の長さをチェックしないため、
今回の例では999文字を超えた入力を行なうと別の領域を破壊する。
2)文字列の終端はNULLではない。'\0'を使う。



この投稿にコメントする

削除パスワード

No.6141

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---kafuka(2006/07/13 18:08:30)


>ソースコードの見易さ、修正箇所など、気づいた点なんでもいいのでご指摘お願い致します。

何でも良いというのなら。。。完全に個人的な考えですが、

if (str[i] == abc_code[m]){
 ↑ここに空白があって。↑ここにない。

私はこれを美しくないと思っています。


あと、
> main()
 ↓
int main(void)

かな。


この投稿にコメントする

削除パスワード

No.6145

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---かずま(2006/07/13 19:08:19)


> もっと効率よく、簡潔に出来そうな感じがしました。

strcat の多用は効率が悪そうです。
#include <stdio.h>
#include <string.h>

#define MAX 999

void morse_conversion(const char [], char []);
void abc_conversion(const char [], char []);

int main(void)
{
    char str[MAX], morse[MAX], abc[MAX];  int i;

    printf("大文字で英文を入力して下さい。英数字(スペース)可能\n");
    gets(str);
    morse_conversion(str, morse);
    printf("モールス符号へ変換終了\n");
    puts(morse);
    abc_conversion(morse, abc);
    printf("モールス符号から文字に変換終了\n");
    puts(abc);
    return 0;
}

static char *morse_code[] = {
    ".-","-...","-.-.","-..",".","..-.","--.","....","..",".---",
    "-.-",".-..","--", "-.","---",".--.","--.-",".-.","...","-",
    "..-","...-",".--","-..-","-.--","--..", ".----","..---",
    "...--","....-",".....","-....","--...","---..","----.","-----"
};

static char abc_code[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";

void morse_conversion(const char *str, char *morse)
{
    const char *p;

    for (; *str; str++)
        if (*str == ' ') *morse++ = ' ', *morse++ = ' ';
        else if (p = strchr(abc_code, *str)) {
            for (p = morse_code[p - abc_code]; *p; p++) *morse++ = *p;
            *morse++ = ' ';
        }
    *morse = '\0';
}

#define N_MORSE  (sizeof(morse_code) / sizeof(*morse_code))

void abc_conversion(const char *morse, char *abc)
{
    int i;  char word[10];

    while (*morse) {
        for (i = 0; *morse == ' '; i++) morse++;
        if (i >= 3) *abc++ = ' ';
        for (i = 0; *morse == '.' || *morse == '-'; i++) word[i] = *morse++;
        if (i == 0) break;
        word[i] = '\0';
        for (i = 0; i < N_MORSE && strcmp(morse_code[i], word); i++) ;
        if (i < N_MORSE) *abc++ = abc_code[i];
    }
    *abc = '\0';
}



この投稿にコメントする

削除パスワード

No.6146

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---かずま(2006/07/13 20:49:42)


main の int i; は不要でした。

では、もっと効率の良いプログラムを示します。
void abc_conversion(const char *morse, char *abc)
{
    static char t[] =
        "-ETIANMSURWDKGOHVF-L-PJBXCYZQ--54-3---2-------16-------7---8-90";
    int i;

    for (; *morse; morse++) {
        for (i = 0; *morse == ' '; i++) morse++;
        if (i >= 2) *abc++ = ' ';
        for (i = 0; ; morse++)
            if (*morse == '.') i = i * 2 + 1;
            else if (*morse == '-') i = i * 2 + 2;
            else break;
        if (i < 64) *abc++ = t[i];
    }
    *abc = '\0';
}



この投稿にコメントする

削除パスワード

No.6148

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---クロ(2006/07/14 01:19:48)


>>もっと効率よく、簡潔に出来そうな感じがしました。
>では逆にどこが非効率で煩雑に感じますか?
>どんな風に簡潔にできそうだと思いましたか?
>クロさんの考えをお聞かせください。
↑私では、気づかないですが、皆さんなら気づく点があると思ったので。。。
私が気づいているなら、修正して上げます。
他人に見せれるソースコードを書きたいので、気づいた点でいいですので、意見お願いします。

>#define N_MORSE (sizeof(morse_code) / sizeof(*morse_code))
↑このように使用した事ないので、考えてみます。

>static char t[] =
> "-ETIANMSURWDKGOHVF-L-PJBXCYZQ--54-3---2-------16-------7---8-90";
↑みた感じどうしてそうなっているのか、わかりませんので、しばらく考えて、分からなかったときは教えて下さい。

>static char abc_code[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
abc_code[] = {'A','B','C'・・・・・・省略};は''←じゃなくて""でよかったですね。


>if (str[i] == abc_code[m]){
> ↑ここに空白があって。↑ここにない。
↑修正します。


>> main()
> ↓
>int main(void)
↑修正します。省略しない方がいいですよね?

>1)gets関数は使ってはいけない。
>この関数は入力した文字列の長さをチェックしないため、
>今回の例では999文字を超えた入力を行なうと別の領域を破壊する。
↑は完璧に直した方がいいですね。ありがとうございます。
>2)文字列の終端はNULLではない。'\0'を使う。
↑NULLと'\0'って同様ではないんですか?



↑の事項を修正しようと思っておりますが、私なりに理解してソースコードを書き直す為、2〜3日かかるかもしれません。
その間は、この掲示板もみるので、他に指摘事項がある場合はよろしくお願いいたします。



この投稿にコメントする

削除パスワード

No.6150

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---ruby(2006/07/14 07:15:19)


>>2)文字列の終端はNULLではない。'\0'を使う。
>↑NULLと'\0'って同様ではないんですか?

書籍などで'\0'のことを「ヌル文字」や「ナル文字」と
表現している場合があります。
そういったことからNULL(ヌル、ナル)と同じではないかと
思うのかもしれません。
しかし、両者は別物です。'\0'は文字、NULLはポインターです。


この投稿にコメントする

削除パスワード

No.6163

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---かずま(2006/07/15 23:17:17)


strchr も効率が悪いので、英数字が ASCII であると仮定して次のような
プログラムにしてみました。
#include <stdio.h>

void morse_conversion(const char *, char *);
void abc_conversion(const char *, char *);

int main(void)
{
    char str[999], morse[999], abc[999];

    printf("大文字で英文を入力して下さい。英数字(スペース)可能\n");
    gets(str);
    morse_conversion(str, morse);
    printf("モールス符号へ変換終了\n");
    puts(morse);
    abc_conversion(morse, abc);
    printf("モールス符号から文字に変換終了\n");
    puts(abc);
    return 0;
}

static char *morse_code[256] = {
    0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
    0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
    " ", 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
    "-----", ".----", "..---", "...--", "....-", ".....", "-....",
    "--...", "---..", "----.",  0,  0,  0,  0,  0,  0,
    0, ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
    "..", ".---", "-.-", ".-..", "--",  "-.", "---", ".--.", "--.-",
    ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", 
};

void morse_conversion(const char *str, char *morse)
{
    unsigned char c;  const char *p;

    while (c = *str++)
        if (p = morse_code[c]) {
            while (*p) *morse++ = *p++;
            *morse++ = ' ';
        }
    *morse = '\0';
}

void abc_conversion(const char *morse, char *abc)
{
    static char t[] =
        "-ETIANMSURWDKGOHVF-L-PJBXCYZQ--54-3---2-------16-------7---8-90";
    int c, i;

    for (; c = *morse++; morse++)
        if (c == ' ') *abc++ = ' ';
        else {
            for (i = (c == '-') + 1; ; morse++)
                if (*morse == '.') i = i * 2 + 1;
                else if (*morse == '-') i = i * 2 + 2;
                else break;
            *abc++ = t[i];
        }
    *abc = '\0';
}

strcat や strchr がなぜ効率が悪いか分かりますか?


この投稿にコメントする

削除パスワード

No.6166

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---クロ(2006/07/16 02:23:47)


>strcat や strchr がなぜ効率が悪いか分かりますか?
さっぱり分かりません。用意されている関数なので、簡単に使用でき効率がよさそうですが。
strcat や strchr を使用するための下準備が厄介ってことですか(関数に渡す型が決まっているとか?)?



この投稿にコメントする

削除パスワード

No.6167

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---かずま(2006/07/16 11:45:31)


strcat(morse, sp1);

morse が指している配列に入っている文字列の末尾に、文字列 sp1 を追加
するわけですが、strcat は morse の文字列の末尾がどこか知らないので、
配列の先頭から順に '\0' を探さなければなりません。どんどん長くなる
morse の文字列の末尾を毎回毎回先頭から探すのですから、効率が悪いと
思いませんか?

strchr(abc_code, *str)

abc_code は "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" です。
*str が 'X' だとすると、それが abc_code のどこにあるかを strchr は先頭
から順に探しに行くわけです。探す文字によって時間が異なり、abc_code の
後ろにある文字ほど時間がかかってしまいます。効率が悪いと思いませんか?
改良版のプログラムの p = morse_code[c] では、c がどんな文字でも一発で
モールスコードの文字列を取り出すことが出来ます。


この投稿にコメントする

削除パスワード

No.6169

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---クロ(2006/07/16 14:53:38)


>strcat(morse, sp1);
↑の効率の悪さは分かりました。一度読み込んで、再度のアドレスを覚えさせ、次からはそこから読み込む、でまた最後のアドレスを覚えさす関数とか作るって事も、出来そうだと思いますが、難儀そうです。

>strchr(abc_code, *str)
↑の効率の悪さも理解できましたが、↓の事は難しいです。
>改良版のプログラムの p = morse_code[c] では、c がどんな文字でも一発で
>モールスコードの文字列を取り出すことが出来ます。



この投稿にコメントする

削除パスワード

No.6147

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---ruby(2006/07/14 00:48:12)


>下記の問題を私なりに解いてみたのですが、もっと効率よく、簡潔に出来そうな感じがしました。
>ソースコードの見易さ、修正箇所など、気づいた点なんでもいいのでご指摘お願い致します。

効率を求めようとすると保守性が悪く(ソースが見づらく、と言い換えてよいかもしれません)なったり、
保守しやすくしようとすると効率が悪くなったりと、
これらを両立させるのはなかなかむずかしい場合があります。
いちばんいいのは、効率がよくて保守しやすいプログラムなんですけど…。
それに、開発にかけられる時間や費用は有限である、という条件も加わりますしね。


この投稿にコメントする

削除パスワード

No.6149

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---クロ(2006/07/14 01:22:30)


>効率を求めようとすると保守性が悪く(ソースが見づらく、と言い換えてよいかもしれません)なったり、
>保守しやすくしようとすると効率が悪くなったりと、
>これらを両立させるのはなかなかむずかしい場合があります。
>いちばんいいのは、効率がよくて保守しやすいプログラムなんですけど…。
>それに、開発にかけられる時間や費用は有限である、という条件も加わりますしね。

↑そうですね。私はC言語を趣味でしてるため、効率を求めましたが、実際の業務などでは保守性は重要ですね。
ありがとうございます。



この投稿にコメントする

削除パスワード

No.6155

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---shu(2006/07/14 15:13:40)


>下記の問題を私なりに解いてみたのですが、もっと効率よく、簡潔に出来そうな感じがしました。
>ソースコードの見易さ、修正箇所など、気づいた点なんでもいいのでご指摘お願い致します。

//
//	モールス変換プログラム
//

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

//
char *str_morse(int c);

//////////////
int main(void)
{
    char s[256], *p;
    
    //
    fgets(s, sizeof(s), stdin);
    
    //
    for (p = s; *p; p++) {
        puts(str_morse(*p));
    }
    
    return 0;
}

//
static char *alnum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static char *morse[] = {
    //	0 〜 9
    "-----", ".----", "..---", "...--", "....-",
    ".....", "-....", "--...", "---..", "----.",
    //	A 〜 Z
    ".-", "-...", "-.-.", "-..", ".",
    "..-.", "--.", "....", "..", ".---",
    "-.-", ".-..", "--", "-.", "---",
    ".--.", "--.-", ".-.", "...", "-",
    "..-", "...-", ".--", "-..-", "-.--",
    "--.."
};

//
char *str_morse(int c)
{
    char *p;
    
    p = strchr(alnum, c);
    
    return (p) ? morse[p - alnum] : "";
}




この投稿にコメントする

削除パスワード

No.6156

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---クロ(2006/07/14 15:45:57)


>
><pre>char *str_morse(int c);
>
>int main(void)
>{
> char s[256], *p;
>
> for (p = s; *p; p++) {
> puts(str_morse(*p));
> }
>
> return 0;
>}
>
>char *str_morse(int c)
>{
> }
</pre>
↑とても、分かりやすかったです。毎回、関数str_morseを呼び出してますが、関数を呼び出すのって処理とか遅くなりませんか?

char型のポインタをint型で渡せるんですね。又、そんな使い方もできるんですね。
fgets関数は文字列範囲指定できるんですね。fgets関数の存在を知らずに自分で関数作ってしまいました。

strchr関数も使うの忘れてました。


この投稿にコメントする

削除パスワード

No.6157

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---ruby(2006/07/14 16:20:55)


>↑とても、分かりやすかったです。毎回、関数str_morseを呼び出してますが、関数を呼び出すのって処理とか遅くなりませんか?

関数を呼び出すにはそれなりのオーバーヘッドがかかります。
しかし、今回のプログラムの場合、問題にならない程度のものでありましょう。何百万回も連続して変換するのでない限り。

乱暴な例を出すと、実行時間が0.01秒と0.1秒とで10倍違っても、
瞬き1回にも満たない程度の差しかないってことです。


この投稿にコメントする

削除パスワード

No.6158

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---nop(2006/07/14 16:58:32)


>char型のポインタをint型で渡せるんですね。

charポインタをintで渡している所なんてありませんよ?
# また、そんな事はしてはいけません。


この投稿にコメントする

削除パスワード

No.6162

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---shu(2006/07/15 22:11:53)


//
//	モールス変換バラエティ
//

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

//
static char alnum[] = "0123456789abcdefghijklmnopqrstuvwxyz";
static char *morse[] = {
    //	0 〜 9
    "-----", ".----", "..---", "...--", "....-",
    ".....", "-....", "--...", "---..", "----.",
    //	A 〜 Z
    ".-", "-...", "-.-.", "-..", ".",
    "..-.", "--.", "....", "..", ".---",
    "-.-", ".-..", "--", "-.", "---",
    ".--.", "--.-", ".-.", "...", "-",
    "..-", "...-", ".--", "-..-", "-.--",
    "--.."
};

//
int func_cmp(const char *a, const char *b);

//////////////
int main(void)
{
    char s[256], *p, *q;
    
    //
    fgets(s, sizeof(s), stdin);
    
    //	strchr()で
    for (p = s; *p; putchar('\t'), p++) {
        q = strchr(alnum, *p);
        fputs((q) ? morse[q - alnum] : "", stdout);
    }
    putchar('\n');
    
    //	strrchr()で
    for (p = s; *p; putchar('\t'), p++) {
        q = strrchr(alnum, *p);
        fputs((q) ? morse[q - alnum] : "", stdout);
    }
    putchar('\n');
    
    //	memchr()で
    for (p = s; *p; putchar('\t'), p++) {
        q = memchr(alnum, *p, sizeof(alnum));
        fputs((q) ? morse[q - alnum] : "", stdout);
    }
    putchar('\n');
    
    //	bsearch()で
    for (p = s; *p; putchar('\t'), p++) {
        q = bsearch(p, alnum, sizeof(alnum), sizeof(char),
            (int (*)(const void *, const void *))func_cmp);
        fputs((q) ? morse[q - alnum] : "", stdout);
    }
    putchar('\n');
    
    return 0;
}

//
int func_cmp(const char *a, const char *b)
{
    return 
            (*a > *b) ? 1 :
            (*a < *b) ? -1 : 0;
}



この投稿にコメントする

削除パスワード

No.6164

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---shu(2006/07/16 00:47:11)


>
    char str[MAX];
    char morse[MAX];


入力strに対しての、出力morseの幅が同じMAXになっている。
入力によっては、morse[MAX]内に収まりきらない。


この投稿にコメントする

削除パスワード

No.6165

Re:英数字を読み込んで、モーレス符号に変換するプログラム。
投稿者---クロ(2006/07/16 02:02:38)


>>
    char str[MAX];
    char morse[MAX];

>
>入力strに対しての、出力morseの幅が同じMAXになっている。
>入力によっては、morse[MAX]内に収まりきらない。
ご指摘ありがとうございます。それに気づいて修正しました。


この投稿にコメントする

削除パスワード

No.6168

とりあえず、これで。。。。。
投稿者---クロ(2006/07/16 14:06:31)


皆さん、ご指摘、ソースの記載ありがとうございました。
皆さんの書いてるソースで理解した範囲で修正しました。


>下記の問題を私なりに解いてみたのですが、もっと効率よく、簡潔に出来そうな感じがしました。
>ソースコードの見易さ、修正箇所など、気づいた点なんでもいいのでご指摘お願い致します。
↑当初は効率よく、簡潔と思っていましたが、保守性を第一と方向性を変えようと思っております。

↓のソースコードをみて何かご指摘があれば教えてください。
*ソースにコメントがありませんがご了承ください。

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

#define MAX1 102
#define MAX2 600

char *o_gets(char *, int);
void morse_conversion(const char *[], char *, char *, const char []);
void abc_conversion(const char *[], char *, char *, const char []);


/*************************************************/
int main(void)
{
        //morse_code[0]〜[25]がA〜Z、morese_code[26]〜[35]が1〜0
    char *morse_code[] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--",
                  "-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",
                  ".----","..---","...--","....-",".....","-....","--...","---..","----.","-----"};

    char abc_code[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    char str[MAX1], morse[MAX2] ,abc[MAX1];
    int i;


    printf("大文字で英文を入力して下さい。英数字(スペース)最大100文字入力可能\n");

    o_gets(str, MAX1);

    //puts(str);


    //文字列からモールス符号に変換
    morse_conversion(morse_code, str, morse, abc_code);

    printf("\nモールス符号へ変換終了\n");
    puts(morse);


    //モールス符号からスペルに変換
    abc_conversion(morse_code, morse, abc, abc_code);

    printf("\nモールス符号から文字に変換終了\n");
    puts(abc);


    return 0;
}
/*************************************************/


/******************MAX1 - 2 文字以上は入力させない********************/
char *o_gets(char *s, int size)
{
    int i = 0;
    char c;

    c = getchar();

    while(c != '\n') {
        *(s + i++) = c;

        if(i == size - 2) {
            printf("これ以上入力出来ません\n");
            break;
        }
        c = getchar();
    }
    *(s + i) = '\0';
    return s;
}
/***********************************************************/


/**************************文字列からモールス符号に変換********************/
void morse_conversion(const char *morse_code[], char *str, char *morse, const char abc_code[])
{
    const char *p;

    for (; *str; str++) {

        if (*str == ' ') {
            *morse++ = ' ';
            *morse++ = ' ';
        }
        else if ( (65 <= *str) && (*str <= 90) || (48 <= *str) && (*str <= 57) ) {
            p = strchr(abc_code, *str);

            for (p = morse_code[p - abc_code]; *p; p++)
                *morse++ = *p;

            *morse++ = ' ';
        }
    }
    *morse = '\0';
}

/********************************************************************/

/**********************モールス符号からスペルに変換****************************/
void abc_conversion(const char *morse_code[], char *morse, char *abc, const char abc_code[])
{

    char hold[6];
    int i;

    while(*morse != '\0') {

        for(i = 0; i <= 5; i++)
            hold[i] = '\0';

        for (i = 0; *morse != ' '; morse++){
            if (*morse == '\0')
                break;

            hold[i++] = *morse;
        }

        hold[i] = '\0';

        for (i = 0; i <= 35; i++)
            if (0 == strcmp(morse_code[i], hold)) {
                *abc++ = abc_code[i];
                break;
            }

        if ( ( *morse == ' ' ) && ( *(morse + 1) == ' ' ) && ( *(morse + 2) == ' ' ) ) {
            morse += 3;
            *abc++ =  ' ';
        }
        else if ( *morse == ' ' ) {
            morse++;
        }

    }

    *abc = '\0';
}
/********************************************************************/




この投稿にコメントする

削除パスワード

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





掲示板提供:(有)リアル・インテグリティ