名前: 吉田 日時: 2002-09-01 11:39:56 IPアドレス: 61.195.112.*
>>10545 他には、エラーが出てるかどうかはわからないんですが、入力ファイルをのせました。 よろしくお願いします。 \documentclass{jarticle} \begin{document} \date{} \section{課題内容} ファイルから数字を配列に読み込み、その数字を降順に並べ替え、並べ替え終わった 配列の要素をファイルに出力するプログラムを3つ作成することが、課題である。 ここで、ソーティングアルゴリズムとして、以下のものがある。 \begin{enumerate} \item 最小値選択法 \item 単純挿入法 \item 単純交換法(バブルソート) \item マージソート \item クイックソート \item シェルソート \item シェーカーソート \item ヒープソート \end{enumerate} そこでこの8つのうち、\textbf{1最小値選択法}、\textbf{3単純交換法(バブルソート)}、\textbf{5クイックソート}を用い プログラムを作成した。そして、それぞれに手続きもしくは関数を用いた。 \section{最小値選択法を用いたプログラムの説明} \subsection{テキストファイルについて} まず、数字が入力されているファイルをpresort出力するファイルをpostsort とする。ここで、これらのテキストファイルもデータの1つとして考え、その データ型を\textit{text}と書く。プログラムの中では、テキストファイルその ものも変数として扱うため、他の変数と同じように宣言する。 \subsection{テキストファイルの入出力について} PASCALでは、ファイルの入出力を、そのファイルの先頭から順に読むこと、 書くことを制限されている。そこで、以下のような繰作がある。 \begin{enumerate} \item reset(f) 読む箇所をファイルfの先頭に戻し以後読み取りを行う。 \item rewrite(f) 書く箇所をファイルfの先頭に戻して以後書き出しを行う。 \end{enumerate} また、ファイルそのものにも終わりがある。そこで、以下の関数が用意されている。 \begin{enumerate} \item eof(f) fがファイルの終わりに達しているかを示す。 \end{enumerate} \subsection{配列について} ここで、並べ替える数字は30個以内の整数であり、これを\textbf{配列}(array)という ものを用い並べ替えるわけであるが、配列とは、個々の変数を番号で選びだせる 仕掛けであり、配列の中の、番号で選び出せる個々の変数をその配列の\textbf{要素} という。そこで、配列にも名前をつける。これをxとした時、配列の要素は x[1],x[2],…と表せる。 \subsection{手続きについて} 簡単のために手続きというものを用いるが、ひとまとまりの作業に名前を 付けたものを\textbf{手続き}(procedure)という。その名前を\textbf{手続き名} という。そして、手続きを使うときに添える情報を\textbf{引数}という。 このとき手続きは\\手続き名[(引数1、引数2…)]と表せる。 \subsection{最小値選択法について} 最小値選択法とは、ある配列の要素があり、それより大きい番号の配列の要素 を順番に比べていき、もし後者のほうが小さければ前者といれかえていき、それ が最後の番号の配列の要素まで終われば、また前者より1つ大きな番号の配列 の要素について同様の作業を行っていくアルゴリズムである。 \\例えば、n個の整数についてこれを行うとする。そこで、x[i]について考えると x[i+1],x[i+2],…x[n]について大小を比べていき、もし、x[i]>x[i+2]と なっている時x[i]とx[i+2]の配列の要素をいれかえ、またx[i]とx[i+3]と 比べていきx[n]まで続け、その後x[i+1]とx[i+2],x[i+3]…x[n]と続けていく。 \\例 \subsection{数を入れ替える手続きについて} 先に述べたように最小値選択法では、数を入れ替える必要がある。ここではそれ を手続きを用いて行った。ここで、aの値をb、bの値をaとすることを考えた 時、単純にa=b,b=aとしてはいけない。なぜなら、a=bとした時にaの値は、b なのだから、b=aとしてもbの値は入れ替わらない。だから、もう1つ数を 用意する。これをcとするなら、いったんaの値をcに移してaの値をbとして、 その後bの値をcとすれば2つの数は入れ替わる。 \section{プログラムリストの説明} 1行目は、プログラム名と入出力をおこなうファイル名。 2行目から4行目までは変数の宣言で、2行目でテキストファイル、3行目で配列 の宣言を行っている。\\5行目から11行目までは、\textbf{2.6}で述べた2つの数を 入れ替える手続きを行っている。\\12行目から20行目までは、最小値選択法を 行う手続きが行われている。17行目に\textbf{2.5}で述べたことが行われ ており、x[k]とx[j]の大小が比べられる。ここで、降順に並べ替えられること を考えてx[k]<x[j]の時入れ替えが行われるようにする。ここにでてくるmは 配列に読み込まれる数の個数である。\\21行目からプログラムが始まり、22行目 で、読み取りを行うファイルの読み込む場所を先頭に移している。\\24行目 から27行目までで、presortに入力されている数を配列に読み込んでいる。 while文は、while 条件 do 文という形をとり、not eof(presort)でpresort のファイルの終わりを全て読み込むまで繰作を続ける命令を出せる。この時 配列に読み込まれた数の個数はi個である。\\そして28行目でi個の数に対して 最小値選択法を用い数を降順に並べ、29行目で出力するファイルの書き込まれる 場所を先頭に戻している。そして、31行目でi個の数を降順にpostsortに出力 している。 \section{工夫した点} \begin{enumerate} \item 今まで習ってきた知識を最大限に利用し、ややこしい操作を行わなかった。 \end{enumerate} \section{入出力例} \begin{verbatim} 入力例 出力例 4 0 3 -9 3 → 4 3 3 0 -9 \end{verbatim} \section{感想} ソーティングアルゴリズムは、前の課題で学習したこともあり、たいした苦労はなかったが 手続きに関しても複雑なことはしていないので、たいした苦労はなかった。 テキストファイルに入出力させることについては、慣れていなかったのでどう処理 していいかわからず、苦労した。 \end{document}
この書き込みへの返事: