• ベストアンサー

プログラムです。

 次のプログラムは何をするものでしょうか?ただし、自然数が入力されるそうです。   program test(input,output) var i,j,n:integer; begin read(n); s:=0; i:=1; j:=1; while i <=n do begin s:=s+j*i i:=i+1; j:=j*(-1) end writeln('n=' ,n:3,' のときs=',s:5) end 宜しくお願いします。

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

  • ベストアンサー
  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.5

皆さんの回答が、ヒントだけ差し上げようというご配慮からだと思いますが、細切れになっちゃったみたいなので、僭越ながら。 Pascalにしちゃ、セミコロンが抜けてたりピリオドが無かったりしますけど、まいいか。 Assertionという考え方を使います。Assertionってのは「文と文の間で成り立っている論理式」のことです。 {nは自然数} s:=0; i:=1; j:=1; {s=0, i=1, j=1, nは自然数} while i <=n do {i≦n, nは自然数} begin s:=s+j*i i:=i+1; j:=j*(-1) end {i>n, nは自然数} まずここまでは自明でしょう。  次にループの中では invariant assertion、つまり繰り返し中いつでも成り立つ論理式を考える。ここで、 i:=i+1; のような代入は、繰り返しの回数を数えるカウンターmを追加して i(m):=i(m-1)+1; という意味だと解釈してやります。すると s:=0; i:=1; j:=1; m:=0; {s(0)=0, i(0)=1, j(0)=1, m=0,nは自然数} while i <=n do {i(m)≦n,nは自然数} begin m:=m+1 s:=s+j*i i:=i+1; j:=j*(-1) {nは自然数, s(m)=s(m-1)+j(m-1)*i(m-1), i(m)=i(m-1)+1, j(m)=-j(m-1)} end さて、 i(0)=1, i(m)=i(m-1)+1 より i(m) = m+1 であることが分かります。 それから j(m) = (-1)^m も自明ですね。従って {s(0)=0, i(0)=1, j(0)=1, m=0,nは自然数} while i <=n do {i(m)≦n,nは自然数} begin m:=m+1 s:=s+j*i i:=i+1; j:=j*(-1) {nは自然数, s(m)=s(m-1)+((-1)^(m-1))*m, i(m)=m+1, j(m)= (-1)^m} end  いよいよミソの部分ですが、 s(0)=0 s(m)=s(m-1)+((-1)^(m-1))*m という漸化式ですから、 s(m)= Σ((-1)^(k-1))*k (Σはk=1,2,....,m) です。だから、 {s(0)=0, i(0)=1, j(0)=1, m=0,nは自然数} while i <=n do {i(m)≦n,nは自然数} begin m:=m+1 s:=s+j*i i:=i+1; j:=j*(-1) {nは自然数,s(m)= Σ((-1)^(k-1))*k (Σはk=1,2,....,m), i(m)=m+1, j(m)=(-1)^m} end そしてループを抜けた時には i(m)>n が初めて成り立った訳です。そしてnは自然数なので、m=n だと分かります。ゆえに、 end {s(n)= Σ((-1)^(k-1))*k (Σはk=1,2,....,n), i(n)=n+1, j(n)=(-1)^n),} writeln('n=' ,n:3,' のときs=',s:5) ということ。で、writelnで使うのはnとsだけですんで、i,jはどうでも良い。かくて nと、Σ((-1)^(k-1))*k(Σはk=1,2,....,n) が印刷されることになる。 さて次に、s(n)は s(n)=Σ((-1)^(k-1))*k(Σはk=1,2,....,n)=1-2+3-4+......n という和です。2項づつ組にしてみると ●nが偶数の時  s(n) = (1-2)+(3-4)+....+((n-1)-n) = (-1)+(-1)+....+(-1) = -(n/2) ●nが奇数の時  s(n) = 1+(-2+3)+(-4+5)+.....+(-(n-1)+n) = 1+1+....+1 = (n+1)/2 だから、 nが偶数ならs(n) = -(n/2) nが奇数ならs(n) = (n+1)/2 このs(n)が印刷されるということ。

goosasuke
質問者

お礼

非常に細かく、ありがとうございました。 とても参考になりました。

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

その他の回答 (4)

  • tiezo-
  • ベストアンサー率41% (13/31)
回答No.4

入力したnに対して  S=1-2+3-4+5-....+((-1)^(n-1))*n を出力させるプログラムでしょう 結果は、  1,-1,2,-2,3,-3,4,-4,5,-5.... となります。

すると、全ての回答が全文表示されます。
  • brogie
  • ベストアンサー率33% (131/392)
回答No.3

Pascalのプログラムですね、小生はパスカルは知りませんが、Cを長くやっていますので大体のことは分かりますので、各行の説明を書いておきます。   program test(input,output)  プログラム名 var i,j,n:integer;   変数宣言:整数 begin        プログラムの始まり read(n);      データnの読み込み s:=0;         sに0を代入(初期化) i:=1;         iに1を代入 j:=1;         jに1を代入 while i <=n do   iがn以下なら繰り返せ begin        繰り返しの始まり s:=s+j*i       sにjとiを掛けてsに代入 i:=i+1;        iを1増加させる j:=j*(-1)      jの符号を変える(正なら負へ、負なら正へ) end         繰り返しの終わり writeln('n=' ,n:3,' のときs=',s:5)   出力する。nは3桁、sは5桁で。 end         プログラムの終わり nに5を入力したときは、s、i、jは次のように変化していきます。nは変化しません。 s=0 i=1 j=+1 iは1つづつ増加していき、 jは-1と+1交互に変化します。 前の値がsの計算に使用されます。 s=s+j*i=0+1*1=1 i=i+1=1+1=2 j=j*(-1)=1*(-1)=-1 s=s+j*i=1+(-1)*2=-1 i=i+1=2+1=3 j=j*(-1)=(-1)*(-1)=+1 s=s+j*i=-1+(+1)*3=2 i=i+1=3+1=4 j=j*(-1)=(+1)*(-1)=-1 s=s+j*i=2+(-1)*4=-2 i=i+1=4+1=5 j=j*(-1)=(-1)*(-1)=1 s=s+j*i=-2+(-1)*(-2)=0 i=i+1=2+1=6 j=j*(-1)=(+1)*(-1)=1 iがn=5以下でないから繰り返しから脱出する。 writeln('n=' ,n:3,' のときs=',s:5) これにより、次のように出力されます。 n=  5のときs=   0  パスカルは知りませんので、自信なしです。

goosasuke
質問者

お礼

 繰り返しのところでつまずいていたのだとわかりました。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • inetd
  • ベストアンサー率23% (43/184)
回答No.2

それは見るからに PASCAL (あるいは Windows の Delphi や Linux の Kylix でコンパイル可能な言語) だと思うんですが、そうですよね? で、そうだとして、PASCAL の文法はどこまでわかってますか? たとえば i := i + 1; に関してはなにを意味するかわかってますか? もしこのレベルがわからないとすると入門書を読んだ方が早いと 思います。そのレベルの事から全てをここで説明すると長くなり 過ぎると思うので、私には書く気力が起きません。

すると、全ての回答が全文表示されます。
  • may-may-jp
  • ベストアンサー率26% (324/1203)
回答No.1

キーになるのはwhile構文でしょう。 whileは繰り返しです。 この場合、while i<=n doですから、i≦nのとき以下のことを実行する、ということでしょう。 その他のところはお分かりでしょうか。

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

関連するQ&A