【掲示板ご利用上の注意】

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

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


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

No.22807

数字の3桁区切りについて
投稿者---help(2005/08/25 18:52:22)


こんばんは。

過去ログでこのような記述をみたのですが

/*
    SampleSource
void pwc(unsigned long n)   /* print with comma */
{
    (n > 999) ? (pwc(n/1000), printf(",%03u", n%1000)) : printf("%u", n);
}



これについて解説願えないでしょうか?

確かに3桁に区切れるのですが
なぜ区切れるのかがわかりません。

また

(n > 999) ? (pwc(n/1000), printf(",%03u", n%1000)) : printf("%u", n);

このような記述法は、はじめてで
どういう動きをしているかわからないです。


この結果を15桁で右よりに表示するにはどうしたらいいんでしょうか?




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:数字の3桁区切りについて 22808 解説者 2005/08/25 19:30:46
<子記事> Re:数字の3桁区切りについて 22812 まきじ 2005/08/26 01:21:41


No.22808

Re:数字の3桁区切りについて
投稿者---解説者(2005/08/25 19:30:46)


><pre>/*
SampleSource
void pwc(unsigned long n) /* print with comma */
{
(n > 999) ? (pwc(n/1000), printf(",%03u", n%1000)) : printf("%u", n);
}

</pre>
まず、この式についてですが、単なる if-else 文です。

(条件式) ? 真 : 偽;

まず、( n > 999 ) で、n の値が 999 より大きいかどうか(3桁以内か)
を条件に、真 : 偽; で処理をわけています。

3桁以内(999以内)ならば"偽"の部分を実行します。
つまり、そのまま printf しているだけ。

また、真の場合ですが、
自身の関数である pwc(n/1000) を呼び出しています。

これは 再帰 と呼ばれる記法です。
"再帰"については自身で調べるなりして下さい。

また、printf 内の ( n % 1000 ) は、
n を 1000 で割った余りを返します。
と、いうことは printf で出力される数字は
必ず 0〜999 以内になります。

pwc(n/1000) に関してちょっとだけヒント。
これは元の n の値を "/1000" していった値をどんどん
関数 pwc に渡しています。
と、いうことは・・・
(・∀・)



この投稿にコメントする

削除パスワード

No.22822

Re:数字の3桁区切りについて
投稿者---help(2005/08/26 11:52:30)


>(・∀・)

解説ありがとうございます!

自分なりに理解できたと思います!

すっきりしました^^


この投稿にコメントする

削除パスワード

No.22812

Re:数字の3桁区切りについて
投稿者---まきじ(2005/08/26 01:21:41)


>この結果を15桁で右よりに表示するにはどうしたらいいんでしょうか?
#include<stdio.h>

#define K 15

void pwc(unsigned int n, int k){

    k -= 3;
    
    if(k < 1){
        printf("%u", n);
        return;
    }
    
    if(n >= 1000){
        pwc(n/1000,k);
        printf(",%03u", n%1000);
    }else{
        int i = 0;
        int j = 0;
        
        if(n < 10) i += 2;
        else if(n < 100) i += 1;
        
        for(j = 0; j < K%3; j++) putchar('0');
        if(j) putchar(',');
        
        for(j = 0; j < k - (K%3); j++){ 
            if(j && (j%3) == 0) putchar(',');
            putchar('0');
        }
        if(j)putchar(',');
        
        while(i > 0 && i--)putchar('0');
        printf("%u", n);
    }
}


int main(void){

    pwc(12345,K);
    putchar('\n');
    
    return 0;
}
15桁以外の桁数にも対応しました。
一応、テストはしましたけど、バグあるかも(^^;


この投稿にコメントする

削除パスワード

No.22820

Re:数字の3桁区切りについて
投稿者---まきじ(2005/08/26 10:33:00)


バグがあったので修正。
#include<stdio.h>

#define K 15

void pwc(unsigned int n, int k){

    k -= 3;
    
    if(k < 0){
        printf("%0*u",(k + 3), n);
        return;
    }
    
    if(n >= 1000){
        pwc(n/1000,k);
        printf(",%03u", n%1000);
    }else{
        int j = 0;
        
        for(j = 0; j < K%3; j++) putchar('0');
        if(j) putchar(',');
        
        for(j = 0; j < k - (K%3); j++){ 
            if(j && (j%3) == 0) putchar(',');
            putchar('0');
        }
        if(j)putchar(',');
        

        printf("%03u", n);
    }
}


int main(void){

    pwc(1234567890,K);
    putchar('\n');
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.22821

解決
投稿者---help(2005/08/26 11:51:13)


ありがとうございます!

無事3桁に区切れて値もそろえました!



この投稿にコメントする

削除パスワード

No.22863

Re:数字の3桁区切りについて
投稿者---かずま(2005/08/27 21:42:22)


> バグがあったので修正。

pwc(1234567890, 16); の表示が変です。pwc には、引数で桁数を渡している
のに、pwc の中で固定値の K を参照しているのが間違いではないのですか?

試しに、#deifne K 15 を削除し、pwc に入ったところに int K = k; を
追加してみたら、まともな結果が得られました。

再帰呼び出しとループの両方を使って、面倒な処理をしているように見えます。
ということで、次のようにしてみました。
#include <stdio.h>

void pwc(unsigned int n, int k)
{
    k>3 ? pwc(n/1000, k-3), printf(",%03u", n%1000) : printf("%0*u", k, n);
}

int main(void)
{
    pwc(1234567890, 15), putchar('\n');
    pwc(1234567890, 16), putchar('\n');
    pwc(1234567890, 17), putchar('\n');
    return 0;
}



この投稿にコメントする

削除パスワード

No.22864

Re:数字の3桁区切りについて
投稿者---まきじ(2005/08/27 22:59:25)


>試しに、#deifne K 15 を削除し、pwc に入ったところに int K = k; を
>追加してみたら、まともな結果が得られました。

int K = k; としなくても、 K は k で良いみたいです。


この投稿にコメントする

削除パスワード

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