掲示板利用宣言

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

 私は

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

掲示板2

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

No.24453

基数変換のプログラム
投稿者---plusdriver(2005/12/01 18:42:55)


初めまして、最近Cを勉強し始めたplusdriverです。
今回は基数変換のプログラムについての質問です。
アルゴリズムは
2つの数字を入力し、それぞれを変換対象と基数とします。
対象を基数で剰余計算し対象が0になるまで答えを配列に入れます。
すると配列に逆順に入るのでそれをソートして正しい並びにします。

(以下ソース)
#include<stdio.h>
main()
{
        int x,j,n,
            p[16],q[16];

        j=0;/*添字の初期化*/

        printf("数字を入力:");/*変換対象入力*/
        scanf("%d",&n);
        printf("基数を入力:");/*基数入力*/

        for(scanf("%d",&x);x!=0;x/=n)
        p[++j]=x%n;/*変換対象を基数で割った余りを配列pへ繰り返し代入*/

        for(j=15;j>0;j--)
        q[j]=p[j-15];/*配列pを配列qに逆順に入れなおす*/
        printf("%d進数で%d\n",x,q);/*変換された数の表示*/

}


(以上ソース)

後半が怪しいなと思っています、コンパイルには問題はありませんでした。
実行結果を貼り付けます。
(以下DOS画面)
C:\work>gcc kisuu.c -o kisuu.exe

C:\work>kisuu
数字を入力:10
基数を入力:2
0進数で2293496
(以上DOS画面)
どうかご教授願います。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:基数変換のプログラム 24454 REE 2005/12/01 19:18:55
<子記事> Re:基数変換のプログラム 24455 わたり 2005/12/01 21:35:03
<子記事> Re:基数変換のプログラム 24456 plusdriver 2005/12/01 22:56:47
<子記事> Re:基数変換のプログラム 24470 nop 2005/12/02 12:25:03


No.24454

Re:基数変換のプログラム
投稿者---REE(2005/12/01 19:18:55)


変換対象と基数が混同されています。
まず、それぞれに分かりやすい変数名を付けるところからはじめましょう。

また、printfには、配列をまとめて表示する機能はありません。


この投稿にコメントする

削除パスワード

No.24455

Re:基数変換のプログラム
投稿者---わたり(2005/12/01 21:35:03)
http://study-with.sub.jp/


> for(scanf("%d",&x);x!=0;x/=n)
> p[++j]=x%n;/*変換対象を基数で割った余りを配列pへ繰り返し代入*/

++jとすると、jは1から始まってしまうのではないでしょうか。

その他のミスは、、、頑張って解いてください。


この投稿にコメントする

削除パスワード

No.24456

Re:基数変換のプログラム
投稿者---plusdriver(2005/12/01 22:56:47)


回答をくださった御二方、ありがとうございます。
少し考え直して書き直してみました。
(以下ソース)
#include<stdio.h>
main()
{
    int j,a,x,n,y,
        p[a],q[a];/*j=添字,a=カウンタ,x=変換対象,n=基数*/

    y=x;/*xを保存(24行目の為)*/
    a=0;/*カウンタ初期化*/
    j=0;/*添字初期化*/

    printf("数字を入力:");
    scanf("%d",&n);/*変換対象入力*/
    printf("基数を設定:");

    for(scanf("%d",&x);x>n;x/=n)/*基数設定,計算処理部*/
    {
        p[a]=x%n;
        a++;
    }

    for(j=a;j>=0;j++)/*配列を並び替え*/
        q[a-j]=p[j];

    printf("%d進数では%d",y,q[a]);/*結果表示*/

}


(以上ソース)

しかし、可変長配列の宣言が分からず・・・変なことしてます。
これなら最大値を見積もった方が良さそうでしょうか。

変数名は数学の癖が抜け切れずに、すいません。


この投稿にコメントする

削除パスワード

No.24457

Re:基数変換のプログラム
投稿者---わたり(2005/12/01 23:29:42)
http://study-with.sub.jp/


>しかし、可変長配列の宣言が分からず・・・変なことしてます。

可変長配列の宣言方法について、以下の例文に示します。参考程度に拝見
してください。

//calloc関数を使用するには、このinclude文が必要
#include<stdlib.h>

int main( void )
{
    int *p, size;

    //配列のサイズを取得
    printf("Input Size->");
    scanf("%d", &size );

    //size分のint型のサイズを確保
    p = ( int * )calloc( size, sizeof( int ) );

    for( i = 0; i < size; i++ )
    {
        p[i] = i;
        printf("p[%d] = %d\n", i, p[i] );
    }
    free( p );//取得したメモリを開放する

    return 0;
}



この投稿にコメントする

削除パスワード

No.24462

Re:基数変換のプログラム
投稿者---RAPT(2005/12/02 02:02:08)


# 全然関係無いところに突っ込み失礼。

> 参考程度に拝見してください。
これは、謙譲語なのでおかしいのでは?
「ご覧ください」等の方が良いかと思われます。



この投稿にコメントする

削除パスワード

No.24467

Re:基数変換のプログラム
投稿者---わたり(2005/12/02 08:33:58)
http://study-with.sub.jp/


>「ご覧ください」等の方が良いかと思われます。

確かにそうですね^^
失礼しました。。


この投稿にコメントする

削除パスワード

No.24470

Re:基数変換のプログラム
投稿者---nop(2005/12/02 12:25:03)


> for(scanf("%d",&x);x!=0;x/=n)
> p[++j]=x%n;/*変換対象を基数で割った余りを配列pへ繰り返し代入*/

基数を割ってどうするのかと…。


この投稿にコメントする

削除パスワード

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