• 締切済み

またまたテストの復習なんですが・・・

処理内容 基数、および変換対象数値(10進数)を入力させ、それに応じた基数変換を行う。その結果を画面に出力する。 ソースプログラム #include<stdio.h> #define MAX_OUT (16) int InputNum(int, int); char ChangeNum(int); /* メイン処理 */ main(){ int i; /* カウンタ */ int num; /* 対象数値 */ int num_base /* 基数 */ int num_next, num_out; char str[MAX_OUT]; /* 変換後文字格納用 */ while (1){ printf("基数を入力してください(2~32)\n"); printf("(2~32以外の入力で終了)\n"); num_base=InputNum(2,32); if (-1==num_base) { break; } printf("対象の数値を入力してください(0~65535)\n"); printf("(0~65535以外の入力で終了)\n"); num=InputNum(0,65535); if (-1==num) { break; } /* 変換開始 */ ( 1 ) for (i=0; i<MAX_OUT; i++){ /* 変換終了か判定する */ if (num_base>num_next){ /* 変換後文字の格納 */ str[i++]=ChangeNum(num_next); break; } /* 数値文字を抽出 */ num_out=( 2 ) str[i]=ChangeNum(num_out); /* 次の行へ */ num_next=( 3 ) } /* 変換結果を出力 */ printf("対象数値%dの%d進数表現は\n",num, num_base); for (i -= 1; 0<=i; i--) { printf("%c", str[i]); } printf("\nです\n"); } printf("終了します\n"); } /* 数値入力処理 */ int InputNum(int min, int max){ int ret; scanf("%d", &ret); if ((min>ret) || (max<ret)){ ret=-1; } return ret; } /* 数値を文字に変換 */ char ChargeNum(int num){ char ret=0; if (10>num){ ret=num+'0'; } else{ ret=( 4 )+'A'; } return ret; } という問題なんですが、(1)~(4)の答えと説明をどなたかして頂けないでしょうか?どうぞよろしくお願いします!ちなみにwhile(1)は無限ループです。

みんなの回答

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

この質問のままでは、問題の丸投げだと言われても仕方がないので、あなたなりの回答と回答の根拠をまず書き込んでくださいね。その上でなら質問の回答も可能です。 とりあえず、解き方のヒントだけ書いておきます。 (1)まず、変数に着目します。ループ内で参照時に未初期化のものはありませんか? (2)下のケタの1ケタ分の基数変換を計算します。 (3)「次の行へ」はたぶんコメント間違いです。残りの基数変換されていない値を求めます。 (4)アスキーコードと数値の関係が分かれば解けると思います。 それとプログラムは慣れるまでコンパイラとデバッガで動かしながら理解するほうが良いかと思いますので以下の環境を検討してみてください。 Cコンパイラを持っていないのであれば、Win環境なら「Visual Studio 2005 Express Edition」のC++が無料で入手可能です。 http://www.microsoft.com/japan/msdn/vstudio/express/ 学校の環境がもしLinuxで同じ環境にしたいのであれば無料のcygwinをインストールすればWinでもgccが使えるようになります。

mimasaka12
質問者

お礼

いろいろなご指導ありがとうございます。解き方のヒントを見て自分で考えたいと思います。ほんとうにありがとうございます。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

復習で在るならば既に答えはあるはずですが、 何故その部分の答えが必要なのですか? (1)-(4)の何が(またはどこが)わかりませんか?

mimasaka12
質問者

お礼

それが、テストが終わった後は、答えを教えてもらえないし、点数も教えてもらえないので、どこが間違っているのかも分からないです。だから、答えを知ってから、なぜそうなるのかを考えたいと思っていました。