レポート課題

以下の課題を C, C++, Java, Smalltalk のどれかの言語を使って作りなさい。 なお、Smalltalk は標準入出力がないので、適宜入出力の仕様を付加しなさい。

注意: どちらも Windows の API は使用しないで作って下さい。

課題1

レポート締切日: 2004年11月24日

標準入力からテキストファイルを読み込み、 行を短い順に出力しなさい。 但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い 出力し、空行は出力しないで下さい。 また、同じ長さの行は入力した順番に出しなさい。 レポートでは、実行例として、作成したソースプログラムをプログラムに入力 した出力と、 http://www.bbn.com/index.html のホームページのソースを入力した結果を先頭 5 行、最後の 5 行を示しなさい。

なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに依存 しなければなりません。 勝手な上限を設けてはいけません。

実行例

入力
Windows XP
Power Mac G5
Unix SVR4
出力
Unix SVR4
Windows XP
Power Mac G5

ヒント

C++ で行の取得をするには std::istream のメンバ関数である getline メソッ ドを使います。 これは getline(文字配列のポインタ, 文字数, 区切り文字)で呼びます。 ここで、区切り文字が来る前に文字数-1 文字だけ読み込んでしまった時、 std::ios:failbit が ON になってしまいます。 この場合 clear() メソッドでこのビットを OFF にする必要があります。 但し、この clear() メソッドは std::ios:eofbit も OFF にしてしまうので、 注意して使う必要があります。

以下は標準入力から各行を高々 80 文字だけ読み込み出力するプログラムです。


#include <iostream>
using std::cin;
using std::cout;
using std::endl;
main(){
  char buffer[81];
  while(!cin.eof()){
    cin.getline(buffer,sizeof(buffer));
    cout << buffer << endl;
    while((!cin.eof())&&cin.fail()){
      cin.clear();
      cin.ignore(80,'\n');
    }
  }
}

課題2

レポート締切日: 2005年1月12日(水)

標準入力から C 言語などのプログラムテキストファイルを読み込み、使用し ている関数名を頻度順に並べなさい。これは宣言文と実際の式のどちらも含み ます。 なお、同じ頻度の関数は辞書順に並べなさい。 レポートでは、実行例として、作成したソースプログラムをプログラムに入力 した出力を示しなさい。

なお、取り扱える行数は実行時のコンピュータのメモリーのサイズのみに依存 しなければなりません。 勝手な上限を設けてはいけません。 但し、関数名の長さは高々 255 文字と仮定して良い。

実行例

入力
int combination(int n, int m){
  if(m==0){return 1;}
  else if(n==m){return 1;}
  return combination(n-1,m-1)+combination(n-1,m);
}
main(){
  int n=5,m=2;
  printf("%dC%d = %d\n",n,m,combination(n,m));
}  
出力
combination: 4
main: 1
printf: 1

坂本直志 <sakamoto@c.dendai.ac.jp>
東京電機大学工学部情報通信工学科