• ベストアンサー

お願いします

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;    } } }

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.7

>必要最小限の変数の・・ >名前替えだけが許されるという条件  少なくとも、「変数」は、スコープ内及び関数の引数で、宣言されていないと「エラー」だよね。  (「グローバル」略)   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 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

inouegaku
質問者

お礼

yama5140さん、本当にお礼を申し上げます。たいへん助かりました、いい参考になります。どうもありがとうございます。

その他の回答 (8)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.9

や, その No6 は #6 で示唆されるものではないと思いますよ>#7. 少なくとも私の思い付いたものとは違います. そもそも元の c と機能が違いますよね. 最後が....

inouegaku
質問者

お礼

どうもありがとうございました、いい参考になります。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.8

おー, 確かに 3個だ>#6. そうする手があったかぁ. もっと強い条件で考えてた.... ああ, いずれにしても「変数の名前替え」という言葉の意味に依存します. そういえば誰も書いてないけど, 「関数 f の働きを変えずに」ってのは, 「引数 x に対して返される値が変化しないように」ってことです. 元の関数 c で (あれ?) 引数 x に対して返り値がどうなるか分かりますか? って, こっちの線から行くと最初に考えてた「1個少ない方法」にいっちゃうんだよなぁ.... う~ん, なかなか誘導も難しい....

inouegaku
質問者

お礼

どうもありがとうございました、いい参考になります。

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.6

>#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文字、変数名を変更すれば、良いと思います。

inouegaku
質問者

お礼

どうもありがとうございました、いい参考になります。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

「名前替え」の意味が微妙. それが最小という解釈も可能だし, 「もっと少ない方法がある」という解釈も可能. (解釈次第で) 1個少ない方法はありうるけど, もっと減らす方法はありますか?>#1

inouegaku
質問者

お礼

どうもありがとうございました、いい参考になります。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

>{ int x; x = 6; t = x + t + 12; } >の(int x)を(int t) に変更して とのことでありますが、引用した上の行には (int x) という箇所がありません。よって、 (int t) に変更することができません。 出題者に確認することをおすすめします。 # 何だか変な問題 :)

inouegaku
質問者

補足

asuncionさん、{ int x; x = 6; t = x + t + 12; }中のint x を int t に変更すること。

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.3

*4行目*のint xをint tに変えろってコトだから、正しいと思うけど。。 ()は関係ないと思われます。 ちゃんと4行目の元のtをyに変えてるしね。

inouegaku
質問者

補足

そうです、tをyに変更する。

  • 1108435
  • ベストアンサー率43% (94/217)
回答No.2

(int x)ってどこのことだと思う? (int x)が明記されているのは1箇所だよね。違うところ見てない?

inouegaku
質問者

補足

申し訳ございません、確か私は書き間違いました。上の関数の変数の名前替えだけが許されるという条件の下で,関数f の働き(すなわち,引数と戻り値の関係)を変えずに,上記の関数定義の4行目 { int x; x = 6; t = x + t + 12; } のint x を int t に変更して.必要最小限の変数の名前替えを施した関数定義を書け.

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

「必要最小限」というと、もっと「変数の名前替え」の少ない解があるみたいですね。

関連するQ&A