// 165 名前: デフォルトの名無しさん Mail: sage 投稿日: 2012/12/11(火) 11:07:17.44
// よろしくお願いします。
// [1] 授業単元: Programming C
// [2] 問題文(含コード&リンク):
// 1. argv[1]を使って wordlist(txtファイル) を読み込み、Hashtableに格納。
// サンプルtxtファイル -> http://s...content-available-to-author-only...s.jp/~c_cpp_homework/cgi-bin/joyful/joyful.cgi の 386.txt, 387.txt
// ※二重ハッシュ法を使う
// ※アポストロフィや .等を含んでいた場合、別の単語として扱う。ただ大文字小文字は区別しない。
// 例) grindstone’s と grindstones は別の単語。Armour と armour は同じ単語として扱う。
// ※単語数の約二倍のサイズのHashTableと素数を使う。ただ、単語数はファイル読み込み事前にはわからないものとする。
// ※単語の長さの最大値をあらかじめ決め打ちしない。
// 2.
// ・それぞれのセルでアクセスされた回数をカウントしていき、表示する。
// [3] 環境
// [3.1] Cent OS
// [3.2] gcc
// [3.3] C
// [4] 2012年12月12日
// [5] その他の制限:
// ・グローバル変数を使わない
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// prototype
int h(char *);
int p(char *);
int h(char *s)
{
int r = 0;
while (*s) {
r = r * 26 + (*s - 'a');
r %= 11;
++s;
}
return r;
}
int p(char *s){
}
int main(int argc, char const *argv[])
{
FILE *fp;
int hashTableSize, len = 0, lenMax = 0;
char c, **hashTable, *buf;
// 単語数カウント
fp
= fopen(argv
[1], "r"); while ((c
= fgetc(fp
)) != EOF
) { if (c == '\n') {
++hashTableSize;
if (lenMax < len)
lenMax = len;
len = 0;
} else ++len;
}
// HashTableサイズ決め
{
int n;
hashTableSize *= 2;
while (1) {
for (n = 2; (n * n < hashTableSize) && (hashTableSize % n); ++n);
if (hashTableSize % n) /* 素数 */
break;
++hashTableSize;
}
}
printf("hashTableSize = %d\n", hashTableSize
); printf("lenMax = %d\n", lenMax
); hashTable
= (char **)malloc(sizeof(char *)*hashTableSize
); buf
= (char *)malloc(sizeof(char ) * (lenMax
+ 2));
while ((fgets(buf
, lenMax
, fp
)) != NULL
) {
h(buf, hashTableSize);
}
return 0;
}
Ly8gMTY1IOWQjeWJjTog44OH44OV44Kp44Or44OI44Gu5ZCN54Sh44GX44GV44KTICBNYWlsOiBzYWdlIOaKleeov+aXpTogMjAxMi8xMi8xMSjngaspIDExOjA3OjE3LjQ0Ci8vIOOCiOOCjeOBl+OBj+OBiumhmOOBhOOBl+OBvuOBmeOAggoKLy8gWzFdIOaOiOalreWNmOWFg++8miBQcm9ncmFtbWluZyBDCi8vIFsyXSDllY/poYzmloco5ZCr44Kz44O844OJJuODquODs+OCrynvvJoKLy8gMS4gYXJndlsxXeOCkuS9v+OBo+OBpiB3b3JkbGlzdCh0eHTjg5XjgqHjgqTjg6spIOOCkuiqreOBv+i+vOOBv+OAgUhhc2h0YWJsZeOBq+agvOe0jeOAggovLyDjgrXjg7Pjg5fjg6t0eHTjg5XjgqHjgqTjg6sgLT4gaHR0cDovL3MuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnMuanAvfmNfY3BwX2hvbWV3b3JrL2NnaS1iaW4vam95ZnVsL2pveWZ1bC5jZ2kg44GuIDM4Ni50eHQsIDM4Ny50eHQKCi8vIOKAu+S6jOmHjeODj+ODg+OCt+ODpeazleOCkuS9v+OBhgovLyDigLvjgqLjg53jgrnjg4jjg63jg5XjgqPjgoQgLuetieOCkuWQq+OCk+OBp+OBhOOBn+WgtOWQiOOAgeWIpeOBruWNmOiqnuOBqOOBl+OBpuaJseOBhuOAguOBn+OBoOWkp+aWh+Wtl+Wwj+aWh+Wtl+OBr+WMuuWIpeOBl+OBquOBhOOAggovLyDkvospIGdyaW5kc3RvbmXigJlzIOOBqCBncmluZHN0b25lcyDjga/liKXjga7ljZjoqp7jgIJBcm1vdXIg44GoIGFybW91ciDjga/lkIzjgZjljZjoqp7jgajjgZfjgabmibHjgYbjgIIKLy8g4oC75Y2Y6Kqe5pWw44Gu57SE5LqM5YCN44Gu44K144Kk44K644GuSGFzaFRhYmxl44Go57Sg5pWw44KS5L2/44GG44CC44Gf44Gg44CB5Y2Y6Kqe5pWw44Gv44OV44Kh44Kk44Or6Kqt44G/6L6844G/5LqL5YmN44Gr44Gv44KP44GL44KJ44Gq44GE44KC44Gu44Go44GZ44KL44CCCi8vIOKAu+WNmOiqnuOBrumVt+OBleOBruacgOWkp+WApOOCkuOBguOCieOBi+OBmOOCgeaxuuOCgeaJk+OBoeOBl+OBquOBhOOAggoKLy8gMi4KLy8g44O744Gd44KM44Ge44KM44Gu44K744Or44Gn44Ki44Kv44K744K544GV44KM44Gf5Zue5pWw44KS44Kr44Km44Oz44OI44GX44Gm44GE44GN44CB6KGo56S644GZ44KL44CCCgovLyBbM10g55Kw5aKDCi8vIOOAgFszLjFdIENlbnQgT1MKLy8g44CAWzMuMl0gZ2NjCi8vIOOAgFszLjNdIEMKLy8gWzRdIDIwMTLlubQxMuaciDEy5pelCi8vIFs1XSDjgZ3jga7ku5bjga7liLbpmZDvvJoKLy8g44O744Kw44Ot44O844OQ44Or5aSJ5pWw44KS5L2/44KP44Gq44GECgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgoKLy8gcHJvdG90eXBlCmludCBoKGNoYXIgKik7CmludCBwKGNoYXIgKik7CgppbnQgaChjaGFyICpzKQp7CiAgaW50IHIgPSAwOwogIHdoaWxlICgqcykgewogICAgKnMgPSB0b2xvd2VyKCpzKTsKICAgIHIgPSByICogMjYgKyAoKnMgLSAnYScpOwogICAgciAlPSAxMTsKICAgICsrczsKICB9CiAgcmV0dXJuIHI7Cn0KCmludCBwKGNoYXIgKnMpewoKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgY29uc3QgKmFyZ3ZbXSkKewogIEZJTEUgKmZwOwogIGludCBoYXNoVGFibGVTaXplLCBsZW4gPSAwLCBsZW5NYXggPSAwOwogIGNoYXIgYywgKipoYXNoVGFibGUsICpidWY7CgogIC8vIOWNmOiqnuaVsOOCq+OCpuODs+ODiAogIGZwID0gZm9wZW4oYXJndlsxXSwgInIiKTsKICB3aGlsZSAoKGMgPSBmZ2V0YyhmcCkpICE9IEVPRikgewogICAgaWYgKGMgPT0gJ1xuJykgewogICAgICArK2hhc2hUYWJsZVNpemU7CiAgICAgIGlmIChsZW5NYXggPCBsZW4pCiAgICAgICAgbGVuTWF4ID0gbGVuOwogICAgICBsZW4gPSAwOwogICAgfSBlbHNlICsrbGVuOwogIH0KCiAgLy8gSGFzaFRhYmxl44K144Kk44K65rG644KBCiAgewogICAgaW50IG47CiAgICBoYXNoVGFibGVTaXplICo9IDI7CiAgICB3aGlsZSAoMSkgewogICAgICBmb3IgKG4gPSAyOyAobiAqIG4gPCBoYXNoVGFibGVTaXplKSAmJiAoaGFzaFRhYmxlU2l6ZSAlIG4pOyArK24pOwogICAgICBpZiAoaGFzaFRhYmxlU2l6ZSAlIG4pIC8qIOe0oOaVsCAqLwogICAgICAgIGJyZWFrOwogICAgICArK2hhc2hUYWJsZVNpemU7CiAgICB9CiAgfQogIHByaW50ZigiaGFzaFRhYmxlU2l6ZSA9ICVkXG4iLCBoYXNoVGFibGVTaXplKTsKICBwcmludGYoImxlbk1heCA9ICVkXG4iLCBsZW5NYXgpOwogIGhhc2hUYWJsZSA9IChjaGFyICoqKW1hbGxvYyhzaXplb2YoY2hhciAqKSpoYXNoVGFibGVTaXplKTsKICBidWYgPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhciApICogKGxlbk1heCArIDIpKTsKCiAgcmV3aW5kKGZwKTsKICB3aGlsZSAoKGZnZXRzKGJ1ZiwgbGVuTWF4LCBmcCkpICE9IE5VTEwpCiAgewogICAgICBoKGJ1ZiwgaGFzaFRhYmxlU2l6ZSk7CiAgfQoKICByZXR1cm4gMDsKfQo=