平成8年度 秋期 第二種 午後 問7

                        [更新日]1996.11.19
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃次の問7から問10までの4問については、この中から1問を選択し、答案用紙の┃ ┃選択欄の「選」をマークして解答してください。              ┃ ┃ なお、2問以上選択した場合には、はじめの1問について採点します。    ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 問7 次のCプログラムの説明及びプログラムを読んで,設問に答えよ。 〔プログラムの説明〕 インターネットのWWW(Wornd Wide Web)サーバへのアクセス履歴を集計し印字 するプログラムである。WWWサーバへのアクセス履歴は。図1に示す様式のレコード で記録されている。 8けた 4けた 可変長 ┌─────────┬─┬─────┬─┬────────┐ │ 年 月 日 │△│ 時刻 │△│ アクセス先 │ └─────────┴─┴─────┴─┴────────┘ (△:空白文字) 図1 アクセス履歴レコード様式 年月日はWWWサーバヘアクセスした日付であり、8けたの数字列"YYYYMMDD" ("YYYY"は4けたの数字列で西暦年を"MM"は2けたの数字列で月を"DD"は2けた の数字列で日を示す)で記録されている。 時刻はWWWサーバヘアクセスを開始した時刻であり,4けたの数字列"hhmm" "hh"は2けたの数字列で24時間表現による時を,"mm"は2けたの数字列で分を 示す)で記録されている。 アクセス先はURL(Uniform Resource Locator)と呼ばれる表記法による可 変長文字列(ただし文字列の長さは最大で64文字)の形式で記録されている。 年月日と時刻の間及び時刻とアクセス先の間は,1個の空白文字で区切られ ておりアクセス履歴レコードの終端には改行文字が付いている。 例えば1996年2月14日の15時24分に。URLがhttp:www.kantyo.go.jp/index.html であるWWWサーバにアクセスした場合のアクセス履歴レコードは,図2のとおりで ある。 ┌──────────────────────────┐ │ 19960214△1524△http://www.kantyo.go.jp/index.html │ └──────────────────────────┘ 図2 アクセス履歴レコードの例 ファイルwww.logには,1個以上のアクセス履歴が含まれている。各レコードは アクセス先の文字列の昇順に整列されている。なお,アクセス先の個数は128以下 とする。 www.logの例を図3に示す。 ┌───────────────────────────┐ │19960405 1215 http://www.daigaku.ac.jp/bungaku.html │ │19960520 1425 http://www.daigaku.ac.jp/keizai.html │←┬ 同一のアクセス先 │19960603 0930 http://www.kaisya.co.jp/home/eigyo.html │←┘ │19960603 1320 http://www.kaisya.co.jp/home/eigyo.html │ │19960522 1315 http://www.kaisya.co.jp/home/zinzai.html│ │19960214 1524 http://www.kaisya.co.jp/index.html │←┬ 同一のアクセス先 │19960405 1045 http://www.kaisya.co.jp/index.html │←┘ │ : │ └───────────────────────────┘ 図3 www.logの内容例 プログラムは,www.logからアクセス履歴レコードを読み込み、図4に示すアク セス回数表及びアクセス時間帯表を印字する。 アクセス回数表にはアクセス先をアクセス回数の多い順に最大5個表示する。 アクセス回数が等しい場合には,アクセス先の文字列の昇順に表示する。 アクセス時間帯表には,1日を1時間単位に24の時間帯に分けて,その時間帯を アクセス比率の大きい順に最大5個表示する。アクセス比率は,各時間帯ごとのア クセス回数と総アクセス回数との比率(百分率)である。アクセス比率が等しい 場合には,時間帯の昇順に表示する。 ┌──────────────────────────────┐ │ ***アクセス回数表*** │ │ 順位 アクセス回数 アクセス先 │ │ 1 218回 http://www.kantyo.go.jp/index.html │ │ 2 126回 http://www.kaisya.co.jp/home/zinzi.html │ │ 3 68回 http://www.daigaku_1.ac.jp/home.html │ │ 4 50回 http://www.daigaku_3.ac.jp/home.html │ │ 5 43回 http://www.abc_net.or.jp/index.html │ │ │ │ ***アクセス時間帯表*** │ │ 順位 時間帯 アクセス比率 │ │ 1 12時台 45% │ │ 2 8時台 20% │ │ 3 18時台 10% │ │ 4 15時台 5% │ │ 5 9時台 2% │ └──────────────────────────────┘ 図4 アクセス回数表及びアクセス時間帯表の印宇例 プログラム中で,テーブルの整列に使用している関数sort_addr及びsort_ji の仕様は次のとおりである。 《形式》 void sort_addr(ADDR *base,int nmemb); void sort_ji(JI *base,int nmemb); 《機能》 いずれの関数も,最初の要素がbaseで示されるnmemb個の要素からなる構造体 配列を整列する。 関数sort_addrは,ADDR型の構造体を要素とする配列を,アクセス回数を示す メンバcntの値の降順に整列する。ただし,cntの値が等しい場合はメンバurlp で示されるアクセス先の文字列の昇順に整列する。 関数sort_jiはJI型の構造体を要素とする配列を,アクセス回数を示すメンバ cntの値の降順に整列する。ただし,cntの値が等しい場合は,時間帯を示すメン バhourの値の昇順に整列する。 〔プログラム〕 #include <stdio.h> #include <string.h> #define ADSIZF 66 #define LOGMAX l28 typedef struct { int cnt;char *urlp; }ADDR; typedef struct { int cnt;int hour; }JI; typedef struct { long yymmdd;int hhmm;char arec[ADSIZE];}LOG; void sort_addr( ADDR*;int ); void sort_ji(JI*,int); ADDR loginf[LOGMAX]; char logbuf[LOGMAX*ADSIZE]; JI ji_t[24]; main() { LOG ibuf; char *cp,sbuf[ADSIZE]; FILE *wfp; int rcnt=0;idx= 〔 a 〕 ,i; for(i=0;i <24;i++){ ji_t[i].cnt = 0; ji_t[i].hour = i; } wfp=fopen("www.log","r"); sbuf[0]='\0'; cp=logbuf; whi1e(fscanf(wfp,"%ld %d %s\n", &ibuf.yymmdd,&ibuf.hhmm,ibuf.area)!=EOF){ rcnt++; ji_t[ibuf.hhmm / 〔 b 〕 ].cnt++; if( strcmp(sbuf,ibuf.arec)==0) loginf[idx-1].cnt++; e1se{ loginf[idx].urlp=cp; loginf[idx].cnt=l; strcpy(loginf[idx].urlp;ibuf.arec); cp+=(strlen 〔 c 〕)+1 ); strcpy(sbuf,ibuf.arec); idx++; } } fclose(wfp); sort_addr(loginf,idx); printf(" *** アクセス回数表 ***\n" ); printf(" 順位 アクセス回数 アクセス先\n" ); for( i=0; i<5; i++, idx-- ){ if(idx==0)break; printf(" %d %6d回 %s\n", i+1,loginf[i].cnt,〔 d 〕); } sort_ji(ji_t,24); printf("\n *** アクセス時間帯表 ***\n" ); printf(" 順位 時間帯 アクセス比率\n" ); for(i=0;i<5;i++){ if(ji_t[i].cnt==0)break; printf(" %d %2d時台 %3ld%%\n", i+1,ji_t[i].hour,ji_t[i].cnt*100L/ 〔 e 〕); } } 設問 プログラム中の〔 〕に入れる正しい答えを解答群の中から選べ。 aに関する解答群 ア -1 イ 0 ウ 1 エ LOGMAX bに関する解答群 ア 60 イ l00 ウ ADSIZE エ LOGMAX オ rcnt cに関する解答群 ア ibuf イ ibuf.arec ウ logbuf エ loginf[idx] オ sbuf dに関する解答群 ア logbuf[i] イ logbuf[idx] ウ loginf[i].urlp エ loginf[idx].urlp eに関する解答群 ア (idx+1) イ (rcnt+1) ウ idx エ LOGMAX オ rcnt
戻る 次頁:問8