プログラミング実習II (2026) 応用課題

[XA] 言語処理とログ解析

言語処理

英語の慣用的な用法を知るには,大量の英文中に現れる単語について,その前後に使われる単語を知ることが有用である.そのためには,与えられた英文を単語単位に分割し,次いで以下のような処理がその基礎となる.

  1. 各単語について,前後の単語を求め,3連の単語の組を作る.この3単語の組を3連語と呼ぼう.
  2. 3連語を,中央の単語によって辞書順に並べ換え,表の形で出力する.

この表を見れば,ある単語の前後に使われる単語の傾向を知ることができる.

以上の説明をもとに,以下の(課題 A_1)~(課題 A_2)を解け.なお,両課題とも入力に用いる英文テキストファイルは XA_1.txt を利用すること.

(課題 A_1)

与えられた英文テキストファイルを読み込み,その英文に含まれている単語数を数えるプログラムを作成せよ.

(課題 A_2)

与えられた英文テキストファイルを読み込み,その英文に含まれている3連語を辞書順に並べ換えて出力するプログラムを作成せよ. ただし,並べ換えに当たっては,単語の頭3文字を考慮し,第4文字以降は順序決定に無関係としてよい.

<ヒント>
3連語を一つの構造体で表し,英文から得られた3連語のすべてを構造体の配列に格納する(ただし,文頭・文末の単語は,それぞれ左,右を空白にせよ.各種句切り記号 ,.";:- などは,直前の単語の一部とみなす).

例: "This is a pen. That is an apple." の場合

struct w_triple 
{
    char pre[30];
    char wrd[30];
    char ant[30];
};

上記のような構造体を定義し,この型 struct w_triple の配列 word[300] を定義して利用せよ.

次に,word[ i ].wrd の辞書順で並び換えればよい.

並べ換えの際は,「単語の頭3文字」のみを考慮し,それよりも短い単語には '空白' を後に付け足して,'空白' はアルファベットより前にあると考えよ.また大文字,小文字の違いは無視せよ.

(構造体の作成法は上に記したものに従う必要はない.例えば,入力文から抽出した単語(文の切れ目を表す「空白」も含む)を構造体のメンバ word[i].wrd に順番に入れて,word[i].pre, word[i].ant は空のまま,まずは構造体の配列 word[ ] を作る.この配列では,文中で前後にある単語が,配列の前後の要素のメンバ word[i-1].wrd, word[i+1].wrd に含まれているので,これらの要素から取り出して word[i].pre, word[i].ant を補充してもよい.)
例文の場合の最終結果:
( pen.	空白	That	)
( is	a	pen.	)
( is	an	apple.	)
( an	apple.	空白	)
   ・・・・
( 空白	This	is	)

WWWサイトアクセスログ解析

WWWサイトが存在するサーバにある「アクセスログ」を解析することで,どのページへのアクセスが多いのか,アクセスが集中する時間帯はいつなのか等の情報を知ることができる.

「C言語によるプログラミング 基礎編 第2版」の 10.10節(p.352~p.373) を読み,以下の課題を解け.
(注)第3版とは内容が異なるため,指定された PDF 資料を閲覧すること.
(課題 A_3)

アクセスログ(acc20071120b.txt)を解析し,下記の内容すべてを出力するプログラムを作成せよ.

なお,それぞれのアクセスランキングの表示はテキスト p.371 の実行結果例のように行うこと.

(課題 A_4)

アクセスログ(acc20071120b.txt)を解析し,下記の内容すべてを出力するプログラムを作成せよ.