掲示板利用宣言

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

 私は

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

掲示板2

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

No.27877

自作関数で。
投稿者---るぅ(2006/08/05 14:41:37)


受け取った値を2進数で表示するプログラムを作ろうとしたのですが、うまく動きません。
(正常に動作する値(4〜15と異常に動作する値(その他)があります)
どうしたら正常に動きますか?
自分が考えたソースは以下の通りです。


<pre>#include&lt;stdio.h&gt;


/*--------------------------------------------------------
    プロトタイプ宣言
--------------------------------------------------------*/
void bit( int num );


/*--------------------------------------------------------
    main関数
--------------------------------------------------------*/
int main( void )
{
    int no;  /* 変換する値 */

    /* 変換する値の入力 */
    printf( &quot;2進数に変換する値を入力してください:&quot; );
    scanf( &quot;%d&quot;, &amp;no );

    bit( no );


    return 0;
}


/*--------------------------------------------------------
[内容]
    numの値を2進数('0','1')で画面に表示する
[仮引数]
    int num  :値
[戻り値]
    なし
--------------------------------------------------------*/
void bit( int num )
{
    int binary[8];      /* 2進数 */
    int attach = 0;   /* 添え字 */
    int tmp;                /* 値一時避難用 */
    int i;          /* ループカウンタ */
    int len;                /* 要素数 */


    /* 2進数に変換 */
    while( num &gt; 0 ){
        /* 値を基数で割った余りを一時格納 */
        binary[ attach ] = num % 2;
        num /= 2;
        attach++;
    }
    attach--;

    /* 2進数表記になるよう逆順に */
    for( len = 0; len &lt; attach; len++ ){
        tmp = binary[ attach ];
        binary[ attach ] = binary[ len ];
        binary[ len ] = tmp;
        attach--;
    }
    len++;

    /* 変換した値を表示 */
    printf( &quot;2進数:&quot; );
    for( i = 0; i &lt;= len; i++ ){
        printf( &quot;%d&quot;, binary[ i ] );
    }


}
</pre>



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:自作関数で。 27880 ruby 2006/08/05 15:35:18


No.27880

Re:自作関数で。
投稿者---ruby(2006/08/05 15:35:18)


bit関数で、
>    len++;

あたりに問題が潜んでいそうです。

ご参考になるかどうかはわかりませんが、
以下の例も併せてごらんいただけますか?
void bit(int num)
{
    if ((num == 0) || (num == 1)) {
        printf("%d", num);
        return;
    }
    else {
        bit(num / 2);
        printf("%d", num % 2);
    }
}



この投稿にコメントする

削除パスワード

No.27882

Re:自作関数で。
投稿者---るぅ(2006/08/05 16:11:01)


bit(num / 2);
ですか。
関数の中から同じ関数を呼ぶのは思いつきませんでした。
ありがとうございました。おかげで正常に動くようになりました。

後で、自分の作ったソースもよく見直して、動くようにしたいと思います。
特に len++;のあたりを。


この投稿にコメントする

削除パスワード

No.27884

Re:自作関数で。
投稿者---ruby(2006/08/05 16:17:43)


>関数の中から同じ関数を呼ぶのは思いつきませんでした。

なぜ正しく動くか、ロジックを追いかけてみることをおすすめします。
私が提示した「再帰呼び出し」の考え方は、問題の種類によっては
絶大な威力を発揮します。


この投稿にコメントする

削除パスワード

No.28063

Re:自作関数で。
投稿者---かずま(2006/09/06 02:01:26)


> 後で、自分の作ったソースもよく見直して、動くようにしたいと思います。

見直したソースはどうなったのでしょうか?
#include <stdio.h>

void bit(unsigned num)
{
    if (num > 1) bit(num >> 1);
    putchar((num & 1) + '0');
}

int main(void)
{
    int no;

    printf("2進数に変換する値を入力してください:");
    if (scanf("%d", &no) == 1) bit(no), putchar('\n');
    return 0;
}



この投稿にコメントする

削除パスワード

No.28065

Re:自作関数で。
投稿者---あきき(2006/09/07 00:38:22)


下の箇所で赤い部分の働きが理解できず、困っています。
+ '0'がどのような働きをしてるんでしょうか。引数の型はint型ですし。
void bit(unsigned num)
{
    if (num > 1) bit(num >> 1);
    putchar((num & 1) + '0');
}



この投稿にコメントする

削除パスワード

No.28066

Re:自作関数で。
投稿者---Blue(2006/09/07 00:58:20)


> + '0'がどのような働きをしてるんでしょうか。引数の型はint型ですし。
単に putchar で出力できるように文字しているのでは。



この投稿にコメントする

削除パスワード

No.28067

Re:自作関数で。
投稿者---dead man walking(2006/09/07 09:02:17)


お手軽な型変換ですな。
「アスキーコード」「数字」「出力」などで調べると、幸せになれるかもしれません。


この投稿にコメントする

削除パスワード

No.28068

Re:自作関数で。
投稿者---nano(2006/09/07 09:27:22)


'0'〜'9'のコードが連続している体系では、
'n' - '0' → 数値の n
 n  + '0' → 数字の'n'

という変換パターンはよくあります。
定石として覚えておくとよいかもしれません。



この投稿にコメントする

削除パスワード

No.28071

Re:自作関数で。
投稿者---yoh2(2006/09/07 19:55:14)


>'0'〜'9'のコードが連続している体系では、

これはCの規格で保証されていますね。

ただし、'a' - 'z'、'A' - 'Z' はそのような保証がないので、
16進数文字との変換のためにほぼ定石となっている
 n - 'a' + 10 /* 文字 'a’ - 'f' を 10 - 15 に */
 n + 'a' - 10 /* 10 - 15 を文字 'a' - 'f' に */

は、厳密には移植性がないコードだったりします。
規格の文面上だけの話ではなく、EBCDICという、現実に存在する反例もありますし。
とはいえ大抵の処理系で通じる (ASCII、UNICODE系ならOK) ので使っちゃうことも多いのですが……


この投稿にコメントする

削除パスワード

No.28077

解決しました。
投稿者---あきき(2006/09/07 22:18:13)


アスキーコードの事を思い出し、難なく解決しました。'0'を加える事で文字になりますね。文字列に'0'を加えるものと勘違いしてました。みなさんありがとうございました。


この投稿にコメントする

削除パスワード

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