• 締切済み

次のプログラムの作り方が分かりません…

整数変数(データ変数)a,b,cを定義し、それぞれ10,20,30を代入しなさい。 次にその変数の格納されているアドレスを表示するプログラム ---------------------------------------------------------- 【ヒント】16進数で打ち出すためには、%xを利用する。課題のように頭に0xを付けるときには、0x%xとすればよい 宜しくお願いします。

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.7

> あと #7 については「uintptr_t を提供しない処理系」で困りませんか? だから結局 uintmax_t を使わざるを得ないのではないかと. はい。そうなんですが、uintptr_tが提供されていない処理系であれば、uintmax_tを使ってもポインタの値を保持できません。 その意味ではC99でも規格厳密合致プログラムは難しいですね。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

おお, たしかに %#x だと 0 のときに困る>#5. あと #7 については「uintptr_t を提供しない処理系」で困りませんか? だから結局 uintmax_t を使わざるを得ないのではないかと.

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

#5です。 あまり難しくなるといけないので、前回はuintmax_tにしましたが、本当なら、 printf("0x%" PRIxPTR, (uintptr_t)&a); とするのが一番よいのでしょうね。 C99に対応していない古い処理系で、かつ規格厳密合致プログラムを書くのは無理かと思います。 union ptr_bytes {  const volatile void *ptr;  unsigned char bytes[sizeof(const volatile void*)]; }; のような共用体を作って、ビットパターンを読み取るしかありませんが、この場合のバイトオーダーを特定する一般的な手段がありません。 バイトオーダーはリトルエンディアンとビッグエンディアンだけではありませんし、整数型を使ってバイトオーダーを調べても、それがポインタにもあてはまるという保証はありませんから。 バイトオーダーは無視して、各アドレスに対応するユニークな値が取れればよいのであれば、bytesの要素を前から順に出力すればよいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

p   実引数は、void へのポインタでなければならない。そのポインタの値を処理系定義の方法で表示文字の並びに変換する。 処理系定義の方法であって16進数と規格で決まっているわけではないのですね。 勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

常に16進法で表現しなければならないのであれば、例えポインタの値を変換する場合であっても%pは適切ではありませんね。 また、%#xとした場合、値が0のときは0x0とはならず、0と出力されますので、0x%xでなければなりません。 ただし、0x%xではポインタの値を完全に表現できるかどうかわかりませんので、実際には、 printf("0x%jx", (uintmax_t)&a); のようにする必要があります。

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

アドレス表示なら %p のほうが適当だと思う

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

これってよく考えると実はいたるところに落とし穴が隠れてるような気がするなぁ. もっとも, 出題者自身は落とし穴に気付いていないと思う. でも, 「16進で出力するときに頭に 0x を付ける」ならそんなことしなくても # フラグをつければいいんじゃない?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • プログラムの組み方が分かりません。

    ある課題で以下の問題が出題されました。 >>>> 2つのint型変数x,yにキーボードから値を入力し、その大小を判定する関数funcを作成せよ。この課題では、大きいと判定された数が代入された変数のアドレスがmain関数に戻されるものとする。 ============ #include<stdio.h> int *func(int *a,int *b) { /* 2つの値の大小判定を行い、アドレスを返す */ } main(void) { int x, y, *z; /* 変数 x,yにキーボードからデータを入力する */ /* 関数funcの呼び出し */ /* 変数zを用いて値の出力を行う */ } ============ <<<< 2行目の*funcというように、関数の頭に*が付くプログラムは初めてで、 どういう意味かもさっぱりわかりません。 それも含め、この問題はどういう風解けばいいのか、教えてください。 お願いします。

  • C言語プログラムの課題

    大学で以下のような課題が出ました。でも全然わかりません。わかる方がいらっしゃったら、是非教えてほしいです★ 1整数値123を変数iに代入して、iの値を表示するプログラムを作成せよ。 2実数値3.14159を変数xに代入して、xの値を表示するプログラムを作成せよ。 3文字型せーた'A'を変数chに代入して、chの値を表示するプログラムを作成せよ。ただし、chの値を表示する際には、%d,%x,%cの書式を用いること。 4キーボードから入力された2つの整数値i,jの値を画面に表示するプログラムを作成せよ。 5キーボードから2つの整数値を、変数in1とin2に入力して、以下の計算をした結果を画面に表示するプログラムを作成せよ。 in1+in2= in1-in2= in1*in2= in1/in2= in1%in2=

  • charの操作について

    お世話になります、フジと申します。 今回皆様にお聞きしたいことはchar型変数の操作についてなのですが、次のプログラムのようにchar型に代入した整数を16進数用に変換させ、最後に同じchar型の変数に代入したいと考えています。 int a,b,c; char data = 48; //dataに10進数48を代入 c = (int)data; //ここでcは48になる a = c/16;          //16進数用に変換 b = c%16; c = 10*a + b;        //ここでcは30になる このint型変数c(30)をchar型変数dataに代入するにはどうしたらいいでしょうか? char buf[5]; sprintf(buf,"%d",c); にすればchar型の配列に代入することは出来ますが、これだとcの値30がbuf[0]=3,buf[1]=0となってしまい、目的の操作が達成できません。 よい方法をしっている方がいましたら、宜しくお願い致します。

  • 次のプログラムを教えてほしいのですが・・・・

    #include<stdio.h> main() { int a,b,c,d,e; a=1;b=3;c=5;d=7;e=8; float X; X = (a+b+c+d+e)/5.0; printf("Y =%f\n",X); } X=4.8 となるプログラムですが、Xという変数を用いています。 これを変数を用いず、4.8を導きだせ という宿題が出ました。 全くわからないので詳しい方回答お願いします。

  • C言語の不等号の計算

    三つの整数の変数a,b,cを用意して、プログラムの各変数に任意の値を代入する 例:a=9,b=31,c=25 このプログラムを実行して 「a=9,b=31,c=25です.よって b>c>a です.」 と表示するプログラムを組みなさい とゆう課題が出されたのですが switch文を使ってプログラムを組んで課題は終わったのですが・・・ switch文以外方法でこのプログラムが組めるのか プログラムの例を教えてください。 あとプログラムを組むときにはシンプルで行数の少ないプログラムのほうがいいのですか? 教えてくださいお願いします。

  • PICプログラム:受信データの格納について

    こんにちは。 アセンブリ言語でPICをプログラムして試行錯誤している者です。 シリアル通信でデータを受信するなかで、受信データ1バイト毎に変数へ格納したいのですが、データ数があらかじめ規定されていれば変数定義の時点で(例えば)TEMP1,TEMP2...とすれば良いのでしょうが、 受信データの個数が不定の場合、変数をどう定義したら良いか悩んでいます。 予定している受信データ群には、先頭にデータ個数が示されているので、 受信→格納→データ数を格納した変数から1を減じて0になるまでループ といった流れで運用しようと思っています。 アドバイスをよろしくお願いいたします

  • 至急!助けて下さい。プログラミングJava

    明日までの大学の課題が、わかりません。 どなたか教えてください。書き方が、わかりません。言語はJavaです。 よろしくお願い申し上げます。 1.条件分岐 整数d,xをキーボードから入力させ、 dとzの差の大きさ(絶対値)を計算し、結果を表示するプログラムを作りなさい。 2.繰り返し 整数qcをキーボードから入力させ、1からqcまでの整数を全て表示させるプログラムを作りなさい 3.式 式y=xの二乗+6x+10の値を、x=13から21まで、一つづつ変化させた時のyの値を表示しなさい。 4.和 1から58までの和1+2+3+….+58をプログラムを作って求めなさい。 5.乱数 乱数関数rnd()を使って、変数wgに0~383までの適当な数値を代入し、その結果を出力しなさい。 6.円を描く for文を使って、適当な位置に半径17の赤い円を、87個だけ描きなさい。 7.余り 変数qeに整数を入力させ、その変数qeが6で割り切れたら「割り切れる」と表示し、それ以外は「割り切れない」と表示するプログラムを作りなさい。 *ヒント %演算子で割った余りが求められる。 例えば、5%3は2となる。 8.break文 変数bjに0から1000までの乱数を作っては代入することを繰り返し、bjの値が900以上になったら繰り返しを止めて、bjの値を出力するプログラムを作りなさい。 9.カウント 1から1076までの整数の中で、8で割り切れる数がいくつあるかカウントしてその数を表示しなさい。 以上です。 どうかお助け下さいm(__)m

  • 3つほどプログラムをおしえてください。

    (1)100までの整数をいくつか入力し、10刻みでの個数を表示し、負の数が入力されると整数の入力を終わるプログラムです。各範囲の個数は配列に格納する。 実行結果 65 30 21 95 5 -1 0--- 9 : 1 10--- 19 : 0 20--- 29 : 1 30--- 39 : 1 40--- 49 : 0 50--- 59 : 0 60--- 69 : 1 70--- 79 : 0 80--- 89 : 0 90---100 : 1 (2)数字の文字列を入力し、その文字列に含まれる各数字(文字)'0','1',~'9'の個数を表示するプログラムの作成。 実行結果 1231234567 0: 0 1: 2 2: 2 3: 2 4: 1 5: 1 6: 1 7: 1 8: 0 9: 0 (3) 変数xは、0~1までの0.01刻みの値(101個)を取るとする。このとき、2次関数 f(x)=3x^2+2x+1の値が2.0<f(x)<3.0となるxの値をの個数を求めるプログラムの作成。ただし、xを引数としf(x)の値を返す関数を作成して、それを使用する。 実行結果 number=21 やってるうちにわけがわからなくなってしまいます。どなたかよろしくおねがいします。

  • switch文とwhile文を用いたプログラムに関して

    swich文とwhile文を用いたプログラムについて 授業の課題で、swich文とwhile文を用いたプログラムを作りなさい。いう課題が出ました。 5桁以上9桁以下の正の整数を入力し、4で割り切れたとき、何桁の数字かを出力。4でわって1余ったとき、すべての桁の合計を出力。3余ったとき、与えられた数の逆を変数に代入し、その変数を出力(単純に表示するわけではなく、数字として表示) といったものです。 途中からの授業参加で、C言語に関する知識はほとんどありません。do文を用いたプログラムは見つけれたのですが、while文とswich文を用いろということなので、do文は使えないです。 どなたか教えていただけませんか? 今日中にわからないとちょっとやばいです・・・。 よろしくお願いします

  • このプログラムみてもらえますか?

    課題は標準入力から正整数aを読み込み、aが素数であるか否か判定するプログラムを作れ、です。 #include <stdio.h> int main(void) { int a,b,c; for(;;){ printf("正整数を入力して下さい。\n"); scanf("%d",&a); c=a%b; for(b=2;b=a-1;b=b+1){ if(c==0) printf("素数でない。\n"); break; } printf("素数です。\n"); break; return(0); } } コンパイルはできますが、実行すると9が「素数です」と表示されます^^; よろしくおねがいします。

このQ&Aのポイント
  • PayPayで自動車税をクレジット払いする方法について解説します。
  • 自動車税をPayPayで支払うための手順や注意点をまとめました。
  • 自動車税の支払いにおいて、PayPay残高のみ利用できる制約が存在することについて説明します。
回答を見る