Česky
Kamil Dudka

Tiny programs (C, C++, C#, ...)

File detail

Name:Downloadwordcount.c [Download]
Location: tiny > IJC > du2
Size:1.8 KB
Last modification:2022-09-09 13:06

Source code

/*
 * Soubor: wordcount.c - hlavni modul programu pocitajici slova
 * Kamil Dudka, FIT, DU2, priklad 2, 17.4.2005
 */
 
 
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include "htable.h"	// Rozhrani modulu htable.c
 
/*
 * Velikost tabulky jsem stanovil experimentalne
 */
const unsigned HashInitSize=16384;	// Velikost hashovaci tabulky
const unsigned WordBufferSize=256;	// Maximalni velikost slova + 1
 
/*
 * Funkce read_word() cte jedno slovo ze souboru do zadaneho pole znaku
 * a vrati delku slova (z delsich slov vrati prvnich max-1 znaku,
 * a zbytek preskoci). Funkce vraci nulu, pokud je konec souboru.
 */
int read_word (char *, int, FILE *);
 
/*
 * Obsluha nedostatku pameti
 */
inline void errMemory (void) {
	fprintf (stderr, "wordcount: Nedostatek pameti!\n");
	exit (1);
}
 
int main () {
	// Alokace a inicializace hashovaci tabulky
	htable_t *pHash;
	if (NULL==( pHash=htable_init (HashInitSize)))
		errMemory ();
 
	// Buffer pro nacteni jednoho slova
	char wordBuffer [WordBufferSize];
	// Cyklus pocitajici jednotliva slova
	while (read_word (wordBuffer, WordBufferSize, stdin)) {
		struct htable_listitem *item;
		if (NULL==( item=htable_lookup (pHash, wordBuffer))) {
			htable_free (pHash);
			errMemory ();
		}
 
		// Inkrementace pocitadla
		item->n ++;
	}
 
	// Tisk obsahu tabulky
	htable_print (pHash);
 
	// Uvolneni hashovaci tabulky
	htable_free (pHash);	
}
 
int read_word (char *buffer, int max, FILE *input) {
	int size=0;
	register int tmp;
 
	// Preskoceni mezer
	while (EOF!=( tmp=fgetc (input)) && isspace(tmp));
 
	// Nacteni slova
	while (EOF!=tmp && !isspace(tmp)) {
		if (size<max-1) {
			*buffer = tmp;
			buffer++;
			size++;
		}
		tmp = fgetc(input);
	}
 
	// Zakonceni nulou
	*buffer = '\0';
 
	// Vraci pocet nactenych (skutecne ulozenych) znaku
	return size;
}