2002 年度「応用数理C3」「計算数学1」 2002-06-26

課題3

プリント 020619.txt のプログラム例 020619b.c の関数 mergesort() には、 ポインタが配列の外を指してしまうミスがあった。

C言語では、ポインタは

のいずれかであることが求められる。

(「配列の終わりの一つ先を指す」というのは、 a が int a[10]; と宣言されているとき int へのポインタ p が値 a + 10 をとる、 といった場合をいう。 それは許されるが、その状態で *p を使ってはいけない。 p の指しているところには意味のある実体はないからである。)

また、関数 merge() の本体は伏せてあった。

/* p からの m 個と q からの n 個をマージして r からにコピー */
void merge(int *p, int m, int *q, int n, int *r) {
    /* 課題にしようかと考えているところ */
}
となっていたが、mergesort() があのままでは m や n が負で呼び出されることも起こりえる。 そのときはゼロとみなして動作するように merge() を書くのか、 あるいは mergesort() の側でそうならないようにすべきなのか、 も問題である。

以上の点を修正・補足して完全なものとせよ。 関数 mergesort() と merge() の引数や返り値の型をプリントのものから変更しても構わないし、 一つの関数にまとめてしまっても構わない。

そのままコンパイルして実行できるものを (i.e. 自作部分だけでなく全部を) メールで cf7248@mailedu2.ipc.kanazawa-u.ac.jp へ送ってください。 Subject は「kadai3」(カギかっこは含まない、間にスペースを入れない) としてください。 なお、 プログラムは添付ファイルではなく copy & paste して本文に貼りつけて送ってください。

締め切りは 2002 年 7 月 31 日(水)18 時。 (その日はもう授業はありません。)


岩瀬順一