掲示板利用宣言

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

 私は

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

掲示板2

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

No.29851

16進数から10進数へ変換
投稿者---初級階段(2007/02/27 18:09:18)


宿題ですけど、16進数から10進数へ変換、条件はprintfを使ってはいけません。出力はputsで。誰かが助けていただけますか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:16進数から10進数へ変換 29852 jazz 2007/02/27 18:16:48
<子記事> Re:16進数から10進数へ変換 29855 円零 2007/02/27 18:34:02
<子記事> Re:16進数から10進数へ変換 29975 たかぎ 2007/03/23 09:49:16


No.29852

Re:16進数から10進数へ変換
投稿者---jazz(2007/02/27 18:16:48)


>宿題ですけど

お決まりのパターンの回答ですけど、
ご自分ではどこまでお考えになって
どこがおわかりにならないかを、
具体的にご提示ください。


この投稿にコメントする

削除パスワード

No.29853

Re:16進数から10進数へ変換
投稿者---初級階段(2007/02/27 18:30:21)


>>宿題ですけど
>
>お決まりのパターンの回答ですけど、
>ご自分ではどこまでお考えになって
>どこがおわかりにならないかを、
>具体的にご提示ください。
例え:0xa0=a*16+0*1は分かっていますが、入力した16進数の変換が分かりません。


この投稿にコメントする

削除パスワード

No.29854

Re:16進数から10進数へ変換
投稿者---初級階段(2007/02/27 18:33:42)


>>>宿題ですけど
>>
>>お決まりのパターンの回答ですけど、
>>ご自分ではどこまでお考えになって
>>どこがおわかりにならないかを、
>>具体的にご提示ください。
>例え:0xa0=a*16+0*1は分かっていますが、入力した16進数の変換が分かりません。
それと、最後に10進数の出力はprintfを使ってはいけないので、変換された10進数を文字コードに変換しなければならないことも分かっています。




この投稿にコメントする

削除パスワード

No.29857

Re:16進数から10進数へ変換
投稿者---初級階段(2007/02/27 18:45:44)


>>>>宿題ですけど
>>>
>>>お決まりのパターンの回答ですけど、
>>>ご自分ではどこまでお考えになって
>>>どこがおわかりにならないかを、
>>>具体的にご提示ください。
>>例え:0xa0=a*16+0*1は分かっていますが、入力した16進数の変換が分かりません。
>それと、最後に10進数の出力はprintfを使ってはいけないので、変換された10進数を文字コードに変換しなければならないことも分かっています。
>

また、10進数から出力できる文字コードへの変換もできません。


この投稿にコメントする

削除パスワード

No.29855

Re:16進数から10進数へ変換
投稿者---円零(2007/02/27 18:34:02)


sprintfなら使ってもいいんだ?
#include <stdio.h>

int main(void){
    int hex;
    char dec[128];
    scanf("%x", &hex);
    sprintf(dec, "%d", hex);
    puts(dec);
    return 0;
}

んなわきゃないかw


この投稿にコメントする

削除パスワード

No.29856

Re:16進数から10進数へ変換
投稿者---初級階段(2007/02/27 18:40:16)


>sprintfなら使ってもいいんだ?
><pre>#include <stdio.h>

int main(void){
int hex;
char dec[128];
scanf("%x", &hex);
sprintf(dec, "%d", hex);
puts(dec);
return 0;
}</pre>
>んなわきゃないかw

でも、%d自体は十進数の出力です。


この投稿にコメントする

削除パスワード

No.29858

Re:16進数から10進数へ変換
投稿者---円零(2007/02/27 18:53:01)


>No.29856
>でも、%d自体は十進数の出力です。

何が言いたいかわからない。

>No.29853
とりあえずscanfは禁止じゃないみたいだし、16進表記の文字列を
10進表記に変換する必要はないですね。
故に「printf」が禁止としてもこれでOK。
#include <stdio.h>

int main(void){
    int hex;
    char dec[256], *cp = dec + 255;
    scanf("%x", &hex);
    do{
        *--cp = '0' + hex % 10;
    }while(hex /= 10);
    puts(cp);
    return 0;
}

って答書いちゃった。まあいいか。


この投稿にコメントする

削除パスワード

No.29859

Re:16進数から10進数へ変換
投稿者---初期階段(2007/02/27 20:19:12)


int main(void){
int hex;
char dec[256], *cp = dec + 255;
scanf("%x", &hex);
do{
*--cp = '0' + hex % 10;
}while(hex /= 10);
puts(cp);
return 0;
}</pre>

円零先生、*cp = dec + 255;このポインタの宣言、+255の意味がわかりません。*--cp = '0' + hex % 10;この処理を解説していただけますか?宜しくお願いします。




この投稿にコメントする

削除パスワード

No.29860

Re:16進数から10進数へ変換
投稿者---円零(2007/02/27 20:56:44)


しまった、初期化するの忘れてた。
char dec[256] = {0}に直しておいてください。

長さ256で0に初期化されたchar配列の254番目にポインタを置けば、
一文字書き込むごとにデクリメントすることで
文字列に後ろから文字を入れていくことができます。
ループの中で、cpが前置--演算子によりいきなり1減るので255にしてあります。

*--cp = '0' + hex % 10 は、
hex を10で割った余りに相当する数字の文字を代入してポインタを一つ先頭へ向けてずらしています。
10進数の最下位が10の剰余算で求められるのはOKですよね?


この投稿にコメントする

削除パスワード

No.29861

Re:16進数から10進数へ変換
投稿者---初期階段(2007/02/27 21:14:46)


>しまった、初期化するの忘れてた。
>char dec[256] = {0}に直しておいてください。
>
>長さ256で0に初期化されたchar配列の254番目にポインタを置けば、
>一文字書き込むごとにデクリメントすることで
>文字列に後ろから文字を入れていくことができます。
>ループの中で、cpが前置--演算子によりいきなり1減るので255にしてあります。
>
>*--cp = '0' + hex % 10 は、
>hex を10で割った余りに相当する数字の文字を代入してポインタを一つ先頭へ向けてずらしています。
>10進数の最下位が10の剰余算で求められるのはOKですよね?
ありがとうございます。


この投稿にコメントする

削除パスワード

No.29905

Re:16進数から10進数へ変換
投稿者---大阪慕情(2007/03/10 13:37:33)


 私もC言語も初心者ですで、偉そうにいえませんが、計算の演算操作をまず紙に書いてみてプログラムで追えば良いのでは?
 ちなみに大阪は、構造不況の真っ只中です。助けてーっ。
 


この投稿にコメントする

削除パスワード

No.29974

Re:16進数から10進数へ変換
投稿者---金魚ちゃん(2007/03/22 14:33:12)


またお会いしましたね。
金魚ちゃんです。

宿題という事ですが、10進数も16進数もコンピュータ内部での表現は全てが2進数ですよ。
この問題は画面への出力を10進数で出力すればよいという事ですからね。分かりますか?

それでアルゴリズムですが、整数値(8進数、10進数、16進数、n進数のすべて)を10で割った
余りをchar型配列に格納していきます。その後、最後にセットした値から最初にセットした値を
数字文字で出力すればよいのです。

char buff[ 32 ];
int a = 0xABCD; ←これが整数値
int i;

for ( i = 0 ; a > 0 ; i++ ){
 buff[ i ] = (char)((a % 10) + '0'); ←10で割った余り+'0'で数値→数字文字に変換
 a /= 10;
}
buff[ i ] = '\0';

ここまでで buff に 10 進整数を文字列に変換できます。
ただし、左右が逆転しています。つまり 0xABCD は 10 進数で 43981 ですが文字列は 18934 となります。
そこで、左右の逆転を直す処理を次に行います。→文字列反転の処理です。

int head; ←先頭位置の添え字カウンタ
int tail; ←最後位置の添え字カウンタ
char temp;←入れ替えようの一時変数

for ( head = 0, tail = (i - 1) ; head < tail ; head++, tail-- ){
 temp = buff[ head ];
 buff[ head ] = buff[ tail ];
 buff[ tail ] = temp;
 ↑
 この 3 行は buff[head] と buff[tail] の内容を入れ替える処理です。
}
puts( buff ); ←ここで buff の文字列を出力すれば 18934 が 43981(0xABCD) に表示されます。
以上。



この投稿にコメントする

削除パスワード

No.29976

金魚ちゃんさん
投稿者---大阪慕情(2007/03/23 12:15:46)


 素晴らしいです。配列に関して、見事なコードの記述です。
 もっと、もっと記述してこの掲示板に投稿してください。


この投稿にコメントする

削除パスワード

No.29975

Re:16進数から10進数へ変換
投稿者---たかぎ(2007/03/23 09:49:16)
http://takagi.in/


宿題とのことなので、普通に答えても面白くないですから、なるべく珍解答にしてみます。
#include <stdio.h>
#include <time.h>

int main(void)
{
    int value;
    struct tm t;
    char s[1024];

    scanf("%x", &value);
    t.tm_year = -1900 + value;
    strftime(s, sizeof s, "%Y", &t);
    puts(s);
    return 0;
}




この投稿にコメントする

削除パスワード

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