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

 次のプログラムは何をするものでしょうか?ただし、自然数が入力されるそうです。
  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

宜しくお願いします。

A 回答 (5件)

キーになるのはwhile構文でしょう。



whileは繰り返しです。
この場合、while i<=n doですから、i≦nのとき以下のことを実行する、ということでしょう。

その他のところはお分かりでしょうか。
    • good
    • 0

それは見るからに PASCAL (あるいは Windows の Delphi や Linux の


Kylix でコンパイル可能な言語) だと思うんですが、そうですよね?

で、そうだとして、PASCAL の文法はどこまでわかってますか?
たとえば i := i + 1; に関してはなにを意味するかわかってますか?
もしこのレベルがわからないとすると入門書を読んだ方が早いと
思います。そのレベルの事から全てをここで説明すると長くなり
過ぎると思うので、私には書く気力が起きません。
    • good
    • 0

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 

パスカルは知りませんので、自信なしです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/02/14 04:17

入力したnに対して


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

皆さんの回答が、ヒントだけ差し上げようというご配慮からだと思いますが、細切れになっちゃったみたいなので、僭越ながら。



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)が印刷されるということ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/02/14 04:14

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