<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/digicre/">
    <title>デジクリwiki</title>
    <link>http://w.atwiki.jp/digicre/</link>
    <atom:link href="https://w.atwiki.jp/digicre/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>デジクリwiki</description>

    <dc:language>ja</dc:language>
    <dc:date>2011-08-06T10:48:22+09:00</dc:date>
    <utime>1312595302</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/digicre/pages/29.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/digicre/pages/28.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/digicre/pages/27.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/digicre/pages/26.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/digicre/pages/25.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/digicre/pages/24.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/digicre/pages/23.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/digicre/pages/22.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/digicre/pages/21.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/digicre/pages/20.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/digicre/pages/29.html">
    <title>プログラミン練習問題-解答</title>
    <link>https://w.atwiki.jp/digicre/pages/29.html</link>
    <description>
      [1]
(a)
&gt; PRINT 3+5
&gt; END

(b)
&gt; INPUT A
&gt; INPUT B
&gt; INPUT C
&gt; PRINT (A+B+C)/3
&gt; END

(c)
&gt; S=0
&gt; FOR I=1 TO 40
&gt;    LET S=S+2*I
&gt; NEXT I
&gt; PRINT S
&gt; END

(d)
&gt; INPUT N
&gt; LET F=1
&gt; FOR I=1 TO N
&gt;    LET F=F*I
&gt; NEXT I
&gt; END

[2]このプログラムはよく使うので覚えておきましょう。
例としてM=3,N=4が入っている状態にしておきます。
&gt; LET TEMP=M
&gt; LET M=N
&gt; LET N=TEMP

[3]
(1)xに非常に小さな数(0.00001など)を入れると考えます。
&gt; PRINT PRINT (1+0.00001)^(1/0.00001)
&gt; END

(2)
&gt; LET E=0
&gt; FOR I=0 TO 100000
&gt;    LET F=1
&gt;    FOR J=1 TO I
&gt;       LET F=F/J
&gt;    NEXT J
&gt;    LET E=E+F
&gt; NEXT I
&gt; PRINT E
&gt; END

(3)省略

(4)
&gt; LET E=1
&gt; LET A=1
&gt; FOR I=0 TO 100000
&gt;    LET A=A/(I+1)
&gt;    LET E=E+A
&gt; NEXT I
&gt; PRINT E
&gt; END
実行してみればわかりますが、(2)と(4)ではものすごく実行時間に差が出ます。FOR文の繰り返し回数をNとすれば、これのオーダが
(2):O(N^2)、(4):O(N)となることからも明らかではあります。    </description>
    <dc:date>2011-08-06T10:48:22+09:00</dc:date>
    <utime>1312595302</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/digicre/pages/28.html">
    <title>プログラミング練習問題</title>
    <link>https://w.atwiki.jp/digicre/pages/28.html</link>
    <description>
      プログラミング作成の練習問題集です。[[解答&gt;プログラミン練習問題-解答]]
[1]次の値を求め、表示するプログラムを作成せよ。なお、a,b,cおよびnが与えられたときはユーザに入力させるものとする。
#math(100){{{  
(a)3+5 \\
}}}
#math(100){{{
(b)a,b,c
}}}の最大値および平均値
#math(100){{{
(c)\sum^{40}_{k=1}2k 
}}}
#math(100){{{
(d)n!
}}}

[2]変数m,nに入っている値を交換するプログラムを作成せよ。

[3]自然対数の底eという値は、次の式で与えられる。
#math(100){{{  
e=\lim_{x \to 0}(1+x)^{1/x}
}}}
(1)この定義式を用いて、eの値を求めよ。

一方、eを底とする指数関数のマクローリン展開式にx=1を代入することで、eを次の値とも考えられる。
#math(100){{{  
e= \sum^{\infty}_{n=0} \frac{1}{n!}=\frac{1}{0!}+\frac{1}{1!}+\frac{1}{2!}+\frac{1}{3!}+\cdots
}}}
(2)この式によりeの値を求めよ。

さらに、
#math(100){{{  
a_{n+1}=\frac{1}{n+1}a_n (a_0=1)
}}}
なる数列{an}を定義すると、
#math(100){{{  
e=\sum^{\infty}_{n=0} a_n=a_0+a_1+a_2+\cdots
}}}
でeを考えることができる。ここで、{an}を配列変数を用いてすべて求めるのではなく、
#math(100){{{  
S_{n+1}=S_n+a_{n+1}
}}}
である、つまり変数aに入っている値を1/n+1倍したものを次に足していくと考えてeを求めることもできる。
(3)電卓のメモリー機能を用いて実際にeを求めよ(1 M+ M+ /2 M+ /3 M+ … RMのようにキーを押す)。
(4)この方法によりeの値を求めるプログラムを作成せよ。    </description>
    <dc:date>2011-08-06T10:29:34+09:00</dc:date>
    <utime>1312594174</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/digicre/pages/27.html">
    <title>『センターBASICの解き方』誤植</title>
    <link>https://w.atwiki.jp/digicre/pages/27.html</link>
    <description>
      現在判明している誤植を訂正します。

**p.17　選択肢[タ]→[タチ]

**p.33　解答：[カ]
7INT(Y) ではなく9INT(C) が正解です。ここにはいる処理は、Yの平方根を取った&amp;bold(){後に}その小数を切り捨てるものです。INT(Y)であればただ
#math(100){{a^2 + b^2}}
の整数部分のみを取り出すことになり不適です。&amp;bold(){後に}を満たすようにすると、INT(C)が正しい答えになります。

**p.21　「右図」について
掲載し損ねております。これは本wikiアルゴリズム集の台形積分のページの図と同じで
#ref(http://www35.atwiki.jp/digicre?cmd=upload&amp;act=open&amp;pageid=22&amp;file=graph.png)
です。

**p.21　厳密な数式
区分求積の厳密な数式を掲載し損ねております。これは
#math(200){{{  
\int_{0}^{1}} f(x) dx = \lim_{n \to \infty} \frac{1}{n} \sum^{n}_{k=1} f( \frac{k}{n} )
}}}
という数式です。    </description>
    <dc:date>2011-07-28T16:08:09+09:00</dc:date>
    <utime>1311836889</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/digicre/pages/26.html">
    <title>BASIC講座</title>
    <link>https://w.atwiki.jp/digicre/pages/26.html</link>
    <description>
      ここではセンター試験でも出題されるBASICについて扱います。

2011年度附高祭にて販売した『センターBASICの解き方』の補足、あるいはゲーム制作に用いるC言語への導入用の言語としての解説を行います。来年度に向けて『センターBASICの解き方』をベースにした新入会員教育用冊子『BASICによるプログラミング基礎』を編集予定。

実際に動作を確認するためのコンパイラとしては「10進BASIC(仮)」(http://hp.vector.co.jp/authors/VA008683/)を用いることをお勧めします。

-[[『センターBASICの解き方』誤植]]
-[[BASICの練習問題]]    </description>
    <dc:date>2011-07-27T20:22:25+09:00</dc:date>
    <utime>1311765745</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/digicre/pages/25.html">
    <title>アルゴリズム講座―バブルソート法</title>
    <link>https://w.atwiki.jp/digicre/pages/25.html</link>
    <description>
      最も基本的なソート法として、バブルソートがあります。これは、隣り合う2数をひたすら比べていって、「小さいほう,大きいほう」という並びになるように繰り返していくことでソートを実現します。
すなわち、比較を繰り返すことで最大値が右に来るようにするのです。

たとえば、&lt;5,8,1,4,7&gt;として
-最初の5,8は8のほうが大きいから&lt;5,8,1,4,7&gt;、次に8と1を比べて&lt;5,1,8,4,7&gt;、以下同様にして&lt;5,1,4,7,8&gt;
-残りの4つについて同様にする。最初の5,1は5のほうが大きいから&lt;1,5,4,7,8&gt;、以下同様に&lt;1,4,5,7,8&gt;
-残りの3つ、2つ、1つについても同様に行う。

では、実装してみてください。    </description>
    <dc:date>2010-10-02T17:42:53+09:00</dc:date>
    <utime>1286008973</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/digicre/pages/24.html">
    <title>アルゴリズム講座―挿入ソート法</title>
    <link>https://w.atwiki.jp/digicre/pages/24.html</link>
    <description>
      挿入ソートは、整列された配列に整列する要素を不変式を維持するように挿入していくソート法です。

たとえば、&lt;5,8,1,4,7&gt;として、
-まず別に用意された集合に対し先頭の5を入れて&lt;5&gt;&lt;8,1,4,7&gt;とします
-次に8を左の集合へ挿入して&lt;5,8&gt;&lt;1,4,7&gt;とします
-同様に&lt;1,5,8&gt;&lt;4,7&gt;→&lt;1,4,5,8&gt;&lt;7&gt;→&lt;1,4,5,7,8&gt;とします
とすることでソートを行います。

では、実装してみてください。    </description>
    <dc:date>2010-10-02T17:34:46+09:00</dc:date>
    <utime>1286008486</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/digicre/pages/23.html">
    <title>アルゴリズム講座―再帰関数</title>
    <link>https://w.atwiki.jp/digicre/pages/23.html</link>
    <description>
      再帰関数とは、自分自身を関数定義内で再び呼び出す関数のことです。言葉だと分かりにくいですので、代表的な例をいくつか挙げたいと思います。

**例1:階乗を求めるプログラム
n!を求めるプログラムです。普通に考えれば、繰り返し処理をしてやることでプログラムを組めますが、再帰関数を使って組むときは次のように考えます。
 n!はn×(n-1)!である
 (n-1)!は(n-1)×(n-2)!である
 …
 2!は2×1!である
 1!は1である
という風に考えて、自分自身を呼び出していきます。次のようになるでしょう(long intは整数型の大きなものです)。
 long factorial(int n){
 	long temp;
 	if(n==0||n==1) return 1;
 	temp = n*factorial(n-1);
 	return temp;
 }
重要なのは「factorial(n-1)」です。引数を(n-1)として自分を再帰的に、つまり自分で自分の関数を呼び出しています。

**例2:フィボナッチ数列を求める
フィボナッチ数列Fnは、
#center(){{{
$$F_0 =0,F_1 =1,F_{n} = F_{n-1} + F_{n-2}$$
}}}
という風に、n番目の数列の項に対し、&amp;u(){n-1番目とn-2番目の項を足したもの}という風に定義されます。ここから、次のようにプログラムを組むことで任意番目のフィボナッチ数列を求めることができます。
 int fibonacci(int n){
 	if(n=0)return 0;
 	if(n=1)return 1;
 	return fibonacci(n-1)+fibonacci(n-2);
 }

**例3:一般の漸化式の項を求める
例1,例2のように、前の項が決まることで次の項が決まる数列の定義の仕方を漸化式と言います。ここでは、
#center(){{{
$$a_1=a, a_n+1=pa_n+q (p,q:const.)$$
}}}
となる数列a_nを求めてみましょう(これの一般項の求め方は高校数学Bで習ってください)。
 int n_seq(int n,int a,int p,int q){
 	i    </description>
    <dc:date>2010-09-21T21:48:51+09:00</dc:date>
    <utime>1285073331</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/digicre/pages/22.html">
    <title>アルゴリズム講座―台形近似積分</title>
    <link>https://w.atwiki.jp/digicre/pages/22.html</link>
    <description>
      コンピュータに積分をさせるとなると、(積分公式は使えないので)やはり近似的な方法を使うことになります。代表的な方法として
-長方形近似法
-台形近似法
-シンプソン法
という方法が知られています。ここでは、台形近似による積分を扱います。

まず根本的に、どういう風に処理させるかを考えます。これは、非常に積分にとって原始的な方法をとることになります。すなわち、グラフを非常に小さく区切り、それぞれの区切られた区間の面積を求めていくことで実現します。以下の赤い部分ようなイメージです。
#ref(graph.png)
台形近似法では、これを台形に見立てて、その面積を足していく方針で積分を行います。

では、台形積分をする関数trap_integ(double (*func)(double a),double low,double high,double h)です。
 仕様
 機能:渡されたポインタの関数について、与えられた区間内で台形近似による積分を行います。
 引数:double (*func)(double a)…引数にdouble型を一つ、返値がdouble型の、積分を行う関数へのポインタ
  　　low…積分を行う区間の最低値
  　　high…積分を行う区間の最高値
  　　h…台形の高さをhにして計算します
 返値:積分をした計算結果を返します

 double integ(double (*func)(double a),double low,double high,double h){
 	double x,result;
 	for(x=low;x&lt;=high;x+=h){
 		result+=((*func)(x+h)+(*func)(x))*h/2;
 	}
 	return result;
 }

使用例です。ここでは、f(x)=3x^2の0～2の区間について積分を行います。上の関数と一緒に書いて実行してみてください(ちなみに理論値は8、h=0.00001くらいにすると結果も8.000000になる)。
 #include &lt;stdio.h&gt;
 
 double function(double);
 
 int main(void){
 	printf(&quot;%lf\n&quot;,integ(fu    </description>
    <dc:date>2010-09-21T16:15:37+09:00</dc:date>
    <utime>1285053337</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/digicre/pages/21.html">
    <title>おまけ集―素数判定プログラム</title>
    <link>https://w.atwiki.jp/digicre/pages/21.html</link>
    <description>
      素数かどうかを判定する関数d_primeです。このプログラムでは単純に
+与えられたnに対し2～n-1までの数で割ってみて、割り切れなければ素数
という方法で判定します。

&gt; int型関数d_prime(int num)の仕様
&gt; 機能:与えられた値numが、素数であるとき1、そうでないとき0を返します。
&gt; 引数:int型num…素数かどうか判定したい数をいれる
&gt; 返値:numが素数のとき　　:1
&gt;           素数でないとき:0

&gt; int d_prime(int num){
&gt; 	int i;
&gt; 	for(i=2;i&lt;num;i++){
&gt; 		if(num%i==0) return 0;
&gt; 	}
&gt; 	return 1;
&gt; }

利用例です。これでは、入力された値までで、素数であるものを全て表示するプログラムです。0は偽、それ以外は真であるというC言語の仕様も利用したプログラムになっています。
上の関数と一緒に書いて、実行してみてください。
&gt; #include &lt;stdio.h&gt;
&gt; 
&gt; int main(void)
&gt; {
&gt; 	int check_n,i;
&gt; 	printf(&quot;判定する数を入力してください\n&quot;);
&gt; 	scanf(&quot;%d&quot;,&amp;check_n);
&gt; 	for(i=2;i&lt;=check_n;i++){
&gt; 		if(d_prime(i)) printf(&quot;%d &quot;,i);
&gt; 	}
&gt; 	printf(&quot;以上です\n&quot;);
&gt; 	
&gt; 	return 0;
&gt; }    </description>
    <dc:date>2010-09-17T20:49:00+09:00</dc:date>
    <utime>1284724140</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/digicre/pages/20.html">
    <title>アルゴリズム講座―選択ソート法</title>
    <link>https://w.atwiki.jp/digicre/pages/20.html</link>
    <description>
      選択ソート法とは、
&gt;選択ソート (selection sort) は、ソートのアルゴリズムの一つ。
&gt;配列された要素から、最大値やまたは最小値を探索し配列最後の要素と入れ替えをおこなうこと。
&gt;最悪計算時間がO(n^2)と遅いが、アルゴリズムが単純で実装が容易なため、しばしば用いられる。
&gt;　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　―Wikipedia『選択ソート』
要するに、
+ソートする変数のうち最大(最小)のものを見つける
+最大(最小)の変数と最後(最初)の変数を交換
+残りの変数についてもこれを繰り返す
でソートを実現します。大きい数は後ろに来るから、その中で一番のものを後ろに持っていき続けたら並ぶというわけです。

例えば、a[5]={5,8,1,4,7}とします。このとき、
-まず{5,8,1,4,7}で最大の8と、一番後ろの7を交換して{5,7,1,4,8}とします。
-次に、最後に持っていった8以外の数で最大の7と、後ろから2つめの4を交換して{5,4,1,7,8}とします。
-また次に、残りの3つから最大の5と、一番後ろの1を交換して{1,4,5,7,8}とします。
これで終了です(実際は最後の2つについても判定をしますが)。

では、実装してみてください。    </description>
    <dc:date>2010-10-02T17:35:15+09:00</dc:date>
    <utime>1286008515</utime>
  </item>
  </rdf:RDF>
