2 部データ構造とアルゴリズムI レポート課題

本講義では 2 通のレポートで評価します。 レポートは A4 の紙を縦に使い、適宜表紙を付けて提出すること。 またプログラムは C 言語で作成しなさい。

課題2

レポート締切日: 2011年7月14日(木)20:00
提出先: 7 号館 3F レポートボックス

なお、遅れレポートは原則受けとりません。

一行が高々200文字のテキストファイル input.txt に対して、 逆順に表示するプログラムを作成しなさい。 なお、行数の上限は仮定してはならない。 また、ファイルが存在しないとき、あるいはメモリーを確保できない時はそれ ぞれその旨のエラーメッセージを出力し、リターンコード -1, -2で異常終了しなさい。 なお、ファイル中に日本語が含まれる場合は正常に動作しなくてよい。

なお、プログラムの実行例は次のケースについて添付しなさい。

  1. input.txt ファイルが存在しない時
  2. input.txt が空のファイルの時
  3. 作成したプログラムのソースコードをinput.txt として保存して与えた時

実行例

入力

abc
def
ghi

出力

ihg
fed
cba

課題1

レポート締切日: 2011年6月23日(木)20:00
提出先: 7 号館 3F レポートボックス

課題を作り直しました。 旧課題でも解答可能です。

次の 4 つの課題を合わせて行い、報告しなさい。

なお、遅れレポートは教員に直接提出してください。 遅れた方が有利にならない範囲内で採点します。

複素数の演算を行うパッケージを作成したい。 そのため、次のような構造体を作成した。


typedef struct {
  double real;
  double imaginary;
} COMPLEX;

また、それを表示する関数を次のように作成した。


#include <stdio.h>
void printComplex(COMPLEX c){
  if(c.imaginary==0){
    printf("%f",c.real);
  }else if(c.real==0){
    printf("%fi",c.imaginary);
  }else{   
    printf("%f%+fi",c.real,c.imaginary);
  }
}

課題1-1

与えられた複素数に対して共役複素数を返す関数 COMPLEX conjugate(COMPLEX c)を作成しなさい。 そして、次のテストプログラムと結合し、正常な出力が得られることを確認しなさい。

テストプログラム


#include <stdio.h>
#define G (999)
/* 学籍番号の下3桁を記入する。先頭の 0 は省く */
void printComplex(COMPLEX c);
COMPLEX conjugate(COMPLEX c);
int main(void){
  COMPLEX c1 = {G,2};
  printComplex(c1);
  printf("\n");
  printComplex(conjugate(c1));
  printf("\n");
  return 0;
}
出力例
999.000000+2.000000i
999.000000-2.000000i

課題 1-2

与えられた2つの複素数に対して和を返す関数 COMPLEX add(COMPLEX x, COMPLEX y) を作成しなさい。 そして、次のテストプログラムと結合し、正常な出力が得られることを確認しなさい。


#include <stdio.h>
#define G (999)
/* 学籍番号の下3桁を記入する。先頭の 0 は省く */
void printComplex(COMPLEX c);
COMPLEX conjugate(COMPLEX c);
COMPLEX add(COMPLEX x, COMPLEX y);
int main(void){
  COMPLEX c1 = {G,2};
  COMPLEX c2 = {1,G};
  printComplex(add(c1,c2));
  printf("\n");
  printComplex(add(c1,conjugate(c1));
  printf("\n");
  return 0;
}
出力例
1000.000000+1001.000000i
1998.000000

課題 1-3

与えられた2つの複素数に対して積を返す関数 COMPLEX multiply(COMPLEX x, COMPLEX y) を作成しなさい。 そして、次のテストプログラムと結合し、正常な出力が得られることを確認しなさい。


#include <stdio.h>
#define G (999)
/* 学籍番号の下3桁を記入する。先頭の 0 は省く */
void printComplex(COMPLEX c);
COMPLEX conjugate(COMPLEX c);
COMPLEX multiply(COMPLEX x, COMPLEX y);
int main(void){
  COMPLEX c1 = {G,2};
  COMPLEX c2 = {1,G};
  printComplex(multiply(c1,c2));
  printf("\n");
  printComplex(multiply(c1,conjugate(c1));
  printf("\n");
  return 0;
}
出力例
-999.000000+998003.000000i
998005.000000

課題 1-4

与えられた2つの複素数に対して商を返す関数 COMPLEX divide(COMPLEX x, COMPLEX y) を作成しなさい。 そして、次のテストプログラムと結合し、正常な出力が得られることを確認しなさい。

テストプログラム


#include <stdio.h>
#define G (999)
/* 学籍番号の下3桁を記入する。先頭の 0 は省く */
void printComplex(COMPLEX c);
COMPLEX conjugate(COMPLEX c);
COMPLEX multiply(COMPLEX x, COMPLEX y);
int main(void){
  COMPLEX c1 = {G,2*G};
  COMPLEX c2 = {2*G,4*G};
  printComplex(divide(c1,c2));
  printf("\n");
  printComplex(divide(c1,conjugate(c1));
  printf("\n");
  return 0;
}
出力例
0.500000
-0.600000+0.800000i

レポート作成上の注意

  1. レポートはグラフの表現など特殊な事情がない限り、必ず白黒で作成する こと。
  2. プログラミングのレポートでは必ずプログラムの説明をすること。その時 に、一行一行を日本語に直訳するのではなく、プログラムを機能毎に区分し、 機能の実現方法を説明すること。 プログラムに一行ずつコメントを入れてもプログラムの説明とは見なしません。
  3. 「問題を解きなさい」という問に対して「解きました。合ってました」は 正解ではありません。 「プログラムを作りなさい」という問題については、作成の手順の説明をする こと。 「テストしなさい」という問題についてはテストの手法、合否判定の基準、結 果の検討などを説明しなさい。
  4. プログラムが短くて説明がしづらい場合は、ポインタなどの関係を図示す るなどして工夫してください。
  5. 出力例は個々に異なりますので、手計算であらかじめ正しい値の求め方を 示し、値を提示してテストの合否を判定しなさい。
  6. レポートは手書きでも良いですが、プログラムの実行結果だけは必ずコン ピュータの出力の印刷にして下さい。
  7. 考察は必ず書いて下さい。ネタがない人は以下を参考にして下さい。

坂本直志 <[email protected]>
東京電機大学工学部情報通信工学科