プロが教えるわが家の防犯対策術!

以下のプログラムを実行したとき、表示される値を余白に記述せよ。ただし、配列idataは1000番地から格納されているとする。また、表示結果*8**~*10**の箇所で、正しく計算された値のみ表示させるには、maxはいくらに設定すればよいか。という課題なんですが、実際にプログラムを作ってみてmaxの箇所を4にしてみたところ間違いと言われたので正しいmaxの値を教えて下さい。

#include<stdio.h>
int main(void)
{
int iv,idata[]={2,4,6,8,10,12},*ip,i,max;

iv=idata[0];
printf("*1*ivの値=%d\n",iv);
ip=&idata[0];
printf("*2*ipの値=%p\n",ip);
ip=&idata[1];
printf("*3*ipの値=%p\n",ip);
ip=&idata[2];
printf("*4*ipの値=%p\n",ip);

iv=*ip;
printf("*5*ivの値=%d\n",iv);
iv=*ip+3;
printf("*6*ivの値=%d\n",iv);
iv=*(ip+3);
printf("*7*ivの値=%d\n",iv);

max=4;

*ip=0;
for(i=0;i<max;i++){
printf("*8**(ip+%d)=%d\n",i,*(ip+i));
}
*(ip+1)=10;
for(i=0;i<max;i++){
printf("*9**(ip+%d)=%d\n",i,*(ip+i));
}
*(ip+3)=20;
for(i=0;i<max;i++){
printf("*10**(ip+%d)=%d\n",i,*(ip+i));
}

ip=&idata[0];
printf("*11*ipの値=%p\n",ip);
ip=ip+2;
printf("*12*ipの値=%p\n",ip);

iv=*ip+3;
printf("*13*ipの値=%d\n",iv);
iv=*(ip+3);
printf("*14*ivの値=%d\n",iv);
++ip;
printf("*15*ipの値=%p\n",ip);
}

ヒントは”正しく計算された値のみ”という部分らしいのですが、自分にはまったく分りませんでした。

A 回答 (7件)

>maxの箇所を4にしてみた



なぜ、そのようにしてみましたか?
    • good
    • 0

そうですね、実際に動かしてみて、max は4だと思ったと言うことですから、「なぜ4だと思ったのか」言い換えると、3や6やそのほかだと、どうなったから、だめだと思ったかと、その説明がまず必要かなと思います。



実際、8~10 の部分、値も表示されていますから、それがどこから来たのかわかれば、実際にやってみるでも、多分、正しい値に到達するでしょう。

この回答への補足

根拠はないんですが、解答欄が小さかったのであまり大きな数値を入れてしまうと書ききれないからです。

補足日時:2010/12/08 21:57
    • good
    • 0

> 根拠はないんですが、解答欄が小さかったのであまり大きな数値を入れてしまうと書ききれないからです。



質問にある「実際にプログラムを作ってみてmaxの箇所を4にしてみた」は嘘だったのですか?
本当は、「やってみて正しいそうな結果になった数値」じゃ良くはないのですが、解答欄に「4」と書けたというのなら、少なくとも、一桁の数字は候補になるわけですよね。

せめて「実際にプログラムを作ってみて」試してみましょう。
その後、なぜそうなるのか考えるのでも良いかもしれません。
    • good
    • 0

「正しく計算された値」というからには


・何らかの計算があって
・「正しく計算された値かどうか」が判定できる
ということか? そもそも「何を計算したのか」すら, 問題からは読み取れんのだが....
    • good
    • 0

要するに、8~10で、idataのサイズをはみ出さずに、正しくidataを表示するポインタip+iの最大のiが


いくつなんだと言っているんじゃないかと。
8~10の前でipを最後に決めたのは、ip=&idata[2]
だから、ipは3番目の要素を指している。それから4つ増えれば、要素はないから、増やせるのは3まで。
for(i=0;i<max;i++)
といっているから、max=4でいいと思うが、誰に「間違いと言われた」のだろう。

あと、なにも計算していないから、思い当たる節はないな。

「表示される値を余白に記述せよ」というのが間違っていたりしないだろうね。

*1*ivの値=2
*2*ipの値=1000
*3*ipの値=1004
*4*ipの値=1008
*5*ivの値=6
*6*ivの値=9
*7*ivの値=12
*8**(ip+0)=0
*8**(ip+1)=8
*8**(ip+2)=10
    • good
    • 0

やはり「正しく計算された値のみ表示させる」が理解不能です。



理屈から言えば、 このプログラムでmaxにどんな値(負が入ると、forループが1つも回らないのでだめですが)が入っても、 *(ip+i)自体は「正しく計算」されます。
意味不明な値だとしても、 ip+iのアドレスにあるデータを(int型と解釈して)正しく取り出したものです。
ip+iがアクセスできないアドレスになって、*(ip+i)で領域エラーになる、ということはあるかもしれませんが、計算自体が違うわけではないし。

通常の使い方で考えれば、idataの最後の要素まで、ということになります。
が、それだとmax=4で正しいはずです。

特定の環境に限れば
> int iv,idata[]={2,4,6,8,10,12},*ip,i,max;
と宣言すると、連続した領域に確保されるので、 変数maxのアドレスまでは確実にアクセスできる.....という考えも可能ですが、違う環境では成り立ちません。


> for(i=0;i<max;i++){
この i<maxが i<=max が正しい、とかは無いですよね?

「値は4で正しいけど、それの根拠がわかってないから『間違い』」とされてしまった、ということは無いですよね?
    • good
    • 0

No. 2です。



あらら~

> 8~10の前でipを最後に決めたのは、ip=&idata[2]

というのを完全に見落としていました。
このコードの通りなら、max = 4; で良さそうですけどね。
でも、せっかくですから、ここを変えると何が起こるか試すのは無駄ではないとは思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!