- ベストアンサー
お願いします
int c(int x) { x = x + 3; { int t; t = 6; { int x; x = 6; t = x + t + 12; } return x + t; } } 上の関数の変数の名前替えだけが許されるという条件の下で,関数f の働き(すなわち,引数と戻り値の関係)を変えずに,上記の関数定義の4行目 { int x; x = 6; t = x + t + 12; } の(int x)を(int t) に変更して.必要最小限の変数の名前替えを施した関数定義を書け. 私はこのように定義していますので、正しいですか、「関数の変数の名前替えだけが許されるという条件の下で,関数f の働き(すなわち,引数と戻り値の関係)を変えずに」ってあまり理解できてないので、ご教授お願いいたします。 int c(int x) { x = x + 3; { int y; y = 6; { int t; t = 6; y = t + y + 12; } return x + y; } } }
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
>必要最小限の変数の・・ >名前替えだけが許されるという条件 少なくとも、「変数」は、スコープ内及び関数の引数で、宣言されていないと「エラー」だよね。 (「グローバル」略) int err( int x ) // エラー { x = x + 3; { int x; x = 6; { int t; t = 6; t = x + t + 12; } return x + t; この t は、「未定義のシンボル」。 } } また、 int w( int x ) // エラーではないが・・ { x = x + 3; { int t; t = 6; { int t; x = 6; t = x + t + 12; } return x + t; } } とすると、return 文直前の波括弧(スコープ)内の、x = 6; は、スコープを出ても有効だが、t = x + t + 12; は★このスコープ内でのみ★有効。 この辺りを考えると、「答え」が出るかと思います。 また、質問主旨とは離れます( t → a )が、下の関数 f() と q() の実行結果をみても何かが判るのでは・・。 ☆少なくとも「エラー」は、コンパイラが教えてくれるから、好きにいじくってみるのがよいかと・・。 >私はこのように定義していますので、正しいですか、 ☆「関数 f の働きを変えず」は、実行すれば確認できます。 当然、「必要最小限の変数の名前替え」かどうかは判りません・・。 #include <stdio.h> int f( int x ) { x = x + 3; { int t; t = 6; { int x; x = 6; t = x + t + 12; } return x + t; } } int w( int x ) // エラーではないが・・ { x = x + 3; { int t; t = 6; { int t; x = 6; t = x + t + 12; } return x + t; } } int q( int x ) { x = x + 3; { int t; t = 6; { int a; a = 6; t = a + t + 12; } return x + t; } } int c( int x ) // 質問者様 { x = x + 3; { int y; y = 6; { int t; t = 6; y = t + y + 12; } return x + y; } } int No6( int x ) // No.6 様 { x = x + 3; { int t; t = 6; { int t; t = 6; t = t + t + 12; } return x + t; } } int main() { for( int i = -5; i < 6; i++ ){ printf( "%2d f %2d, w %2d, q %2d, c %2d, No6 %2d\n", i, f( i ), w( i ), q( i ), c( i ), No6( i ) ); } return( 0 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
その他の回答 (8)
- Tacosan
- ベストアンサー率23% (3656/15482)
や, その No6 は #6 で示唆されるものではないと思いますよ>#7. 少なくとも私の思い付いたものとは違います. そもそも元の c と機能が違いますよね. 最後が....
お礼
どうもありがとうございました、いい参考になります。
- Tacosan
- ベストアンサー率23% (3656/15482)
おー, 確かに 3個だ>#6. そうする手があったかぁ. もっと強い条件で考えてた.... ああ, いずれにしても「変数の名前替え」という言葉の意味に依存します. そういえば誰も書いてないけど, 「関数 f の働きを変えずに」ってのは, 「引数 x に対して返される値が変化しないように」ってことです. 元の関数 c で (あれ?) 引数 x に対して返り値がどうなるか分かりますか? って, こっちの線から行くと最初に考えてた「1個少ない方法」にいっちゃうんだよなぁ.... う~ん, なかなか誘導も難しい....
お礼
どうもありがとうございました、いい参考になります。
- Yanch
- ベストアンサー率50% (114/225)
>#5さんへ > 「名前替え」の意味が微妙. > それが最小という解釈も可能だし, 「もっと少ない方法がある」という解釈も可能. > (解釈次第で) 1個少ない方法はありうるけど, もっと減らす方法はありますか?>#1 1:int c(int x) 2: { x = x + 3; 3: { int t; t = 6; 4: { int x; x = 6; t = x + t + 12; } 5: return x + t; 6: } 7:} として、 問題にある、 ●1箇所目 4行目の「int x」を「int t」に変更。問題の通り。 を含めて、3文字、変数名を変更すれば、良いと思います。
お礼
どうもありがとうございました、いい参考になります。
- Tacosan
- ベストアンサー率23% (3656/15482)
「名前替え」の意味が微妙. それが最小という解釈も可能だし, 「もっと少ない方法がある」という解釈も可能. (解釈次第で) 1個少ない方法はありうるけど, もっと減らす方法はありますか?>#1
お礼
どうもありがとうございました、いい参考になります。
- asuncion
- ベストアンサー率33% (2127/6289)
>{ int x; x = 6; t = x + t + 12; } >の(int x)を(int t) に変更して とのことでありますが、引用した上の行には (int x) という箇所がありません。よって、 (int t) に変更することができません。 出題者に確認することをおすすめします。 # 何だか変な問題 :)
補足
asuncionさん、{ int x; x = 6; t = x + t + 12; }中のint x を int t に変更すること。
- phoenix343
- ベストアンサー率15% (296/1946)
*4行目*のint xをint tに変えろってコトだから、正しいと思うけど。。 ()は関係ないと思われます。 ちゃんと4行目の元のtをyに変えてるしね。
補足
そうです、tをyに変更する。
- 1108435
- ベストアンサー率43% (94/217)
(int x)ってどこのことだと思う? (int x)が明記されているのは1箇所だよね。違うところ見てない?
補足
申し訳ございません、確か私は書き間違いました。上の関数の変数の名前替えだけが許されるという条件の下で,関数f の働き(すなわち,引数と戻り値の関係)を変えずに,上記の関数定義の4行目 { int x; x = 6; t = x + t + 12; } のint x を int t に変更して.必要最小限の変数の名前替えを施した関数定義を書け.
- Yanch
- ベストアンサー率50% (114/225)
「必要最小限」というと、もっと「変数の名前替え」の少ない解があるみたいですね。
お礼
yama5140さん、本当にお礼を申し上げます。たいへん助かりました、いい参考になります。どうもありがとうございます。