OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

プログラムです。

  • 困ってます
  • 質問No.216823
  • 閲覧数41
  • ありがとう数4
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 59% (35/59)

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

宜しくお願いします。
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.5
レベル14

ベストアンサー率 57% (1014/1775)

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

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

お礼率 59% (35/59)

非常に細かく、ありがとうございました。
とても参考になりました。
投稿日時 - 2002-02-14 04:14:38
-PR-
-PR-

その他の回答 (全4件)

  • 回答No.1
レベル13

ベストアンサー率 26% (324/1203)

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

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

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


  • 回答No.2
レベル10

ベストアンサー率 23% (43/184)

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

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

ベストアンサー率 33% (131/392)

Pascalのプログラムですね、小生はパスカルは知りませんが、Cを長くやっていますので大体のことは分かりますので、各行の説明を書いておきます。   program test(input,output)  プログラム名 var i,j,n:integer;   変数宣言:整数 begin        プログラムの始まり read(n);      データnの読み込み s:=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 

パスカルは知りませんので、自信なしです。
お礼コメント
goosasuke

お礼率 59% (35/59)

 繰り返しのところでつまずいていたのだとわかりました。
ありがとうございました。
投稿日時 - 2002-02-14 04:17:16
  • 回答No.4
レベル8

ベストアンサー率 41% (13/31)

入力したnに対して  S=1-2+3-4+5-....+((-1)^(n-1))*n を出力させるプログラムでしょう 結果は、  1,-1,2,-2,3,-3,4,-4,5,-5.... となります。
入力したnに対して
 S=1-2+3-4+5-....+((-1)^(n-1))*n
を出力させるプログラムでしょう
結果は、
 1,-1,2,-2,3,-3,4,-4,5,-5....
となります。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ